123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898 |
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
- */
- #include <open62541/client.h>
- #include <open62541/client_config_default.h>
- #include <open62541/client_highlevel.h>
- #include <open62541/server.h>
- #include <open62541/server_config_default.h>
- #include "client/ua_client_internal.h"
- #include <check.h>
- #include "testing_clock.h"
- #include "testing_networklayers.h"
- #include "thread_wrapper.h"
- UA_Server *server;
- UA_Boolean running;
- THREAD_HANDLE server_thread;
- UA_Client *client;
- UA_UInt32 subId;
- UA_NodeId parentNodeId;
- UA_NodeId parentReferenceNodeId;
- UA_NodeId outNodeId;
- UA_Boolean notificationReceived = false;
- UA_UInt32 countNotificationReceived = 0;
- UA_Double publishingInterval = 500.0;
- UA_DataValue lastValue;
- THREAD_CALLBACK(serverloop) {
- while(running)
- UA_Server_run_iterate(server, true);
- return 0;
- }
- static void setup(void) {
- UA_DataValue_init(&lastValue);
- running = true;
- server = UA_Server_new();
- UA_ServerConfig_setDefault(UA_Server_getConfig(server));
- UA_Server_run_startup(server);
- THREAD_CREATE(server_thread, serverloop);
- /* Define the attribute of the double variable node */
- UA_VariableAttributes attr = UA_VariableAttributes_default;
- UA_Double myDouble = 40.0;
- UA_Variant_setScalar(&attr.value, &myDouble, &UA_TYPES[UA_TYPES_DOUBLE]);
- attr.description = UA_LOCALIZEDTEXT("en-US","the answer");
- attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
- attr.dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
- attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
- UA_NodeId doubleNodeId = UA_NODEID_STRING(1, "the.answer");
- UA_QualifiedName doubleName = UA_QUALIFIEDNAME(1, "the answer");
- parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
- parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
- UA_NodeId_init(&outNodeId);
- ck_assert_uint_eq(UA_Server_addVariableNode(server,
- doubleNodeId, parentNodeId,
- parentReferenceNodeId,
- doubleName,
- UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
- attr,
- NULL,
- &outNodeId)
- , UA_STATUSCODE_GOOD);
- /* Add a boolean node */
- UA_Boolean myBool = false;
- UA_Variant_setScalar(&attr.value, &myBool, &UA_TYPES[UA_TYPES_BOOLEAN]);
- attr.description = UA_LOCALIZEDTEXT("en-US","the answer bool");
- attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer bool");
- attr.dataType = UA_TYPES[UA_TYPES_BOOLEAN].typeId;
- ck_assert_uint_eq(UA_Server_addVariableNode(server,
- UA_NODEID_STRING(1, "the.bool"),
- parentNodeId, parentReferenceNodeId,
- UA_QUALIFIEDNAME(1, "the bool"),
- UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
- attr, NULL, NULL)
- , UA_STATUSCODE_GOOD);
- client = UA_Client_new();
- UA_ClientConfig_setDefault(UA_Client_getConfig(client));
- UA_StatusCode retval = UA_Client_connect(client, "opc.tcp://localhost:4840");
- ck_assert_uint_eq(retval, UA_STATUSCODE_GOOD);
- UA_Client_recv = client->connection.recv;
- client->connection.recv = UA_Client_recvTesting;
- UA_CreateSubscriptionRequest request = UA_CreateSubscriptionRequest_default();
- request.requestedMaxKeepAliveCount = 100;
- UA_CreateSubscriptionResponse response = UA_Client_Subscriptions_create(client, request,
- NULL, NULL, NULL);
- ck_assert_uint_eq(response.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- subId = response.subscriptionId;
- notificationReceived = false;
- countNotificationReceived = 0;
- }
- static void teardown(void) {
- ck_assert_uint_eq(UA_Client_Subscriptions_deleteSingle(client, subId)
- , UA_STATUSCODE_GOOD);
- /* cleanup */
- UA_Client_disconnect(client);
- UA_Client_delete(client);
- UA_NodeId_deleteMembers(&parentNodeId);
- UA_NodeId_deleteMembers(&parentReferenceNodeId);
- UA_NodeId_deleteMembers(&outNodeId);
- running = false;
- THREAD_JOIN(server_thread);
- UA_Server_run_shutdown(server);
- UA_Server_delete(server);
- UA_DataValue_deleteMembers(&lastValue);
- }
- #ifdef UA_ENABLE_SUBSCRIPTIONS
- static void
- dataChangeHandler(UA_Client *thisClient, UA_UInt32 thisSubId, void *subContext,
- UA_UInt32 monId, void *monContext, UA_DataValue *value) {
- notificationReceived = true;
- ++countNotificationReceived;
- UA_DataValue_deleteMembers(&lastValue);
- UA_DataValue_copy(value, &lastValue);
- }
- static UA_StatusCode
- setDouble(UA_Client *thisClient, UA_NodeId node, UA_Double value) {
- UA_Variant variant;
- UA_Variant_setScalar(&variant, &value, &UA_TYPES[UA_TYPES_DOUBLE]);
- return UA_Client_writeValueAttribute(thisClient, node, &variant);
- }
- static UA_StatusCode waitForNotification(UA_UInt32 notifications, UA_UInt32 maxTries) {
- UA_StatusCode retval = UA_STATUSCODE_GOOD;
- for (UA_UInt32 i = 0; i < maxTries; ++i) {
- UA_fakeSleep((UA_UInt32)publishingInterval + 100);
- retval = UA_Client_run_iterate(client, (UA_UInt16)(publishingInterval + 100));
- if (retval != UA_STATUSCODE_GOOD)
- return retval;
- if (countNotificationReceived == notifications)
- return retval;
- }
- return retval;
- }
- static UA_Boolean fuzzyLastValueIsEqualTo(UA_Double value) {
- double offset = 0.001;
- if(lastValue.hasValue
- && lastValue.value.type == &UA_TYPES[UA_TYPES_DOUBLE]) {
- double lastDouble = *((UA_Double*)(lastValue.value.data));
- if (lastDouble > value - offset && lastDouble < value + offset) {
- return true;
- }
- }
- return false;
- }
- START_TEST(Server_MonitoredItemsAbsoluteFilterSetLater) {
- UA_DataValue_init(&lastValue);
- /* define a monitored item with no filter */
- UA_MonitoredItemCreateRequest item = UA_MonitoredItemCreateRequest_default(outNodeId);;
- UA_UInt32 newMonitoredItemIds[1];
- UA_Client_DataChangeNotificationCallback callbacks[1];
- callbacks[0] = dataChangeHandler;
- UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
- void *contexts[1];
- contexts[0] = NULL;
- UA_CreateMonitoredItemsRequest createRequest;
- UA_CreateMonitoredItemsRequest_init(&createRequest);
- createRequest.subscriptionId = subId;
- createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
- createRequest.itemsToCreate = &item;
- createRequest.itemsToCreateSize = 1;
- UA_CreateMonitoredItemsResponse createResponse =
- UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
- callbacks, deleteCallbacks);
- ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(createResponse.resultsSize, 1);
- ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
- newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
- UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
- // Do we get initial value ?
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert(fuzzyLastValueIsEqualTo(40.0));
- // This should trigger because no filter
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 2);
- ck_assert(fuzzyLastValueIsEqualTo(42.0));
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 2);
- ck_assert(fuzzyLastValueIsEqualTo(44.0));
- // set back to 40.0
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 40.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert(fuzzyLastValueIsEqualTo(40.0));
- /* modify the monitored item with an absolute filter with deadbandvalue = 2.0 */
- UA_MonitoredItemModifyRequest itemModify;
- UA_MonitoredItemModifyRequest_init(&itemModify);
- itemModify.monitoredItemId = newMonitoredItemIds[0];
- itemModify.requestedParameters.samplingInterval = 250;
- itemModify.requestedParameters.discardOldest = true;
- itemModify.requestedParameters.queueSize = 1;
- itemModify.requestedParameters.clientHandle = newMonitoredItemIds[0];
- UA_DataChangeFilter filter;
- UA_DataChangeFilter_init(&filter);
- filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
- filter.deadbandType = UA_DEADBANDTYPE_ABSOLUTE;
- filter.deadbandValue = 2.0;
- itemModify.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
- itemModify.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
- itemModify.requestedParameters.filter.content.decoded.data = &filter;
- UA_ModifyMonitoredItemsRequest modifyRequest;
- UA_ModifyMonitoredItemsRequest_init(&modifyRequest);
- modifyRequest.subscriptionId = subId;
- modifyRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
- modifyRequest.itemsToModify = &itemModify;
- modifyRequest.itemsToModifySize = 1;
- UA_ModifyMonitoredItemsResponse modifyResponse =
- UA_Client_MonitoredItems_modify(client, modifyRequest);
- ck_assert_uint_eq(modifyResponse.resultsSize, 1);
- ck_assert_uint_eq(modifyResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
- UA_ModifyMonitoredItemsResponse_deleteMembers(&modifyResponse);
- // This should trigger only once for the new filter
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 39.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert(fuzzyLastValueIsEqualTo(39.0));
- // This should trigger once at 43.0.
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert(fuzzyLastValueIsEqualTo(43.0));
- // remove monitored item
- UA_DeleteMonitoredItemsRequest deleteRequest;
- UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
- deleteRequest.subscriptionId = subId;
- deleteRequest.monitoredItemIds = newMonitoredItemIds;
- deleteRequest.monitoredItemIdsSize = 1;
- UA_DeleteMonitoredItemsResponse deleteResponse =
- UA_Client_MonitoredItems_delete(client, deleteRequest);
- ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(deleteResponse.resultsSize, 1);
- ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_GOOD);
- UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
- }
- END_TEST
- START_TEST(Server_MonitoredItemsAbsoluteFilterSetOnCreateRemoveLater) {
- UA_DataValue_init(&lastValue);
- /* define a monitored item with absolute filter */
- UA_MonitoredItemCreateRequest item = UA_MonitoredItemCreateRequest_default(outNodeId);;
- UA_DataChangeFilter filter;
- UA_DataChangeFilter_init(&filter);
- filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
- filter.deadbandType = UA_DEADBANDTYPE_ABSOLUTE;
- filter.deadbandValue = 2.0;
- item.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
- item.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
- item.requestedParameters.filter.content.decoded.data = &filter;
- UA_UInt32 newMonitoredItemIds[1];
- UA_Client_DataChangeNotificationCallback callbacks[1];
- callbacks[0] = dataChangeHandler;
- UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
- void *contexts[1];
- contexts[0] = NULL;
- UA_CreateMonitoredItemsRequest createRequest;
- UA_CreateMonitoredItemsRequest_init(&createRequest);
- createRequest.subscriptionId = subId;
- createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
- createRequest.itemsToCreate = &item;
- createRequest.itemsToCreateSize = 1;
- UA_CreateMonitoredItemsResponse createResponse =
- UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
- callbacks, deleteCallbacks);
- ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(createResponse.resultsSize, 1);
- ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
- newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
- UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
- // Do we get initial value ?
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert(fuzzyLastValueIsEqualTo(40.0));
- // This should not trigger because of filter
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(0, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(0, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, false);
- ck_assert_uint_eq(countNotificationReceived, 0);
- ck_assert(fuzzyLastValueIsEqualTo(40.0));
- // This should trigger once at 43.0.
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert(fuzzyLastValueIsEqualTo(43.0));
- // set back to 40.0
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 40.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert(fuzzyLastValueIsEqualTo(40.0));
- /* modify the monitored item with no filter */
- UA_MonitoredItemModifyRequest itemModify;
- UA_MonitoredItemModifyRequest_init(&itemModify);
- itemModify.monitoredItemId = newMonitoredItemIds[0];
- itemModify.requestedParameters.samplingInterval = 250;
- itemModify.requestedParameters.discardOldest = true;
- itemModify.requestedParameters.queueSize = 1;
- itemModify.requestedParameters.clientHandle = newMonitoredItemIds[0];
- UA_DataChangeFilter unsetfilter;
- UA_DataChangeFilter_init(&unsetfilter);
- unsetfilter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
- unsetfilter.deadbandType = UA_DEADBANDTYPE_NONE;
- unsetfilter.deadbandValue = 0.0;
- itemModify.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
- itemModify.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
- itemModify.requestedParameters.filter.content.decoded.data = &unsetfilter;
- UA_ModifyMonitoredItemsRequest modifyRequest;
- UA_ModifyMonitoredItemsRequest_init(&modifyRequest);
- modifyRequest.subscriptionId = subId;
- modifyRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
- modifyRequest.itemsToModify = &itemModify;
- modifyRequest.itemsToModifySize = 1;
- UA_ModifyMonitoredItemsResponse modifyResponse =
- UA_Client_MonitoredItems_modify(client, modifyRequest);
- ck_assert_uint_eq(modifyResponse.resultsSize, 1);
- ck_assert_uint_eq(modifyResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
- UA_ModifyMonitoredItemsResponse_deleteMembers(&modifyResponse);
- // This should trigger because now we do not filter
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 2);
- ck_assert(fuzzyLastValueIsEqualTo(42.0));
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 2);
- ck_assert(fuzzyLastValueIsEqualTo(44.0));
- // remove monitored item
- UA_DeleteMonitoredItemsRequest deleteRequest;
- UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
- deleteRequest.subscriptionId = subId;
- deleteRequest.monitoredItemIds = newMonitoredItemIds;
- deleteRequest.monitoredItemIdsSize = 1;
- UA_DeleteMonitoredItemsResponse deleteResponse =
- UA_Client_MonitoredItems_delete(client, deleteRequest);
- ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(deleteResponse.resultsSize, 1);
- ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_GOOD);
- UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
- }
- END_TEST
- START_TEST(Server_MonitoredItemsPercentFilterSetLater) {
- UA_DataValue_init(&lastValue);
- /* define a monitored item with no filter */
- UA_MonitoredItemCreateRequest item = UA_MonitoredItemCreateRequest_default(outNodeId);;
- UA_UInt32 newMonitoredItemIds[1];
- UA_Client_DataChangeNotificationCallback callbacks[1];
- callbacks[0] = dataChangeHandler;
- UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
- void *contexts[1];
- contexts[0] = NULL;
- UA_CreateMonitoredItemsRequest createRequest;
- UA_CreateMonitoredItemsRequest_init(&createRequest);
- createRequest.subscriptionId = subId;
- createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
- createRequest.itemsToCreate = &item;
- createRequest.itemsToCreateSize = 1;
- UA_CreateMonitoredItemsResponse createResponse =
- UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
- callbacks, deleteCallbacks);
- ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(createResponse.resultsSize, 1);
- ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
- newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
- UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
- // Do we get initial value ?
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert(fuzzyLastValueIsEqualTo(40.0));
- // This should trigger because no filter
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 2);
- ck_assert(fuzzyLastValueIsEqualTo(42.0));
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 2);
- ck_assert(fuzzyLastValueIsEqualTo(44.0));
- // set back to 40.0
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 40.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert(fuzzyLastValueIsEqualTo(40.0));
- /* modify the monitored item with an percent filter with deadbandvalue = 2.0 */
- UA_MonitoredItemModifyRequest itemModify;
- UA_MonitoredItemModifyRequest_init(&itemModify);
- itemModify.monitoredItemId = newMonitoredItemIds[0];
- itemModify.requestedParameters.samplingInterval = 250;
- itemModify.requestedParameters.discardOldest = true;
- itemModify.requestedParameters.queueSize = 1;
- itemModify.requestedParameters.clientHandle = newMonitoredItemIds[0];
- UA_DataChangeFilter filter;
- UA_DataChangeFilter_init(&filter);
- filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
- filter.deadbandType = UA_DEADBANDTYPE_PERCENT;
- filter.deadbandValue = 2.0;
- itemModify.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
- itemModify.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
- itemModify.requestedParameters.filter.content.decoded.data = &filter;
- UA_ModifyMonitoredItemsRequest modifyRequest;
- UA_ModifyMonitoredItemsRequest_init(&modifyRequest);
- modifyRequest.subscriptionId = subId;
- modifyRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
- modifyRequest.itemsToModify = &itemModify;
- modifyRequest.itemsToModifySize = 1;
- UA_ModifyMonitoredItemsResponse modifyResponse =
- UA_Client_MonitoredItems_modify(client, modifyRequest);
- ck_assert_uint_eq(modifyResponse.resultsSize, 1);
- ck_assert_uint_eq(modifyResponse.results[0].statusCode, UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED);
- UA_ModifyMonitoredItemsResponse_deleteMembers(&modifyResponse);
- // This should trigger because setting filter failed
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 2);
- ck_assert(fuzzyLastValueIsEqualTo(42.0));
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 2);
- ck_assert(fuzzyLastValueIsEqualTo(44.0));
- // remove monitored item
- UA_DeleteMonitoredItemsRequest deleteRequest;
- UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
- deleteRequest.subscriptionId = subId;
- deleteRequest.monitoredItemIds = newMonitoredItemIds;
- deleteRequest.monitoredItemIdsSize = 1;
- UA_DeleteMonitoredItemsResponse deleteResponse =
- UA_Client_MonitoredItems_delete(client, deleteRequest);
- ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(deleteResponse.resultsSize, 1);
- ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_GOOD);
- UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
- }
- END_TEST
- START_TEST(Server_MonitoredItemsNoFilter) {
- UA_DataValue_init(&lastValue);
- /* define a monitored item with an absolute filter with deadbandvalue = 2.0 */
- UA_MonitoredItemCreateRequest item = UA_MonitoredItemCreateRequest_default(outNodeId);;
- UA_UInt32 newMonitoredItemIds[1];
- UA_Client_DataChangeNotificationCallback callbacks[1];
- callbacks[0] = dataChangeHandler;
- UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
- void *contexts[1];
- contexts[0] = NULL;
- UA_CreateMonitoredItemsRequest createRequest;
- UA_CreateMonitoredItemsRequest_init(&createRequest);
- createRequest.subscriptionId = subId;
- createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
- createRequest.itemsToCreate = &item;
- createRequest.itemsToCreateSize = 1;
- UA_CreateMonitoredItemsResponse createResponse =
- UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
- callbacks, deleteCallbacks);
- ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(createResponse.resultsSize, 1);
- ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
- newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
- UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
- // Do we get initial value ?
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert(fuzzyLastValueIsEqualTo(40.0));
- // This should trigger because no filter
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 2);
- ck_assert(fuzzyLastValueIsEqualTo(42.0));
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(2, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 2);
- ck_assert(fuzzyLastValueIsEqualTo(44.0));
- // remove monitored item
- UA_DeleteMonitoredItemsRequest deleteRequest;
- UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
- deleteRequest.subscriptionId = subId;
- deleteRequest.monitoredItemIds = newMonitoredItemIds;
- deleteRequest.monitoredItemIdsSize = 1;
- UA_DeleteMonitoredItemsResponse deleteResponse =
- UA_Client_MonitoredItems_delete(client, deleteRequest);
- ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(deleteResponse.resultsSize, 1);
- ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_GOOD);
- UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
- }
- END_TEST
- /* Test if an absolute filter can be added for boolean variables */
- START_TEST(Server_MonitoredItemsAbsoluteFilterOnBool) {
- UA_DataValue_init(&lastValue);
- /* define a monitored item with an absolute filter with deadbandvalue = 2.0 */
- UA_MonitoredItemCreateRequest item =
- UA_MonitoredItemCreateRequest_default(UA_NODEID_STRING(1, "the.bool"));;
- UA_DataChangeFilter filter;
- UA_DataChangeFilter_init(&filter);
- filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
- filter.deadbandType = UA_DEADBANDTYPE_ABSOLUTE;
- filter.deadbandValue = 0.5;
- item.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
- item.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
- item.requestedParameters.filter.content.decoded.data = &filter;
- UA_Client_DataChangeNotificationCallback callbacks[1];
- callbacks[0] = dataChangeHandler;
- UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
- void *contexts[1];
- contexts[0] = NULL;
- UA_CreateMonitoredItemsRequest createRequest;
- UA_CreateMonitoredItemsRequest_init(&createRequest);
- createRequest.subscriptionId = subId;
- createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
- createRequest.itemsToCreate = &item;
- createRequest.itemsToCreateSize = 1;
- UA_CreateMonitoredItemsResponse createResponse =
- UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
- callbacks, deleteCallbacks);
- ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(createResponse.resultsSize, 1);
- ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
- UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
- }
- END_TEST
- START_TEST(Server_MonitoredItemsAbsoluteFilterSetOnCreate) {
- UA_DataValue_init(&lastValue);
- /* define a monitored item with an absolute filter with deadbandvalue = 2.0 */
- UA_MonitoredItemCreateRequest item = UA_MonitoredItemCreateRequest_default(outNodeId);;
- UA_DataChangeFilter filter;
- UA_DataChangeFilter_init(&filter);
- filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
- filter.deadbandType = UA_DEADBANDTYPE_ABSOLUTE;
- filter.deadbandValue = 2.0;
- item.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
- item.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
- item.requestedParameters.filter.content.decoded.data = &filter;
- UA_UInt32 newMonitoredItemIds[1];
- UA_Client_DataChangeNotificationCallback callbacks[1];
- callbacks[0] = dataChangeHandler;
- UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
- void *contexts[1];
- contexts[0] = NULL;
- UA_CreateMonitoredItemsRequest createRequest;
- UA_CreateMonitoredItemsRequest_init(&createRequest);
- createRequest.subscriptionId = subId;
- createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
- createRequest.itemsToCreate = &item;
- createRequest.itemsToCreateSize = 1;
- UA_CreateMonitoredItemsResponse createResponse =
- UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
- callbacks, deleteCallbacks);
- ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(createResponse.resultsSize, 1);
- ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_GOOD);
- newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
- UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
- // Do we get initial value ?
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert(fuzzyLastValueIsEqualTo(40.0));
- // This should not trigger because of filter
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 41.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(0, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 42.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(0, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, false);
- ck_assert_uint_eq(countNotificationReceived, 0);
- ck_assert(fuzzyLastValueIsEqualTo(40.0));
- // This should trigger once at 43.0.
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(setDouble(client, outNodeId, 43.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(setDouble(client, outNodeId, 44.0), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(waitForNotification(1, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, true);
- ck_assert_uint_eq(countNotificationReceived, 1);
- ck_assert(fuzzyLastValueIsEqualTo(43.0));
- // remove monitored item
- UA_DeleteMonitoredItemsRequest deleteRequest;
- UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
- deleteRequest.subscriptionId = subId;
- deleteRequest.monitoredItemIds = newMonitoredItemIds;
- deleteRequest.monitoredItemIdsSize = 1;
- UA_DeleteMonitoredItemsResponse deleteResponse =
- UA_Client_MonitoredItems_delete(client, deleteRequest);
- ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(deleteResponse.resultsSize, 1);
- ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_GOOD);
- UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
- }
- END_TEST
- START_TEST(Server_MonitoredItemsPercentFilterSetOnCreate) {
- UA_DataValue_init(&lastValue);
- /* define a monitored item with an percent filter with deadbandvalue = 2.0 */
- UA_MonitoredItemCreateRequest item = UA_MonitoredItemCreateRequest_default(outNodeId);;
- UA_DataChangeFilter filter;
- UA_DataChangeFilter_init(&filter);
- filter.trigger = UA_DATACHANGETRIGGER_STATUSVALUE;
- filter.deadbandType = UA_DEADBANDTYPE_PERCENT;
- filter.deadbandValue = 2.0;
- item.requestedParameters.filter.encoding = UA_EXTENSIONOBJECT_DECODED;
- item.requestedParameters.filter.content.decoded.type = &UA_TYPES[UA_TYPES_DATACHANGEFILTER];
- item.requestedParameters.filter.content.decoded.data = &filter;
- UA_UInt32 newMonitoredItemIds[1];
- UA_Client_DataChangeNotificationCallback callbacks[1];
- callbacks[0] = dataChangeHandler;
- UA_Client_DeleteMonitoredItemCallback deleteCallbacks[1] = {NULL};
- void *contexts[1];
- contexts[0] = NULL;
- UA_CreateMonitoredItemsRequest createRequest;
- UA_CreateMonitoredItemsRequest_init(&createRequest);
- createRequest.subscriptionId = subId;
- createRequest.timestampsToReturn = UA_TIMESTAMPSTORETURN_BOTH;
- createRequest.itemsToCreate = &item;
- createRequest.itemsToCreateSize = 1;
- UA_CreateMonitoredItemsResponse createResponse =
- UA_Client_MonitoredItems_createDataChanges(client, createRequest, contexts,
- callbacks, deleteCallbacks);
- ck_assert_uint_eq(createResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(createResponse.resultsSize, 1);
- ck_assert_uint_eq(createResponse.results[0].statusCode, UA_STATUSCODE_BADMONITOREDITEMFILTERUNSUPPORTED);
- newMonitoredItemIds[0] = createResponse.results[0].monitoredItemId;
- UA_CreateMonitoredItemsResponse_deleteMembers(&createResponse);
- // Do we get initial value ? (must fail)
- notificationReceived = false;
- countNotificationReceived = 0;
- ck_assert_uint_eq(waitForNotification(0, 10), UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(notificationReceived, false);
- ck_assert_uint_eq(countNotificationReceived, 0);
- // remove monitored item (must fail)
- UA_DeleteMonitoredItemsRequest deleteRequest;
- UA_DeleteMonitoredItemsRequest_init(&deleteRequest);
- deleteRequest.subscriptionId = subId;
- deleteRequest.monitoredItemIds = newMonitoredItemIds;
- deleteRequest.monitoredItemIdsSize = 1;
- UA_DeleteMonitoredItemsResponse deleteResponse =
- UA_Client_MonitoredItems_delete(client, deleteRequest);
- ck_assert_uint_eq(deleteResponse.responseHeader.serviceResult, UA_STATUSCODE_GOOD);
- ck_assert_uint_eq(deleteResponse.resultsSize, 1);
- ck_assert_uint_eq(deleteResponse.results[0], UA_STATUSCODE_BADMONITOREDITEMIDINVALID);
- UA_DeleteMonitoredItemsResponse_deleteMembers(&deleteResponse);
- }
- END_TEST
- #endif /*UA_ENABLE_SUBSCRIPTIONS*/
- static Suite* testSuite_Client(void) {
- Suite *s = suite_create("Server monitored item filter");
- TCase *tc_server = tcase_create("Server monitored item filter Basic");
- tcase_add_checked_fixture(tc_server, setup, teardown);
- #ifdef UA_ENABLE_SUBSCRIPTIONS
- tcase_add_test(tc_server, Server_MonitoredItemsNoFilter);
- tcase_add_test(tc_server, Server_MonitoredItemsAbsoluteFilterSetOnCreate);
- tcase_add_test(tc_server, Server_MonitoredItemsAbsoluteFilterOnBool);
- tcase_add_test(tc_server, Server_MonitoredItemsAbsoluteFilterSetLater);
- tcase_add_test(tc_server, Server_MonitoredItemsAbsoluteFilterSetOnCreateRemoveLater);
- tcase_add_test(tc_server, Server_MonitoredItemsPercentFilterSetOnCreate);
- tcase_add_test(tc_server, Server_MonitoredItemsPercentFilterSetLater);
- #endif /* UA_ENABLE_SUBSCRIPTIONS */
- suite_add_tcase(s, tc_server);
- return s;
- }
- int main(void) {
- Suite *s = testSuite_Client();
- SRunner *sr = srunner_create(s);
- srunner_set_fork_status(sr, CK_NOFORK);
- srunner_run_all(sr,CK_NORMAL);
- int number_failed = srunner_ntests_failed(sr);
- srunner_free(sr);
- return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
- }
|