|
@@ -384,6 +384,54 @@ START_TEST(generateEvents) {
|
|
UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
|
|
UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
|
|
} END_TEST
|
|
} END_TEST
|
|
|
|
|
|
|
|
+static bool hasBaseModelChangeEventType() {
|
|
|
|
+
|
|
|
|
+ UA_QualifiedName readBrowsename;
|
|
|
|
+ UA_QualifiedName_init(&readBrowsename);
|
|
|
|
+ UA_StatusCode retval = UA_Server_readBrowseName(server, UA_NODEID_NUMERIC(0, UA_NS0ID_BASEMODELCHANGEEVENTTYPE), &readBrowsename);
|
|
|
|
+ UA_QualifiedName_deleteMembers(&readBrowsename);
|
|
|
|
+ return !(retval == UA_STATUSCODE_BADNODEIDUNKNOWN);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+START_TEST(createAbstractEvent) {
|
|
|
|
+ if (!hasBaseModelChangeEventType())
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ UA_NodeId eventNodeId = UA_NODEID_NULL;
|
|
|
|
+ UA_NodeId abstractEventType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEMODELCHANGEEVENTTYPE);
|
|
|
|
+ serverMutexLock();
|
|
|
|
+ UA_StatusCode retval = UA_Server_createEvent(server, abstractEventType, &eventNodeId);
|
|
|
|
+ serverMutexUnlock();
|
|
|
|
+ ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
|
|
|
|
+} END_TEST
|
|
|
|
+
|
|
|
|
+START_TEST(createAbstractEventWithParent) {
|
|
|
|
+ if (!hasBaseModelChangeEventType())
|
|
|
|
+ return;
|
|
|
|
+ UA_NodeId eventNodeId = UA_NODEID_NULL;
|
|
|
|
+ UA_NodeId abstractEventType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEMODELCHANGEEVENTTYPE);
|
|
|
|
+ serverMutexLock();
|
|
|
|
+ // createEvent does not use a parent, so we are instead using addObjectNode
|
|
|
|
+ UA_StatusCode retval = UA_Server_addObjectNode(server, UA_NODEID_NULL, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER),
|
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
|
|
|
|
+ UA_QUALIFIEDNAME(0, "Abstract Event"), abstractEventType,
|
|
|
|
+ UA_ObjectAttributes_default, NULL, &eventNodeId);
|
|
|
|
+ serverMutexUnlock();
|
|
|
|
+ ck_assert_uint_eq(retval, UA_STATUSCODE_BADTYPEDEFINITIONINVALID);
|
|
|
|
+} END_TEST
|
|
|
|
+
|
|
|
|
+START_TEST(createNonAbstractEventWithParent) {
|
|
|
|
+ UA_NodeId eventNodeId = UA_NODEID_NULL;
|
|
|
|
+ serverMutexLock();
|
|
|
|
+ // Our SimpleEventType is not abstract
|
|
|
|
+ UA_StatusCode retval = UA_Server_addObjectNode(server, UA_NODEID_NULL, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER),
|
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
|
|
|
|
+ UA_QUALIFIEDNAME(0, "Non-Abstract Event"), eventType,
|
|
|
|
+ UA_ObjectAttributes_default, NULL, &eventNodeId);
|
|
|
|
+ serverMutexUnlock();
|
|
|
|
+ ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
|
|
|
|
+} END_TEST
|
|
|
|
+
|
|
static void
|
|
static void
|
|
handler_events_propagate(UA_Client *lclient, UA_UInt32 subId, void *subContext,
|
|
handler_events_propagate(UA_Client *lclient, UA_UInt32 subId, void *subContext,
|
|
UA_UInt32 monId, void *monContext,
|
|
UA_UInt32 monId, void *monContext,
|
|
@@ -625,6 +673,9 @@ static Suite *testSuite_Client(void) {
|
|
tcase_add_unchecked_fixture(tc_server, setup, teardown);
|
|
tcase_add_unchecked_fixture(tc_server, setup, teardown);
|
|
tcase_add_test(tc_server, generateEventEmptyFilter);
|
|
tcase_add_test(tc_server, generateEventEmptyFilter);
|
|
tcase_add_test(tc_server, generateEvents);
|
|
tcase_add_test(tc_server, generateEvents);
|
|
|
|
+ tcase_add_test(tc_server, createAbstractEvent);
|
|
|
|
+ tcase_add_test(tc_server, createAbstractEventWithParent);
|
|
|
|
+ tcase_add_test(tc_server, createNonAbstractEventWithParent);
|
|
tcase_add_test(tc_server, uppropagation);
|
|
tcase_add_test(tc_server, uppropagation);
|
|
tcase_add_test(tc_server, eventOverflow);
|
|
tcase_add_test(tc_server, eventOverflow);
|
|
tcase_add_test(tc_server, multipleMonitoredItemsOneNode);
|
|
tcase_add_test(tc_server, multipleMonitoredItemsOneNode);
|