test_oneof_fields.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  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 <oneof_fields.h>
  38. using ::testing::_;
  39. using ::testing::InSequence;
  40. using ::testing::Return;
  41. using ::testing::SetArgReferee;
  42. TEST(OneofField, construction)
  43. {
  44. message_oneof msg;
  45. }
  46. TEST(OneofField, serialize_zero)
  47. {
  48. message_oneof msg;
  49. Mocks::WriteBufferMock buffer;
  50. EXPECT_CALL(buffer, push(_)).Times(0);
  51. EXPECT_CALL(buffer, push(_,_)).Times(0);
  52. EXPECT_CALL(buffer, get_available_size()).Times(0);
  53. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  54. }
  55. TEST(OneofField, set_get_clear)
  56. {
  57. message_oneof msg;
  58. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_xyz());
  59. msg.set_x(1);
  60. EXPECT_EQ(1, msg.get_x());
  61. EXPECT_EQ(message_oneof::id::X, msg.get_which_xyz());
  62. msg.clear_x();
  63. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_xyz());
  64. msg.set_y(1);
  65. EXPECT_EQ(1, msg.get_y());
  66. EXPECT_EQ(message_oneof::id::Y, msg.get_which_xyz());
  67. msg.clear_y();
  68. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_xyz());
  69. msg.set_z(1);
  70. EXPECT_EQ(1, msg.get_z());
  71. EXPECT_EQ(message_oneof::id::Z, msg.get_which_xyz());
  72. msg.clear_z();
  73. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_xyz());
  74. msg.set_state(message_oneof::States::Run);
  75. EXPECT_EQ(message_oneof::States::Run, msg.get_state());
  76. EXPECT_EQ(message_oneof::id::STATE, msg.get_which_xyz());
  77. msg.clear_state();
  78. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_xyz());
  79. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_message());
  80. msg.mutable_msg_ABC().set_varA(1);
  81. msg.mutable_msg_ABC().set_varB(22);
  82. msg.mutable_msg_ABC().set_varC(333);
  83. EXPECT_EQ(message_oneof::id::MSG_ABC, msg.get_which_message());
  84. EXPECT_EQ(1, msg.msg_ABC().varA());
  85. EXPECT_EQ(22, msg.msg_ABC().varB());
  86. EXPECT_EQ(333, msg.msg_ABC().varC());
  87. msg.clear_msg_ABC();
  88. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_message());
  89. msg.set_x(1);
  90. msg.mutable_msg_ABC().set_varA(1);
  91. EXPECT_EQ(message_oneof::id::X, msg.get_which_xyz());
  92. EXPECT_EQ(message_oneof::id::MSG_ABC, msg.get_which_message());
  93. msg.clear();
  94. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_xyz());
  95. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_message());
  96. }
  97. TEST(OneofField, serialize_ones)
  98. {
  99. InSequence s;
  100. message_oneof msg;
  101. Mocks::WriteBufferMock buffer;
  102. // X
  103. msg.set_a(1);
  104. msg.set_b(1);
  105. msg.set_x(1);
  106. uint8_t expected_x[] = {0x08, 0x01, // a
  107. 0x50, 0x01, // b
  108. 0x28, 0x01}; // x
  109. for(auto e : expected_x) {
  110. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  111. }
  112. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  113. // Y
  114. msg.set_y(1);
  115. uint8_t expected_y[] = {0x08, 0x01, // a
  116. 0x50, 0x01, // b
  117. 0x30, 0x01}; // y
  118. for(auto e : expected_y) {
  119. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  120. }
  121. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  122. // z
  123. msg.set_z(1);
  124. uint8_t expected_z[] = {0x08, 0x01, // a
  125. 0x50, 0x01, // b
  126. 0x38, 0x01}; // z
  127. for(auto e : expected_z) {
  128. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  129. }
  130. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  131. }
  132. TEST(OneofField, serialize_second_oneof)
  133. {
  134. InSequence s;
  135. message_oneof msg;
  136. Mocks::WriteBufferMock buffer;
  137. // X and V
  138. msg.set_a(1);
  139. msg.set_b(1);
  140. msg.set_x(1);
  141. msg.set_v(1);
  142. uint8_t expected_z[] = {0x08, 0x01, // a
  143. 0x50, 0x01, // b
  144. 0x28, 0x01, // x
  145. 0x85, 0x01, 0x00, 0x00, 0x80, 0x3f}; // v
  146. for(auto e : expected_z) {
  147. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  148. }
  149. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  150. }
  151. TEST(OneofField, deserialize)
  152. {
  153. InSequence s;
  154. message_oneof msg;
  155. Mocks::ReadBufferMock buffer;
  156. uint8_t referee[] = {0x08, 0x01, // a
  157. 0x50, 0x01, // b
  158. 0x30, 0x01}; // y
  159. for(auto r: referee) {
  160. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  161. }
  162. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  163. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  164. EXPECT_EQ(1, msg.get_a());
  165. EXPECT_EQ(1, msg.get_b());
  166. EXPECT_EQ(message_oneof::id::Y, msg.get_which_xyz());
  167. EXPECT_EQ(1, msg.get_y());
  168. }
  169. TEST(OneofField, deserialize_override)
  170. {
  171. InSequence s;
  172. message_oneof msg;
  173. Mocks::ReadBufferMock buffer;
  174. uint8_t referee[] = {0x08, 0x01, // a
  175. 0x50, 0x01, // b
  176. 0x30, 0x01, // y
  177. 0x28, 0x01}; // x
  178. for(auto r: referee) {
  179. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  180. }
  181. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  182. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  183. EXPECT_EQ(1, msg.get_a());
  184. EXPECT_EQ(1, msg.get_b());
  185. EXPECT_EQ(message_oneof::id::X, msg.get_which_xyz());
  186. EXPECT_EQ(1, msg.get_x());
  187. }
  188. TEST(OneofField, deserialize_failure)
  189. {
  190. InSequence s;
  191. message_oneof msg;
  192. Mocks::ReadBufferMock buffer;
  193. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(0x30), Return(true))); // y
  194. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(0x01), Return(false))); // This simulates the fialure.
  195. EXPECT_EQ(::EmbeddedProto::Error::END_OF_BUFFER, msg.deserialize(buffer));
  196. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_xyz());
  197. }
  198. TEST(OneofField, deserialize_second_oneof)
  199. {
  200. InSequence s;
  201. message_oneof msg;
  202. Mocks::ReadBufferMock buffer;
  203. uint8_t referee[] = {0x08, 0x01, // a
  204. 0x50, 0x01, // b
  205. 0x28, 0x01, // x
  206. 0x85, 0x01, 0x00, 0x00, 0x80, 0x3f}; // v
  207. for(auto r: referee) {
  208. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  209. }
  210. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  211. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  212. EXPECT_EQ(1, msg.get_a());
  213. EXPECT_EQ(1, msg.get_b());
  214. EXPECT_EQ(message_oneof::id::X, msg.get_which_xyz());
  215. EXPECT_EQ(1, msg.get_x());
  216. EXPECT_EQ(message_oneof::id::V, msg.get_which_uvw());
  217. EXPECT_EQ(1.0, msg.get_y());
  218. }
  219. TEST(OneofField, serialize_oneof_msg)
  220. {
  221. InSequence s;
  222. message_oneof msg;
  223. Mocks::WriteBufferMock buffer;
  224. msg.mutable_msg_ABC().set_varA(1);
  225. msg.mutable_msg_ABC().set_varB(1);
  226. msg.mutable_msg_ABC().set_varC(1);
  227. // When called the buffer will have enough space for the message
  228. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(99));
  229. uint8_t expected_ABC[] = {0xa2, // field ID.
  230. 0x01, 0x06, // Nested message size.
  231. 0x08, 0x01, // varA
  232. 0x10, 0x01, // varB
  233. 0x18, 0x01};// varC
  234. for(auto e : expected_ABC) {
  235. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  236. }
  237. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  238. }
  239. TEST(OneofField, deserialize_oneof_msg)
  240. {
  241. InSequence s;
  242. message_oneof msg;
  243. Mocks::ReadBufferMock buffer;
  244. static constexpr uint32_t SIZE = 10;
  245. ON_CALL(buffer, get_size()).WillByDefault(Return(SIZE));
  246. uint8_t referee[SIZE] = {0xaa, 0x01, 0x07, 0x08, 0x01, 0x10, 0x16, 0x18, 0xcd, 0x02};
  247. for(auto r: referee) {
  248. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  249. }
  250. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  251. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  252. EXPECT_EQ(message_oneof::id::MSG_DEF, msg.get_which_message());
  253. EXPECT_EQ(1, msg.get_msg_DEF().get_varD());
  254. EXPECT_EQ(22, msg.get_msg_DEF().get_varE());
  255. EXPECT_EQ(333, msg.get_msg_DEF().get_varF());
  256. }
  257. TEST(OneofField, nested_assign)
  258. {
  259. // This test will call the assignement operator and set the union data correctly in the message
  260. // which holds a nested message with oneof's.
  261. InSequence s;
  262. nested_oneof top_level_msg;
  263. message_oneof nested_msg;
  264. nested_msg.mutable_msg_ABC().set_varA(1);
  265. nested_msg.mutable_msg_ABC().set_varB(22);
  266. nested_msg.mutable_msg_ABC().set_varC(333);
  267. top_level_msg.set_msg_oneof(nested_msg);
  268. // Check the result.
  269. EXPECT_EQ(message_oneof::id::MSG_ABC, top_level_msg.get_msg_oneof().get_which_message());
  270. EXPECT_EQ(1, top_level_msg.get_msg_oneof().msg_ABC().varA());
  271. EXPECT_EQ(22, top_level_msg.get_msg_oneof().msg_ABC().varB());
  272. EXPECT_EQ(333, top_level_msg.get_msg_oneof().msg_ABC().varC());
  273. }