test_RepeatedFieldMessage.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. /*
  2. * Copyright (C) 2020 Embedded AMS B.V. - All Rights Reserved
  3. *
  4. * This file is part of Embedded Proto.
  5. *
  6. * Embedded Proto is open source software: you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License as published
  8. * by the Free Software Foundation, version 3 of the license.
  9. *
  10. * Embedded Proto is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with Embedded Proto. If not, see <https://www.gnu.org/licenses/>.
  17. *
  18. * For commercial and closed source application please visit:
  19. * <https://EmbeddedProto.com/license/>.
  20. *
  21. * Embedded AMS B.V.
  22. * Info:
  23. * info at EmbeddedProto dot com
  24. *
  25. * Postal address:
  26. * Johan Huizingalaan 763a
  27. * 1066 VH, Amsterdam
  28. * the Netherlands
  29. */
  30. #include "gtest/gtest.h"
  31. #include <WireFormatter.h>
  32. #include <ReadBufferMock.h>
  33. #include <WriteBufferMock.h>
  34. #include <cstdint>
  35. #include <limits>
  36. // EAMS message definitions
  37. #include <repeated_fields.h>
  38. using ::testing::_;
  39. using ::testing::InSequence;
  40. using ::testing::Return;
  41. using ::testing::SetArgReferee;
  42. namespace test_EmbeddedAMS_RepeatedFieldMessage
  43. {
  44. static constexpr uint32_t Y_SIZE = 3;
  45. TEST(RepeatedFieldMessage, construction)
  46. {
  47. repeated_fields<Y_SIZE> msg;
  48. repeated_message<Y_SIZE> msg2;
  49. }
  50. TEST(RepeatedFieldMessage, serialize_empty_fields)
  51. {
  52. repeated_fields<Y_SIZE> msg;
  53. Mocks::WriteBufferMock buffer;
  54. EXPECT_CALL(buffer, push(_)).Times(0);
  55. EXPECT_CALL(buffer, push(_,_)).Times(0);
  56. EXPECT_CALL(buffer, get_available_size()).WillRepeatedly(Return(99));
  57. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  58. EXPECT_EQ(0, msg.serialized_size());
  59. }
  60. TEST(RepeatedFieldMessage, serialize_empty_message)
  61. {
  62. repeated_message<Y_SIZE> msg;
  63. Mocks::WriteBufferMock buffer;
  64. EXPECT_CALL(buffer, push(_)).Times(0);
  65. EXPECT_CALL(buffer, push(_,_)).Times(0);
  66. EXPECT_CALL(buffer, get_available_size()).WillRepeatedly(Return(99));
  67. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  68. EXPECT_EQ(0, msg.serialized_size());
  69. }
  70. TEST(RepeatedFieldMessage, serialize_array_zero_fields)
  71. {
  72. InSequence s;
  73. Mocks::WriteBufferMock buffer;
  74. repeated_fields<Y_SIZE> msg;
  75. msg.add_y(0);
  76. msg.add_y(0);
  77. msg.add_y(0);
  78. uint8_t expected[] = {0x12, 0x03, 0x00, 0x00, 0x00}; // y
  79. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(6));
  80. for(auto e : expected)
  81. {
  82. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  83. }
  84. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  85. }
  86. TEST(RepeatedFieldMessage, serialize_array_zero_messages)
  87. {
  88. InSequence s;
  89. Mocks::WriteBufferMock buffer;
  90. repeated_message<Y_SIZE> msg;
  91. repeated_nested_message rnm;
  92. rnm.set_u(0);
  93. rnm.set_v(0);
  94. msg.add_b(rnm);
  95. msg.add_b(rnm);
  96. msg.add_b(rnm);
  97. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(6));
  98. EXPECT_CALL(buffer, push(0x12)).Times(1).WillOnce(Return(true));
  99. EXPECT_CALL(buffer, push(0x00)).Times(1).WillOnce(Return(true));
  100. EXPECT_CALL(buffer, push(0x12)).Times(1).WillOnce(Return(true));
  101. EXPECT_CALL(buffer, push(0x00)).Times(1).WillOnce(Return(true));
  102. EXPECT_CALL(buffer, push(0x12)).Times(1).WillOnce(Return(true));
  103. EXPECT_CALL(buffer, push(0x00)).Times(1).WillOnce(Return(true));
  104. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  105. }
  106. TEST(RepeatedFieldMessage, serialize_array_zero_one_zero)
  107. {
  108. InSequence s;
  109. Mocks::WriteBufferMock buffer;
  110. repeated_fields<Y_SIZE> msg;
  111. msg.add_y(0);
  112. msg.add_y(1);
  113. msg.add_y(0);
  114. uint8_t expected[] = {0x12, 0x03, 0x00, 0x01, 0x00}; // y
  115. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(5));
  116. for(auto e : expected)
  117. {
  118. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  119. }
  120. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  121. }
  122. TEST(RepeatedFieldMessage, serialize_array_zero_one_zero_messages)
  123. {
  124. InSequence s;
  125. Mocks::WriteBufferMock buffer;
  126. repeated_message<Y_SIZE> msg;
  127. repeated_nested_message rnm;
  128. rnm.set_u(0);
  129. rnm.set_v(0);
  130. msg.add_b(rnm);
  131. rnm.set_u(1);
  132. rnm.set_v(1);
  133. msg.add_b(rnm);
  134. rnm.set_u(0);
  135. rnm.set_v(0);
  136. msg.add_b(rnm);
  137. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(10));
  138. EXPECT_CALL(buffer, push(0x12)).Times(1).WillOnce(Return(true));
  139. EXPECT_CALL(buffer, push(0x00)).Times(1).WillOnce(Return(true));
  140. EXPECT_CALL(buffer, push(0x12)).Times(1).WillOnce(Return(true));
  141. EXPECT_CALL(buffer, push(0x04)).Times(1).WillOnce(Return(true));
  142. EXPECT_CALL(buffer, push(0x08)).Times(1).WillOnce(Return(true));
  143. EXPECT_CALL(buffer, push(0x01)).Times(1).WillOnce(Return(true));
  144. EXPECT_CALL(buffer, push(0x10)).Times(1).WillOnce(Return(true));
  145. EXPECT_CALL(buffer, push(0x01)).Times(1).WillOnce(Return(true));
  146. EXPECT_CALL(buffer, push(0x12)).Times(1).WillOnce(Return(true));
  147. EXPECT_CALL(buffer, push(0x00)).Times(1).WillOnce(Return(true));
  148. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  149. }
  150. TEST(RepeatedFieldMessage, serialize_array_one)
  151. {
  152. InSequence s;
  153. Mocks::WriteBufferMock buffer;
  154. repeated_fields<Y_SIZE> msg;
  155. msg.add_y(1);
  156. msg.add_y(1);
  157. msg.add_y(1);
  158. uint8_t expected[] = {0x12, 0x03, 0x01, 0x01, 0x01}; // y
  159. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(5));
  160. for(auto e : expected)
  161. {
  162. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  163. }
  164. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  165. }
  166. TEST(RepeatedFieldMessage, serialize_array_max)
  167. {
  168. InSequence s;
  169. Mocks::WriteBufferMock buffer;
  170. repeated_fields<Y_SIZE> msg;
  171. msg.add_y(std::numeric_limits<uint32_t>::max());
  172. msg.add_y(std::numeric_limits<uint32_t>::max());
  173. msg.add_y(std::numeric_limits<uint32_t>::max());
  174. uint8_t expected[] = {0x12, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f}; // y
  175. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(17));
  176. for(auto e : expected)
  177. {
  178. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  179. }
  180. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  181. }
  182. TEST(RepeatedFieldMessage, serialize_one)
  183. {
  184. InSequence s;
  185. Mocks::WriteBufferMock buffer;
  186. repeated_fields<Y_SIZE> msg;
  187. msg.set_x(1);
  188. msg.add_y(1);
  189. msg.add_y(1);
  190. msg.add_y(1);
  191. msg.set_z(1);
  192. uint8_t expected_x[] = {0x08, 0x01}; // x
  193. for(auto e : expected_x) {
  194. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  195. }
  196. uint8_t expected[] = {0x12, 0x03, 0x01, 0x01, 0x01, // y
  197. 0x18, 0x01}; // z
  198. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(9));
  199. for(auto e : expected)
  200. {
  201. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  202. }
  203. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  204. }
  205. TEST(RepeatedFieldMessage, serialize_max)
  206. {
  207. InSequence s;
  208. Mocks::WriteBufferMock buffer;
  209. repeated_fields<Y_SIZE> msg;
  210. msg.set_x(std::numeric_limits<uint32_t>::max());
  211. msg.add_y(std::numeric_limits<uint32_t>::max());
  212. msg.add_y(std::numeric_limits<uint32_t>::max());
  213. msg.add_y(std::numeric_limits<uint32_t>::max());
  214. msg.set_z(std::numeric_limits<uint32_t>::max());
  215. uint8_t expected_x[] = {0x08, 0xff, 0xff, 0xff, 0xff, 0x0f}; // x
  216. for(auto e : expected_x) {
  217. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  218. }
  219. uint8_t expected[] = {0x12, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, // y
  220. 0x18, 0xff, 0xff, 0xff, 0xff, 0x0f}; // z
  221. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(17));
  222. for(auto e : expected)
  223. {
  224. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  225. }
  226. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  227. }
  228. TEST(RepeatedFieldMessage, serialize_fault_buffer_full)
  229. {
  230. Mocks::WriteBufferMock buffer;
  231. repeated_fields<Y_SIZE> msg;
  232. msg.add_y(1);
  233. msg.add_y(1);
  234. msg.add_y(1);
  235. // Need 3 bytes but got only 2.
  236. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(2));
  237. EXPECT_EQ(::EmbeddedProto::Error::BUFFER_FULL, msg.serialize(buffer));
  238. }
  239. TEST(RepeatedFieldMessage, deserialize_empty_array)
  240. {
  241. repeated_fields<Y_SIZE> msg;
  242. Mocks::ReadBufferMock buffer;
  243. EXPECT_CALL(buffer, pop(_)).WillRepeatedly(Return(false));
  244. EXPECT_CALL(buffer, get_size()).WillRepeatedly(Return(0));
  245. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  246. }
  247. TEST(RepeatedFieldMessage, deserialize_empty_message_array)
  248. {
  249. repeated_message<Y_SIZE> msg;
  250. Mocks::ReadBufferMock buffer;
  251. EXPECT_CALL(buffer, pop(_)).WillRepeatedly(Return(false));
  252. EXPECT_CALL(buffer, get_size()).WillRepeatedly(Return(0));
  253. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  254. }
  255. TEST(RepeatedFieldMessage, deserialize_one)
  256. {
  257. InSequence s;
  258. repeated_fields<Y_SIZE> msg;
  259. Mocks::ReadBufferMock buffer;
  260. static constexpr uint32_t SIZE = 9;
  261. ON_CALL(buffer, get_size()).WillByDefault(Return(SIZE));
  262. uint8_t referee[SIZE] = { 0x08, 0x01, // x
  263. 0x12, 0x03, 0x01, 0x01, 0x01, // y
  264. 0x18, 0x01}; // z
  265. for(auto r: referee)
  266. {
  267. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  268. }
  269. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  270. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  271. EXPECT_EQ(1, msg.get_x());
  272. EXPECT_EQ(3, msg.get_y().get_length());
  273. EXPECT_EQ(1, msg.y(0));
  274. EXPECT_EQ(1, msg.y(1));
  275. EXPECT_EQ(1, msg.y(2));
  276. EXPECT_EQ(1, msg.get_z());
  277. }
  278. TEST(RepeatedFieldMessage, deserialize_one_message_array)
  279. {
  280. InSequence s;
  281. repeated_message<Y_SIZE> msg;
  282. Mocks::ReadBufferMock buffer;
  283. static constexpr uint32_t SIZE = 15;
  284. ON_CALL(buffer, get_size()).WillByDefault(Return(SIZE));
  285. uint8_t referee[SIZE] = { 0x08, 0x01, // x
  286. 0x12, 0x00, 0x12, 0x04, 0x08, 0x01, 0x10, 0x01, 0x12, 0x00, // y
  287. 0x18, 0x01}; // z
  288. for(auto r: referee)
  289. {
  290. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  291. }
  292. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  293. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  294. EXPECT_EQ(1, msg.get_a());
  295. EXPECT_EQ(3, msg.get_b().get_length());
  296. EXPECT_EQ(0, msg.b(0).u());
  297. EXPECT_EQ(0, msg.b(0).v());
  298. EXPECT_EQ(1, msg.b(1).u());
  299. EXPECT_EQ(1, msg.b(1).v());
  300. EXPECT_EQ(0, msg.b(2).u());
  301. EXPECT_EQ(0, msg.b(2).v());
  302. EXPECT_EQ(1, msg.get_c());
  303. }
  304. TEST(RepeatedFieldMessage, deserialize_mixed_message_array)
  305. {
  306. // I should be possible to read in the non packed data mixed with other fields. All elements
  307. // should be added to the array.
  308. InSequence s;
  309. repeated_message<Y_SIZE> msg;
  310. Mocks::ReadBufferMock buffer;
  311. static constexpr uint32_t SIZE = 14;
  312. ON_CALL(buffer, get_size()).WillByDefault(Return(SIZE));
  313. uint8_t referee[SIZE] = { 0x12, 0x00, // y[0]
  314. 0x08, 0x01, // x
  315. 0x12, 0x04, 0x08, 0x01, 0x10, 0x01, // y[1]
  316. 0x18, 0x01, // z
  317. 0x12, 0x00, }; // y[2]
  318. for(auto r: referee)
  319. {
  320. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  321. }
  322. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  323. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  324. EXPECT_EQ(1, msg.get_a());
  325. EXPECT_EQ(3, msg.get_b().get_length());
  326. EXPECT_EQ(0, msg.b(0).u());
  327. EXPECT_EQ(0, msg.b(0).v());
  328. EXPECT_EQ(1, msg.b(1).u());
  329. EXPECT_EQ(1, msg.b(1).v());
  330. EXPECT_EQ(0, msg.b(2).u());
  331. EXPECT_EQ(0, msg.b(2).v());
  332. EXPECT_EQ(1, msg.get_c());
  333. }
  334. TEST(RepeatedFieldMessage, deserialize_max)
  335. {
  336. InSequence s;
  337. repeated_fields<Y_SIZE> msg;
  338. Mocks::ReadBufferMock buffer;
  339. static constexpr uint32_t SIZE = 29;
  340. ON_CALL(buffer, get_size()).WillByDefault(Return(SIZE));
  341. uint8_t referee[SIZE] = { 0x08, 0xff, 0xff, 0xff, 0xff, 0x0f, // x
  342. 0x12, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, // y
  343. 0x18, 0xff, 0xff, 0xff, 0xff, 0x0f}; // z
  344. for(auto r: referee)
  345. {
  346. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  347. }
  348. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  349. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  350. EXPECT_EQ(std::numeric_limits<uint32_t>::max(), msg.get_x());
  351. EXPECT_EQ(3, msg.get_y().get_length());
  352. EXPECT_EQ(std::numeric_limits<uint32_t>::max(), msg.y(0));
  353. EXPECT_EQ(std::numeric_limits<uint32_t>::max(), msg.y(1));
  354. EXPECT_EQ(std::numeric_limits<uint32_t>::max(), msg.y(2));
  355. EXPECT_EQ(std::numeric_limits<uint32_t>::max(), msg.get_z());
  356. }
  357. TEST(RepeatedFieldMessage, assign_a_nested_message)
  358. {
  359. // Assign a nested message which holds an repeated field.
  360. nested_repeated_message<Y_SIZE> top_level_msg;
  361. // The nexted message
  362. repeated_fields<Y_SIZE> nested_msg;
  363. // Fill the array with some data.
  364. nested_msg.add_y(1);
  365. nested_msg.add_y(2);
  366. nested_msg.add_y(3);
  367. // And assign
  368. top_level_msg.set_rf(nested_msg);
  369. EXPECT_EQ(3, top_level_msg.get_rf().get_y().get_length());
  370. EXPECT_EQ(1, top_level_msg.get_rf().get_y()[0]);
  371. EXPECT_EQ(2, top_level_msg.get_rf().get_y()[1]);
  372. EXPECT_EQ(3, top_level_msg.get_rf().get_y()[2]);
  373. }
  374. } // End of namespace test_EmbeddedAMS_RepeatedFieldMessage