endianconvtest.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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 EipUint8 test_message[] = { 8 };
  19. const EipUint8 *message_pointer = test_message;
  20. const EipUint8 **const message = &message_pointer;
  21. EipUint16 returned_value = GetSintFromMessage(message);
  22. LONGS_EQUAL(8, returned_value);
  23. POINTERS_EQUAL(test_message + 1, *message);
  24. }
  25. TEST(EndianConversion, GetIntFromMessage) {
  26. const EipUint8 test_message[] = { 8, 60 };
  27. const EipUint8 *message_pointer = test_message;
  28. const EipUint8 **const message = &message_pointer;
  29. EipUint16 returned_value = GetIntFromMessage(message);
  30. LONGS_EQUAL(15368, returned_value);
  31. POINTERS_EQUAL(test_message + 2, *message);
  32. }
  33. TEST(EndianConversion, GetDintFromMessage) {
  34. const EipUint8 test_message[] = { 28, 53, 41, 37 };
  35. const EipUint8 *message_pointer = test_message;
  36. const EipUint8 **const message = &message_pointer;
  37. EipUint32 returned_value = GetDintFromMessage(message);
  38. LONGS_EQUAL(623457564, returned_value);
  39. POINTERS_EQUAL(test_message + 4, *message);
  40. }
  41. TEST(EndianConversion, GetLintFromMessage) {
  42. const EipUint8 test_message[] = { 81, 126, 166, 15, 70, 97, 208, 236 };
  43. const EipUint8 *message_pointer = test_message;
  44. const EipUint8 **const message = &message_pointer;
  45. EipUint64 returned_value = GetLintFromMessage(message);
  46. LONGS_EQUAL(5872313548673241324, returned_value);
  47. POINTERS_EQUAL(test_message + 8, *message);
  48. }
  49. TEST(EndianConversion, AddIntToMessage) {
  50. CipUint value_to_add_to_message = 0x5499;
  51. CipOctet message[2];
  52. CipOctet *message_pointer = message;
  53. AddIntToMessage(value_to_add_to_message, &message_pointer);
  54. BYTES_EQUAL(0x99, message[0]);
  55. BYTES_EQUAL(0x54, message[1]);
  56. POINTERS_EQUAL(message + 2, message_pointer)
  57. }
  58. TEST(EndianConversion, AddDintToMessage) {
  59. CipUdint value_to_add_to_message = 0x25E0C459;
  60. CipOctet message[4];
  61. CipOctet *message_pointer = message;
  62. AddDintToMessage(value_to_add_to_message, &message_pointer);
  63. BYTES_EQUAL(0x59, message[0]);
  64. BYTES_EQUAL(0xC4, message[1]);
  65. BYTES_EQUAL(0xE0, message[2]);
  66. BYTES_EQUAL(0x25, message[3]);
  67. POINTERS_EQUAL(message + 4, message_pointer)
  68. }
  69. TEST(EndianConversion, AddLintToMessage) {
  70. CipLint value_to_add_to_message = 0x2D2AEF0B84095230;
  71. CipOctet message[8];
  72. CipOctet *message_pointer = message;
  73. AddLintToMessage(value_to_add_to_message, &message_pointer);
  74. /* Expected message from highest to lowest byte [30][52][09][84][0B][EF][2A][2D] */
  75. BYTES_EQUAL(0x2D, message[0]);
  76. BYTES_EQUAL(0x2A, message[1]);
  77. BYTES_EQUAL(0xEF, message[2]);
  78. BYTES_EQUAL(0x0B, message[3]);
  79. BYTES_EQUAL(0x84, message[4]);
  80. BYTES_EQUAL(0x09, message[5]);
  81. BYTES_EQUAL(0x52, message[6]);
  82. BYTES_EQUAL(0x30, message[7]);
  83. POINTERS_EQUAL(message + 8, message_pointer)
  84. }
  85. TEST(EndianConversion, EncapsulateIpAddress) {
  86. CipOctet ip_message[8];
  87. CipOctet *ip_message_ponter = ip_message;
  88. DetermineEndianess();
  89. EncapsulateIpAddress(0xAF12, 0x25E0C459, &ip_message_ponter);
  90. BYTES_EQUAL(AF_INET >> 8, ip_message[0]);
  91. BYTES_EQUAL(AF_INET, ip_message[1]);
  92. BYTES_EQUAL(0x12, ip_message[2]);
  93. BYTES_EQUAL(0xAF, ip_message[3]);
  94. BYTES_EQUAL(0x59, ip_message[4]);
  95. BYTES_EQUAL(0xC4, ip_message[5]);
  96. BYTES_EQUAL(0xE0, ip_message[6]);
  97. BYTES_EQUAL(0x25, ip_message[7]);
  98. }
  99. TEST(EndianConversion, MoveMessageNOctets) {
  100. CipOctet message[8];
  101. CipOctet *message_runner = message;
  102. MoveMessageNOctets(4, &message_runner);
  103. POINTERS_EQUAL(message + 4, message_runner);
  104. }
  105. TEST(EndianConversion, FillNextNMEssageOctetsWith) {
  106. CipOctet message[8];
  107. CipOctet *message_runner = message;
  108. memset(message, 15, 8);
  109. FillNextNMessageOctetsWith(0, 8, &message_runner);
  110. BYTES_EQUAL(0, message_runner[0]);
  111. BYTES_EQUAL(0, message_runner[1]);
  112. BYTES_EQUAL(0, message_runner[2]);
  113. BYTES_EQUAL(0, message_runner[3]);
  114. BYTES_EQUAL(0, message_runner[4]);
  115. BYTES_EQUAL(0, message_runner[5]);
  116. BYTES_EQUAL(0, message_runner[6]);
  117. BYTES_EQUAL(0, message_runner[7]);
  118. }