endianconvtest.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /*******************************************************************************
  2. * Copyright (c) 2016, Rockwell Automation, Inc.
  3. * All rights reserved.
  4. *
  5. ******************************************************************************/
  6. #include <CppUTest/TestHarness.h>
  7. #include <stdint.h>
  8. #include <string.h>
  9. extern "C" {
  10. #include <sys/socket.h>
  11. #include <arpa/inet.h>
  12. #include "endianconv.h"
  13. #include "ciptypes.h"
  14. }
  15. TEST_GROUP (EndianConversion) {
  16. };
  17. TEST(EndianConversion, GetSintFromMessage) {
  18. const CipOctet test_message[] = {8};
  19. const CipOctet *message_pointer = test_message;
  20. const CipOctet **const message = &message_pointer;
  21. CipSint returned_value = GetSintFromMessage(message);
  22. LONGS_EQUAL(8, returned_value);
  23. POINTERS_EQUAL(test_message + 1, *message);
  24. }
  25. TEST(EndianConversion, GetUsintFromMessage) {
  26. const CipOctet test_message[] = {8};
  27. const CipOctet *message_pointer = test_message;
  28. const CipOctet **const message = &message_pointer;
  29. CipUsint returned_value = GetUsintFromMessage(message);
  30. LONGS_EQUAL(8, returned_value);
  31. POINTERS_EQUAL(test_message + 1, *message);
  32. }
  33. TEST(EndianConversion, GetByteFromMessage) {
  34. const CipOctet test_message[] = {8};
  35. const CipOctet *message_pointer = test_message;
  36. const CipOctet **const message = &message_pointer;
  37. CipByte returned_value = GetByteFromMessage(message);
  38. LONGS_EQUAL(8, returned_value);
  39. POINTERS_EQUAL(test_message + 1, *message);
  40. }
  41. TEST(EndianConversion, GetIntFromMessage) {
  42. const CipOctet test_message[] = {8, 60};
  43. const CipOctet *message_pointer = test_message;
  44. const CipOctet **const message = &message_pointer;
  45. CipInt returned_value = GetIntFromMessage(message);
  46. LONGS_EQUAL(15368, returned_value);
  47. POINTERS_EQUAL(test_message + 2, *message);
  48. }
  49. TEST(EndianConversion, GetUintFromMessage) {
  50. const CipOctet test_message[] = {8, 60};
  51. const CipOctet *message_pointer = test_message;
  52. const CipOctet **const message = &message_pointer;
  53. CipUint returned_value = GetUintFromMessage(message);
  54. LONGS_EQUAL(15368, returned_value);
  55. POINTERS_EQUAL(test_message + 2, *message);
  56. }
  57. TEST(EndianConversion, GetWordFromMessage) {
  58. const CipOctet test_message[] = {8, 60};
  59. const CipOctet *message_pointer = test_message;
  60. const CipOctet **const message = &message_pointer;
  61. CipWord returned_value = GetWordFromMessage(message);
  62. LONGS_EQUAL(15368, returned_value);
  63. POINTERS_EQUAL(test_message + 2, *message);
  64. }
  65. TEST(EndianConversion, GetDintFromMessage) {
  66. const CipOctet test_message[] = {28, 53, 41, 37};
  67. const CipOctet *message_pointer = test_message;
  68. const CipOctet **const message = &message_pointer;
  69. CipDint returned_value = GetDintFromMessage(message);
  70. LONGS_EQUAL(623457564, returned_value);
  71. POINTERS_EQUAL(test_message + 4, *message);
  72. }
  73. TEST(EndianConversion, GetUdintFromMessage) {
  74. const CipOctet test_message[] = {28, 53, 41, 37};
  75. const CipOctet *message_pointer = test_message;
  76. const CipOctet **const message = &message_pointer;
  77. CipUdint returned_value = GetUdintFromMessage(message);
  78. LONGS_EQUAL(623457564, returned_value);
  79. POINTERS_EQUAL(test_message + 4, *message);
  80. }
  81. TEST(EndianConversion, GetDwordFromMessage) {
  82. const CipOctet test_message[] = {28, 53, 41, 37};
  83. const CipOctet *message_pointer = test_message;
  84. const CipOctet **const message = &message_pointer;
  85. CipDword returned_value = GetDwordFromMessage(message);
  86. LONGS_EQUAL(623457564, returned_value);
  87. POINTERS_EQUAL(test_message + 4, *message);
  88. }
  89. TEST(EndianConversion, GetLintFromMessage) {
  90. const CipOctet test_message[] = {81, 126, 166, 15, 70, 97, 208, 236};
  91. const CipOctet *message_pointer = test_message;
  92. const CipOctet **const message = &message_pointer;
  93. EipUint64 returned_value = GetLintFromMessage(message);
  94. LONGS_EQUAL(5872313548673241324, returned_value);
  95. POINTERS_EQUAL(test_message + 8, *message);
  96. }
  97. TEST(EndianConversion, AddIntToMessage) {
  98. CipUint value_to_add_to_message = 0x5499;
  99. ENIPMessage message;
  100. InitializeENIPMessage(&message);
  101. AddIntToMessage(value_to_add_to_message, &message);
  102. BYTES_EQUAL(0x99, message.message_buffer[0]);
  103. BYTES_EQUAL(0x54, message.message_buffer[1]);
  104. POINTERS_EQUAL(message.message_buffer + 2, message.current_message_position)
  105. }
  106. TEST(EndianConversion, AddDintToMessage) {
  107. CipUdint value_to_add_to_message = 0x25E0C459;
  108. ENIPMessage message;
  109. InitializeENIPMessage(&message);
  110. AddDintToMessage(value_to_add_to_message, &message);
  111. BYTES_EQUAL(0x59, message.message_buffer[0]);
  112. BYTES_EQUAL(0xC4, message.message_buffer[1]);
  113. BYTES_EQUAL(0xE0, message.message_buffer[2]);
  114. BYTES_EQUAL(0x25, message.message_buffer[3]);
  115. POINTERS_EQUAL(message.message_buffer + 4, message.current_message_position)
  116. }
  117. TEST(EndianConversion, AddLintToMessage) {
  118. CipLint value_to_add_to_message = 0x2D2AEF0B84095230;
  119. ENIPMessage message;
  120. InitializeENIPMessage(&message);
  121. AddLintToMessage(value_to_add_to_message, &message);
  122. /* Expected message from highest to lowest byte [30][52][09][84][0B][EF][2A][2D] */
  123. BYTES_EQUAL(0x30, message.message_buffer[0]);
  124. BYTES_EQUAL(0x52, message.message_buffer[1]);
  125. BYTES_EQUAL(0x09, message.message_buffer[2]);
  126. BYTES_EQUAL(0x84, message.message_buffer[3]);
  127. BYTES_EQUAL(0x0B, message.message_buffer[4]);
  128. BYTES_EQUAL(0xEF, message.message_buffer[5]);
  129. BYTES_EQUAL(0x2A, message.message_buffer[6]);
  130. BYTES_EQUAL(0x2D, message.message_buffer[7]);
  131. POINTERS_EQUAL(message.message_buffer + 8, message.current_message_position)
  132. }
  133. TEST(EndianConversion, EncapsulateIpAddress) {
  134. ENIPMessage message;
  135. InitializeENIPMessage(&message);
  136. DetermineEndianess();
  137. EncapsulateIpAddress(0xAF12, 0x25E0C459, &message);
  138. BYTES_EQUAL(AF_INET >> 8, message.message_buffer[0]);
  139. BYTES_EQUAL(AF_INET, message.message_buffer[1]);
  140. BYTES_EQUAL(0x12, message.message_buffer[2]);
  141. BYTES_EQUAL(0xAF, message.message_buffer[3]);
  142. BYTES_EQUAL(0x59, message.message_buffer[4]);
  143. BYTES_EQUAL(0xC4, message.message_buffer[5]);
  144. BYTES_EQUAL(0xE0, message.message_buffer[6]);
  145. BYTES_EQUAL(0x25, message.message_buffer[7]);
  146. POINTERS_EQUAL(message.message_buffer + 8, message.current_message_position)
  147. }
  148. TEST(EndianConversion, MoveMessageNOctets) {
  149. ENIPMessage message;
  150. InitializeENIPMessage(&message);
  151. MoveMessageNOctets(4, &message);
  152. POINTERS_EQUAL(message.message_buffer + 4, message.current_message_position);
  153. }
  154. TEST(EndianConversion, FillNextNMEssageOctetsWith) {
  155. ENIPMessage message;
  156. InitializeENIPMessage(&message);
  157. memset(message.message_buffer, 15, 8);
  158. FillNextNMessageOctetsWith(0, 8, &message);
  159. BYTES_EQUAL(0, message.message_buffer[0]);
  160. BYTES_EQUAL(0, message.message_buffer[1]);
  161. BYTES_EQUAL(0, message.message_buffer[2]);
  162. BYTES_EQUAL(0, message.message_buffer[3]);
  163. BYTES_EQUAL(0, message.message_buffer[4]);
  164. BYTES_EQUAL(0, message.message_buffer[5]);
  165. BYTES_EQUAL(0, message.message_buffer[6]);
  166. BYTES_EQUAL(0, message.message_buffer[7]);
  167. POINTERS_EQUAL(message.message_buffer, message.current_message_position);
  168. }