ProfinetConnector/profinet_stack/p-net/test/test_cmina.cpp

266 lines
12 KiB
C++

/*********************************************************************
* _ _ _
* _ __ | |_ _ | | __ _ | |__ ___
* | '__|| __|(_)| | / _` || '_ \ / __|
* | | | |_ _ | || (_| || |_) |\__ \
* |_| \__|(_)|_| \__,_||_.__/ |___/
*
* www.rt-labs.com
* Copyright 2018 rt-labs AB, Sweden.
*
* This software is dual-licensed under GPLv3 and a commercial
* license. See the file LICENSE.md distributed with this software for
* full license information.
********************************************************************/
#include "utils_for_testing.h"
#include "mocks.h"
#include "pf_includes.h"
#include <gtest/gtest.h>
class CminaUnitTest : public PnetUnitTest
{
};
TEST_F (CminaUnitTest, CminaCheckIsStationNameValid)
{
EXPECT_TRUE (pf_cmina_is_stationname_valid ("", 0));
EXPECT_TRUE (pf_cmina_is_stationname_valid ("abc", 3));
EXPECT_TRUE (pf_cmina_is_stationname_valid ("a1.2.3.4", 8));
EXPECT_TRUE (
pf_cmina_is_stationname_valid ("device-1.machine-1.plant-1.vendor", 33));
EXPECT_TRUE (pf_cmina_is_stationname_valid (
"xn--mhle1-kva.xn--lmhle1-vxa4c.plant.com",
40));
EXPECT_TRUE (pf_cmina_is_stationname_valid ("port-xyz", 8));
EXPECT_TRUE (pf_cmina_is_stationname_valid ("port-xyz-abcde", 14));
EXPECT_TRUE (pf_cmina_is_stationname_valid (
"abcdefghijklmnopqrstuvwxyz-abcdefghijklmnopqrstuvwxyz1234567890",
63));
EXPECT_TRUE (pf_cmina_is_stationname_valid (
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb."
"ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc."
"dddddddddddddddddddddddddddddddddddddddddddddddd",
240));
EXPECT_FALSE (pf_cmina_is_stationname_valid (
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb."
"ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc."
"dddddddddddddddddddddddddddddddddddddddddddddddd",
240));
EXPECT_FALSE (pf_cmina_is_stationname_valid (
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb."
"ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc."
"ddddddddddddddddddddddddddddddddddddddddddddddddd",
241));
EXPECT_FALSE (pf_cmina_is_stationname_valid ("name_1", 6));
EXPECT_FALSE (pf_cmina_is_stationname_valid ("name/1", 6));
EXPECT_FALSE (pf_cmina_is_stationname_valid ("-name", 5));
EXPECT_FALSE (pf_cmina_is_stationname_valid ("name-", 5));
EXPECT_FALSE (pf_cmina_is_stationname_valid ("name.-name", 10));
EXPECT_FALSE (pf_cmina_is_stationname_valid ("name.name-", 10));
EXPECT_FALSE (pf_cmina_is_stationname_valid (
"looooooooooooooooooooooooooooooooooooooooooooooooooooooonglabelname",
67));
EXPECT_FALSE (pf_cmina_is_stationname_valid ("1.2.3.4", 7));
EXPECT_FALSE (pf_cmina_is_stationname_valid ("port-123", 8));
EXPECT_FALSE (pf_cmina_is_stationname_valid ("port-123-98765", 14));
}
TEST_F (CminaUnitTest, CminaCheckIsNetmaskValid)
{
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (0, 0, 0, 0)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 255)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 254)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 252)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 248)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 240)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 224)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 192)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 128)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 254, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 252, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 248, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 240, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 224, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 192, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 128, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 254, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 252, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 248, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 240, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 224, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 192, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 128, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 000, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (254, 000, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (252, 000, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (248, 000, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (240, 000, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (224, 000, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (192, 000, 000, 000)));
EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (128, 000, 000, 000)));
EXPECT_FALSE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 0, 255, 255)));
EXPECT_FALSE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (0, 255, 255, 255)));
EXPECT_FALSE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 254, 255, 0)));
}
TEST_F (CminaUnitTest, CminaCheckIsIPaddressValid)
{
/* 0.0.0.0 /32 Mandatory 0.0.0.0 up to 0.0.0.0
Special case: No IPsuite assigned in conjunction with
SubnetMask and StandardGateway set to zero */
EXPECT_TRUE (pf_cmina_is_ipaddress_valid (
PNAL_MAKEU32 (0, 0, 0, 0),
PNAL_MAKEU32 (0, 0, 0, 0)));
/* 0.0.0.0 /8 Invalid 0.0.0.0 up to 0.255.255.255
Reserved according to IETF RFC 6890 */
EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
PNAL_MAKEU32 (255, 0, 0, 0),
PNAL_MAKEU32 (0, 255, 1, 1)));
/* 127.0.0.0 /8 Invalid 127.0.0.0 up to 127.255.255.255
Reserved according to IETF RFC 6890 loopback address */
EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
PNAL_MAKEU32 (255, 0, 0, 0),
PNAL_MAKEU32 (127, 0, 0, 1)));
/* 224.0.0.0 /4 Invalid 224.0.0.0 up to 239.255.255.255
Reserved according to IETF RFC 6890; IPv4 multicast address assignments */
EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
PNAL_MAKEU32 (0xF0, 0, 0, 0),
PNAL_MAKEU32 (224, 0, 0, 34)));
/* 240.0.0.0 /4 Invalid 240.0.0.0 up to 255.255.255.255
Reserved according to IETF RFC 6890; reserved for future addressing */
EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
PNAL_MAKEU32 (0xF0, 0, 0, 0),
PNAL_MAKEU32 (240, 0, 0, 34)));
/* Invalid — Subnet part of the IPAddress is “0” */
EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
PNAL_MAKEU32 (255, 255, 0, 0),
PNAL_MAKEU32 (0, 0, 1, 10)));
/* Invalid Host part of the IPAddress is a series of consecutive “1”
(subnet broadcast address)
IPAddress may be accepted but should be invalid.*/
EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
PNAL_MAKEU32 (255, 255, 0, 0),
PNAL_MAKEU32 (192, 168, 255, 255)));
/* Invalid — Host part of the IPAddress is a series of consecutive “0”
(subnet address)
IPAddress may be accepted but should be invalid. */
EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
PNAL_MAKEU32 (255, 255, 0, 0),
PNAL_MAKEU32 (192, 168, 0, 0)));
/* Other Mandatory — IP address assigned */
EXPECT_TRUE (pf_cmina_is_ipaddress_valid (
PNAL_MAKEU32 (255, 255, 0, 0),
PNAL_MAKEU32 (192, 168, 1, 1)));
EXPECT_TRUE (pf_cmina_is_ipaddress_valid (
PNAL_MAKEU32 (255, 255, 255, 0),
PNAL_MAKEU32 (10, 10, 0, 35)));
}
TEST_F (CminaUnitTest, CminaCheckIsGatewayValid)
{
EXPECT_TRUE (pf_cmina_is_gateway_valid (
PNAL_MAKEU32 (192, 168, 1, 4),
PNAL_MAKEU32 (255, 255, 255, 0),
PNAL_MAKEU32 (192, 168, 1, 1)));
EXPECT_TRUE (pf_cmina_is_gateway_valid (
PNAL_MAKEU32 (192, 168, 1, 4),
PNAL_MAKEU32 (255, 255, 255, 0),
PNAL_MAKEU32 (0, 0, 0, 0)));
EXPECT_FALSE (pf_cmina_is_gateway_valid (
PNAL_MAKEU32 (192, 168, 1, 4),
PNAL_MAKEU32 (255, 255, 255, 0),
PNAL_MAKEU32 (192, 169, 1, 1)));
EXPECT_FALSE (pf_cmina_is_gateway_valid (
PNAL_MAKEU32 (192, 168, 1, 4),
PNAL_MAKEU32 (255, 255, 255, 0),
PNAL_MAKEU32 (192, 168, 0, 1)));
}
TEST_F (CminaUnitTest, CminaCheckHasTimedOut)
{
// Interval length 1 ms (= 32), factor 1
EXPECT_FALSE (pf_cmina_has_timed_out (0, 0, 32, 1));
EXPECT_FALSE (pf_cmina_has_timed_out (999, 0, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (1000, 0, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (1001, 0, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX, 0, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (0, 1000, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (999, 1000, 32, 1));
EXPECT_FALSE (pf_cmina_has_timed_out (1000, 1000, 32, 1));
EXPECT_FALSE (pf_cmina_has_timed_out (1001, 1000, 32, 1));
EXPECT_FALSE (pf_cmina_has_timed_out (1999, 1000, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (2000, 1000, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (2001, 1000, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (3000, 1000, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (4000, 1000, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX, 1000, 32, 1));
EXPECT_FALSE (pf_cmina_has_timed_out (0, UINT32_MAX, 32, 1));
EXPECT_FALSE (pf_cmina_has_timed_out (998, UINT32_MAX, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (999, UINT32_MAX, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (1000, UINT32_MAX, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (1001, UINT32_MAX, 32, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX - 1, UINT32_MAX, 32, 1));
EXPECT_FALSE (pf_cmina_has_timed_out (UINT32_MAX, UINT32_MAX, 32, 1));
// Interval length 1 ms, factor 3
EXPECT_TRUE (pf_cmina_has_timed_out (0, 1000, 32, 3));
EXPECT_TRUE (pf_cmina_has_timed_out (999, 1000, 32, 3));
EXPECT_FALSE (pf_cmina_has_timed_out (1000, 1000, 32, 3));
EXPECT_FALSE (pf_cmina_has_timed_out (1001, 1000, 32, 3));
EXPECT_FALSE (pf_cmina_has_timed_out (3999, 1000, 32, 3));
EXPECT_TRUE (pf_cmina_has_timed_out (4000, 1000, 32, 3));
EXPECT_TRUE (pf_cmina_has_timed_out (4001, 1000, 32, 3));
EXPECT_TRUE (pf_cmina_has_timed_out (5000, 1000, 32, 3));
EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX, 1000, 32, 3));
// Interval length 31.25 microseconds, factor 1
EXPECT_TRUE (pf_cmina_has_timed_out (0, 1000, 1, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (999, 1000, 1, 1));
EXPECT_FALSE (pf_cmina_has_timed_out (1000, 1000, 1, 1));
EXPECT_FALSE (pf_cmina_has_timed_out (1001, 1000, 1, 1));
EXPECT_FALSE (pf_cmina_has_timed_out (1030, 1000, 1, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (1031, 1000, 1, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (1032, 1000, 1, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (2000, 1000, 1, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX, 1000, 1, 1));
// No interval
EXPECT_TRUE (pf_cmina_has_timed_out (0, 1000, 0, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (999, 1000, 0, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (1000, 1000, 0, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (1001, 1000, 0, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX, 1000, 0, 1));
EXPECT_TRUE (pf_cmina_has_timed_out (0, 1000, 32, 0));
EXPECT_TRUE (pf_cmina_has_timed_out (999, 1000, 32, 0));
EXPECT_TRUE (pf_cmina_has_timed_out (1000, 1000, 32, 0));
EXPECT_TRUE (pf_cmina_has_timed_out (1001, 1000, 32, 0));
EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX, 1000, 32, 0));
}