streaming_c.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #include <msgpack.h>
  2. #include <gtest/gtest.h>
  3. #include <stdio.h>
  4. TEST(streaming, basic)
  5. {
  6. msgpack_sbuffer* buffer = msgpack_sbuffer_new();
  7. msgpack_packer* pk = msgpack_packer_new(buffer, msgpack_sbuffer_write);
  8. // 1, 2, 3, "str", ["str_data"], "bin", ["bin_data"], {0.3: 0.4}
  9. EXPECT_EQ(0, msgpack_pack_int(pk, 1));
  10. EXPECT_EQ(0, msgpack_pack_int(pk, 2));
  11. EXPECT_EQ(0, msgpack_pack_int(pk, 3));
  12. EXPECT_EQ(0, msgpack_pack_str(pk, 3));
  13. EXPECT_EQ(0, msgpack_pack_str_body(pk, "str", 3));
  14. EXPECT_EQ(0, msgpack_pack_array(pk, 1));
  15. EXPECT_EQ(0, msgpack_pack_str(pk, 8));
  16. EXPECT_EQ(0, msgpack_pack_str_body(pk, "str_data", 8));
  17. EXPECT_EQ(0, msgpack_pack_bin(pk, 3));
  18. EXPECT_EQ(0, msgpack_pack_bin_body(pk, "bin", 3));
  19. EXPECT_EQ(0, msgpack_pack_array(pk, 1));
  20. EXPECT_EQ(0, msgpack_pack_bin(pk, 8));
  21. EXPECT_EQ(0, msgpack_pack_bin_body(pk, "bin_data", 8));
  22. EXPECT_EQ(0, msgpack_pack_map(pk, 1));
  23. EXPECT_EQ(0, msgpack_pack_float(pk, 0.4f));
  24. EXPECT_EQ(0, msgpack_pack_double(pk, 0.8));
  25. int max_count = 6;
  26. msgpack_packer_free(pk);
  27. const char* input = buffer->data;
  28. const char* const eof = input + buffer->size;
  29. msgpack_unpacker pac;
  30. msgpack_unpacker_init(&pac, MSGPACK_UNPACKER_INIT_BUFFER_SIZE);
  31. msgpack_unpacked result;
  32. msgpack_unpacked_init(&result);
  33. int count = 0;
  34. while(count < max_count) {
  35. bool unpacked = false;
  36. msgpack_unpacker_reserve_buffer(&pac, 32*1024);
  37. while(!unpacked) {
  38. /* read buffer into msgpack_unapcker_buffer(&pac) upto
  39. * msgpack_unpacker_buffer_capacity(&pac) bytes. */
  40. memcpy(msgpack_unpacker_buffer(&pac), input, 1);
  41. input += 1;
  42. EXPECT_TRUE(input <= eof);
  43. msgpack_unpacker_buffer_consumed(&pac, 1);
  44. while(msgpack_unpacker_next(&pac, &result) == MSGPACK_UNPACK_SUCCESS) {
  45. unpacked = 1;
  46. msgpack_object obj = result.data;
  47. msgpack_object e;
  48. switch(count++) {
  49. case 0:
  50. EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type);
  51. EXPECT_EQ(1u, obj.via.u64);
  52. break;
  53. case 1:
  54. EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type);
  55. EXPECT_EQ(2u, obj.via.u64);
  56. break;
  57. case 2:
  58. EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type);
  59. EXPECT_EQ(3u, obj.via.u64);
  60. break;
  61. case 3:
  62. EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
  63. EXPECT_EQ(std::string("str",3), std::string(obj.via.str.ptr, obj.via.str.size));
  64. break;
  65. case 4:
  66. EXPECT_EQ(MSGPACK_OBJECT_ARRAY, obj.type);
  67. EXPECT_EQ(1u, obj.via.array.size);
  68. e = obj.via.array.ptr[0];
  69. EXPECT_EQ(MSGPACK_OBJECT_STR, e.type);
  70. EXPECT_EQ(std::string("str_data",8), std::string(e.via.str.ptr, e.via.str.size));
  71. break;
  72. case 5:
  73. EXPECT_EQ(MSGPACK_OBJECT_BIN, obj.type);
  74. EXPECT_EQ(std::string("bin",3), std::string(obj.via.bin.ptr, obj.via.bin.size));
  75. break;
  76. case 6:
  77. EXPECT_EQ(MSGPACK_OBJECT_ARRAY, obj.type);
  78. EXPECT_EQ(1u, obj.via.array.size);
  79. e = obj.via.array.ptr[0];
  80. EXPECT_EQ(MSGPACK_OBJECT_BIN, e.type);
  81. EXPECT_EQ(std::string("bin_data",8), std::string(e.via.bin.ptr, e.via.bin.size));
  82. break;
  83. case 7:
  84. EXPECT_EQ(MSGPACK_OBJECT_MAP, obj.type);
  85. EXPECT_EQ(1u, obj.via.map.size);
  86. e = obj.via.map.ptr[0].key;
  87. EXPECT_EQ(MSGPACK_OBJECT_FLOAT, e.type);
  88. ASSERT_FLOAT_EQ(0.4f, static_cast<float>(e.via.f64));
  89. #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
  90. EXPECT_EQ(MSGPACK_OBJECT_DOUBLE, e.type);
  91. ASSERT_FLOAT_EQ(0.4f, static_cast<float>(e.via.dec));
  92. #endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
  93. e = obj.via.map.ptr[0].val;
  94. EXPECT_EQ(MSGPACK_OBJECT_FLOAT, e.type);
  95. ASSERT_DOUBLE_EQ(0.8, e.via.f64);
  96. #if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
  97. EXPECT_EQ(MSGPACK_OBJECT_DOUBLE, e.type);
  98. ASSERT_DOUBLE_EQ(0.8, e.via.dec);
  99. #endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
  100. break;
  101. }
  102. }
  103. }
  104. }
  105. msgpack_unpacker_destroy(&pac);
  106. msgpack_unpacked_destroy(&result);
  107. msgpack_sbuffer_free(buffer);
  108. }
  109. TEST(streaming, basic_with_size)
  110. {
  111. int ret;
  112. size_t bytes;
  113. size_t parsed = 0;
  114. msgpack_sbuffer* buffer = msgpack_sbuffer_new();
  115. msgpack_packer* pk = msgpack_packer_new(buffer, msgpack_sbuffer_write);
  116. msgpack_unpacked result;
  117. msgpack_unpacker *unp;
  118. // 1, 2, 3, "str", ["str_data"], "bin", ["bin_data"], {0.3: 0.4}
  119. msgpack_pack_int(pk, 1);
  120. msgpack_pack_int(pk, 2);
  121. msgpack_pack_int(pk, 3);
  122. msgpack_pack_str(pk, 3);
  123. msgpack_pack_str_body(pk, "str", 3);
  124. msgpack_pack_array(pk, 1);
  125. msgpack_pack_str(pk, 8);
  126. msgpack_pack_str_body(pk, "str_data", 8);
  127. msgpack_pack_bin(pk, 3);
  128. msgpack_pack_bin_body(pk, "bin", 3);
  129. msgpack_pack_array(pk, 1);
  130. msgpack_pack_bin(pk, 8);
  131. msgpack_pack_bin_body(pk, "bin_data", 8);
  132. msgpack_pack_map(pk, 1);
  133. msgpack_pack_float(pk, 0.4f);
  134. msgpack_pack_double(pk, 0.8);
  135. msgpack_packer_free(pk);
  136. unp = msgpack_unpacker_new(32 * 1024);
  137. msgpack_unpacked_init(&result);
  138. const char* input = buffer->data;
  139. while (parsed < buffer->size) {
  140. memcpy(msgpack_unpacker_buffer(unp), input, 1);
  141. msgpack_unpacker_buffer_consumed(unp, 1);
  142. input += 1;
  143. bytes = 0;
  144. ret = msgpack_unpacker_next_with_size(unp, &result, &bytes);
  145. if (ret == MSGPACK_UNPACK_CONTINUE) {
  146. EXPECT_GT(bytes, static_cast<size_t>(0));
  147. continue;
  148. }
  149. while (ret == MSGPACK_UNPACK_SUCCESS) {
  150. EXPECT_GT(bytes, static_cast<size_t>(0));
  151. parsed += bytes;
  152. ret = msgpack_unpacker_next_with_size(unp, &result, &bytes);
  153. }
  154. }
  155. EXPECT_EQ(parsed, buffer->size);
  156. msgpack_unpacked_destroy(&result);
  157. msgpack_unpacker_free(unp);
  158. msgpack_sbuffer_free(buffer);
  159. }