1 #include <errno.h>
2 #include <fcntl.h>
3 #include <unistd.h>
4 
5 #include <memory>
6 #include <string>
7 #include <thread>
8 #include <utility>
9 
10 #include <gtest/gtest.h>
11 #include <pdx/rpc/argument_encoder.h>
12 #include <pdx/rpc/array_wrapper.h>
13 #include <pdx/rpc/default_initialization_allocator.h>
14 #include <pdx/rpc/payload.h>
15 #include <pdx/rpc/serializable.h>
16 #include <pdx/rpc/serialization.h>
17 #include <pdx/rpc/string_wrapper.h>
18 #include <pdx/utility.h>
19 
20 using namespace android::pdx;
21 using namespace android::pdx::rpc;
22 
23 // Tests the serialization/deserialization of all supported types, verifying all
24 // reasonable boundary conditions for types with multiple encodings.
25 //
26 // NOTE: Sometimes this file uses the construct "var = decltype(var)({...})"
27 // instead of the equivalent "var = {...}" to construct vectors. This is to
28 // prevent clang-format from producing annoyingly vertical code from long
29 // initializers.
30 
31 // TODO(eieio): Automatically generate some of these tests?
32 
33 namespace {
34 
35 // Test data for serialization/deserialization of floats.
36 const float kZeroFloat = 0.0f;
37 const float kOneFloat = 1.0f;
38 const auto kZeroFloatBytes = reinterpret_cast<const std::uint8_t*>(&kZeroFloat);
39 const auto kOneFloatBytes = reinterpret_cast<const std::uint8_t*>(&kOneFloat);
40 const double kZeroDouble = 0.0;
41 const double kOneDouble = 1.0;
42 const auto kZeroDoubleBytes =
43     reinterpret_cast<const std::uint8_t*>(&kZeroDouble);
44 const auto kOneDoubleBytes = reinterpret_cast<const std::uint8_t*>(&kOneDouble);
45 
46 struct TestType {
47   enum class Foo { kFoo, kBar, kBaz };
48 
49   int a;
50   float b;
51   std::string c;
52   Foo d;
53 
TestType__anonad615aa80111::TestType54   TestType() {}
TestType__anonad615aa80111::TestType55   TestType(int a, float b, const std::string& c, Foo d)
56       : a(a), b(b), c(c), d(d) {}
57 
58   // Make gtest expressions simpler by defining equality operator. This is not
59   // needed for serialization.
operator ==__anonad615aa80111::TestType60   bool operator==(const TestType& other) const {
61     return a == other.a && b == other.b && c == other.c && d == other.d;
62   }
63 
64  private:
65   PDX_SERIALIZABLE_MEMBERS(TestType, a, b, c, d);
66 };
67 
68 template <typename FileHandleType>
69 struct TestTemplateType {
70   FileHandleType fd;
71 
TestTemplateType__anonad615aa80111::TestTemplateType72   TestTemplateType() {}
TestTemplateType__anonad615aa80111::TestTemplateType73   explicit TestTemplateType(FileHandleType fd) : fd(std::move(fd)) {}
74 
operator ==__anonad615aa80111::TestTemplateType75   bool operator==(const TestTemplateType& other) const {
76     return fd.Get() == other.fd.Get();
77   }
78 
79  private:
80   PDX_SERIALIZABLE_MEMBERS(TestTemplateType<FileHandleType>, fd);
81 };
82 
83 // Utilities to generate test maps and payloads.
84 template <typename MapType>
MakeMap(std::size_t size)85 MapType MakeMap(std::size_t size) {
86   MapType result;
87   for (std::size_t i = 0; i < size; i++) {
88     result.emplace(i, i);
89   }
90   return result;
91 }
92 
93 template <typename MapType>
InsertKeyValue(MessageWriter * writer,std::size_t size)94 void InsertKeyValue(MessageWriter* writer, std::size_t size) {
95   MapType map;
96   for (std::size_t i = 0; i < size; i++) {
97     map.emplace(i, i);
98   }
99   for (const auto& element : map) {
100     Serialize(element.first, writer);
101     Serialize(element.second, writer);
102   }
103 }
104 
105 }  // anonymous namespace
106 
TEST(SerializableTypes,Constructor)107 TEST(SerializableTypes, Constructor) {
108   TestType tt(1, 2.0, "three", TestType::Foo::kBar);
109   EXPECT_EQ(1, tt.a);
110   EXPECT_EQ(2.0, tt.b);
111   EXPECT_EQ("three", tt.c);
112   EXPECT_EQ(TestType::Foo::kBar, tt.d);
113 }
114 
TEST(SerializationTest,bool)115 TEST(SerializationTest, bool) {
116   Payload result;
117   Payload expected;
118   bool value;
119 
120   // True.
121   value = true;
122   Serialize(value, &result);
123   expected = {ENCODING_TYPE_TRUE};
124   EXPECT_EQ(expected, result);
125   result.Clear();
126 
127   // False.
128   value = false;
129   Serialize(value, &result);
130   expected = {ENCODING_TYPE_FALSE};
131   EXPECT_EQ(expected, result);
132   result.Clear();
133 }
134 
TEST(SerializationTest,uint8_t)135 TEST(SerializationTest, uint8_t) {
136   Payload result;
137   Payload expected;
138   uint8_t value;
139 
140   // Min FIXINT.
141   value = 0;
142   Serialize(value, &result);
143   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
144   EXPECT_EQ(expected, result);
145   result.Clear();
146 
147   // Max FIXINT.
148   value = (1 << 7) - 1;
149   Serialize(value, &result);
150   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
151   EXPECT_EQ(expected, result);
152   result.Clear();
153 
154   // Min UINT8.
155   value = (1 << 7);
156   Serialize(value, &result);
157   expected = {ENCODING_TYPE_UINT8, (1 << 7)};
158   EXPECT_EQ(expected, result);
159   result.Clear();
160 
161   // Max UINT8.
162   value = 0xff;
163   Serialize(value, &result);
164   expected = {ENCODING_TYPE_UINT8, 0xff};
165   EXPECT_EQ(expected, result);
166   result.Clear();
167 }
168 
TEST(SerializationTest,uint16_t)169 TEST(SerializationTest, uint16_t) {
170   Payload result;
171   Payload expected;
172   uint16_t value;
173 
174   // Min FIXINT.
175   value = 0;
176   Serialize(value, &result);
177   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
178   EXPECT_EQ(expected, result);
179   result.Clear();
180 
181   // Max FIXINT.
182   value = (1 << 7) - 1;
183   Serialize(value, &result);
184   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
185   EXPECT_EQ(expected, result);
186   result.Clear();
187 
188   // Min UINT8.
189   value = (1 << 7);
190   Serialize(value, &result);
191   expected = {ENCODING_TYPE_UINT8, (1 << 7)};
192   EXPECT_EQ(expected, result);
193   result.Clear();
194 
195   // Max UINT8.
196   value = 0xff;
197   Serialize(value, &result);
198   expected = {ENCODING_TYPE_UINT8, 0xff};
199   EXPECT_EQ(expected, result);
200   result.Clear();
201 
202   // Min UINT16.
203   value = (1 << 8);
204   Serialize(value, &result);
205   expected = {ENCODING_TYPE_UINT16, 0, 1};
206   EXPECT_EQ(expected, result);
207   result.Clear();
208 
209   // Max UINT16.
210   value = 0xffff;
211   Serialize(value, &result);
212   expected = {ENCODING_TYPE_UINT16, 0xff, 0xff};
213   EXPECT_EQ(expected, result);
214   result.Clear();
215 }
216 
TEST(SerializationTest,uint32_t)217 TEST(SerializationTest, uint32_t) {
218   Payload result;
219   Payload expected;
220   uint32_t value;
221 
222   // Min FIXINT.
223   value = 0;
224   Serialize(value, &result);
225   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
226   EXPECT_EQ(expected, result);
227   result.Clear();
228 
229   // Max FIXINT.
230   value = (1 << 7) - 1;
231   Serialize(value, &result);
232   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
233   EXPECT_EQ(expected, result);
234   result.Clear();
235 
236   // Min UINT8.
237   value = (1 << 7);
238   Serialize(value, &result);
239   expected = {ENCODING_TYPE_UINT8, (1 << 7)};
240   EXPECT_EQ(expected, result);
241   result.Clear();
242 
243   // Max UINT8.
244   value = 0xff;
245   Serialize(value, &result);
246   expected = {ENCODING_TYPE_UINT8, 0xff};
247   EXPECT_EQ(expected, result);
248   result.Clear();
249 
250   // Min UINT16.
251   value = (1 << 8);
252   Serialize(value, &result);
253   expected = {ENCODING_TYPE_UINT16, 0, 1};
254   EXPECT_EQ(expected, result);
255   result.Clear();
256 
257   // Max UINT16.
258   value = 0xffff;
259   Serialize(value, &result);
260   expected = {ENCODING_TYPE_UINT16, 0xff, 0xff};
261   EXPECT_EQ(expected, result);
262   result.Clear();
263 
264   // Min UINT32.
265   value = (1 << 16);
266   Serialize(value, &result);
267   expected = {ENCODING_TYPE_UINT32, 0, 0, 1, 0};
268   EXPECT_EQ(expected, result);
269   result.Clear();
270 
271   // Max UINT32.
272   value = 0xffffffff;
273   Serialize(value, &result);
274   expected = {ENCODING_TYPE_UINT32, 0xff, 0xff, 0xff, 0xff};
275   EXPECT_EQ(expected, result);
276   result.Clear();
277 }
278 
TEST(SerializationTest,uint64_t)279 TEST(SerializationTest, uint64_t) {
280   Payload result;
281   Payload expected;
282   uint64_t value;
283 
284   // Min FIXINT.
285   value = 0;
286   Serialize(value, &result);
287   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
288   EXPECT_EQ(expected, result);
289   result.Clear();
290 
291   // Max FIXINT.
292   value = (1 << 7) - 1;
293   Serialize(value, &result);
294   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
295   EXPECT_EQ(expected, result);
296   result.Clear();
297 
298   // Min UINT8.
299   value = (1 << 7);
300   Serialize(value, &result);
301   expected = {ENCODING_TYPE_UINT8, (1 << 7)};
302   EXPECT_EQ(expected, result);
303   result.Clear();
304 
305   // Max UINT8.
306   value = 0xff;
307   Serialize(value, &result);
308   expected = {ENCODING_TYPE_UINT8, 0xff};
309   EXPECT_EQ(expected, result);
310   result.Clear();
311 
312   // Min UINT16.
313   value = (1 << 8);
314   Serialize(value, &result);
315   expected = {ENCODING_TYPE_UINT16, 0, 1};
316   EXPECT_EQ(expected, result);
317   result.Clear();
318 
319   // Max UINT16.
320   value = 0xffff;
321   Serialize(value, &result);
322   expected = {ENCODING_TYPE_UINT16, 0xff, 0xff};
323   EXPECT_EQ(expected, result);
324   result.Clear();
325 
326   // Min UINT32.
327   value = (1 << 16);
328   Serialize(value, &result);
329   expected = {ENCODING_TYPE_UINT32, 0, 0, 1, 0};
330   EXPECT_EQ(expected, result);
331   result.Clear();
332 
333   // Max UINT32.
334   value = 0xffffffff;
335   Serialize(value, &result);
336   expected = {ENCODING_TYPE_UINT32, 0xff, 0xff, 0xff, 0xff};
337   EXPECT_EQ(expected, result);
338   result.Clear();
339 
340   // Min UINT64.
341   value = (1ULL << 32);
342   Serialize(value, &result);
343   expected = {ENCODING_TYPE_UINT64, 0, 0, 0, 0, 1, 0, 0, 0};
344   EXPECT_EQ(expected, result);
345   result.Clear();
346 
347   // Max UINT64.
348   value = 0xffffffffffffffffULL;
349   Serialize(value, &result);
350   expected = {
351       ENCODING_TYPE_UINT64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
352   EXPECT_EQ(expected, result);
353   result.Clear();
354 }
355 
TEST(SerializationTest,int8_t)356 TEST(SerializationTest, int8_t) {
357   Payload result;
358   Payload expected;
359   int8_t value;
360 
361   // Min NEGATIVE FIXINT.
362   value = -32;
363   Serialize(value, &result);
364   expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
365   EXPECT_EQ(expected, result);
366   result.Clear();
367 
368   // Max NEGATIVE FIXINT.
369   value = -1;
370   Serialize(value, &result);
371   expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
372   EXPECT_EQ(expected, result);
373   result.Clear();
374 
375   // Min FIXINT.
376   value = 0;
377   Serialize(value, &result);
378   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
379   EXPECT_EQ(expected, result);
380   result.Clear();
381 
382   // Max FIXINT.
383   value = 127;
384   Serialize(value, &result);
385   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
386   EXPECT_EQ(expected, result);
387   result.Clear();
388 
389   // Min INT8.
390   value = -128;
391   Serialize(value, &result);
392   expected = {ENCODING_TYPE_INT8, 0x80};
393   EXPECT_EQ(expected, result);
394   result.Clear();
395 
396   // Max INT8.
397   value = -33;
398   Serialize(value, &result);
399   expected = {ENCODING_TYPE_INT8, 0xdf};
400   EXPECT_EQ(expected, result);
401   result.Clear();
402 }
403 
TEST(SerializationTest,int16_t)404 TEST(SerializationTest, int16_t) {
405   Payload result;
406   Payload expected;
407   int16_t value;
408 
409   // Min NEGATIVE FIXINT.
410   value = -32;
411   Serialize(value, &result);
412   expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
413   EXPECT_EQ(expected, result);
414   result.Clear();
415 
416   // Max NEGATIVE FIXINT.
417   value = -1;
418   Serialize(value, &result);
419   expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
420   EXPECT_EQ(expected, result);
421   result.Clear();
422 
423   // Min FIXINT.
424   value = 0;
425   Serialize(value, &result);
426   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
427   EXPECT_EQ(expected, result);
428   result.Clear();
429 
430   // Max FIXINT.
431   value = 127;
432   Serialize(value, &result);
433   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
434   EXPECT_EQ(expected, result);
435   result.Clear();
436 
437   // Min INT8.
438   value = -128;
439   Serialize(value, &result);
440   expected = {ENCODING_TYPE_INT8, 0x80};
441   EXPECT_EQ(expected, result);
442   result.Clear();
443 
444   // Max INT8.
445   value = -33;
446   Serialize(value, &result);
447   expected = {ENCODING_TYPE_INT8, 0xdf};
448   EXPECT_EQ(expected, result);
449   result.Clear();
450 
451   // Min INT16.
452   value = -32768;
453   Serialize(value, &result);
454   expected = {ENCODING_TYPE_INT16, 0x00, 0x80};
455   EXPECT_EQ(expected, result);
456   result.Clear();
457 
458   // Max INT16.
459   value = 32767;
460   Serialize(value, &result);
461   expected = {ENCODING_TYPE_INT16, 0xff, 0x7f};
462   EXPECT_EQ(expected, result);
463   result.Clear();
464 }
465 
TEST(SerializationTest,int32_t)466 TEST(SerializationTest, int32_t) {
467   Payload result;
468   Payload expected;
469   int32_t value;
470 
471   // Min NEGATIVE FIXINT.
472   value = -32;
473   Serialize(value, &result);
474   expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
475   EXPECT_EQ(expected, result);
476   result.Clear();
477 
478   // Max NEGATIVE FIXINT.
479   value = -1;
480   Serialize(value, &result);
481   expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
482   EXPECT_EQ(expected, result);
483   result.Clear();
484 
485   // Min FIXINT.
486   value = 0;
487   Serialize(value, &result);
488   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
489   EXPECT_EQ(expected, result);
490   result.Clear();
491 
492   // Max FIXINT.
493   value = 127;
494   Serialize(value, &result);
495   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
496   EXPECT_EQ(expected, result);
497   result.Clear();
498 
499   // Min INT8.
500   value = -128;
501   Serialize(value, &result);
502   expected = {ENCODING_TYPE_INT8, 0x80};
503   EXPECT_EQ(expected, result);
504   result.Clear();
505 
506   // Max INT8.
507   value = -33;
508   Serialize(value, &result);
509   expected = {ENCODING_TYPE_INT8, 0xdf};
510   EXPECT_EQ(expected, result);
511   result.Clear();
512 
513   // Min INT16.
514   value = -32768;
515   Serialize(value, &result);
516   expected = {ENCODING_TYPE_INT16, 0x00, 0x80};
517   EXPECT_EQ(expected, result);
518   result.Clear();
519 
520   // Max INT16.
521   value = 32767;
522   Serialize(value, &result);
523   expected = {ENCODING_TYPE_INT16, 0xff, 0x7f};
524   EXPECT_EQ(expected, result);
525   result.Clear();
526 
527   // Min INT32.
528   value = -2147483648;
529   Serialize(value, &result);
530   expected = {ENCODING_TYPE_INT32, 0x00, 0x00, 0x00, 0x80};
531   EXPECT_EQ(expected, result);
532   result.Clear();
533 
534   // Max INT32.
535   value = 2147483647;
536   Serialize(value, &result);
537   expected = {ENCODING_TYPE_INT32, 0xff, 0xff, 0xff, 0x7f};
538   EXPECT_EQ(expected, result);
539   result.Clear();
540 }
541 
TEST(SerializationTest,int64_t)542 TEST(SerializationTest, int64_t) {
543   Payload result;
544   Payload expected;
545   int64_t value;
546 
547   // Min NEGATIVE FIXINT.
548   value = -32;
549   Serialize(value, &result);
550   expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
551   EXPECT_EQ(expected, result);
552   result.Clear();
553 
554   // Max NEGATIVE FIXINT.
555   value = -1;
556   Serialize(value, &result);
557   expected = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
558   EXPECT_EQ(expected, result);
559   result.Clear();
560 
561   // Min FIXINT.
562   value = 0;
563   Serialize(value, &result);
564   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
565   EXPECT_EQ(expected, result);
566   result.Clear();
567 
568   // Max FIXINT.
569   value = 127;
570   Serialize(value, &result);
571   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
572   EXPECT_EQ(expected, result);
573   result.Clear();
574 
575   // Min INT8.
576   value = -128;
577   Serialize(value, &result);
578   expected = {ENCODING_TYPE_INT8, 0x80};
579   EXPECT_EQ(expected, result);
580   result.Clear();
581 
582   // Max INT8.
583   value = -33;
584   Serialize(value, &result);
585   expected = {ENCODING_TYPE_INT8, 0xdf};
586   EXPECT_EQ(expected, result);
587   result.Clear();
588 
589   // Min INT16.
590   value = -32768;
591   Serialize(value, &result);
592   expected = {ENCODING_TYPE_INT16, 0x00, 0x80};
593   EXPECT_EQ(expected, result);
594   result.Clear();
595 
596   // Max INT16.
597   value = 32767;
598   Serialize(value, &result);
599   expected = {ENCODING_TYPE_INT16, 0xff, 0x7f};
600   EXPECT_EQ(expected, result);
601   result.Clear();
602 
603   // Min INT32.
604   value = -2147483648;
605   Serialize(value, &result);
606   expected = {ENCODING_TYPE_INT32, 0x00, 0x00, 0x00, 0x80};
607   EXPECT_EQ(expected, result);
608   result.Clear();
609 
610   // Max INT32.
611   value = 2147483647;
612   Serialize(value, &result);
613   expected = {ENCODING_TYPE_INT32, 0xff, 0xff, 0xff, 0x7f};
614   EXPECT_EQ(expected, result);
615   result.Clear();
616 
617   // Min INT64.
618   value = -9223372036854775808ULL;
619   Serialize(value, &result);
620   expected = {
621       ENCODING_TYPE_INT64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};
622   EXPECT_EQ(expected, result);
623   result.Clear();
624 
625   // Max INT64.
626   value = 9223372036854775807ULL;
627   Serialize(value, &result);
628   expected = {
629       ENCODING_TYPE_INT64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
630   EXPECT_EQ(expected, result);
631   result.Clear();
632 }
633 
TEST(SerializationTest,float)634 TEST(SerializationTest, float) {
635   Payload result;
636   Payload expected;
637   float value;
638 
639   value = 0.0f;
640   Serialize(value, &result);
641   expected = {ENCODING_TYPE_FLOAT32, kZeroFloatBytes[0], kZeroFloatBytes[1],
642               kZeroFloatBytes[2], kZeroFloatBytes[3]};
643   EXPECT_EQ(expected, result);
644   result.Clear();
645 
646   value = 1.0f;
647   Serialize(value, &result);
648   expected = {ENCODING_TYPE_FLOAT32, kOneFloatBytes[0], kOneFloatBytes[1],
649               kOneFloatBytes[2], kOneFloatBytes[3]};
650   EXPECT_EQ(expected, result);
651   result.Clear();
652 }
653 
TEST(SerializationTest,double)654 TEST(SerializationTest, double) {
655   Payload result;
656   Payload expected;
657   double value;
658 
659   value = 0.0f;
660   Serialize(value, &result);
661   expected = {ENCODING_TYPE_FLOAT64, kZeroDoubleBytes[0], kZeroDoubleBytes[1],
662               kZeroDoubleBytes[2],   kZeroDoubleBytes[3], kZeroDoubleBytes[4],
663               kZeroDoubleBytes[5],   kZeroDoubleBytes[6], kZeroDoubleBytes[7]};
664   EXPECT_EQ(expected, result);
665   result.Clear();
666 
667   value = 1.0f;
668   Serialize(value, &result);
669   expected = {ENCODING_TYPE_FLOAT64, kOneDoubleBytes[0], kOneDoubleBytes[1],
670               kOneDoubleBytes[2],    kOneDoubleBytes[3], kOneDoubleBytes[4],
671               kOneDoubleBytes[5],    kOneDoubleBytes[6], kOneDoubleBytes[7]};
672   EXPECT_EQ(expected, result);
673   result.Clear();
674 }
675 
TEST(SerializationTest,Enum)676 TEST(SerializationTest, Enum) {
677   Payload result;
678   Payload expected;
679 
680   enum Foo { kFoo, kBar, kBaz };
681   Foo value = kBar;
682   Serialize(value, &result);
683   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1};
684   EXPECT_EQ(expected, result);
685   result.Clear();
686 }
687 
TEST(SerializationTest,EnumClass)688 TEST(SerializationTest, EnumClass) {
689   Payload result;
690   Payload expected;
691 
692   enum class Foo { kFoo, kBar, kBaz };
693   Foo value = Foo::kBaz;
694   Serialize(value, &result);
695   expected = {ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2};
696   EXPECT_EQ(expected, result);
697   result.Clear();
698 }
699 
TEST(SerializationTest,LocalHandle)700 TEST(SerializationTest, LocalHandle) {
701   Payload result;
702   Payload expected;
703   LocalHandle fd1;
704   LocalHandle fd2;
705 
706   fd1 = LocalHandle(100);
707   Serialize(fd1, &result);
708   expected = {ENCODING_TYPE_FIXEXT2, ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0, 0};
709   EXPECT_EQ(expected, result);
710   EXPECT_EQ(1u, result.FdCount());
711   EXPECT_EQ(100, result.FdArray()[0]);
712   result.Clear();
713 
714   fd2 = LocalHandle(200);
715   Serialize(std::forward_as_tuple(fd1, fd2), &result);
716   expected = decltype(expected)(
717       {ENCODING_TYPE_FIXARRAY_MIN + 2, ENCODING_TYPE_FIXEXT2,
718        ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0, 0, ENCODING_TYPE_FIXEXT2,
719        ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 1, 0});
720   EXPECT_EQ(expected, result);
721   EXPECT_EQ(2u, result.FdCount());
722   EXPECT_EQ(100, result.FdArray()[0]);
723   EXPECT_EQ(200, result.FdArray()[1]);
724   result.Clear();
725 
726   fd1.Release();  // Don't try to close fd 100.
727   fd2.Release();  // Don't try to close fd 200.
728 
729   fd1 = LocalHandle(-2);
730   Serialize(fd1, &result);
731   expected = {ENCODING_TYPE_FIXEXT2, ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0xfe,
732               0xff};
733   EXPECT_EQ(expected, result);
734   EXPECT_EQ(0u, result.FdCount());
735   result.Clear();
736 }
737 
TEST(SerializationTest,string)738 TEST(SerializationTest, string) {
739   Payload result;
740   Payload expected;
741   std::string value;
742 
743   // Min FIXSTR.
744   value = "";
745   Serialize(value, &result);
746   expected = {ENCODING_TYPE_FIXSTR_MIN};
747   EXPECT_EQ(expected, result);
748   result.Clear();
749 
750   // Max FIXSTR.
751   value = std::string((1 << 5) - 1, 'x');
752   Serialize(value, &result);
753   expected = {ENCODING_TYPE_FIXSTR_MAX};
754   expected.Append((1 << 5) - 1, 'x');
755   EXPECT_EQ(expected, result);
756   result.Clear();
757 
758   // Min STR8.
759   value = std::string((1 << 5), 'x');
760   Serialize(value, &result);
761   expected = {ENCODING_TYPE_STR8, (1 << 5)};
762   expected.Append((1 << 5), 'x');
763   EXPECT_EQ(expected, result);
764   result.Clear();
765 
766   // Max STR8.
767   value = std::string((1 << 8) - 1, 'x');
768   Serialize(value, &result);
769   expected = {ENCODING_TYPE_STR8, (1 << 8) - 1};
770   expected.Append((1 << 8) - 1, 'x');
771   EXPECT_EQ(expected, result);
772   result.Clear();
773 
774   // Min STR16.
775   value = std::string((1 << 8), 'x');
776   Serialize(value, &result);
777   expected = {ENCODING_TYPE_STR16, 0x00, 0x01};
778   expected.Append((1 << 8), 'x');
779   EXPECT_EQ(expected, result);
780   result.Clear();
781 
782   // Max STR16.
783   value = std::string((1 << 16) - 1, 'x');
784   Serialize(value, &result);
785   expected = {ENCODING_TYPE_STR16, 0xff, 0xff};
786   expected.Append((1 << 16) - 1, 'x');
787   EXPECT_EQ(expected, result);
788   result.Clear();
789 
790   // Min STR32.
791   value = std::string((1 << 16), 'x');
792   Serialize(value, &result);
793   expected = {ENCODING_TYPE_STR32, 0x00, 0x00, 0x01, 0x00};
794   expected.Append((1 << 16), 'x');
795   EXPECT_EQ(expected, result);
796   result.Clear();
797 }
798 
TEST(SerializationTest,StringWrapper)799 TEST(SerializationTest, StringWrapper) {
800   Payload result;
801   Payload expected;
802   std::string value;
803 
804   // Min FIXSTR.
805   value = "";
806   Serialize(WrapString(value), &result);
807   expected = {ENCODING_TYPE_FIXSTR_MIN};
808   EXPECT_EQ(expected, result);
809   result.Clear();
810 
811   // Max FIXSTR.
812   value = std::string((1 << 5) - 1, 'x');
813   Serialize(WrapString(value), &result);
814   expected = {ENCODING_TYPE_FIXSTR_MAX};
815   expected.Append((1 << 5) - 1, 'x');
816   EXPECT_EQ(expected, result);
817   result.Clear();
818 
819   // Min STR8.
820   value = std::string((1 << 5), 'x');
821   Serialize(WrapString(value), &result);
822   expected = {ENCODING_TYPE_STR8, (1 << 5)};
823   expected.Append((1 << 5), 'x');
824   EXPECT_EQ(expected, result);
825   result.Clear();
826 
827   // Max STR8.
828   value = std::string((1 << 8) - 1, 'x');
829   Serialize(WrapString(value), &result);
830   expected = {ENCODING_TYPE_STR8, (1 << 8) - 1};
831   expected.Append((1 << 8) - 1, 'x');
832   EXPECT_EQ(expected, result);
833   result.Clear();
834 
835   // Min STR16.
836   value = std::string((1 << 8), 'x');
837   Serialize(WrapString(value), &result);
838   expected = {ENCODING_TYPE_STR16, 0x00, 0x01};
839   expected.Append((1 << 8), 'x');
840   EXPECT_EQ(expected, result);
841   result.Clear();
842 
843   // Max STR16.
844   value = std::string((1 << 16) - 1, 'x');
845   Serialize(WrapString(value), &result);
846   expected = {ENCODING_TYPE_STR16, 0xff, 0xff};
847   expected.Append((1 << 16) - 1, 'x');
848   EXPECT_EQ(expected, result);
849   result.Clear();
850 
851   // Min STR32.
852   value = std::string((1 << 16), 'x');
853   Serialize(WrapString(value), &result);
854   expected = {ENCODING_TYPE_STR32, 0x00, 0x00, 0x01, 0x00};
855   expected.Append((1 << 16), 'x');
856   EXPECT_EQ(expected, result);
857   result.Clear();
858 }
859 
TEST(SerializationTest,vector)860 TEST(SerializationTest, vector) {
861   Payload result;
862   Payload expected;
863   std::vector<uint8_t> value;
864 
865   // Min FIXARRAY.
866   value = {};
867   Serialize(value, &result);
868   expected = {ENCODING_TYPE_FIXARRAY_MIN};
869   EXPECT_EQ(expected, result);
870   result.Clear();
871 
872   // Max FIXARRAY.
873   value = decltype(value)((1 << 4) - 1, 'x');
874   Serialize(value, &result);
875   expected = {ENCODING_TYPE_FIXARRAY_MAX};
876   expected.Append((1 << 4) - 1, 'x');
877   EXPECT_EQ(expected, result);
878   result.Clear();
879 
880   // Min ARRAY16.
881   value = decltype(value)((1 << 4), 'x');
882   Serialize(value, &result);
883   expected = {ENCODING_TYPE_ARRAY16, 0x10, 0x00};
884   expected.Append((1 << 4), 'x');
885   EXPECT_EQ(expected, result);
886   result.Clear();
887 
888   // Max ARRAY16.
889   value = decltype(value)((1 << 16) - 1, 'x');
890   Serialize(value, &result);
891   expected = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
892   expected.Append((1 << 16) - 1, 'x');
893   EXPECT_EQ(expected, result);
894   result.Clear();
895 
896   // Min ARRAY32.
897   value = decltype(value)((1 << 16), 'x');
898   Serialize(value, &result);
899   expected = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
900   expected.Append((1 << 16), 'x');
901   EXPECT_EQ(expected, result);
902   result.Clear();
903 }
904 
TEST(SerializationTest,map)905 TEST(SerializationTest, map) {
906   Payload result;
907   Payload expected;
908   std::map<std::uint32_t, std::uint32_t> value;
909 
910   // Min FIXMAP.
911   value = {};
912   Serialize(value, &result);
913   expected = {ENCODING_TYPE_FIXMAP_MIN};
914   EXPECT_EQ(expected, result);
915   result.Clear();
916 
917   // Max FIXMAP.
918   value = MakeMap<decltype(value)>((1 << 4) - 1);
919   Serialize(value, &result);
920   expected = {ENCODING_TYPE_FIXMAP_MAX};
921   InsertKeyValue<decltype(value)>(&expected, (1 << 4) - 1);
922   EXPECT_EQ(expected, result);
923   result.Clear();
924 
925   // Min MAP16.
926   value = MakeMap<decltype(value)>((1 << 4));
927   Serialize(value, &result);
928   expected = {ENCODING_TYPE_MAP16, 0x10, 0x00};
929   InsertKeyValue<decltype(value)>(&expected, (1 << 4));
930   EXPECT_EQ(expected, result);
931   result.Clear();
932 
933   // Max MAP16.
934   value = MakeMap<decltype(value)>((1 << 16) - 1);
935   Serialize(value, &result);
936   expected = {ENCODING_TYPE_MAP16, 0xff, 0xff};
937   InsertKeyValue<decltype(value)>(&expected, (1 << 16) - 1);
938   EXPECT_EQ(expected, result);
939   result.Clear();
940 
941   // Min MAP32.
942   value = MakeMap<decltype(value)>((1 << 16));
943   Serialize(value, &result);
944   expected = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x01, 0x00};
945   InsertKeyValue<decltype(value)>(&expected, (1 << 16));
946   EXPECT_EQ(expected, result);
947   result.Clear();
948 }
949 
TEST(SerializationTest,unordered_map)950 TEST(SerializationTest, unordered_map) {
951   Payload result;
952   Payload expected;
953   std::unordered_map<std::uint32_t, std::uint32_t> value;
954 
955   // Min FIXMAP.
956   value = {};
957   Serialize(value, &result);
958   expected = {ENCODING_TYPE_FIXMAP_MIN};
959   EXPECT_EQ(expected, result);
960   result.Clear();
961 
962   // Max FIXMAP.
963   value = MakeMap<decltype(value)>((1 << 4) - 1);
964   Serialize(value, &result);
965   expected = {ENCODING_TYPE_FIXMAP_MAX};
966   InsertKeyValue<decltype(value)>(&expected, (1 << 4) - 1);
967   EXPECT_EQ(expected, result);
968   result.Clear();
969 
970   // Min MAP16.
971   value = MakeMap<decltype(value)>((1 << 4));
972   Serialize(value, &result);
973   expected = {ENCODING_TYPE_MAP16, 0x10, 0x00};
974   InsertKeyValue<decltype(value)>(&expected, (1 << 4));
975   EXPECT_EQ(expected, result);
976   result.Clear();
977 
978   // Max MAP16.
979   value = MakeMap<decltype(value)>((1 << 16) - 1);
980   Serialize(value, &result);
981   expected = {ENCODING_TYPE_MAP16, 0xff, 0xff};
982   InsertKeyValue<decltype(value)>(&expected, (1 << 16) - 1);
983   EXPECT_EQ(expected, result);
984   result.Clear();
985 
986   // Min MAP32.
987   value = MakeMap<decltype(value)>((1 << 16));
988   Serialize(value, &result);
989   expected = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x01, 0x00};
990   InsertKeyValue<decltype(value)>(&expected, (1 << 16));
991   EXPECT_EQ(expected, result);
992   result.Clear();
993 }
994 
TEST(SerializationTest,array)995 TEST(SerializationTest, array) {
996   Payload result;
997   Payload expected;
998 
999   // Min FIXARRAY.
1000   std::array<std::uint8_t, 0> a0;
1001   Serialize(a0, &result);
1002   expected = {ENCODING_TYPE_FIXARRAY_MIN};
1003   EXPECT_EQ(expected, result);
1004   result.Clear();
1005 
1006   // Max FIXARRAY.
1007   std::array<std::uint8_t, (1 << 4) - 1> a1;
1008   for (auto& element : a1)
1009     element = 'x';
1010   Serialize(a1, &result);
1011   expected = {ENCODING_TYPE_FIXARRAY_MAX};
1012   expected.Append((1 << 4) - 1, 'x');
1013   EXPECT_EQ(expected, result);
1014   result.Clear();
1015 
1016   // Min ARRAY16.
1017   std::array<std::uint8_t, (1 << 4)> a2;
1018   for (auto& element : a2)
1019     element = 'x';
1020   Serialize(a2, &result);
1021   expected = {ENCODING_TYPE_ARRAY16, 0x10, 0x00};
1022   expected.Append((1 << 4), 'x');
1023   EXPECT_EQ(expected, result);
1024   result.Clear();
1025 
1026   // Max ARRAY16.
1027   std::array<std::uint8_t, (1 << 16) - 1> a3;
1028   for (auto& element : a3)
1029     element = 'x';
1030   Serialize(a3, &result);
1031   expected = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
1032   expected.Append((1 << 16) - 1, 'x');
1033   EXPECT_EQ(expected, result);
1034   result.Clear();
1035 
1036   // Min ARRAY32.
1037   std::array<std::uint8_t, (1 << 16)> a4;
1038   for (auto& element : a4)
1039     element = 'x';
1040   Serialize(a4, &result);
1041   expected = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
1042   expected.Append((1 << 16), 'x');
1043   EXPECT_EQ(expected, result);
1044   result.Clear();
1045 }
1046 
TEST(SerializationTest,ArrayWrapper)1047 TEST(SerializationTest, ArrayWrapper) {
1048   Payload result;
1049   Payload expected;
1050   std::vector<std::uint8_t, DefaultInitializationAllocator<std::uint8_t>> value;
1051   ArrayWrapper<std::uint8_t> wrapper;
1052 
1053   // Min FIXARRAY.
1054   value = {};
1055   Serialize(wrapper, &result);
1056   expected = {ENCODING_TYPE_FIXARRAY_MIN};
1057   EXPECT_EQ(expected, result);
1058   result.Clear();
1059 
1060   // Max FIXARRAY.
1061   value = decltype(value)((1 << 4) - 1, 'x');
1062   wrapper = decltype(wrapper)(value.data(), value.capacity(), value.size());
1063   Serialize(wrapper, &result);
1064   expected = {ENCODING_TYPE_FIXARRAY_MAX};
1065   expected.Append((1 << 4) - 1, 'x');
1066   EXPECT_EQ(expected, result);
1067   result.Clear();
1068 
1069   // Min ARRAY16.
1070   value = decltype(value)((1 << 4), 'x');
1071   wrapper = decltype(wrapper)(value.data(), value.capacity(), value.size());
1072   Serialize(wrapper, &result);
1073   expected = {ENCODING_TYPE_ARRAY16, 0x10, 0x00};
1074   expected.Append((1 << 4), 'x');
1075   EXPECT_EQ(expected, result);
1076   result.Clear();
1077 
1078   // Max ARRAY16.
1079   value = decltype(value)((1 << 16) - 1, 'x');
1080   wrapper = decltype(wrapper)(value.data(), value.capacity(), value.size());
1081   Serialize(wrapper, &result);
1082   expected = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
1083   expected.Append((1 << 16) - 1, 'x');
1084   EXPECT_EQ(expected, result);
1085   result.Clear();
1086 
1087   // Min ARRAY32.
1088   value = decltype(value)((1 << 16), 'x');
1089   wrapper = decltype(wrapper)(value.data(), value.capacity(), value.size());
1090   Serialize(wrapper, &result);
1091   expected = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
1092   expected.Append((1 << 16), 'x');
1093   EXPECT_EQ(expected, result);
1094   result.Clear();
1095 }
1096 
TEST(SerializationTest,pair)1097 TEST(SerializationTest, pair) {
1098   Payload result;
1099   Payload expected;
1100 
1101   auto p1 = std::make_pair(1, 2);
1102   Serialize(p1, &result);
1103   expected = {ENCODING_TYPE_FIXARRAY_MIN + 2, 1, 2};
1104   EXPECT_EQ(expected, result);
1105   result.Clear();
1106 
1107   auto p2 = std::make_pair('x', std::string("12345"));
1108   Serialize(p2, &result);
1109   expected = decltype(expected)({ENCODING_TYPE_FIXARRAY_MIN + 2, 'x',
1110                                  ENCODING_TYPE_FIXSTR_MIN + 5, '1', '2', '3',
1111                                  '4', '5'});
1112   EXPECT_EQ(expected, result);
1113   result.Clear();
1114 }
1115 
TEST(SerializationTest,tuple)1116 TEST(SerializationTest, tuple) {
1117   Payload result;
1118   Payload expected;
1119 
1120   // Min FIXARRAY.
1121   auto t1 = std::make_tuple();
1122   Serialize(t1, &result);
1123   expected = {ENCODING_TYPE_FIXARRAY_MIN};
1124   EXPECT_EQ(expected, result);
1125   result.Clear();
1126 
1127   // Max FIXARRAY.
1128   auto t2 = GetNTuple<15>('x');
1129   Serialize(t2, &result);
1130   expected = {ENCODING_TYPE_FIXARRAY_MAX};
1131   expected.Append((1 << 4) - 1, 'x');
1132   EXPECT_EQ(expected, result);
1133   result.Clear();
1134 
1135   // Min ARRAY16.
1136   auto t3 = GetNTuple<(1 << 4)>('x');
1137   Serialize(t3, &result);
1138   expected = {ENCODING_TYPE_ARRAY16, 0x10, 0x00};
1139   expected.Append((1 << 4), 'x');
1140   EXPECT_EQ(expected, result);
1141   result.Clear();
1142 
1143 // Template instantiation depth is an issue for these tests. They are commented
1144 // out to document the expected behavior, even though tuples of this order are
1145 // not expected in practice.
1146 #if 0
1147   // Max ARRAY16.
1148   auto t4 = GetNTuple<(1 << 16)-1>('x');
1149   Serialize(t4, &result);
1150   expected = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
1151   expected.Append((1 << 16)-1, 'x');
1152   EXPECT_EQ(expected, result);
1153   result.Clear();
1154 
1155   // Min ARRAY32.
1156   auto t5 = GetNTuple<(1 << 16)>('x');
1157   Serialize(t5, &result);
1158   expected = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
1159   expected.Append((1 << 16), 'x');
1160   EXPECT_EQ(expected, result);
1161   result.Clear();
1162 #endif
1163 }
1164 
1165 // TODO(eieio): More exhaustive testing of type nesting.
TEST(SerializationTest,NestedTuple)1166 TEST(SerializationTest, NestedTuple) {
1167   Payload result;
1168   Payload expected;
1169 
1170   auto t1 = std::make_tuple('x', std::make_tuple<int, int>(1, 2));
1171   Serialize(t1, &result);
1172   expected = decltype(expected)({ENCODING_TYPE_FIXARRAY_MIN + 2, 'x',
1173                                  ENCODING_TYPE_FIXARRAY_MIN + 2, 1, 2});
1174   EXPECT_EQ(expected, result);
1175   result.Clear();
1176 
1177   auto t2 = std::make_tuple('x', std::make_tuple<int, int>(1, 2),
1178                             std::string("0123456789"));
1179   Serialize(t2, &result);
1180   expected = decltype(expected)({ENCODING_TYPE_FIXARRAY_MIN + 3, 'x',
1181                                  ENCODING_TYPE_FIXARRAY_MIN + 2, 1, 2,
1182                                  ENCODING_TYPE_FIXSTR | 10, '0', '1', '2', '3',
1183                                  '4', '5', '6', '7', '8', '9'});
1184   EXPECT_EQ(expected, result);
1185   result.Clear();
1186 
1187   auto t3 = std::make_tuple(0.0f, std::uint64_t(10ULL),
1188                             std::vector<char>{'a', 'b', 'c'});
1189   Serialize(t3, &result);
1190   expected = decltype(expected)(
1191       {ENCODING_TYPE_FIXARRAY_MIN + 3, ENCODING_TYPE_FLOAT32,
1192        kZeroFloatBytes[0], kZeroFloatBytes[1], kZeroFloatBytes[2],
1193        kZeroFloatBytes[3], ENCODING_TYPE_POSITIVE_FIXINT_MIN + 10,
1194        ENCODING_TYPE_FIXARRAY_MIN + 3, 'a', 'b', 'c'});
1195   EXPECT_EQ(expected, result);
1196   result.Clear();
1197 }
1198 
TEST(SerializationTest,NestedMap)1199 TEST(SerializationTest, NestedMap) {
1200   Payload result;
1201   Payload expected;
1202 
1203   std::map<int, std::pair<std::string, int>> m1 = {{0, {"a", 2}},
1204                                                    {1, {"b", 10}}};
1205   Serialize(m1, &result);
1206   expected = decltype(expected)(
1207       {ENCODING_TYPE_FIXMAP_MIN + 2, 0, ENCODING_TYPE_FIXARRAY_MIN + 2,
1208        ENCODING_TYPE_FIXSTR_MIN + 1, 'a', 2, 1, ENCODING_TYPE_FIXARRAY_MIN + 2,
1209        ENCODING_TYPE_FIXSTR_MIN + 1, 'b', 10});
1210   EXPECT_EQ(expected, result);
1211   result.Clear();
1212 }
1213 
TEST(SerializationTest,Serializable)1214 TEST(SerializationTest, Serializable) {
1215   Payload result;
1216   Payload expected;
1217 
1218   TestType t1{10, 0.0, "12345", TestType::Foo::kBaz};
1219   Serialize(t1, &result);
1220   expected = decltype(expected)(
1221       {ENCODING_TYPE_FIXARRAY_MIN + 4, 10, ENCODING_TYPE_FLOAT32,
1222        kZeroFloatBytes[0], kZeroFloatBytes[1], kZeroFloatBytes[2],
1223        kZeroFloatBytes[3], ENCODING_TYPE_FIXSTR_MIN + 5, '1', '2', '3', '4',
1224        '5', ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2});
1225   EXPECT_EQ(expected, result);
1226   result.Clear();
1227 
1228   TestTemplateType<LocalHandle> tt{LocalHandle(-1)};
1229   Serialize(tt, &result);
1230   expected =
1231       decltype(expected)({ENCODING_TYPE_FIXARRAY_MIN + 1, ENCODING_TYPE_FIXEXT2,
1232                           ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0xff, 0xff});
1233   EXPECT_EQ(expected, result);
1234 }
1235 
TEST(SerializationTest,Variant)1236 TEST(SerializationTest, Variant) {
1237   Payload result;
1238   Payload expected;
1239 
1240   Variant<int, bool, float> v;
1241 
1242   // Empty variant.
1243   Serialize(v, &result);
1244   expected = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_NEGATIVE_FIXINT_MAX,
1245               ENCODING_TYPE_NIL};
1246   EXPECT_EQ(expected, result);
1247   result.Clear();
1248 
1249   v = 10;
1250   Serialize(v, &result);
1251   expected = {ENCODING_TYPE_FIXMAP_MIN + 1,
1252               ENCODING_TYPE_POSITIVE_FIXINT_MIN + 0,
1253               ENCODING_TYPE_POSITIVE_FIXINT_MIN + 10};
1254   EXPECT_EQ(expected, result);
1255   result.Clear();
1256 
1257   v = true;
1258   Serialize(v, &result);
1259   expected = {ENCODING_TYPE_FIXMAP_MIN + 1,
1260               ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1, ENCODING_TYPE_TRUE};
1261   EXPECT_EQ(expected, result);
1262   result.Clear();
1263 
1264   v = false;
1265   Serialize(v, &result);
1266   expected = {ENCODING_TYPE_FIXMAP_MIN + 1,
1267               ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1, ENCODING_TYPE_FALSE};
1268   EXPECT_EQ(expected, result);
1269   result.Clear();
1270 
1271   v = 1.0f;
1272   Serialize(v, &result);
1273   expected = {ENCODING_TYPE_FIXMAP_MIN + 1,
1274               ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2,
1275               ENCODING_TYPE_FLOAT32,
1276               kOneFloatBytes[0],
1277               kOneFloatBytes[1],
1278               kOneFloatBytes[2],
1279               kOneFloatBytes[3]};
1280   EXPECT_EQ(expected, result);
1281   result.Clear();
1282 
1283   // TODO(eieio): Add more serialization tests for Variant.
1284 }
1285 
TEST(DeserializationTest,bool)1286 TEST(DeserializationTest, bool) {
1287   Payload buffer;
1288   bool result = false;
1289   ErrorType error;
1290 
1291   // True.
1292   buffer = {ENCODING_TYPE_TRUE};
1293   error = Deserialize(&result, &buffer);
1294   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1295   EXPECT_EQ(1, result);  // Gtest generates warning from bool literals.
1296 
1297   // False.
1298   buffer = {ENCODING_TYPE_FALSE};
1299   error = Deserialize(&result, &buffer);
1300   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1301   EXPECT_EQ(0, result);  // Gtest generates warning from bool literals.
1302 }
1303 
TEST(DeserializationTest,uint8_t)1304 TEST(DeserializationTest, uint8_t) {
1305   Payload buffer;
1306   std::uint8_t result = 0;
1307   ErrorType error;
1308 
1309   // Min FIXINT.
1310   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1311   error = Deserialize(&result, &buffer);
1312   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1313   EXPECT_EQ(0U, result);
1314 
1315   // Max FIXINT.
1316   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1317   error = Deserialize(&result, &buffer);
1318   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1319   EXPECT_EQ(127U, result);
1320 
1321   // Min UINT8.
1322   buffer = {ENCODING_TYPE_UINT8, 0x00};
1323   error = Deserialize(&result, &buffer);
1324   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1325   EXPECT_EQ(0U, result);
1326 
1327   // Max UINT8.
1328   buffer = {ENCODING_TYPE_UINT8, 0xff};
1329   error = Deserialize(&result, &buffer);
1330   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1331   EXPECT_EQ(0xffU, result);
1332 
1333   // UINT16 out of range.
1334   buffer = {ENCODING_TYPE_UINT16};
1335   error = Deserialize(&result, &buffer);
1336   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1337   EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
1338   EXPECT_EQ(ENCODING_TYPE_UINT16, error.encoding_type());
1339 
1340   // UINT32 out of range.
1341   buffer = {ENCODING_TYPE_UINT32};
1342   error = Deserialize(&result, &buffer);
1343   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1344   EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
1345   EXPECT_EQ(ENCODING_TYPE_UINT32, error.encoding_type());
1346 
1347   // UINT64 out of range.
1348   buffer = {ENCODING_TYPE_UINT64};
1349   error = Deserialize(&result, &buffer);
1350   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1351   EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
1352   EXPECT_EQ(ENCODING_TYPE_UINT64, error.encoding_type());
1353 }
1354 
TEST(DeserializationTest,uint16_t)1355 TEST(DeserializationTest, uint16_t) {
1356   Payload buffer;
1357   std::uint16_t result = 0;
1358   ErrorType error;
1359 
1360   // Min FIXINT.
1361   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1362   error = Deserialize(&result, &buffer);
1363   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1364   EXPECT_EQ(0U, result);
1365 
1366   // Max FIXINT.
1367   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1368   error = Deserialize(&result, &buffer);
1369   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1370   EXPECT_EQ(127U, result);
1371 
1372   // Min UINT8.
1373   buffer = {ENCODING_TYPE_UINT8, 0x00};
1374   error = Deserialize(&result, &buffer);
1375   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1376   EXPECT_EQ(0U, result);
1377 
1378   // Max UINT8.
1379   buffer = {ENCODING_TYPE_UINT8, 0xff};
1380   error = Deserialize(&result, &buffer);
1381   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1382   EXPECT_EQ(0xffU, result);
1383 
1384   // Min UINT16.
1385   buffer = {ENCODING_TYPE_UINT16, 0x00, 0x00};
1386   error = Deserialize(&result, &buffer);
1387   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1388   EXPECT_EQ(0U, result);
1389 
1390   // Max UINT16.
1391   buffer = {ENCODING_TYPE_UINT16, 0xff, 0xff};
1392   error = Deserialize(&result, &buffer);
1393   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1394   EXPECT_EQ(0xffffU, result);
1395 
1396   // UINT32 out of range.
1397   buffer = {ENCODING_TYPE_UINT32};
1398   error = Deserialize(&result, &buffer);
1399   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1400   EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
1401   EXPECT_EQ(ENCODING_TYPE_UINT32, error.encoding_type());
1402 
1403   // UINT64 out of range.
1404   buffer = {ENCODING_TYPE_UINT64};
1405   error = Deserialize(&result, &buffer);
1406   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1407   EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
1408   EXPECT_EQ(ENCODING_TYPE_UINT64, error.encoding_type());
1409 }
1410 
TEST(DeserializationTest,uint32_t)1411 TEST(DeserializationTest, uint32_t) {
1412   Payload buffer;
1413   std::uint32_t result = 0;
1414   ErrorType error;
1415 
1416   // Min FIXINT.
1417   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1418   error = Deserialize(&result, &buffer);
1419   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1420   EXPECT_EQ(0U, result);
1421 
1422   // Max FIXINT.
1423   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1424   error = Deserialize(&result, &buffer);
1425   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1426   EXPECT_EQ(127U, result);
1427 
1428   // Min UINT8.
1429   buffer = {ENCODING_TYPE_UINT8, 0x00};
1430   error = Deserialize(&result, &buffer);
1431   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1432   EXPECT_EQ(0U, result);
1433 
1434   // Max UINT8.
1435   buffer = {ENCODING_TYPE_UINT8, 0xff};
1436   error = Deserialize(&result, &buffer);
1437   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1438   EXPECT_EQ(0xffU, result);
1439 
1440   // Min UINT16.
1441   buffer = {ENCODING_TYPE_UINT16, 0x00, 0x00};
1442   error = Deserialize(&result, &buffer);
1443   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1444   EXPECT_EQ(0U, result);
1445 
1446   // Max UINT16.
1447   buffer = {ENCODING_TYPE_UINT16, 0xff, 0xff};
1448   error = Deserialize(&result, &buffer);
1449   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1450   EXPECT_EQ(0xffffU, result);
1451 
1452   // Min UINT32.
1453   buffer = {ENCODING_TYPE_UINT32, 0x00, 0x00, 0x00, 0x00};
1454   error = Deserialize(&result, &buffer);
1455   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1456   EXPECT_EQ(0U, result);
1457 
1458   // Max UINT32.
1459   buffer = {ENCODING_TYPE_UINT32, 0xff, 0xff, 0xff, 0xff};
1460   error = Deserialize(&result, &buffer);
1461   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1462   EXPECT_EQ(0xffffffffU, result);
1463 
1464   // UINT64 out of range.
1465   buffer = {ENCODING_TYPE_UINT64};
1466   error = Deserialize(&result, &buffer);
1467   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1468   EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
1469   EXPECT_EQ(ENCODING_TYPE_UINT64, error.encoding_type());
1470 }
1471 
TEST(DeserializationTest,uint64_t)1472 TEST(DeserializationTest, uint64_t) {
1473   Payload buffer;
1474   std::uint64_t result = 0;
1475   ErrorType error;
1476 
1477   // Min FIXINT.
1478   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1479   error = Deserialize(&result, &buffer);
1480   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1481   EXPECT_EQ(0U, result);
1482 
1483   // Max FIXINT.
1484   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1485   error = Deserialize(&result, &buffer);
1486   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1487   EXPECT_EQ(127U, result);
1488 
1489   // Min UINT8.
1490   buffer = {ENCODING_TYPE_UINT8, 0x00};
1491   error = Deserialize(&result, &buffer);
1492   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1493   EXPECT_EQ(0U, result);
1494 
1495   // Max UINT8.
1496   buffer = {ENCODING_TYPE_UINT8, 0xff};
1497   error = Deserialize(&result, &buffer);
1498   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1499   EXPECT_EQ(0xffU, result);
1500 
1501   // Min UINT16.
1502   buffer = {ENCODING_TYPE_UINT16, 0x00, 0x00};
1503   error = Deserialize(&result, &buffer);
1504   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1505   EXPECT_EQ(0U, result);
1506 
1507   // Max UINT16.
1508   buffer = {ENCODING_TYPE_UINT16, 0xff, 0xff};
1509   error = Deserialize(&result, &buffer);
1510   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1511   EXPECT_EQ(0xffffU, result);
1512 
1513   // Min UINT32.
1514   buffer = {ENCODING_TYPE_UINT32, 0x00, 0x00, 0x00, 0x00};
1515   error = Deserialize(&result, &buffer);
1516   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1517   EXPECT_EQ(0U, result);
1518 
1519   // Max UINT32.
1520   buffer = {ENCODING_TYPE_UINT32, 0xff, 0xff, 0xff, 0xff};
1521   error = Deserialize(&result, &buffer);
1522   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1523   EXPECT_EQ(0xffffffffU, result);
1524 
1525   // Min UINT64.
1526   buffer = {
1527       ENCODING_TYPE_UINT64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
1528   error = Deserialize(&result, &buffer);
1529   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1530   EXPECT_EQ(0U, result);
1531 
1532   // Max UINT64.
1533   buffer = {
1534       ENCODING_TYPE_UINT64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1535   error = Deserialize(&result, &buffer);
1536   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1537   EXPECT_EQ(0xffffffffffffffffUL, result);
1538 }
1539 
TEST(DeserializationTest,int8_t)1540 TEST(DeserializationTest, int8_t) {
1541   Payload buffer;
1542   std::int8_t result = 0;
1543   ErrorType error;
1544 
1545   // Min NEGATIVE FIXINT.
1546   buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
1547   error = Deserialize(&result, &buffer);
1548   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1549   EXPECT_EQ(-32, result);
1550 
1551   // Max NEGATIVE FIXINT.
1552   buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
1553   error = Deserialize(&result, &buffer);
1554   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1555   EXPECT_EQ(-1, result);
1556 
1557   // Min FIXINT.
1558   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1559   error = Deserialize(&result, &buffer);
1560   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1561   EXPECT_EQ(0, result);
1562 
1563   // Max FIXINT.
1564   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1565   error = Deserialize(&result, &buffer);
1566   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1567   EXPECT_EQ(127, result);
1568 
1569   // Min INT8.
1570   buffer = {ENCODING_TYPE_INT8, 0x80};
1571   error = Deserialize(&result, &buffer);
1572   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1573   EXPECT_EQ(-128, result);
1574 
1575   // Max INT8.
1576   buffer = {ENCODING_TYPE_INT8, 0x7f};
1577   error = Deserialize(&result, &buffer);
1578   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1579   EXPECT_EQ(127, result);
1580 
1581   // INT16 out of range.
1582   buffer = {ENCODING_TYPE_INT16};
1583   error = Deserialize(&result, &buffer);
1584   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1585   EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
1586   EXPECT_EQ(ENCODING_TYPE_INT16, error.encoding_type());
1587 
1588   // INT32 out of range.
1589   buffer = {ENCODING_TYPE_INT32};
1590   error = Deserialize(&result, &buffer);
1591   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1592   EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
1593   EXPECT_EQ(ENCODING_TYPE_INT32, error.encoding_type());
1594 
1595   // INT64 out of range.
1596   buffer = {ENCODING_TYPE_INT64};
1597   error = Deserialize(&result, &buffer);
1598   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1599   EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
1600   EXPECT_EQ(ENCODING_TYPE_INT64, error.encoding_type());
1601 }
1602 
TEST(DeserializationTest,int16_t)1603 TEST(DeserializationTest, int16_t) {
1604   Payload buffer;
1605   std::int16_t result = 0;
1606   ErrorType error;
1607 
1608   // Min NEGATIVE FIXINT.
1609   buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
1610   error = Deserialize(&result, &buffer);
1611   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1612   EXPECT_EQ(-32, result);
1613 
1614   // Max NEGATIVE FIXINT.
1615   buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
1616   error = Deserialize(&result, &buffer);
1617   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1618   EXPECT_EQ(-1, result);
1619 
1620   // Min FIXINT.
1621   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1622   error = Deserialize(&result, &buffer);
1623   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1624   EXPECT_EQ(0, result);
1625 
1626   // Max FIXINT.
1627   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1628   error = Deserialize(&result, &buffer);
1629   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1630   EXPECT_EQ(127, result);
1631 
1632   // Min INT8.
1633   buffer = {ENCODING_TYPE_INT8, 0x80};
1634   error = Deserialize(&result, &buffer);
1635   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1636   EXPECT_EQ(-128, result);
1637 
1638   // Max INT8.
1639   buffer = {ENCODING_TYPE_INT8, 0x7f};
1640   error = Deserialize(&result, &buffer);
1641   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1642   EXPECT_EQ(127, result);
1643 
1644   // Min INT16.
1645   buffer = {ENCODING_TYPE_INT16, 0x00, 0x80};
1646   error = Deserialize(&result, &buffer);
1647   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1648   EXPECT_EQ(-32768, result);
1649 
1650   // Max INT16.
1651   buffer = {ENCODING_TYPE_INT16, 0xff, 0x7f};
1652   error = Deserialize(&result, &buffer);
1653   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1654   EXPECT_EQ(32767, result);
1655 
1656   // INT32 out of range.
1657   buffer = {ENCODING_TYPE_INT32};
1658   error = Deserialize(&result, &buffer);
1659   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1660   EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
1661   EXPECT_EQ(ENCODING_TYPE_INT32, error.encoding_type());
1662 
1663   // INT64 out of range.
1664   buffer = {ENCODING_TYPE_INT64};
1665   error = Deserialize(&result, &buffer);
1666   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1667   EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
1668   EXPECT_EQ(ENCODING_TYPE_INT64, error.encoding_type());
1669 }
1670 
TEST(DeserializationTest,int32_t)1671 TEST(DeserializationTest, int32_t) {
1672   Payload buffer;
1673   std::int32_t result = 0;
1674   ErrorType error;
1675 
1676   // Min NEGATIVE FIXINT.
1677   buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
1678   error = Deserialize(&result, &buffer);
1679   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1680   EXPECT_EQ(-32, result);
1681 
1682   // Max NEGATIVE FIXINT.
1683   buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
1684   error = Deserialize(&result, &buffer);
1685   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1686   EXPECT_EQ(-1, result);
1687 
1688   // Min FIXINT.
1689   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1690   error = Deserialize(&result, &buffer);
1691   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1692   EXPECT_EQ(0, result);
1693 
1694   // Max FIXINT.
1695   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1696   error = Deserialize(&result, &buffer);
1697   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1698   EXPECT_EQ(127, result);
1699 
1700   // Min INT8.
1701   buffer = {ENCODING_TYPE_INT8, 0x80};
1702   error = Deserialize(&result, &buffer);
1703   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1704   EXPECT_EQ(-128, result);
1705 
1706   // Max INT8.
1707   buffer = {ENCODING_TYPE_INT8, 0x7f};
1708   error = Deserialize(&result, &buffer);
1709   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1710   EXPECT_EQ(127, result);
1711 
1712   // Min INT16.
1713   buffer = {ENCODING_TYPE_INT16, 0x00, 0x80};
1714   error = Deserialize(&result, &buffer);
1715   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1716   EXPECT_EQ(-32768, result);
1717 
1718   // Max INT16.
1719   buffer = {ENCODING_TYPE_INT16, 0xff, 0x7f};
1720   error = Deserialize(&result, &buffer);
1721   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1722   EXPECT_EQ(32767, result);
1723 
1724   // Min INT32.
1725   buffer = {ENCODING_TYPE_INT32, 0x00, 0x00, 0x00, 0x80};
1726   error = Deserialize(&result, &buffer);
1727   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1728   EXPECT_EQ(-2147483648, result);
1729 
1730   // Max INT32.
1731   buffer = {ENCODING_TYPE_INT32, 0xff, 0xff, 0xff, 0x7f};
1732   error = Deserialize(&result, &buffer);
1733   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1734   EXPECT_EQ(2147483647, result);
1735 
1736   // INT64 out of range.
1737   buffer = {ENCODING_TYPE_INT64};
1738   error = Deserialize(&result, &buffer);
1739   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
1740   EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
1741   EXPECT_EQ(ENCODING_TYPE_INT64, error.encoding_type());
1742 }
1743 
TEST(DeserializationTest,int64_t)1744 TEST(DeserializationTest, int64_t) {
1745   Payload buffer;
1746   std::int64_t result = 0;
1747   ErrorType error;
1748 
1749   // Min NEGATIVE FIXINT.
1750   buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MIN};
1751   error = Deserialize(&result, &buffer);
1752   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1753   EXPECT_EQ(-32, result);
1754 
1755   // Max NEGATIVE FIXINT.
1756   buffer = {ENCODING_TYPE_NEGATIVE_FIXINT_MAX};
1757   error = Deserialize(&result, &buffer);
1758   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1759   EXPECT_EQ(-1, result);
1760 
1761   // Min FIXINT.
1762   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN};
1763   error = Deserialize(&result, &buffer);
1764   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1765   EXPECT_EQ(0, result);
1766 
1767   // Max FIXINT.
1768   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MAX};
1769   error = Deserialize(&result, &buffer);
1770   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1771   EXPECT_EQ(127, result);
1772 
1773   // Min INT8.
1774   buffer = {ENCODING_TYPE_INT8, 0x80};
1775   error = Deserialize(&result, &buffer);
1776   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1777   EXPECT_EQ(-128, result);
1778 
1779   // Max INT8.
1780   buffer = {ENCODING_TYPE_INT8, 0x7f};
1781   error = Deserialize(&result, &buffer);
1782   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1783   EXPECT_EQ(127, result);
1784 
1785   // Min INT16.
1786   buffer = {ENCODING_TYPE_INT16, 0x00, 0x80};
1787   error = Deserialize(&result, &buffer);
1788   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1789   EXPECT_EQ(-32768, result);
1790 
1791   // Max INT16.
1792   buffer = {ENCODING_TYPE_INT16, 0xff, 0x7f};
1793   error = Deserialize(&result, &buffer);
1794   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1795   EXPECT_EQ(32767, result);
1796 
1797   // Min INT32.
1798   buffer = {ENCODING_TYPE_INT32, 0x00, 0x00, 0x00, 0x80};
1799   error = Deserialize(&result, &buffer);
1800   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1801   EXPECT_EQ(-2147483648, result);
1802 
1803   // Max INT32.
1804   buffer = {ENCODING_TYPE_INT32, 0xff, 0xff, 0xff, 0x7f};
1805   error = Deserialize(&result, &buffer);
1806   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1807   EXPECT_EQ(2147483647, result);
1808 
1809   // Min INT64.
1810   buffer = {
1811       ENCODING_TYPE_INT64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80};
1812   error = Deserialize(&result, &buffer);
1813   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1814   // Believe it or not, this is actually the correct way to specify the most
1815   // negative signed long long.
1816   EXPECT_EQ(-9223372036854775807LL - 1, result);
1817 
1818   // Max INT64.
1819   buffer = {
1820       ENCODING_TYPE_INT64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f};
1821   error = Deserialize(&result, &buffer);
1822   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1823   EXPECT_EQ(9223372036854775807LL, result);
1824 }
1825 
TEST(DeserializationTest,float)1826 TEST(DeserializationTest, float) {
1827   Payload buffer;
1828   float result;
1829   ErrorType error;
1830 
1831   // FLOAT32.
1832   buffer = {ENCODING_TYPE_FLOAT32, kZeroFloatBytes[0], kZeroFloatBytes[1],
1833             kZeroFloatBytes[2], kZeroFloatBytes[3]};
1834   error = Deserialize(&result, &buffer);
1835   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1836   EXPECT_EQ(kZeroFloat, result);
1837 
1838   // FLOAT32.
1839   buffer = {ENCODING_TYPE_FLOAT32, kOneFloatBytes[0], kOneFloatBytes[1],
1840             kOneFloatBytes[2], kOneFloatBytes[3]};
1841   error = Deserialize(&result, &buffer);
1842   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1843   EXPECT_EQ(kOneFloat, result);
1844 }
1845 
TEST(DeserializationTest,double)1846 TEST(DeserializationTest, double) {
1847   Payload buffer;
1848   double result;
1849   ErrorType error;
1850 
1851   // FLOAT32.
1852   buffer = {ENCODING_TYPE_FLOAT32, kZeroFloatBytes[0], kZeroFloatBytes[1],
1853             kZeroFloatBytes[2], kZeroFloatBytes[3]};
1854   error = Deserialize(&result, &buffer);
1855   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1856   EXPECT_EQ(kZeroDouble, result);
1857 
1858   // FLOAT64.
1859   buffer = {ENCODING_TYPE_FLOAT64, kZeroDoubleBytes[0], kZeroDoubleBytes[1],
1860             kZeroDoubleBytes[2],   kZeroDoubleBytes[3], kZeroDoubleBytes[4],
1861             kZeroDoubleBytes[5],   kZeroDoubleBytes[6], kZeroDoubleBytes[7]};
1862   error = Deserialize(&result, &buffer);
1863   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1864   EXPECT_EQ(kZeroDouble, result);
1865 
1866   // FLOAT32.
1867   buffer = {ENCODING_TYPE_FLOAT32, kOneFloatBytes[0], kOneFloatBytes[1],
1868             kOneFloatBytes[2], kOneFloatBytes[3]};
1869   error = Deserialize(&result, &buffer);
1870   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1871   EXPECT_EQ(kOneDouble, result);
1872 
1873   // FLOAT64.
1874   buffer = {ENCODING_TYPE_FLOAT64, kOneDoubleBytes[0], kOneDoubleBytes[1],
1875             kOneDoubleBytes[2],    kOneDoubleBytes[3], kOneDoubleBytes[4],
1876             kOneDoubleBytes[5],    kOneDoubleBytes[6], kOneDoubleBytes[7]};
1877   error = Deserialize(&result, &buffer);
1878   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1879   EXPECT_EQ(kOneDouble, result);
1880 }
1881 
TEST(DeserializationTest,Enum)1882 TEST(DeserializationTest, Enum) {
1883   Payload buffer;
1884   enum Foo { kFoo, kBar, kBaz } result;
1885   ErrorType error;
1886 
1887   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1};
1888   error = Deserialize(&result, &buffer);
1889   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1890   EXPECT_EQ(kBar, result);
1891 }
1892 
TEST(DeserializationTest,EnumClass)1893 TEST(DeserializationTest, EnumClass) {
1894   Payload buffer;
1895   enum Foo { kFoo, kBar, kBaz } result;
1896   ErrorType error;
1897 
1898   buffer = {ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2};
1899   error = Deserialize(&result, &buffer);
1900   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1901   EXPECT_EQ(Foo::kBaz, result);
1902 }
1903 
TEST(DeserializationTest,LocalHandle)1904 TEST(DeserializationTest, LocalHandle) {
1905   Payload buffer;
1906   LocalHandle result1;
1907   LocalHandle result2;
1908   ErrorType error;
1909 
1910   buffer = {ENCODING_TYPE_FIXEXT2, ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0, 0};
1911   error = Deserialize(&result1, &buffer);
1912   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1913   EXPECT_EQ(0, result1.Get());
1914   result1.Release();  // Don't close fd 0.
1915 
1916   std::tuple<LocalHandle&, LocalHandle&> t1(result1, result2);
1917   buffer = decltype(buffer)(
1918       {ENCODING_TYPE_FIXARRAY_MIN + 2, ENCODING_TYPE_FIXEXT2,
1919        ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0, 0, ENCODING_TYPE_FIXEXT2,
1920        ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 1, 0});
1921   error = Deserialize(&t1, &buffer);
1922   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1923   EXPECT_EQ(0, result1.Get());
1924   EXPECT_EQ(1, result2.Get());
1925   result1.Release();  // Don't close fd 0.
1926   result2.Release();  // Don't close fd 1.
1927 
1928   buffer = {ENCODING_TYPE_FIXEXT2, ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0xfe,
1929             0xff};
1930   error = Deserialize(&result1, &buffer);
1931   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1932   EXPECT_EQ(-2, result1.Get());
1933 }
1934 
TEST(DeserializationTest,string)1935 TEST(DeserializationTest, string) {
1936   Payload buffer;
1937   std::string result = "";
1938   ErrorType error;
1939 
1940   // Min FIXSTR.
1941   buffer = {ENCODING_TYPE_FIXSTR_MIN};
1942   error = Deserialize(&result, &buffer);
1943   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1944   EXPECT_EQ("", result);
1945 
1946   // Max FIXSTR.
1947   buffer = {ENCODING_TYPE_FIXSTR_MAX};
1948   buffer.Append((1 << 5) - 1, 'x');
1949   error = Deserialize(&result, &buffer);
1950   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1951   EXPECT_EQ(std::string((1 << 5) - 1, 'x'), result);
1952 
1953   // Min STR8.
1954   buffer = {ENCODING_TYPE_STR8, 0x00};
1955   error = Deserialize(&result, &buffer);
1956   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1957   EXPECT_EQ("", result);
1958 
1959   // Max STR8.
1960   buffer = {ENCODING_TYPE_STR8, 0xff};
1961   buffer.Append(0xff, 'x');
1962   error = Deserialize(&result, &buffer);
1963   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1964   EXPECT_EQ(std::string(0xff, 'x'), result);
1965 
1966   // Min STR16.
1967   buffer = {ENCODING_TYPE_STR16, 0x00, 0x00};
1968   error = Deserialize(&result, &buffer);
1969   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1970   EXPECT_EQ("", result);
1971 
1972   // Max STR16.
1973   buffer = {ENCODING_TYPE_STR16, 0xff, 0xff};
1974   buffer.Append(0xffff, 'x');
1975   error = Deserialize(&result, &buffer);
1976   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1977   EXPECT_EQ(std::string(0xffff, 'x'), result);
1978 
1979   // Min STR32.
1980   buffer = {ENCODING_TYPE_STR32, 0x00, 0x00, 0x00, 0x00};
1981   error = Deserialize(&result, &buffer);
1982   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1983   EXPECT_EQ("", result);
1984 
1985   // Test STR32 with max STR16 + 1 bytes. It's not practical to test max
1986   // STR32.
1987   buffer = {ENCODING_TYPE_STR32, 0x00, 0x00, 0x01, 0x00};
1988   buffer.Append(0x10000, 'x');
1989   error = Deserialize(&result, &buffer);
1990   EXPECT_EQ(ErrorCode::NO_ERROR, error);
1991   EXPECT_EQ(std::string(0x10000, 'x'), result);
1992 }
1993 
TEST(DeserializationTest,vector)1994 TEST(DeserializationTest, vector) {
1995   Payload buffer;
1996   std::vector<std::uint8_t, DefaultInitializationAllocator<std::uint8_t>>
1997       result;
1998   Payload expected;
1999   ErrorType error;
2000 
2001   // Min FIXARRAY.
2002   buffer = {ENCODING_TYPE_FIXARRAY_MIN};
2003   error = Deserialize(&result, &buffer);
2004   expected = {};
2005   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2006   EXPECT_EQ(expected, result);
2007 
2008   // Max FIXARRAY.
2009   buffer = {ENCODING_TYPE_FIXARRAY_MAX};
2010   buffer.Append((1 << 4) - 1, 1);
2011   error = Deserialize(&result, &buffer);
2012   expected = decltype(expected)((1 << 4) - 1, 1);
2013   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2014   EXPECT_EQ(expected, result);
2015 
2016   // Min ARRAY16.
2017   buffer = {ENCODING_TYPE_ARRAY16, 0x00, 0x00};
2018   error = Deserialize(&result, &buffer);
2019   expected = {};
2020   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2021   EXPECT_EQ(expected, result);
2022 
2023   // Max ARRAY16.
2024   buffer = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
2025   buffer.Append(0xffff, 1);
2026   error = Deserialize(&result, &buffer);
2027   expected = decltype(expected)(0xffff, 1);
2028   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2029   EXPECT_EQ(expected, result);
2030 
2031   // Min ARRAY32.
2032   buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x00, 0x00};
2033   error = Deserialize(&result, &buffer);
2034   expected = {};
2035   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2036   EXPECT_EQ(expected, result);
2037 
2038   // ARRAY32 with max ARRAY16 + 1. It's not practical to test max ARRAY32.
2039   buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
2040   buffer.Append(0x10000, 1);
2041   error = Deserialize(&result, &buffer);
2042   expected = decltype(expected)(0x10000, 1);
2043   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2044   EXPECT_EQ(expected, result);
2045 }
2046 
TEST(DeserializationTest,map)2047 TEST(DeserializationTest, map) {
2048   Payload buffer;
2049   std::map<std::uint32_t, std::uint32_t> result;
2050   std::map<std::uint32_t, std::uint32_t> expected;
2051   ErrorType error;
2052 
2053   // Min FIXMAP.
2054   buffer = {ENCODING_TYPE_FIXMAP_MIN};
2055   error = Deserialize(&result, &buffer);
2056   expected = {};
2057   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2058   EXPECT_EQ(expected, result);
2059 
2060   // Size mismatch.
2061   buffer = {ENCODING_TYPE_FIXMAP_MIN + 1};
2062   error = Deserialize(&result, &buffer);
2063   EXPECT_EQ(ErrorCode::INSUFFICIENT_BUFFER, error);
2064 
2065   // Max FIXMAP.
2066   buffer = {ENCODING_TYPE_FIXMAP_MAX};
2067   InsertKeyValue<decltype(result)>(&buffer, (1 << 4) - 1);
2068   error = Deserialize(&result, &buffer);
2069   expected = MakeMap<decltype(expected)>((1 << 4) - 1);
2070   EXPECT_EQ(ErrorCode::NO_ERROR, error) << std::string(error);
2071   EXPECT_EQ(expected, result);
2072 
2073   // Min MAP16.
2074   buffer = {ENCODING_TYPE_MAP16, 0x00, 0x00};
2075   error = Deserialize(&result, &buffer);
2076   expected = {};
2077   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2078   EXPECT_EQ(expected, result);
2079 
2080   // Max MAP16.
2081   buffer = {ENCODING_TYPE_MAP16, 0xff, 0xff};
2082   InsertKeyValue<decltype(result)>(&buffer, (1 << 16) - 1);
2083   error = Deserialize(&result, &buffer);
2084   expected = MakeMap<decltype(expected)>((1 << 16) - 1);
2085   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2086   EXPECT_EQ(expected, result);
2087 
2088   // Min MAP32.
2089   buffer = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x00, 0x00};
2090   error = Deserialize(&result, &buffer);
2091   expected = {};
2092   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2093   EXPECT_EQ(expected, result);
2094 
2095   // MAP32 with max MAP16 + 1. It's not practical to test max MAP32.
2096   buffer = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x01, 0x00};
2097   InsertKeyValue<decltype(result)>(&buffer, (1 << 16));
2098   error = Deserialize(&result, &buffer);
2099   expected = MakeMap<decltype(expected)>((1 << 16));
2100   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2101   EXPECT_EQ(expected, result);
2102 }
2103 
TEST(DeserializationTest,unordered_map)2104 TEST(DeserializationTest, unordered_map) {
2105   Payload buffer;
2106   std::unordered_map<std::uint32_t, std::uint32_t> result;
2107   std::unordered_map<std::uint32_t, std::uint32_t> expected;
2108   ErrorType error;
2109 
2110   // Min FIXMAP.
2111   buffer = {ENCODING_TYPE_FIXMAP_MIN};
2112   error = Deserialize(&result, &buffer);
2113   expected = {};
2114   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2115   EXPECT_EQ(expected, result);
2116 
2117   // Size mismatch.
2118   buffer = {ENCODING_TYPE_FIXMAP_MIN + 1};
2119   error = Deserialize(&result, &buffer);
2120   EXPECT_EQ(ErrorCode::INSUFFICIENT_BUFFER, error);
2121 
2122   // Max FIXMAP.
2123   buffer = {ENCODING_TYPE_FIXMAP_MAX};
2124   InsertKeyValue<decltype(result)>(&buffer, (1 << 4) - 1);
2125   error = Deserialize(&result, &buffer);
2126   expected = MakeMap<decltype(expected)>((1 << 4) - 1);
2127   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2128   EXPECT_EQ(expected, result);
2129 
2130   // Min MAP16.
2131   buffer = {ENCODING_TYPE_MAP16, 0x00, 0x00};
2132   error = Deserialize(&result, &buffer);
2133   expected = {};
2134   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2135   EXPECT_EQ(expected, result);
2136 
2137   // Max MAP16.
2138   buffer = {ENCODING_TYPE_MAP16, 0xff, 0xff};
2139   InsertKeyValue<decltype(result)>(&buffer, (1 << 16) - 1);
2140   error = Deserialize(&result, &buffer);
2141   expected = MakeMap<decltype(expected)>((1 << 16) - 1);
2142   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2143   EXPECT_EQ(expected, result);
2144 
2145   // Min MAP32.
2146   buffer = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x00, 0x00};
2147   error = Deserialize(&result, &buffer);
2148   expected = {};
2149   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2150   EXPECT_EQ(expected, result);
2151 
2152   // MAP32 with max MAP16 + 1. It's not practical to test max MAP32.
2153   buffer = {ENCODING_TYPE_MAP32, 0x00, 0x00, 0x01, 0x00};
2154   InsertKeyValue<decltype(result)>(&buffer, (1 << 16));
2155   error = Deserialize(&result, &buffer);
2156   expected = MakeMap<decltype(expected)>((1 << 16));
2157   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2158   EXPECT_EQ(expected, result);
2159 }
2160 
TEST(DeserializationTest,array)2161 TEST(DeserializationTest, array) {
2162   Payload buffer;
2163   ErrorType error;
2164 
2165   // Min FIXARRAY.
2166   buffer = {ENCODING_TYPE_FIXARRAY_MIN};
2167   std::array<std::uint8_t, 0> a0;
2168   error = Deserialize(&a0, &buffer);
2169   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2170 
2171   // Size mismatch.
2172   buffer = {ENCODING_TYPE_FIXARRAY_MIN + 1};
2173   error = Deserialize(&a0, &buffer);
2174   EXPECT_EQ(ErrorCode::INSUFFICIENT_DESTINATION_SIZE, error);
2175 
2176   // Max FIXARRAY.
2177   buffer = {ENCODING_TYPE_FIXARRAY_MAX};
2178   buffer.Append((1 << 4) - 1, 'x');
2179   std::array<std::uint8_t, (1 << 4) - 1> a1, expected1;
2180   for (auto& element : expected1)
2181     element = 'x';
2182   error = Deserialize(&a1, &buffer);
2183   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2184   EXPECT_EQ(expected1, a1);
2185 
2186   // Min ARRAY16.
2187   buffer = {ENCODING_TYPE_ARRAY16, 0x00, 0x00};
2188   error = Deserialize(&a0, &buffer);
2189   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2190 
2191   // Max ARRAY16.
2192   buffer = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
2193   buffer.Append((1 << 16) - 1, 'x');
2194   std::array<std::uint8_t, (1 << 16) - 1> a3, expected3;
2195   for (auto& element : expected3)
2196     element = 'x';
2197   error = Deserialize(&a3, &buffer);
2198   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2199   EXPECT_EQ(expected3, a3);
2200 
2201   // Min ARRAY32.
2202   buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x00, 0x00};
2203   error = Deserialize(&a0, &buffer);
2204   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2205 
2206   // ARRAY32 with max ARRAY16 + 1. It's not practical to test max ARRAY32.
2207   buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
2208   buffer.Append((1 << 16), 'x');
2209   std::array<std::uint8_t, (1 << 16)> a4, expected4;
2210   for (auto& element : expected4)
2211     element = 'x';
2212   error = Deserialize(&a4, &buffer);
2213   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2214   EXPECT_EQ(expected4, a4);
2215 }
2216 
TEST(DeserializationTest,ArrayWrapper)2217 TEST(DeserializationTest, ArrayWrapper) {
2218   Payload buffer;
2219   std::vector<std::uint8_t, DefaultInitializationAllocator<std::uint8_t>>
2220       result;
2221   std::vector<std::uint8_t, DefaultInitializationAllocator<std::uint8_t>>
2222       expected;
2223   ErrorType error;
2224 
2225   result.reserve(0x10000);
2226   ArrayWrapper<std::uint8_t> wrapper(result.data(), result.capacity());
2227 
2228   // Min FIXARRAY.
2229   buffer = {ENCODING_TYPE_FIXARRAY_MIN};
2230   error = Deserialize(&wrapper, &buffer);
2231   expected = {};
2232   result.resize(wrapper.size());
2233   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2234   EXPECT_EQ(expected, result);
2235 
2236   // Max FIXARRAY.
2237   buffer = {ENCODING_TYPE_FIXARRAY_MAX};
2238   buffer.Append((1 << 4) - 1, 1);
2239   error = Deserialize(&wrapper, &buffer);
2240   expected = decltype(expected)((1 << 4) - 1, 1);
2241   result.resize(wrapper.size());
2242   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2243   EXPECT_EQ(expected, result);
2244 
2245   // Min ARRAY16.
2246   buffer = {ENCODING_TYPE_ARRAY16, 0x00, 0x00};
2247   error = Deserialize(&wrapper, &buffer);
2248   expected = {};
2249   result.resize(wrapper.size());
2250   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2251   EXPECT_EQ(expected, result);
2252 
2253   // Max ARRAY16.
2254   buffer = {ENCODING_TYPE_ARRAY16, 0xff, 0xff};
2255   buffer.Append(0xffff, 1);
2256   error = Deserialize(&wrapper, &buffer);
2257   expected = decltype(expected)(0xffff, 1);
2258   result.resize(wrapper.size());
2259   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2260   EXPECT_EQ(expected, result);
2261 
2262   // Min ARRAY32.
2263   buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x00, 0x00};
2264   error = Deserialize(&wrapper, &buffer);
2265   expected = {};
2266   result.resize(wrapper.size());
2267   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2268   EXPECT_EQ(expected, result);
2269 
2270   // ARRAY32 with max ARRAY16 + 1. It's not practical to test max ARRAY32.
2271   buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x01, 0x00};
2272   buffer.Append(0x10000, 1);
2273   error = Deserialize(&wrapper, &buffer);
2274   expected = decltype(expected)(0x10000, 1);
2275   result.resize(wrapper.size());
2276   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2277   EXPECT_EQ(expected, result);
2278 }
2279 
TEST(DeserializationTest,pair)2280 TEST(DeserializationTest, pair) {
2281   Payload buffer;
2282   ErrorType error;
2283 
2284   std::pair<int, int> p1;
2285   buffer = {ENCODING_TYPE_FIXARRAY_MIN + 2, 1, 2};
2286   error = Deserialize(&p1, &buffer);
2287   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2288   EXPECT_EQ(std::make_pair(1, 2), p1);
2289 }
2290 
TEST(DeserializationTest,tuple)2291 TEST(DeserializationTest, tuple) {
2292   Payload buffer;
2293   ErrorType error;
2294 
2295   // Min FIXARRAY.
2296   std::tuple<> t1;
2297   buffer = {ENCODING_TYPE_FIXARRAY_MIN};
2298   error = Deserialize(&t1, &buffer);
2299   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2300   EXPECT_EQ(std::make_tuple(), t1);  // Superfluous.
2301 
2302   // Max FIXARRAY.
2303   auto t2 = GetNTuple<15, int>(0);
2304   buffer = {ENCODING_TYPE_FIXARRAY_MAX};
2305   buffer.Append((1 << 4) - 1, 1);
2306   error = Deserialize(&t2, &buffer);
2307   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2308   EXPECT_EQ((GetNTuple<15, int>(1)), t2);
2309 
2310   // Min ARRAY16.
2311   // Using t1 above.
2312   buffer = {ENCODING_TYPE_ARRAY16, 0x00, 0x00};
2313   error = Deserialize(&t1, &buffer);
2314   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2315   EXPECT_EQ(std::make_tuple(), t1);
2316 
2317   // ARRAY16 at Max FIXARRAY + 1
2318   auto t3 = GetNTuple<(1 << 4), int>(0);
2319   buffer = {ENCODING_TYPE_ARRAY16, 0x10, 0x00};
2320   buffer.Append((1 << 4), 1);
2321   error = Deserialize(&t3, &buffer);
2322   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2323   EXPECT_EQ((GetNTuple<(1 << 4), int>(1)), t3);
2324 
2325   // Min ARRAY32.
2326   // Using t1 from above.
2327   buffer = {ENCODING_TYPE_ARRAY32, 0x00, 0x00, 0x00, 0x00};
2328   error = Deserialize(&t1, &buffer);
2329   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2330   EXPECT_EQ(std::make_tuple(), t1);
2331 
2332   // ARRAY32 at Max FIXARRAY + 1
2333   auto t4 = GetNTuple<(1 << 4), int>(0);
2334   buffer = {ENCODING_TYPE_ARRAY32, 0x10, 0x00, 0x00, 0x00};
2335   buffer.Append((1 << 4), 1);
2336   error = Deserialize(&t4, &buffer);
2337   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2338   EXPECT_EQ((GetNTuple<(1 << 4), int>(1)), t4);
2339 
2340   // Template instantiation depth is an issue for tuples with large numbers of
2341   // elements. As these are not expected in practice, the limits of ARRAY16
2342   // and ARRAY32 are not tested.
2343 }
2344 
TEST(DeserializationTest,Serializable)2345 TEST(DeserializationTest, Serializable) {
2346   Payload buffer;
2347   ErrorType error;
2348 
2349   buffer = decltype(buffer)(
2350       {ENCODING_TYPE_FIXARRAY_MIN + 4, 10, ENCODING_TYPE_FLOAT32,
2351        kZeroFloatBytes[0], kZeroFloatBytes[1], kZeroFloatBytes[2],
2352        kZeroFloatBytes[3], ENCODING_TYPE_FIXSTR_MIN + 5, '1', '2', '3', '4',
2353        '5', ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1});
2354   TestType t1;
2355   error = Deserialize(&t1, &buffer);
2356   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2357   EXPECT_EQ(TestType(10, 0.f, "12345", TestType::Foo::kBar), t1);
2358 
2359   buffer =
2360       decltype(buffer)({ENCODING_TYPE_FIXARRAY_MIN + 1, ENCODING_TYPE_FIXEXT2,
2361                         ENCODING_EXT_TYPE_FILE_DESCRIPTOR, 0xff, 0xff});
2362   TestTemplateType<LocalHandle> tt;
2363   error = Deserialize(&tt, &buffer);
2364   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2365   EXPECT_EQ(TestTemplateType<LocalHandle>(LocalHandle(-1)), tt);
2366 }
2367 
TEST(DeserializationTest,Variant)2368 TEST(DeserializationTest, Variant) {
2369   Payload buffer;
2370   ErrorType error;
2371 
2372   Variant<int, bool, float> v;
2373 
2374   buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_NEGATIVE_FIXINT_MAX,
2375             ENCODING_TYPE_NIL};
2376   error = Deserialize(&v, &buffer);
2377   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2378   EXPECT_TRUE(v.empty());
2379 
2380   buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_POSITIVE_FIXINT_MIN + 0,
2381             ENCODING_TYPE_POSITIVE_FIXINT_MIN + 10};
2382   error = Deserialize(&v, &buffer);
2383   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2384   ASSERT_TRUE(v.is<int>());
2385   EXPECT_EQ(10, std::get<int>(v));
2386 
2387   buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1,
2388             ENCODING_TYPE_TRUE};
2389   error = Deserialize(&v, &buffer);
2390   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2391   ASSERT_TRUE(v.is<bool>());
2392   EXPECT_EQ(true, std::get<bool>(v));
2393 
2394   buffer = {ENCODING_TYPE_FIXMAP_MIN + 1, ENCODING_TYPE_POSITIVE_FIXINT_MIN + 1,
2395             ENCODING_TYPE_FALSE};
2396   error = Deserialize(&v, &buffer);
2397   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2398   ASSERT_TRUE(v.is<bool>());
2399   EXPECT_EQ(false, std::get<bool>(v));
2400 
2401   buffer = {ENCODING_TYPE_FIXMAP_MIN + 1,
2402             ENCODING_TYPE_POSITIVE_FIXINT_MIN + 2,
2403             ENCODING_TYPE_FLOAT32,
2404             kOneFloatBytes[0],
2405             kOneFloatBytes[1],
2406             kOneFloatBytes[2],
2407             kOneFloatBytes[3]};
2408   error = Deserialize(&v, &buffer);
2409   EXPECT_EQ(ErrorCode::NO_ERROR, error);
2410   ASSERT_TRUE(v.is<float>());
2411   EXPECT_FLOAT_EQ(1.0, std::get<float>(v));
2412 
2413   // TODO(eieio): Add more deserialization tests for Variant.
2414 }
2415 
TEST(DeserializationTest,ErrorType)2416 TEST(DeserializationTest, ErrorType) {
2417   Payload buffer;
2418   ErrorType error;
2419 
2420   std::uint8_t u8;
2421   buffer = {ENCODING_TYPE_STR8};
2422   error = Deserialize(&u8, &buffer);
2423   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2424   EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
2425   EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2426 
2427   std::uint16_t u16;
2428   buffer = {ENCODING_TYPE_STR8};
2429   error = Deserialize(&u16, &buffer);
2430   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2431   EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
2432   EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2433 
2434   std::uint32_t u32;
2435   buffer = {ENCODING_TYPE_STR8};
2436   error = Deserialize(&u32, &buffer);
2437   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2438   EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
2439   EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2440 
2441   std::uint64_t u64;
2442   buffer = {ENCODING_TYPE_STR8};
2443   error = Deserialize(&u64, &buffer);
2444   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2445   EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
2446   EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2447 
2448   std::int8_t i8;
2449   buffer = {ENCODING_TYPE_STR8};
2450   error = Deserialize(&i8, &buffer);
2451   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2452   EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
2453   EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2454 
2455   std::int16_t i16;
2456   buffer = {ENCODING_TYPE_STR8};
2457   error = Deserialize(&i16, &buffer);
2458   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2459   EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
2460   EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2461 
2462   std::int32_t i32;
2463   buffer = {ENCODING_TYPE_STR8};
2464   error = Deserialize(&i32, &buffer);
2465   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2466   EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
2467   EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2468 
2469   std::int64_t i64;
2470   buffer = {ENCODING_TYPE_STR8};
2471   error = Deserialize(&i64, &buffer);
2472   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2473   EXPECT_EQ(ENCODING_CLASS_INT, error.encoding_class());
2474   EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2475 
2476   std::string s;
2477   buffer = {ENCODING_TYPE_POSITIVE_FIXINT};
2478   error = Deserialize(&s, &buffer);
2479   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2480   EXPECT_EQ(ENCODING_CLASS_STRING, error.encoding_class());
2481   EXPECT_EQ(ENCODING_TYPE_POSITIVE_FIXINT, error.encoding_type());
2482 
2483   std::vector<std::uint8_t> v;
2484   buffer = {ENCODING_TYPE_POSITIVE_FIXINT};
2485   error = Deserialize(&v, &buffer);
2486   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2487   EXPECT_EQ(ENCODING_CLASS_ARRAY, error.encoding_class());
2488   EXPECT_EQ(ENCODING_TYPE_POSITIVE_FIXINT, error.encoding_type());
2489 
2490   buffer = {ENCODING_TYPE_FIXARRAY_MIN + 1, ENCODING_TYPE_STR8};
2491   error = Deserialize(&v, &buffer);
2492   EXPECT_EQ(ErrorCode::UNEXPECTED_ENCODING, error);
2493   EXPECT_EQ(ENCODING_CLASS_UINT, error.encoding_class());
2494   EXPECT_EQ(ENCODING_TYPE_STR8, error.encoding_type());
2495 
2496   buffer = {ENCODING_TYPE_FIXARRAY_MIN + 2, 0, 1};
2497   std::tuple<int> t;
2498   error = Deserialize(&t, &buffer);
2499   EXPECT_EQ(ErrorCode::UNEXPECTED_TYPE_SIZE, error);
2500 
2501   buffer = {ENCODING_TYPE_FIXARRAY_MIN + 3, 0, 1, 2};
2502   std::pair<int, int> p;
2503   error = Deserialize(&p, &buffer);
2504   EXPECT_EQ(ErrorCode::UNEXPECTED_TYPE_SIZE, error);
2505 }
2506