test_oneof_fields.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  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. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_message());
  75. msg.mutable_msg_ABC().set_varA(1);
  76. msg.mutable_msg_ABC().set_varB(22);
  77. msg.mutable_msg_ABC().set_varC(333);
  78. EXPECT_EQ(message_oneof::id::MSG_ABC, msg.get_which_message());
  79. EXPECT_EQ(1, msg.msg_ABC().varA());
  80. EXPECT_EQ(22, msg.msg_ABC().varB());
  81. EXPECT_EQ(333, msg.msg_ABC().varC());
  82. msg.clear_msg_ABC();
  83. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_message());
  84. msg.set_x(1);
  85. msg.mutable_msg_ABC().set_varA(1);
  86. EXPECT_EQ(message_oneof::id::X, msg.get_which_xyz());
  87. EXPECT_EQ(message_oneof::id::MSG_ABC, msg.get_which_message());
  88. msg.clear();
  89. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_xyz());
  90. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_message());
  91. }
  92. TEST(OneofField, serialize_ones)
  93. {
  94. InSequence s;
  95. message_oneof msg;
  96. Mocks::WriteBufferMock buffer;
  97. // X
  98. msg.set_a(1);
  99. msg.set_b(1);
  100. msg.set_x(1);
  101. uint8_t expected_x[] = {0x08, 0x01, // a
  102. 0x50, 0x01, // b
  103. 0x28, 0x01}; // x
  104. for(auto e : expected_x) {
  105. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  106. }
  107. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  108. // Y
  109. msg.set_y(1);
  110. uint8_t expected_y[] = {0x08, 0x01, // a
  111. 0x50, 0x01, // b
  112. 0x30, 0x01}; // y
  113. for(auto e : expected_y) {
  114. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  115. }
  116. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  117. // z
  118. msg.set_z(1);
  119. uint8_t expected_z[] = {0x08, 0x01, // a
  120. 0x50, 0x01, // b
  121. 0x38, 0x01}; // z
  122. for(auto e : expected_z) {
  123. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  124. }
  125. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  126. }
  127. TEST(OneofField, serialize_second_oneof)
  128. {
  129. InSequence s;
  130. message_oneof msg;
  131. Mocks::WriteBufferMock buffer;
  132. // X and V
  133. msg.set_a(1);
  134. msg.set_b(1);
  135. msg.set_x(1);
  136. msg.set_v(1);
  137. uint8_t expected_z[] = {0x08, 0x01, // a
  138. 0x50, 0x01, // b
  139. 0x28, 0x01, // x
  140. 0x85, 0x01, 0x00, 0x00, 0x80, 0x3f}; // v
  141. for(auto e : expected_z) {
  142. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  143. }
  144. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  145. }
  146. TEST(OneofField, deserialize)
  147. {
  148. InSequence s;
  149. message_oneof msg;
  150. Mocks::ReadBufferMock buffer;
  151. uint8_t referee[] = {0x08, 0x01, // a
  152. 0x50, 0x01, // b
  153. 0x30, 0x01}; // y
  154. for(auto r: referee) {
  155. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  156. }
  157. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  158. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  159. EXPECT_EQ(1, msg.get_a());
  160. EXPECT_EQ(1, msg.get_b());
  161. EXPECT_EQ(message_oneof::id::Y, msg.get_which_xyz());
  162. EXPECT_EQ(1, msg.get_y());
  163. }
  164. TEST(OneofField, deserialize_override)
  165. {
  166. InSequence s;
  167. message_oneof msg;
  168. Mocks::ReadBufferMock buffer;
  169. uint8_t referee[] = {0x08, 0x01, // a
  170. 0x50, 0x01, // b
  171. 0x30, 0x01, // y
  172. 0x28, 0x01}; // x
  173. for(auto r: referee) {
  174. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  175. }
  176. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  177. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  178. EXPECT_EQ(1, msg.get_a());
  179. EXPECT_EQ(1, msg.get_b());
  180. EXPECT_EQ(message_oneof::id::X, msg.get_which_xyz());
  181. EXPECT_EQ(1, msg.get_x());
  182. }
  183. TEST(OneofField, deserialize_failure)
  184. {
  185. InSequence s;
  186. message_oneof msg;
  187. Mocks::ReadBufferMock buffer;
  188. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(0x30), Return(true))); // y
  189. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(0x01), Return(false))); // This simulates the fialure.
  190. EXPECT_EQ(::EmbeddedProto::Error::END_OF_BUFFER, msg.deserialize(buffer));
  191. EXPECT_EQ(message_oneof::id::NOT_SET, msg.get_which_xyz());
  192. }
  193. TEST(OneofField, deserialize_second_oneof)
  194. {
  195. InSequence s;
  196. message_oneof msg;
  197. Mocks::ReadBufferMock buffer;
  198. uint8_t referee[] = {0x08, 0x01, // a
  199. 0x50, 0x01, // b
  200. 0x28, 0x01, // x
  201. 0x85, 0x01, 0x00, 0x00, 0x80, 0x3f}; // v
  202. for(auto r: referee) {
  203. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  204. }
  205. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  206. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  207. EXPECT_EQ(1, msg.get_a());
  208. EXPECT_EQ(1, msg.get_b());
  209. EXPECT_EQ(message_oneof::id::X, msg.get_which_xyz());
  210. EXPECT_EQ(1, msg.get_x());
  211. EXPECT_EQ(message_oneof::id::V, msg.get_which_uvw());
  212. EXPECT_EQ(1.0, msg.get_y());
  213. }
  214. TEST(OneofField, serialize_oneof_msg)
  215. {
  216. InSequence s;
  217. message_oneof msg;
  218. Mocks::WriteBufferMock buffer;
  219. msg.mutable_msg_ABC().set_varA(1);
  220. msg.mutable_msg_ABC().set_varB(1);
  221. msg.mutable_msg_ABC().set_varC(1);
  222. // When called the buffer will have enough space for the message
  223. EXPECT_CALL(buffer, get_available_size()).Times(1).WillOnce(Return(99));
  224. uint8_t expected_ABC[] = {0xa2, // field ID.
  225. 0x01, 0x06, // Nested message size.
  226. 0x08, 0x01, // varA
  227. 0x10, 0x01, // varB
  228. 0x18, 0x01};// varC
  229. for(auto e : expected_ABC) {
  230. EXPECT_CALL(buffer, push(e)).Times(1).WillOnce(Return(true));
  231. }
  232. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.serialize(buffer));
  233. }
  234. TEST(OneofField, deserialize_oneof_msg)
  235. {
  236. InSequence s;
  237. message_oneof msg;
  238. Mocks::ReadBufferMock buffer;
  239. static constexpr uint32_t SIZE = 10;
  240. ON_CALL(buffer, get_size()).WillByDefault(Return(SIZE));
  241. uint8_t referee[SIZE] = {0xaa, 0x01, 0x07, 0x08, 0x01, 0x10, 0x16, 0x18, 0xcd, 0x02};
  242. for(auto r: referee) {
  243. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(DoAll(SetArgReferee<0>(r), Return(true)));
  244. }
  245. EXPECT_CALL(buffer, pop(_)).Times(1).WillOnce(Return(false));
  246. EXPECT_EQ(::EmbeddedProto::Error::NO_ERRORS, msg.deserialize(buffer));
  247. EXPECT_EQ(message_oneof::id::MSG_DEF, msg.get_which_message());
  248. EXPECT_EQ(1, msg.get_msg_DEF().get_varD());
  249. EXPECT_EQ(22, msg.get_msg_DEF().get_varE());
  250. EXPECT_EQ(333, msg.get_msg_DEF().get_varF());
  251. }