test_cmina.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /*********************************************************************
  2. * _ _ _
  3. * _ __ | |_ _ | | __ _ | |__ ___
  4. * | '__|| __|(_)| | / _` || '_ \ / __|
  5. * | | | |_ _ | || (_| || |_) |\__ \
  6. * |_| \__|(_)|_| \__,_||_.__/ |___/
  7. *
  8. * www.rt-labs.com
  9. * Copyright 2018 rt-labs AB, Sweden.
  10. *
  11. * This software is dual-licensed under GPLv3 and a commercial
  12. * license. See the file LICENSE.md distributed with this software for
  13. * full license information.
  14. ********************************************************************/
  15. #include "utils_for_testing.h"
  16. #include "mocks.h"
  17. #include "pf_includes.h"
  18. #include <gtest/gtest.h>
  19. class CminaUnitTest : public PnetUnitTest
  20. {
  21. };
  22. TEST_F (CminaUnitTest, CminaCheckIsStationNameValid)
  23. {
  24. EXPECT_TRUE (pf_cmina_is_stationname_valid ("", 0));
  25. EXPECT_TRUE (pf_cmina_is_stationname_valid ("abc", 3));
  26. EXPECT_TRUE (pf_cmina_is_stationname_valid ("a1.2.3.4", 8));
  27. EXPECT_TRUE (
  28. pf_cmina_is_stationname_valid ("device-1.machine-1.plant-1.vendor", 33));
  29. EXPECT_TRUE (pf_cmina_is_stationname_valid (
  30. "xn--mhle1-kva.xn--lmhle1-vxa4c.plant.com",
  31. 40));
  32. EXPECT_TRUE (pf_cmina_is_stationname_valid ("port-xyz", 8));
  33. EXPECT_TRUE (pf_cmina_is_stationname_valid ("port-xyz-abcde", 14));
  34. EXPECT_TRUE (pf_cmina_is_stationname_valid (
  35. "abcdefghijklmnopqrstuvwxyz-abcdefghijklmnopqrstuvwxyz1234567890",
  36. 63));
  37. EXPECT_TRUE (pf_cmina_is_stationname_valid (
  38. "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."
  39. "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb."
  40. "ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc."
  41. "dddddddddddddddddddddddddddddddddddddddddddddddd",
  42. 240));
  43. EXPECT_FALSE (pf_cmina_is_stationname_valid (
  44. "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."
  45. "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb."
  46. "ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc."
  47. "dddddddddddddddddddddddddddddddddddddddddddddddd",
  48. 240));
  49. EXPECT_FALSE (pf_cmina_is_stationname_valid (
  50. "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa."
  51. "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb."
  52. "ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc."
  53. "ddddddddddddddddddddddddddddddddddddddddddddddddd",
  54. 241));
  55. EXPECT_FALSE (pf_cmina_is_stationname_valid ("name_1", 6));
  56. EXPECT_FALSE (pf_cmina_is_stationname_valid ("name/1", 6));
  57. EXPECT_FALSE (pf_cmina_is_stationname_valid ("-name", 5));
  58. EXPECT_FALSE (pf_cmina_is_stationname_valid ("name-", 5));
  59. EXPECT_FALSE (pf_cmina_is_stationname_valid ("name.-name", 10));
  60. EXPECT_FALSE (pf_cmina_is_stationname_valid ("name.name-", 10));
  61. EXPECT_FALSE (pf_cmina_is_stationname_valid (
  62. "looooooooooooooooooooooooooooooooooooooooooooooooooooooonglabelname",
  63. 67));
  64. EXPECT_FALSE (pf_cmina_is_stationname_valid ("1.2.3.4", 7));
  65. EXPECT_FALSE (pf_cmina_is_stationname_valid ("port-123", 8));
  66. EXPECT_FALSE (pf_cmina_is_stationname_valid ("port-123-98765", 14));
  67. }
  68. TEST_F (CminaUnitTest, CminaCheckIsNetmaskValid)
  69. {
  70. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (0, 0, 0, 0)));
  71. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 255)));
  72. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 254)));
  73. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 252)));
  74. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 248)));
  75. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 240)));
  76. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 224)));
  77. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 192)));
  78. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 128)));
  79. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 255, 000)));
  80. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 254, 000)));
  81. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 252, 000)));
  82. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 248, 000)));
  83. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 240, 000)));
  84. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 224, 000)));
  85. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 192, 000)));
  86. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 128, 000)));
  87. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 255, 000, 000)));
  88. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 254, 000, 000)));
  89. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 252, 000, 000)));
  90. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 248, 000, 000)));
  91. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 240, 000, 000)));
  92. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 224, 000, 000)));
  93. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 192, 000, 000)));
  94. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 128, 000, 000)));
  95. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 000, 000, 000)));
  96. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (254, 000, 000, 000)));
  97. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (252, 000, 000, 000)));
  98. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (248, 000, 000, 000)));
  99. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (240, 000, 000, 000)));
  100. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (224, 000, 000, 000)));
  101. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (192, 000, 000, 000)));
  102. EXPECT_TRUE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (128, 000, 000, 000)));
  103. EXPECT_FALSE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 0, 255, 255)));
  104. EXPECT_FALSE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (0, 255, 255, 255)));
  105. EXPECT_FALSE (pf_cmina_is_netmask_valid (PNAL_MAKEU32 (255, 254, 255, 0)));
  106. }
  107. TEST_F (CminaUnitTest, CminaCheckIsIPaddressValid)
  108. {
  109. /* 0.0.0.0 /32 Mandatory 0.0.0.0 up to 0.0.0.0
  110. Special case: No IPsuite assigned in conjunction with
  111. SubnetMask and StandardGateway set to zero */
  112. EXPECT_TRUE (pf_cmina_is_ipaddress_valid (
  113. PNAL_MAKEU32 (0, 0, 0, 0),
  114. PNAL_MAKEU32 (0, 0, 0, 0)));
  115. /* 0.0.0.0 /8 Invalid 0.0.0.0 up to 0.255.255.255
  116. Reserved according to IETF RFC 6890 */
  117. EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
  118. PNAL_MAKEU32 (255, 0, 0, 0),
  119. PNAL_MAKEU32 (0, 255, 1, 1)));
  120. /* 127.0.0.0 /8 Invalid 127.0.0.0 up to 127.255.255.255
  121. Reserved according to IETF RFC 6890 loopback address */
  122. EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
  123. PNAL_MAKEU32 (255, 0, 0, 0),
  124. PNAL_MAKEU32 (127, 0, 0, 1)));
  125. /* 224.0.0.0 /4 Invalid 224.0.0.0 up to 239.255.255.255
  126. Reserved according to IETF RFC 6890; IPv4 multicast address assignments */
  127. EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
  128. PNAL_MAKEU32 (0xF0, 0, 0, 0),
  129. PNAL_MAKEU32 (224, 0, 0, 34)));
  130. /* 240.0.0.0 /4 Invalid 240.0.0.0 up to 255.255.255.255
  131. Reserved according to IETF RFC 6890; reserved for future addressing */
  132. EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
  133. PNAL_MAKEU32 (0xF0, 0, 0, 0),
  134. PNAL_MAKEU32 (240, 0, 0, 34)));
  135. /* Invalid — Subnet part of the IPAddress is “0” */
  136. EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
  137. PNAL_MAKEU32 (255, 255, 0, 0),
  138. PNAL_MAKEU32 (0, 0, 1, 10)));
  139. /* Invalid Host part of the IPAddress is a series of consecutive “1”
  140. (subnet broadcast address)
  141. IPAddress may be accepted but should be invalid.*/
  142. EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
  143. PNAL_MAKEU32 (255, 255, 0, 0),
  144. PNAL_MAKEU32 (192, 168, 255, 255)));
  145. /* Invalid — Host part of the IPAddress is a series of consecutive “0”
  146. (subnet address)
  147. IPAddress may be accepted but should be invalid. */
  148. EXPECT_FALSE (pf_cmina_is_ipaddress_valid (
  149. PNAL_MAKEU32 (255, 255, 0, 0),
  150. PNAL_MAKEU32 (192, 168, 0, 0)));
  151. /* Other Mandatory — IP address assigned */
  152. EXPECT_TRUE (pf_cmina_is_ipaddress_valid (
  153. PNAL_MAKEU32 (255, 255, 0, 0),
  154. PNAL_MAKEU32 (192, 168, 1, 1)));
  155. EXPECT_TRUE (pf_cmina_is_ipaddress_valid (
  156. PNAL_MAKEU32 (255, 255, 255, 0),
  157. PNAL_MAKEU32 (10, 10, 0, 35)));
  158. }
  159. TEST_F (CminaUnitTest, CminaCheckIsGatewayValid)
  160. {
  161. EXPECT_TRUE (pf_cmina_is_gateway_valid (
  162. PNAL_MAKEU32 (192, 168, 1, 4),
  163. PNAL_MAKEU32 (255, 255, 255, 0),
  164. PNAL_MAKEU32 (192, 168, 1, 1)));
  165. EXPECT_TRUE (pf_cmina_is_gateway_valid (
  166. PNAL_MAKEU32 (192, 168, 1, 4),
  167. PNAL_MAKEU32 (255, 255, 255, 0),
  168. PNAL_MAKEU32 (0, 0, 0, 0)));
  169. EXPECT_FALSE (pf_cmina_is_gateway_valid (
  170. PNAL_MAKEU32 (192, 168, 1, 4),
  171. PNAL_MAKEU32 (255, 255, 255, 0),
  172. PNAL_MAKEU32 (192, 169, 1, 1)));
  173. EXPECT_FALSE (pf_cmina_is_gateway_valid (
  174. PNAL_MAKEU32 (192, 168, 1, 4),
  175. PNAL_MAKEU32 (255, 255, 255, 0),
  176. PNAL_MAKEU32 (192, 168, 0, 1)));
  177. }
  178. TEST_F (CminaUnitTest, CminaCheckHasTimedOut)
  179. {
  180. // Interval length 1 ms (= 32), factor 1
  181. EXPECT_FALSE (pf_cmina_has_timed_out (0, 0, 32, 1));
  182. EXPECT_FALSE (pf_cmina_has_timed_out (999, 0, 32, 1));
  183. EXPECT_TRUE (pf_cmina_has_timed_out (1000, 0, 32, 1));
  184. EXPECT_TRUE (pf_cmina_has_timed_out (1001, 0, 32, 1));
  185. EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX, 0, 32, 1));
  186. EXPECT_TRUE (pf_cmina_has_timed_out (0, 1000, 32, 1));
  187. EXPECT_TRUE (pf_cmina_has_timed_out (999, 1000, 32, 1));
  188. EXPECT_FALSE (pf_cmina_has_timed_out (1000, 1000, 32, 1));
  189. EXPECT_FALSE (pf_cmina_has_timed_out (1001, 1000, 32, 1));
  190. EXPECT_FALSE (pf_cmina_has_timed_out (1999, 1000, 32, 1));
  191. EXPECT_TRUE (pf_cmina_has_timed_out (2000, 1000, 32, 1));
  192. EXPECT_TRUE (pf_cmina_has_timed_out (2001, 1000, 32, 1));
  193. EXPECT_TRUE (pf_cmina_has_timed_out (3000, 1000, 32, 1));
  194. EXPECT_TRUE (pf_cmina_has_timed_out (4000, 1000, 32, 1));
  195. EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX, 1000, 32, 1));
  196. EXPECT_FALSE (pf_cmina_has_timed_out (0, UINT32_MAX, 32, 1));
  197. EXPECT_FALSE (pf_cmina_has_timed_out (998, UINT32_MAX, 32, 1));
  198. EXPECT_TRUE (pf_cmina_has_timed_out (999, UINT32_MAX, 32, 1));
  199. EXPECT_TRUE (pf_cmina_has_timed_out (1000, UINT32_MAX, 32, 1));
  200. EXPECT_TRUE (pf_cmina_has_timed_out (1001, UINT32_MAX, 32, 1));
  201. EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX - 1, UINT32_MAX, 32, 1));
  202. EXPECT_FALSE (pf_cmina_has_timed_out (UINT32_MAX, UINT32_MAX, 32, 1));
  203. // Interval length 1 ms, factor 3
  204. EXPECT_TRUE (pf_cmina_has_timed_out (0, 1000, 32, 3));
  205. EXPECT_TRUE (pf_cmina_has_timed_out (999, 1000, 32, 3));
  206. EXPECT_FALSE (pf_cmina_has_timed_out (1000, 1000, 32, 3));
  207. EXPECT_FALSE (pf_cmina_has_timed_out (1001, 1000, 32, 3));
  208. EXPECT_FALSE (pf_cmina_has_timed_out (3999, 1000, 32, 3));
  209. EXPECT_TRUE (pf_cmina_has_timed_out (4000, 1000, 32, 3));
  210. EXPECT_TRUE (pf_cmina_has_timed_out (4001, 1000, 32, 3));
  211. EXPECT_TRUE (pf_cmina_has_timed_out (5000, 1000, 32, 3));
  212. EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX, 1000, 32, 3));
  213. // Interval length 31.25 microseconds, factor 1
  214. EXPECT_TRUE (pf_cmina_has_timed_out (0, 1000, 1, 1));
  215. EXPECT_TRUE (pf_cmina_has_timed_out (999, 1000, 1, 1));
  216. EXPECT_FALSE (pf_cmina_has_timed_out (1000, 1000, 1, 1));
  217. EXPECT_FALSE (pf_cmina_has_timed_out (1001, 1000, 1, 1));
  218. EXPECT_FALSE (pf_cmina_has_timed_out (1030, 1000, 1, 1));
  219. EXPECT_TRUE (pf_cmina_has_timed_out (1031, 1000, 1, 1));
  220. EXPECT_TRUE (pf_cmina_has_timed_out (1032, 1000, 1, 1));
  221. EXPECT_TRUE (pf_cmina_has_timed_out (2000, 1000, 1, 1));
  222. EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX, 1000, 1, 1));
  223. // No interval
  224. EXPECT_TRUE (pf_cmina_has_timed_out (0, 1000, 0, 1));
  225. EXPECT_TRUE (pf_cmina_has_timed_out (999, 1000, 0, 1));
  226. EXPECT_TRUE (pf_cmina_has_timed_out (1000, 1000, 0, 1));
  227. EXPECT_TRUE (pf_cmina_has_timed_out (1001, 1000, 0, 1));
  228. EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX, 1000, 0, 1));
  229. EXPECT_TRUE (pf_cmina_has_timed_out (0, 1000, 32, 0));
  230. EXPECT_TRUE (pf_cmina_has_timed_out (999, 1000, 32, 0));
  231. EXPECT_TRUE (pf_cmina_has_timed_out (1000, 1000, 32, 0));
  232. EXPECT_TRUE (pf_cmina_has_timed_out (1001, 1000, 32, 0));
  233. EXPECT_TRUE (pf_cmina_has_timed_out (UINT32_MAX, 1000, 32, 0));
  234. }