test_RepeatedFieldMessage.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. #include "gtest/gtest.h"
  2. #include <WireFormatter.h>
  3. #include <ReadBufferMock.h>
  4. #include <WriteBufferMock.h>
  5. #include <cstdint>
  6. #include <limits>
  7. // EAMS message definitions
  8. #include <repeated_fields.h>
  9. using ::testing::_;
  10. using ::testing::InSequence;
  11. using ::testing::Return;
  12. using ::testing::SetArgReferee;
  13. namespace test_EmbeddedAMS_RepeatedFieldMessage
  14. {
  15. static constexpr uint32_t Y_SIZE = 3;
  16. TEST(RepeatedFieldMessage, construction)
  17. {
  18. repeated_fields<Y_SIZE> msg;
  19. repeated_message<Y_SIZE> msg2;
  20. }
  21. TEST(RepeatedFieldMessage, serialize_empty_fields)
  22. {
  23. repeated_fields<Y_SIZE> msg;
  24. Mocks::WriteBufferMock buffer;
  25. EXPECT_CALL(buffer, push(_)).Times(0);
  26. EXPECT_CALL(buffer, push(_,_)).Times(0);
  27. EXPECT_CALL(buffer, get_available_size()).WillRepeatedly(Return(99));
  28. EXPECT_TRUE(msg.serialize(buffer));
  29. EXPECT_EQ(0, msg.serialized_size());
  30. }
  31. TEST(RepeatedFieldMessage, serialize_empty_message)
  32. {
  33. repeated_message<Y_SIZE> msg;
  34. Mocks::WriteBufferMock buffer;
  35. EXPECT_CALL(buffer, push(_)).Times(0);
  36. EXPECT_CALL(buffer, push(_,_)).Times(0);
  37. EXPECT_CALL(buffer, get_available_size()).WillRepeatedly(Return(99));
  38. EXPECT_TRUE(msg.serialize(buffer));
  39. EXPECT_EQ(0, msg.serialized_size());
  40. }
  41. TEST(RepeatedFieldMessage, serialize_array_zero_fields)
  42. {
  43. InSequence s;
  44. Mocks::WriteBufferMock buffer;
  45. repeated_fields<Y_SIZE> msg;
  46. msg.add_y(0);
  47. msg.add_y(0);
  48. msg.add_y(0);
  49. uint8_t expected[] = {0x12, 0x03, 0x00, 0x00, 0x00}; // y
  50. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(6));
  51. for(auto e : expected)
  52. {
  53. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  54. }
  55. EXPECT_TRUE(msg.serialize(buffer));
  56. }
  57. TEST(RepeatedFieldMessage, serialize_array_zero_messages)
  58. {
  59. InSequence s;
  60. Mocks::WriteBufferMock buffer;
  61. repeated_message<Y_SIZE> msg;
  62. repeated_nested_message rnm;
  63. rnm.set_u(0);
  64. rnm.set_v(0);
  65. msg.add_b(rnm);
  66. msg.add_b(rnm);
  67. msg.add_b(rnm);
  68. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(6));
  69. EXPECT_CALL(buffer, push(0x12)).Times(1).WillOnce(Return(true));
  70. EXPECT_CALL(buffer, push(0x00)).Times(1).WillOnce(Return(true));
  71. EXPECT_CALL(buffer, push(0x12)).Times(1).WillOnce(Return(true));
  72. EXPECT_CALL(buffer, push(0x00)).Times(1).WillOnce(Return(true));
  73. EXPECT_CALL(buffer, push(0x12)).Times(1).WillOnce(Return(true));
  74. EXPECT_CALL(buffer, push(0x00)).Times(1).WillOnce(Return(true));
  75. EXPECT_TRUE(msg.serialize(buffer));
  76. }
  77. TEST(RepeatedFieldMessage, serialize_array_zero_one_zero)
  78. {
  79. InSequence s;
  80. Mocks::WriteBufferMock buffer;
  81. repeated_fields<Y_SIZE> msg;
  82. msg.add_y(0);
  83. msg.add_y(1);
  84. msg.add_y(0);
  85. uint8_t expected[] = {0x12, 0x03, 0x00, 0x01, 0x00}; // y
  86. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(5));
  87. for(auto e : expected)
  88. {
  89. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  90. }
  91. EXPECT_TRUE(msg.serialize(buffer));
  92. }
  93. TEST(RepeatedFieldMessage, serialize_array_zero_one_zero_messages)
  94. {
  95. InSequence s;
  96. Mocks::WriteBufferMock buffer;
  97. repeated_message<Y_SIZE> msg;
  98. repeated_nested_message rnm;
  99. rnm.set_u(0);
  100. rnm.set_v(0);
  101. msg.add_b(rnm);
  102. rnm.set_u(1);
  103. rnm.set_v(1);
  104. msg.add_b(rnm);
  105. rnm.set_u(0);
  106. rnm.set_v(0);
  107. msg.add_b(rnm);
  108. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(10));
  109. EXPECT_CALL(buffer, push(0x12)).Times(1).WillOnce(Return(true));
  110. EXPECT_CALL(buffer, push(0x00)).Times(1).WillOnce(Return(true));
  111. EXPECT_CALL(buffer, push(0x12)).Times(1).WillOnce(Return(true));
  112. EXPECT_CALL(buffer, push(0x04)).Times(1).WillOnce(Return(true));
  113. EXPECT_CALL(buffer, push(0x08)).Times(1).WillOnce(Return(true));
  114. EXPECT_CALL(buffer, push(0x01)).Times(1).WillOnce(Return(true));
  115. EXPECT_CALL(buffer, push(0x10)).Times(1).WillOnce(Return(true));
  116. EXPECT_CALL(buffer, push(0x01)).Times(1).WillOnce(Return(true));
  117. EXPECT_CALL(buffer, push(0x12)).Times(1).WillOnce(Return(true));
  118. EXPECT_CALL(buffer, push(0x00)).Times(1).WillOnce(Return(true));
  119. EXPECT_TRUE(msg.serialize(buffer));
  120. }
  121. TEST(RepeatedFieldMessage, serialize_array_one)
  122. {
  123. InSequence s;
  124. Mocks::WriteBufferMock buffer;
  125. repeated_fields<Y_SIZE> msg;
  126. msg.add_y(1);
  127. msg.add_y(1);
  128. msg.add_y(1);
  129. uint8_t expected[] = {0x12, 0x03, 0x01, 0x01, 0x01}; // y
  130. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(5));
  131. for(auto e : expected)
  132. {
  133. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  134. }
  135. EXPECT_TRUE(msg.serialize(buffer));
  136. }
  137. TEST(RepeatedFieldMessage, serialize_array_max)
  138. {
  139. InSequence s;
  140. Mocks::WriteBufferMock buffer;
  141. repeated_fields<Y_SIZE> msg;
  142. msg.add_y(std::numeric_limits<uint32_t>::max());
  143. msg.add_y(std::numeric_limits<uint32_t>::max());
  144. msg.add_y(std::numeric_limits<uint32_t>::max());
  145. uint8_t expected[] = {0x12, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f}; // y
  146. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(17));
  147. for(auto e : expected)
  148. {
  149. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  150. }
  151. EXPECT_TRUE(msg.serialize(buffer));
  152. }
  153. TEST(RepeatedFieldMessage, serialize_one)
  154. {
  155. InSequence s;
  156. Mocks::WriteBufferMock buffer;
  157. repeated_fields<Y_SIZE> msg;
  158. msg.set_x(1);
  159. msg.add_y(1);
  160. msg.add_y(1);
  161. msg.add_y(1);
  162. msg.set_z(1);
  163. uint8_t expected_x[] = {0x08, 0x01}; // x
  164. for(auto e : expected_x) {
  165. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  166. }
  167. uint8_t expected[] = {0x12, 0x03, 0x01, 0x01, 0x01, // y
  168. 0x18, 0x01}; // z
  169. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(9));
  170. for(auto e : expected)
  171. {
  172. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  173. }
  174. EXPECT_TRUE(msg.serialize(buffer));
  175. }
  176. TEST(RepeatedFieldMessage, serialize_max)
  177. {
  178. InSequence s;
  179. Mocks::WriteBufferMock buffer;
  180. repeated_fields<Y_SIZE> msg;
  181. msg.set_x(std::numeric_limits<uint32_t>::max());
  182. msg.add_y(std::numeric_limits<uint32_t>::max());
  183. msg.add_y(std::numeric_limits<uint32_t>::max());
  184. msg.add_y(std::numeric_limits<uint32_t>::max());
  185. msg.set_z(std::numeric_limits<uint32_t>::max());
  186. uint8_t expected_x[] = {0x08, 0xff, 0xff, 0xff, 0xff, 0x0f}; // x
  187. for(auto e : expected_x) {
  188. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  189. }
  190. uint8_t expected[] = {0x12, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, // y
  191. 0x18, 0xff, 0xff, 0xff, 0xff, 0x0f}; // z
  192. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(17));
  193. for(auto e : expected)
  194. {
  195. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  196. }
  197. EXPECT_TRUE(msg.serialize(buffer));
  198. }
  199. TEST(RepeatedFieldMessage, deserialize_empty_array)
  200. {
  201. repeated_fields<Y_SIZE> msg;
  202. Mocks::ReadBufferMock buffer;
  203. EXPECT_CALL(buffer, pop(_)).WillRepeatedly(Return(false));
  204. EXPECT_CALL(buffer, get_size()).WillRepeatedly(Return(0));
  205. EXPECT_TRUE(msg.deserialize(buffer));
  206. }
  207. TEST(RepeatedFieldMessage, deserialize_empty_message_array)
  208. {
  209. repeated_message<Y_SIZE> msg;
  210. Mocks::ReadBufferMock buffer;
  211. EXPECT_CALL(buffer, pop(_)).WillRepeatedly(Return(false));
  212. EXPECT_CALL(buffer, get_size()).WillRepeatedly(Return(0));
  213. EXPECT_TRUE(msg.deserialize(buffer));
  214. }
  215. TEST(RepeatedFieldMessage, deserialize_one)
  216. {
  217. InSequence s;
  218. repeated_fields<Y_SIZE> msg;
  219. Mocks::ReadBufferMock buffer;
  220. uint8_t referee[] = {0x08, 0x01, // x
  221. 0x12, 0x03, 0x01, 0x01, 0x01, // y
  222. 0x18, 0x01}; // z
  223. for(auto r: referee)
  224. {
  225. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  226. }
  227. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  228. EXPECT_TRUE(msg.deserialize(buffer));
  229. EXPECT_EQ(1, msg.get_x());
  230. EXPECT_EQ(3, msg.get_y().get_length());
  231. EXPECT_EQ(1, msg.y(0));
  232. EXPECT_EQ(1, msg.y(1));
  233. EXPECT_EQ(1, msg.y(2));
  234. EXPECT_EQ(1, msg.get_z());
  235. }
  236. TEST(RepeatedFieldMessage, deserialize_one_message_array)
  237. {
  238. InSequence s;
  239. repeated_message<Y_SIZE> msg;
  240. Mocks::ReadBufferMock buffer;
  241. uint8_t referee[] = {0x08, 0x01, // x
  242. 0x12, 0x00, 0x12, 0x04, 0x08, 0x01, 0x10, 0x01, 0x12, 0x00, // y
  243. 0x18, 0x01}; // z
  244. for(auto r: referee)
  245. {
  246. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  247. }
  248. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  249. EXPECT_TRUE(msg.deserialize(buffer));
  250. EXPECT_EQ(1, msg.get_a());
  251. EXPECT_EQ(3, msg.get_b().get_length());
  252. EXPECT_EQ(0, msg.b(0).u());
  253. EXPECT_EQ(0, msg.b(0).v());
  254. EXPECT_EQ(1, msg.b(1).u());
  255. EXPECT_EQ(1, msg.b(1).v());
  256. EXPECT_EQ(0, msg.b(2).u());
  257. EXPECT_EQ(0, msg.b(2).v());
  258. EXPECT_EQ(1, msg.get_c());
  259. }
  260. TEST(RepeatedFieldMessage, deserialize_mixed_message_array)
  261. {
  262. // I should be possible to read in the non packed data mixed with other fields. All elements
  263. // should be added to the array.
  264. InSequence s;
  265. repeated_message<Y_SIZE> msg;
  266. Mocks::ReadBufferMock buffer;
  267. uint8_t referee[] = {0x12, 0x00, // y[0]
  268. 0x08, 0x01, // x
  269. 0x12, 0x04, 0x08, 0x01, 0x10, 0x01, // y[1]
  270. 0x18, 0x01, // z
  271. 0x12, 0x00, }; // y[2]
  272. for(auto r: referee)
  273. {
  274. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  275. }
  276. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  277. EXPECT_TRUE(msg.deserialize(buffer));
  278. EXPECT_EQ(1, msg.get_a());
  279. EXPECT_EQ(3, msg.get_b().get_length());
  280. EXPECT_EQ(0, msg.b(0).u());
  281. EXPECT_EQ(0, msg.b(0).v());
  282. EXPECT_EQ(1, msg.b(1).u());
  283. EXPECT_EQ(1, msg.b(1).v());
  284. EXPECT_EQ(0, msg.b(2).u());
  285. EXPECT_EQ(0, msg.b(2).v());
  286. EXPECT_EQ(1, msg.get_c());
  287. }
  288. TEST(RepeatedFieldMessage, deserialize_max)
  289. {
  290. InSequence s;
  291. repeated_fields<Y_SIZE> msg;
  292. Mocks::ReadBufferMock buffer;
  293. uint8_t referee[] = {0x08, 0xff, 0xff, 0xff, 0xff, 0x0f, // x
  294. 0x12, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, // y
  295. 0x18, 0xff, 0xff, 0xff, 0xff, 0x0f}; // z
  296. for(auto r: referee)
  297. {
  298. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  299. }
  300. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  301. EXPECT_TRUE(msg.deserialize(buffer));
  302. EXPECT_EQ(std::numeric_limits<uint32_t>::max(), msg.get_x());
  303. EXPECT_EQ(3, msg.get_y().get_length());
  304. EXPECT_EQ(std::numeric_limits<uint32_t>::max(), msg.y(0));
  305. EXPECT_EQ(std::numeric_limits<uint32_t>::max(), msg.y(1));
  306. EXPECT_EQ(std::numeric_limits<uint32_t>::max(), msg.y(2));
  307. EXPECT_EQ(std::numeric_limits<uint32_t>::max(), msg.get_z());
  308. }
  309. } // End of namespace test_EmbeddedAMS_RepeatedFieldMessage