| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404 |
- /*******************************************************************************
- * Copyright (c) 2017, Rockwell Automation, Inc.
- * All rights reserved.
- *
- ******************************************************************************/
- #include <CppUTest/TestHarness.h>
- #include <stdint.h>
- #include <string.h>
- extern "C" {
- #include "cipconnectionobject.h"
- }
- TEST_GROUP(CipConnectionObject) {
- };
- /* Get State tests */
- TEST(CipConnectionObject, GetStateNonExistent) {
- CipConnectionObject connection_object = { 0 };
- connection_object.state = 0;
- ConnectionObjectState state = ConnectionObjectGetState(&connection_object);
- CHECK_EQUAL(kConnectionObjectStateNonExistent, state);
- }
- TEST(CipConnectionObject, GetStateConfiguring) {
- CipConnectionObject connection_object = { 0 };
- connection_object.state = 1;
- ConnectionObjectState state = ConnectionObjectGetState(&connection_object);
- CHECK_EQUAL(kConnectionObjectStateConfiguring, state);
- }
- TEST(CipConnectionObject, GetStateWaitingForConnectionID) {
- CipConnectionObject connection_object = { 0 };
- connection_object.state = 2;
- ConnectionObjectState state = ConnectionObjectGetState(&connection_object);
- CHECK_EQUAL(kConnectionObjectStateWaitingForConnectionID, state);
- }
- TEST(CipConnectionObject, GetStateEstablished) {
- CipConnectionObject connection_object = { 0 };
- connection_object.state = 3;
- ConnectionObjectState state = ConnectionObjectGetState(&connection_object);
- CHECK_EQUAL(kConnectionObjectStateEstablished, state);
- }
- TEST(CipConnectionObject, GetStateTimedOut) {
- CipConnectionObject connection_object = { 0 };
- connection_object.state = 4;
- ConnectionObjectState state = ConnectionObjectGetState(&connection_object);
- CHECK_EQUAL(kConnectionObjectStateTimedOut, state);
- }
- TEST(CipConnectionObject, GetStateDeferredDelete) {
- CipConnectionObject connection_object = { 0 };
- connection_object.state = 5;
- ConnectionObjectState state = ConnectionObjectGetState(&connection_object);
- CHECK_EQUAL(kConnectionObjectStateDeferredDelete, state);
- }
- TEST(CipConnectionObject, GetStateClosing) {
- CipConnectionObject connection_object = { 0 };
- connection_object.state = 6;
- ConnectionObjectState state = ConnectionObjectGetState(&connection_object);
- CHECK_EQUAL(kConnectionObjectStateClosing, state);
- }
- TEST(CipConnectionObject, GetStateInvalid) {
- CipConnectionObject connection_object = { 0 };
- connection_object.state = 7;
- ConnectionObjectState state = ConnectionObjectGetState(&connection_object);
- CHECK_EQUAL(kConnectionObjectStateInvalid, state);
- }
- /* Set state tests */
- TEST(CipConnectionObject, SetStateNonExistent) {
- CipConnectionObject connection_object = { 0 };
- ConnectionObjectSetState(&connection_object, kConnectionObjectStateNonExistent);
- CHECK_EQUAL(0, connection_object.state);
- }
- TEST(CipConnectionObject, SetStateConfiguring) {
- CipConnectionObject connection_object = { 0 };
- ConnectionObjectSetState(&connection_object, kConnectionObjectStateConfiguring);
- CHECK_EQUAL(1, connection_object.state);
- }
- TEST(CipConnectionObject, SetStateWaitingForConnectionID) {
- CipConnectionObject connection_object = { 0 };
- ConnectionObjectSetState(&connection_object, kConnectionObjectStateWaitingForConnectionID);
- CHECK_EQUAL(2, connection_object.state);
- }
- TEST(CipConnectionObject, SetStateEstablished) {
- CipConnectionObject connection_object = { 0 };
- ConnectionObjectSetState(&connection_object, kConnectionObjectStateEstablished);
- CHECK_EQUAL(3, connection_object.state);
- }
- TEST(CipConnectionObject, SetStateTimedOut) {
- CipConnectionObject connection_object = { 0 };
- ConnectionObjectSetState(&connection_object, kConnectionObjectStateTimedOut);
- CHECK_EQUAL(4, connection_object.state);
- }
- TEST(CipConnectionObject, SetStateDeferredDelete) {
- CipConnectionObject connection_object = { 0 };
- ConnectionObjectSetState(&connection_object, kConnectionObjectStateDeferredDelete);
- CHECK_EQUAL(5, connection_object.state);
- }
- TEST(CipConnectionObject, SetStateClosing) {
- CipConnectionObject connection_object = { 0 };
- ConnectionObjectSetState(&connection_object, kConnectionObjectStateClosing);
- CHECK_EQUAL(6, connection_object.state);
- }
- /* Get InstanceType tests */
- TEST(CipConnectionObject, InstanceTypeIExplicitMessaging) {
- CipConnectionObject connection_object = { 0 };
- connection_object.instance_type =
- kConnectionObjectInstanceTypeExplicitMessaging;
- CipUsint value = ConnectionObjectGetInstanceTypeForAttribute(
- &connection_object);
- CHECK_EQUAL(0, value);
- }
- TEST(CipConnectionObject, InstanceTypeIO) {
- CipConnectionObject connection_object = { 0 };
- connection_object.instance_type = kConnectionObjectInstanceTypeIO;
- CipUsint value = ConnectionObjectGetInstanceTypeForAttribute(
- &connection_object);
- CHECK_EQUAL(1, value);
- }
- TEST(CipConnectionObject, InstanceTypeIOExclusiveOwner) {
- CipConnectionObject connection_object = { 0 };
- connection_object.instance_type =
- kConnectionObjectInstanceTypeIOExclusiveOwner;
- CipUsint value = ConnectionObjectGetInstanceTypeForAttribute(
- &connection_object);
- CHECK_EQUAL(1, value);
- }
- TEST(CipConnectionObject, InstanceTypeIOInputOnly) {
- CipConnectionObject connection_object = { 0 };
- connection_object.instance_type = kConnectionObjectInstanceTypeIOInputOnly;
- CipUsint value = ConnectionObjectGetInstanceTypeForAttribute(
- &connection_object);
- CHECK_EQUAL(1, value);
- }
- TEST(CipConnectionObject, InstanceTypeIOListenOnly) {
- CipConnectionObject connection_object = { 0 };
- connection_object.instance_type = kConnectionObjectInstanceTypeIOListenOnly;
- CipUsint value = ConnectionObjectGetInstanceTypeForAttribute(
- &connection_object);
- CHECK_EQUAL(1, value);
- }
- TEST(CipConnectionObject, InstanceTypeCipBridged) {
- CipConnectionObject connection_object = { 0 };
- connection_object.instance_type = kConnectionObjectInstanceTypeCipBridged;
- CipUsint value = ConnectionObjectGetInstanceTypeForAttribute(
- &connection_object);
- CHECK_EQUAL(2, value);
- }
- TEST(CipConnectionObject, TransportClassTriggerDirectionServer) {
- CipConnectionObject connection_object = { 0 };
- connection_object.transport_class_trigger = 0x80;
- ConnectionObjectTransportClassTriggerDirection direction =
- ConnectionObjectGetTransportClassTriggerDirection(&connection_object);
- CHECK_EQUAL(kConnectionObjectTransportClassTriggerDirectionServer, direction);
- }
- TEST(CipConnectionObject, TransportClassTriggerDirectionClient) {
- CipConnectionObject connection_object = { 0 };
- connection_object.transport_class_trigger = 0x00;
- ConnectionObjectTransportClassTriggerDirection direction =
- ConnectionObjectGetTransportClassTriggerDirection(&connection_object);
- CHECK_EQUAL(kConnectionObjectTransportClassTriggerDirectionClient, direction);
- }
- TEST(CipConnectionObject, TransportClassTriggerProductionTriggerInvalid) {
- CipConnectionObject connection_object = { 0 };
- connection_object.transport_class_trigger = 3 << 4;
- ConnectionObjectTransportClassTriggerProductionTrigger production_trigger =
- ConnectionObjectGetTransportClassTriggerProductionTrigger(
- &connection_object);
- CHECK_EQUAL(kConnectionObjectTransportClassTriggerProductionTriggerInvalid,
- production_trigger);
- }
- TEST(CipConnectionObject, TransportClassTriggerProductionTriggerCyclic) {
- CipConnectionObject connection_object = { 0 };
- connection_object.transport_class_trigger = 0x00;
- ConnectionObjectTransportClassTriggerProductionTrigger production_trigger =
- ConnectionObjectGetTransportClassTriggerProductionTrigger(
- &connection_object);
- CHECK_EQUAL(kConnectionObjectTransportClassTriggerProductionTriggerCyclic,
- production_trigger);
- }
- TEST(CipConnectionObject,
- TransportClassTriggerProductionTriggerChangeOfState) {
- CipConnectionObject connection_object = { 0 };
- connection_object.transport_class_trigger = 1 << 4;
- ConnectionObjectTransportClassTriggerProductionTrigger production_trigger =
- ConnectionObjectGetTransportClassTriggerProductionTrigger(
- &connection_object);
- CHECK_EQUAL(
- kConnectionObjectTransportClassTriggerProductionTriggerChangeOfState,
- production_trigger);
- }
- TEST(CipConnectionObject,
- TransportClassTriggerProductionTriggerApplicationObject) {
- CipConnectionObject connection_object = { 0 };
- connection_object.transport_class_trigger = 2 << 4;
- ConnectionObjectTransportClassTriggerProductionTrigger production_trigger =
- ConnectionObjectGetTransportClassTriggerProductionTrigger(
- &connection_object);
- CHECK_EQUAL(
- kConnectionObjectTransportClassTriggerProductionTriggerApplicationObject,
- production_trigger);
- }
- TEST(CipConnectionObject, TransportClassTriggerClassInvalid) {
- CipConnectionObject connection_object = { 0 };
- connection_object.transport_class_trigger = 5;
- ConnectionObjectTransportClassTriggerTransportClass transport_class =
- ConnectionObjectGetTransportClassTriggerTransportClass(&connection_object);
- CHECK_EQUAL(kConnectionObjectTransportClassTriggerTransportClassInvalid,
- transport_class);
- }
- TEST(CipConnectionObject, TransportClassTriggerClass0) {
- CipConnectionObject connection_object = { 0 };
- connection_object.transport_class_trigger = 0;
- ConnectionObjectTransportClassTriggerTransportClass transport_class =
- ConnectionObjectGetTransportClassTriggerTransportClass(&connection_object);
- CHECK_EQUAL(kConnectionObjectTransportClassTriggerTransportClass0,
- transport_class);
- }
- TEST(CipConnectionObject, TransportClassTriggerClass1) {
- CipConnectionObject connection_object = { 0 };
- connection_object.transport_class_trigger = 1;
- ConnectionObjectTransportClassTriggerTransportClass transport_class =
- ConnectionObjectGetTransportClassTriggerTransportClass(&connection_object);
- CHECK_EQUAL(kConnectionObjectTransportClassTriggerTransportClass1,
- transport_class);
- }
- TEST(CipConnectionObject, TransportClassTriggerClass2) {
- CipConnectionObject connection_object = { 0 };
- connection_object.transport_class_trigger = 2;
- ConnectionObjectTransportClassTriggerTransportClass transport_class =
- ConnectionObjectGetTransportClassTriggerTransportClass(&connection_object);
- CHECK_EQUAL(kConnectionObjectTransportClassTriggerTransportClass2,
- transport_class);
- }
- TEST(CipConnectionObject, TransportClassTriggerClass3) {
- CipConnectionObject connection_object = { 0 };
- connection_object.transport_class_trigger = 3;
- ConnectionObjectTransportClassTriggerTransportClass transport_class =
- ConnectionObjectGetTransportClassTriggerTransportClass(&connection_object);
- CHECK_EQUAL(kConnectionObjectTransportClassTriggerTransportClass3,
- transport_class);
- }
- TEST(CipConnectionObject, ExpectedPacketRate) {
- CipConnectionObject connection_object = { 0 };
- connection_object.t_to_o_requested_packet_interval = 11 * 1000; // 11 ms in µs
- ConnectionObjectSetExpectedPacketRate(&connection_object);
- CipUint expected_packet_rate = ConnectionObjectGetExpectedPacketRate(
- &connection_object);
- CHECK_EQUAL(20, expected_packet_rate);
- }
- TEST(CipConnectionObject, ExpectedPacketRateBelowTimerResolution) {
- CipConnectionObject connection_object = { 0 };
- connection_object.t_to_o_requested_packet_interval = 9 * 1000; // 9 ms in µs
- ConnectionObjectSetExpectedPacketRate(&connection_object);
- CipUint expected_packet_rate = ConnectionObjectGetExpectedPacketRate(
- &connection_object);
- CHECK_EQUAL(10, expected_packet_rate);
- }
- TEST(CipConnectionObject, ExpectedPacketRateZero) {
- CipConnectionObject connection_object = { 0 };
- connection_object.t_to_o_requested_packet_interval = 0; // A value of zero needs to be maintained, as this deactivates timeout
- ConnectionObjectSetExpectedPacketRate(&connection_object);
- CipUint expected_packet_rate = ConnectionObjectGetExpectedPacketRate(
- &connection_object);
- CHECK_EQUAL(0, expected_packet_rate);
- }
- TEST(CipConnectionObject, ParseConnectionData) {
- CipConnectionObject connection_object = { 0 };
- const CipOctet message[] =
- "\x06\x28\x00\x00\x00\x00\x00\x00\x00\x00\x98\xff\x18\x00\x78\x56" \
- "\x34\x12\x00\x00\x00\x00\xe0\x93\x04\x00\x02\x40\xa0\x86\x01\x00" \
- "\x22\x20\x01\x04\x20\x04\x24\x97\x2c\x98\x2c\x64";
- const CipOctet *message_runner = (const CipOctet *)message;
- ConnectionObjectInitializeFromMessage(&message_runner, &connection_object);
- CipUdint o_to_t_network_connection_id =
- ConnectionObjectGetCipConsumedConnectionID(&connection_object);
- CHECK_EQUAL(0, o_to_t_network_connection_id);
- CipUdint t_to_o_network_connection_id =
- ConnectionObjectGetCipProducedConnectionID(&connection_object);
- CHECK_EQUAL(0, t_to_o_network_connection_id);
- CipUint connection_serial_number = ConnectionObjectGetConnectionSerialNumber(
- &connection_object);
- CHECK_EQUAL(0xff98, connection_serial_number);
- CipUint vendor_id = ConnectionObjectGetOriginatorVendorId(&connection_object);
- CHECK_EQUAL(0x0018, vendor_id);
- CipUdint originator_serial_number = ConnectionObjectGetOriginatorSerialNumber(
- &connection_object);
- CHECK_EQUAL(0x12345678, originator_serial_number);
- CipUsint connection_timeout_multiplier =
- ConnectionObjectGetConnectionTimeoutMultiplier(&connection_object);
- CHECK_EQUAL(0, connection_timeout_multiplier);
- CipUdint o_to_t_rpi_in_microseconds =
- ConnectionObjectGetOToTRequestedPacketInterval(&connection_object);
- CHECK_EQUAL(300000, o_to_t_rpi_in_microseconds);
- bool o_to_t_redundant_owner = ConnectionObjectIsOToTRedundantOwner(
- &connection_object);
- CHECK_EQUAL(false, o_to_t_redundant_owner);
- ConnectionObjectConnectionType o_to_t_connection_type =
- ConnectionObjectGetOToTConnectionType(&connection_object);
- CHECK_EQUAL(kConnectionObjectConnectionTypePointToPoint,
- o_to_t_connection_type);
- ConnectionObjectPriority o_to_t_priority = ConnectionObjectGetOToTPriority(
- &connection_object);
- CHECK_EQUAL(kConnectionObjectPriorityLow, o_to_t_priority);
- ConnectionObjectConnectionSizeType o_to_t_connection_size_type =
- ConnectionObjectGetOToTConnectionSizeType(&connection_object);
- CHECK_EQUAL(kConnectionObjectConnectionSizeTypeFixed,
- o_to_t_connection_size_type);
- size_t o_to_t_connection_size = ConnectionObjectGetOToTConnectionSize(
- &connection_object);
- CHECK_EQUAL(2ULL, o_to_t_connection_size);
- //T to O Tests
- CipUdint t_to_o_rpi_in_microseconds =
- ConnectionObjectGetTToORequestedPacketInterval(&connection_object);
- CHECK_EQUAL(100000, t_to_o_rpi_in_microseconds);
- bool t_to_o_redundant_owner = ConnectionObjectIsTToORedundantOwner(
- &connection_object);
- CHECK_EQUAL(false, t_to_o_redundant_owner);
- ConnectionObjectConnectionType t_to_o_connection_type =
- ConnectionObjectGetTToOConnectionType(&connection_object);
- CHECK_EQUAL(kConnectionObjectConnectionTypeMulticast, t_to_o_connection_type);
- ConnectionObjectPriority t_to_o_priority = ConnectionObjectGetTToOPriority(
- &connection_object);
- CHECK_EQUAL(kConnectionObjectPriorityLow, t_to_o_priority);
- ConnectionObjectConnectionSizeType t_to_o_connection_size_type =
- ConnectionObjectGetTToOConnectionSizeType(&connection_object);
- CHECK_EQUAL(kConnectionObjectConnectionSizeTypeFixed,
- t_to_o_connection_size_type);
- size_t t_to_o_connection_size = ConnectionObjectGetTToOConnectionSize(
- &connection_object);
- CHECK_EQUAL(34ULL, t_to_o_connection_size);
- ConnectionObjectTransportClassTriggerDirection direction =
- ConnectionObjectGetTransportClassTriggerDirection(&connection_object);
- CHECK_EQUAL(kConnectionObjectTransportClassTriggerDirectionClient, direction);
- ConnectionObjectTransportClassTriggerProductionTrigger trigger =
- ConnectionObjectGetTransportClassTriggerProductionTrigger(&connection_object);
- CHECK_EQUAL(kConnectionObjectTransportClassTriggerProductionTriggerCyclic,
- trigger);
- ConnectionObjectTransportClassTriggerTransportClass transport_class =
- ConnectionObjectGetTransportClassTriggerTransportClass(&connection_object);
- CHECK_EQUAL(kConnectionObjectTransportClassTriggerTransportClass1,
- transport_class);
- }
|