msgpack/test/msgpack_c.cpp
Torleiv Sundre a6bf728a5c Correctly check return value of snprintf
In MSGPACK_CHECKED_CALL, the return value of snprintf is incorrectly
assumed to mean success if it is less than or equal to the buffer size.
The call should only be considered a success if the return value is less
than the buffer size.

This commit adds two unit tests that illustrates the issue and fixes the
issue, making the unit tests pass.
2019-12-04 14:20:12 +01:00

1413 lines
44 KiB
C++

#include "msgpack.h"
#include <math.h>
#include <vector>
#include <limits>
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
#include <gtest/gtest.h>
#pragma GCC diagnostic pop
#if defined(_MSC_VER) || defined(__MINGW32__)
#define msgpack_rand() ((double)rand() / RAND_MAX)
#else // _MSC_VER || __MINGW32__
#define msgpack_rand() drand48()
#endif // _MSC_VER || __MINGW32__
using namespace std;
const unsigned int kLoop = 10000;
const double kEPS = 1e-10;
#define GEN_TEST_SIGNED(test_type, func_type) \
do { \
vector<test_type> v; \
v.push_back(0); \
v.push_back(1); \
v.push_back(-1); \
v.push_back(numeric_limits<test_type>::min()); \
v.push_back(numeric_limits<test_type>::max()); \
for (unsigned int i = 0; i < kLoop; i++) \
v.push_back(static_cast<test_type>(rand())); \
for (unsigned int i = 0; i < v.size() ; i++) { \
test_type val = v[i]; \
msgpack_sbuffer sbuf; \
msgpack_sbuffer_init(&sbuf); \
msgpack_packer pk; \
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); \
msgpack_pack_##func_type(&pk, val); \
msgpack_zone z; \
msgpack_zone_init(&z, 2048); \
msgpack_object obj; \
msgpack_unpack_return ret = \
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); \
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); \
if (val < 0) { \
EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, obj.type); \
EXPECT_EQ(val, obj.via.i64); \
} else { \
EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type); \
EXPECT_EQ(static_cast<uint64_t>(val), obj.via.u64); \
} \
msgpack_zone_destroy(&z); \
msgpack_sbuffer_destroy(&sbuf); \
} \
} while(0)
#define GEN_TEST_UNSIGNED(test_type, func_type) \
do { \
vector<test_type> v; \
v.push_back(0); \
v.push_back(1); \
v.push_back(2); \
v.push_back(numeric_limits<test_type>::min()); \
v.push_back(numeric_limits<test_type>::max()); \
for (unsigned int i = 0; i < kLoop; i++) \
v.push_back(static_cast<test_type>(rand())); \
for (unsigned int i = 0; i < v.size() ; i++) { \
test_type val = v[i]; \
msgpack_sbuffer sbuf; \
msgpack_sbuffer_init(&sbuf); \
msgpack_packer pk; \
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); \
msgpack_pack_##func_type(&pk, val); \
msgpack_zone z; \
msgpack_zone_init(&z, 2048); \
msgpack_object obj; \
msgpack_unpack_return ret = \
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); \
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); \
EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type); \
EXPECT_EQ(val, obj.via.u64); \
msgpack_zone_destroy(&z); \
msgpack_sbuffer_destroy(&sbuf); \
} \
} while(0)
TEST(MSGPACKC, simple_buffer_char)
{
#if defined(CHAR_MIN)
#if CHAR_MIN < 0
GEN_TEST_SIGNED(char, char);
#else
GEN_TEST_UNSIGNED(char, char);
#endif
#else
#error CHAR_MIN is not defined
#endif
}
TEST(MSGPACKC, simple_buffer_singed_char)
{
GEN_TEST_SIGNED(signed char, signed_char);
}
TEST(MSGPACKC, simple_buffer_short)
{
GEN_TEST_SIGNED(short, short);
}
TEST(MSGPACKC, simple_buffer_int)
{
GEN_TEST_SIGNED(int, int);
}
TEST(MSGPACKC, simple_buffer_long)
{
GEN_TEST_SIGNED(long, long);
}
TEST(MSGPACKC, simple_buffer_long_long)
{
GEN_TEST_SIGNED(long long, long_long);
}
TEST(MSGPACKC, simple_buffer_unsigned_char)
{
GEN_TEST_UNSIGNED(unsigned char, unsigned_char);
}
TEST(MSGPACKC, simple_buffer_unsigned_short)
{
GEN_TEST_UNSIGNED(unsigned short, unsigned_short);
}
TEST(MSGPACKC, simple_buffer_unsigned_int)
{
GEN_TEST_UNSIGNED(unsigned int, unsigned_int);
}
TEST(MSGPACKC, simple_buffer_unsigned_long)
{
GEN_TEST_UNSIGNED(unsigned long, unsigned_long);
}
TEST(MSGPACKC, simple_buffer_unsigned_long_long)
{
GEN_TEST_UNSIGNED(unsigned long long, unsigned_long_long);
}
TEST(MSGPACKC, simple_buffer_uint8)
{
GEN_TEST_UNSIGNED(uint8_t, uint8);
}
TEST(MSGPACKC, simple_buffer_uint16)
{
GEN_TEST_UNSIGNED(uint16_t, uint16);
}
TEST(MSGPACKC, simple_buffer_uint32)
{
GEN_TEST_UNSIGNED(uint32_t, uint32);
}
TEST(MSGPACKC, simple_buffer_uint64)
{
GEN_TEST_UNSIGNED(uint64_t, uint64);
}
TEST(MSGPACKC, simple_buffer_int8)
{
GEN_TEST_SIGNED(int8_t, int8);
}
TEST(MSGPACKC, simple_buffer_int16)
{
GEN_TEST_SIGNED(int16_t, int16);
}
TEST(MSGPACKC, simple_buffer_int32)
{
GEN_TEST_SIGNED(int32_t, int32);
}
TEST(MSGPACKC, simple_buffer_int64)
{
GEN_TEST_SIGNED(int64_t, int64);
}
#if !defined(_MSC_VER) || _MSC_VER >=1800
TEST(MSGPACKC, simple_buffer_float)
{
vector<float> v;
v.push_back(0.0);
v.push_back(1.0);
v.push_back(-1.0);
v.push_back(numeric_limits<float>::min());
v.push_back(numeric_limits<float>::max());
v.push_back(nanf("tag"));
if (numeric_limits<float>::has_infinity) {
v.push_back(numeric_limits<float>::infinity());
v.push_back(-numeric_limits<float>::infinity());
}
if (numeric_limits<float>::has_quiet_NaN) {
v.push_back(numeric_limits<float>::quiet_NaN());
}
if (numeric_limits<float>::has_signaling_NaN) {
v.push_back(numeric_limits<float>::signaling_NaN());
}
for (unsigned int i = 0; i < kLoop; i++) {
v.push_back(static_cast<float>(msgpack_rand()));
v.push_back(static_cast<float>(-msgpack_rand()));
}
for (unsigned int i = 0; i < v.size() ; i++) {
float val = v[i];
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_float(&pk, val);
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_FLOAT32, obj.type);
if (isnan(val)) {
EXPECT_TRUE(isnan(obj.via.f64));
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
EXPECT_TRUE(isnan(obj.via.dec));
#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
}
else if (isinf(val)) {
EXPECT_TRUE(isinf(obj.via.f64));
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
EXPECT_TRUE(isinf(obj.via.dec));
#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
}
else {
EXPECT_TRUE(fabs(obj.via.f64 - val) <= kEPS);
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
EXPECT_TRUE(fabs(obj.via.dec - val) <= kEPS);
#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
}
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
}
TEST(MSGPACKC, simple_buffer_double)
{
vector<double> v;
v.push_back(0.0);
v.push_back(-0.0);
v.push_back(1.0);
v.push_back(-1.0);
v.push_back(numeric_limits<double>::min());
v.push_back(numeric_limits<double>::max());
v.push_back(nan("tag"));
if (numeric_limits<double>::has_infinity) {
v.push_back(numeric_limits<double>::infinity());
v.push_back(-numeric_limits<double>::infinity());
}
if (numeric_limits<double>::has_quiet_NaN) {
v.push_back(numeric_limits<double>::quiet_NaN());
}
if (numeric_limits<double>::has_signaling_NaN) {
v.push_back(numeric_limits<double>::signaling_NaN());
}
for (unsigned int i = 0; i < kLoop; i++) {
v.push_back(msgpack_rand());
v.push_back(-msgpack_rand());
}
for (unsigned int i = 0; i < v.size() ; i++) {
double val = v[i];
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_double(&pk, val);
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_FLOAT64, obj.type);
EXPECT_EQ(MSGPACK_OBJECT_FLOAT, obj.type);
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
EXPECT_EQ(MSGPACK_OBJECT_DOUBLE, obj.type);
#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
if (isnan(val)) {
EXPECT_TRUE(isnan(obj.via.f64));
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
EXPECT_TRUE(isnan(obj.via.dec));
#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
}
else if (isinf(val)) {
EXPECT_TRUE(isinf(obj.via.f64));
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
EXPECT_TRUE(isinf(obj.via.dec));
#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
}
else {
EXPECT_TRUE(fabs(obj.via.f64 - val) <= kEPS);
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
EXPECT_TRUE(fabs(obj.via.dec - val) <= kEPS);
#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
}
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
}
#endif // !defined(_MSC_VER) || _MSC_VER >=1800
TEST(MSGPACKC, simple_buffer_nil)
{
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_nil(&pk);
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_NIL, obj.type);
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_true)
{
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_true(&pk);
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, obj.type);
EXPECT_EQ(true, obj.via.boolean);
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_false)
{
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_false(&pk);
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, obj.type);
EXPECT_FALSE(obj.via.boolean);
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_fixext1)
{
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
char const buf[] = { 2 };
msgpack_pack_ext(&pk, sizeof(buf), 1);
msgpack_pack_ext_body(&pk, buf, sizeof(buf));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(1u, obj.via.ext.size);
EXPECT_EQ(1, obj.via.ext.type);
EXPECT_EQ(2, obj.via.ext.ptr[0]);
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_fixext2)
{
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
char const buf[] = { 2, 3 };
msgpack_pack_ext(&pk, sizeof(buf), 0);
msgpack_pack_ext_body(&pk, buf, sizeof(buf));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(2u, obj.via.ext.size);
EXPECT_EQ(0, obj.via.ext.type);
EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_fixext4)
{
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
char const buf[] = { 2, 3, 4, 5 };
msgpack_pack_ext(&pk, sizeof(buf), 1);
msgpack_pack_ext_body(&pk, buf, sizeof(buf));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(4u, obj.via.ext.size);
EXPECT_EQ(1, obj.via.ext.type);
EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_fixext8)
{
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
char const buf [] = { 2, 3, 4, 5, 6, 7, 8, 9 };
msgpack_pack_ext(&pk, sizeof(buf), 1);
msgpack_pack_ext_body(&pk, buf, sizeof(buf));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(8u, obj.via.ext.size);
EXPECT_EQ(1, obj.via.ext.type);
EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_fixext16)
{
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
char const buf [] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 };
msgpack_pack_ext(&pk, sizeof(buf), 1);
msgpack_pack_ext_body(&pk, buf, sizeof(buf));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(16u, obj.via.ext.size);
EXPECT_EQ(1, obj.via.ext.type);
EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_fixext_1byte_0)
{
const size_t size = 0;
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_ext(&pk, size, 77);
// fprintf(stderr, "size: %u, data: \"", sbuf.size);
// for (size_t i = 0; i < sbuf.size; i++)
// fprintf(stderr, "%02x ", (uint8_t)sbuf.data[i]);
// fprintf(stderr, "\"\n");
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(size, obj.via.ext.size);
EXPECT_EQ(77, obj.via.ext.type);
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_fixext_1byte_255)
{
const size_t size = 255;
char buf[size];
for (size_t i = 0; i != size; ++i) buf[i] = (char)i;
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_ext(&pk, size, 78);
msgpack_pack_ext_body(&pk, buf, sizeof(buf));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(size, obj.via.ext.size);
EXPECT_EQ(78, obj.via.ext.type);
EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_fixext_2byte_256)
{
const size_t size = 256;
char buf[size];
for (size_t i = 0; i != size; ++i) buf[i] = (char)i;
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_ext(&pk, size, 79);
msgpack_pack_ext_body(&pk, buf, sizeof(buf));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(size, obj.via.ext.size);
EXPECT_EQ(79, obj.via.ext.type);
EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_fixext_2byte_65535)
{
const size_t size = 65535;
char buf[size];
for (size_t i = 0; i != size; ++i) buf[i] = (char)i;
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_ext(&pk, size, 80);
msgpack_pack_ext_body(&pk, buf, sizeof(buf));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(size, obj.via.ext.size);
EXPECT_EQ(80, obj.via.ext.type);
EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_fixext_4byte_65536)
{
const size_t size = 65536;
char buf[size];
for (size_t i = 0; i != size; ++i) buf[i] = (char)i;
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_ext(&pk, size, 81);
msgpack_pack_ext_body(&pk, buf, sizeof(buf));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(size, obj.via.ext.size);
EXPECT_EQ(81, obj.via.ext.type);
EXPECT_EQ(0, memcmp(buf, obj.via.ext.ptr, sizeof(buf)));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_timestamp_32)
{
msgpack_timestamp ts = {
0xffffffff,
0
};
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_timestamp(&pk, &ts);
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(4u, obj.via.ext.size);
EXPECT_EQ(-1, obj.via.ext.type);
msgpack_timestamp ts2;
bool r = msgpack_object_to_timestamp(&obj, &ts2);
EXPECT_TRUE(r);
EXPECT_EQ(ts.tv_sec, ts2.tv_sec);
EXPECT_EQ(ts.tv_nsec, ts2.tv_nsec);
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_timestamp_64)
{
msgpack_timestamp ts = {
0x3ffffffffL,
999999999
};
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_timestamp(&pk, &ts);
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(8u, obj.via.ext.size);
EXPECT_EQ(-1, obj.via.ext.type);
msgpack_timestamp ts2;
bool r = msgpack_object_to_timestamp(&obj, &ts2);
EXPECT_TRUE(r);
EXPECT_EQ(ts.tv_sec, ts2.tv_sec);
EXPECT_EQ(ts.tv_nsec, ts2.tv_nsec);
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_timestamp_96)
{
msgpack_timestamp ts = {
0x7fffffffffffffffLL,
999999999
};
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_timestamp(&pk, &ts);
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret =
msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_EXT, obj.type);
EXPECT_EQ(12u, obj.via.ext.size);
EXPECT_EQ(-1, obj.via.ext.type);
msgpack_timestamp ts2;
bool r = msgpack_object_to_timestamp(&obj, &ts2);
EXPECT_TRUE(r);
EXPECT_EQ(ts.tv_sec, ts2.tv_sec);
EXPECT_EQ(ts.tv_nsec, ts2.tv_nsec);
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_array)
{
unsigned int array_size = 5;
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_array(&pk, array_size);
msgpack_pack_nil(&pk);
msgpack_pack_true(&pk);
msgpack_pack_false(&pk);
msgpack_pack_int(&pk, 10);
msgpack_pack_int(&pk, -10);
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_ARRAY, obj.type);
EXPECT_EQ(array_size, obj.via.array.size);
for (unsigned int i = 0; i < obj.via.array.size; i++) {
msgpack_object o = obj.via.array.ptr[i];
switch (i) {
case 0:
EXPECT_EQ(MSGPACK_OBJECT_NIL, o.type);
break;
case 1:
EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, o.type);
EXPECT_EQ(true, o.via.boolean);
break;
case 2:
EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, o.type);
EXPECT_FALSE(o.via.boolean);
break;
case 3:
EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, o.type);
EXPECT_EQ(10u, o.via.u64);
break;
case 4:
EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, o.type);
EXPECT_EQ(-10, o.via.i64);
break;
}
}
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_map)
{
unsigned int map_size = 2;
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_map(&pk, map_size);
msgpack_pack_true(&pk);
msgpack_pack_false(&pk);
msgpack_pack_int(&pk, 10);
msgpack_pack_int(&pk, -10);
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_MAP, obj.type);
EXPECT_EQ(map_size, obj.via.map.size);
for (unsigned int i = 0; i < map_size; i++) {
msgpack_object key = obj.via.map.ptr[i].key;
msgpack_object val = obj.via.map.ptr[i].val;
switch (i) {
case 0:
EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, key.type);
EXPECT_EQ(true, key.via.boolean);
EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, val.type);
EXPECT_FALSE(val.via.boolean);
break;
case 1:
EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, key.type);
EXPECT_EQ(10u, key.via.u64);
EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, val.type);
EXPECT_EQ(-10, val.via.i64);
break;
}
}
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_str)
{
unsigned int str_size = 7;
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_str(&pk, str_size);
msgpack_pack_str_body(&pk, "fr", 2);
msgpack_pack_str_body(&pk, "syuki", 5);
// invalid data
msgpack_pack_str_body(&pk, "", 0);
msgpack_pack_str_body(&pk, "kzk", 0);
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp("frsyuki", obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_str_fix_l)
{
char const* str = NULL;
unsigned int str_size = 0;
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_str(&pk, str_size);
msgpack_pack_str_body(&pk, str, str_size);
EXPECT_EQ(sbuf.size, 0x01u);
EXPECT_EQ(sbuf.data[0], static_cast<char>(0xa0u));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_str_fix_h)
{
char str[0x1f] = {'0'};
unsigned int str_size = sizeof(str);
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_str(&pk, str_size);
msgpack_pack_str_body(&pk, str, str_size);
EXPECT_EQ(sbuf.size, 0x1f+1u);
EXPECT_EQ(sbuf.data[0], static_cast<char>(0xbfu));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_str_8_l)
{
char str[0x1f+1] = {'0'};
unsigned int str_size = sizeof(str);
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_str(&pk, str_size);
msgpack_pack_str_body(&pk, str, str_size);
EXPECT_EQ(sbuf.size, 0x1f+1+2u);
EXPECT_EQ(sbuf.data[0], static_cast<char>(0xd9u));
EXPECT_EQ(sbuf.data[1], static_cast<char>(0x20u));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_str_8_h)
{
char str[0xff] = {'0'};
unsigned int str_size = sizeof(str);
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_str(&pk, str_size);
msgpack_pack_str_body(&pk, str, str_size);
EXPECT_EQ(sbuf.size, 0xff+2u);
EXPECT_EQ(sbuf.data[0], static_cast<char>(0xd9u));
EXPECT_EQ(sbuf.data[1], static_cast<char>(0xffu));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_str_16_l)
{
char str[0xff+1] = {'0'};
unsigned int str_size = sizeof(str);
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_str(&pk, str_size);
msgpack_pack_str_body(&pk, str, str_size);
EXPECT_EQ(sbuf.size, 0xff+1+3u);
EXPECT_EQ(sbuf.data[0], static_cast<char>(0xdau));
EXPECT_EQ(sbuf.data[1], static_cast<char>(0x01u));
EXPECT_EQ(sbuf.data[2], static_cast<char>(0x00u));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_str_16_h)
{
char str[0xffff] = {'0'};
unsigned int str_size = sizeof(str);
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_str(&pk, str_size);
msgpack_pack_str_body(&pk, str, str_size);
EXPECT_EQ(sbuf.size, 0xffff+3u);
EXPECT_EQ(sbuf.data[0], static_cast<char>(0xdau));
EXPECT_EQ(sbuf.data[1], static_cast<char>(0xffu));
EXPECT_EQ(sbuf.data[2], static_cast<char>(0xffu));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_str_32_l)
{
char str[0xffff+1] = {'0'};
unsigned int str_size = sizeof(str);
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_str(&pk, str_size);
msgpack_pack_str_body(&pk, str, str_size);
EXPECT_EQ(sbuf.size, 0xffff+1+5u);
EXPECT_EQ(sbuf.data[0], static_cast<char>(0xdbu));
EXPECT_EQ(sbuf.data[1], static_cast<char>(0x00u));
EXPECT_EQ(sbuf.data[2], static_cast<char>(0x01u));
EXPECT_EQ(sbuf.data[3], static_cast<char>(0x00u));
EXPECT_EQ(sbuf.data[4], static_cast<char>(0x00u));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_v4raw_fix_l)
{
char const* str = NULL;
unsigned int str_size = 0;
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_v4raw(&pk, str_size);
msgpack_pack_v4raw_body(&pk, str, str_size);
EXPECT_EQ(sbuf.size, 0x01u);
EXPECT_EQ(sbuf.data[0], static_cast<char>(0xa0u));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_v4raw_fix_h)
{
char str[0x1f] = {'0'};
unsigned int str_size = sizeof(str);
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_v4raw(&pk, str_size);
msgpack_pack_v4raw_body(&pk, str, str_size);
EXPECT_EQ(sbuf.size, 0x1f+1u);
EXPECT_EQ(sbuf.data[0], static_cast<char>(0xbfu));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_v4raw_16_l)
{
char str[0x1f+1] = {'0'};
unsigned int str_size = sizeof(str);
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_v4raw(&pk, str_size);
msgpack_pack_v4raw_body(&pk, str, str_size);
EXPECT_EQ(sbuf.size, 0x1f+1+3u);
EXPECT_EQ(sbuf.data[0], static_cast<char>(0xdau));
EXPECT_EQ(sbuf.data[1], static_cast<char>(0x00u));
EXPECT_EQ(sbuf.data[2], static_cast<char>(0x20u));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_v4raw_16_h)
{
char str[0xffff] = {'0'};
unsigned int str_size = sizeof(str);
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_v4raw(&pk, str_size);
msgpack_pack_v4raw_body(&pk, str, str_size);
EXPECT_EQ(sbuf.size, 0xffff+3u);
EXPECT_EQ(sbuf.data[0], static_cast<char>(0xdau));
EXPECT_EQ(sbuf.data[1], static_cast<char>(0xffu));
EXPECT_EQ(sbuf.data[2], static_cast<char>(0xffu));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, simple_buffer_v4raw_32_l)
{
char str[0xffff+1] = {'0'};
unsigned int str_size = sizeof(str);
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
msgpack_packer pk;
msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);
msgpack_pack_v4raw(&pk, str_size);
msgpack_pack_v4raw_body(&pk, str, str_size);
EXPECT_EQ(sbuf.size, 0xffff+1+5u);
EXPECT_EQ(sbuf.data[0], static_cast<char>(0xdbu));
EXPECT_EQ(sbuf.data[1], static_cast<char>(0x00u));
EXPECT_EQ(sbuf.data[2], static_cast<char>(0x01u));
EXPECT_EQ(sbuf.data[3], static_cast<char>(0x00u));
EXPECT_EQ(sbuf.data[4], static_cast<char>(0x00u));
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp(str, obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
msgpack_sbuffer_destroy(&sbuf);
}
TEST(MSGPACKC, unpack_fixstr)
{
size_t str_size = 7;
const char buf[] = {
(char)0xa7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
};
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp("frsyuki", obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
}
TEST(MSGPACKC, unpack_str8)
{
size_t str_size = 7;
const char buf[] = {
(char)0xd9, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
};
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp("frsyuki", obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
}
TEST(MSGPACKC, unpack_str16)
{
size_t str_size = 7;
const char buf[] = {
(char)0xda, 0, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
};
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp("frsyuki", obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
}
TEST(MSGPACKC, unpack_str32)
{
size_t str_size = 7;
const char buf[] = {
(char)0xdb, 0, 0, 0, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
};
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_STR, obj.type);
EXPECT_EQ(str_size, obj.via.str.size);
EXPECT_EQ(0, memcmp("frsyuki", obj.via.str.ptr, str_size));
msgpack_zone_destroy(&z);
}
TEST(MSGPACKC, unpack_bin8)
{
size_t bin_size = 7;
const char buf[] = {
(char)0xc4, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
};
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_BIN, obj.type);
EXPECT_EQ(bin_size, obj.via.bin.size);
EXPECT_EQ(0, memcmp("frsyuki", obj.via.bin.ptr, bin_size));
msgpack_zone_destroy(&z);
}
TEST(MSGPACKC, unpack_bin16)
{
size_t bin_size = 7;
const char buf[] = {
(char)0xc5, 0, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
};
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_BIN, obj.type);
EXPECT_EQ(bin_size, obj.via.bin.size);
EXPECT_EQ(0, memcmp("frsyuki", obj.via.bin.ptr, bin_size));
msgpack_zone_destroy(&z);
}
TEST(MSGPACKC, unpack_bin32)
{
size_t bin_size = 7;
const char buf[] = {
(char)0xc6, 0, 0, 0, 7, 'f', 'r', 's', 'y', 'u', 'k', 'i'
};
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_BIN, obj.type);
EXPECT_EQ(bin_size, obj.via.bin.size);
EXPECT_EQ(0, memcmp("frsyuki", obj.via.bin.ptr, bin_size));
msgpack_zone_destroy(&z);
}
TEST(MSGPACKC, unpack_array_uint64)
{
const char buf[] = {
(char)0x91, (char)0xcf, (char)0xff, (char)0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
};
msgpack_zone z;
msgpack_zone_init(&z, 2048);
msgpack_object obj;
msgpack_unpack_return ret;
ret = msgpack_unpack(buf, sizeof(buf), NULL, &z, &obj);
EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);
EXPECT_EQ(MSGPACK_OBJECT_ARRAY, obj.type);
EXPECT_EQ(1u, obj.via.array.size);
EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.via.array.ptr[0].type);
EXPECT_EQ(0xFFF0000000000001LL, obj.via.array.ptr[0].via.u64);
msgpack_zone_destroy(&z);
}
TEST(MSGPACKC, vref_buffer_overflow)
{
msgpack_vrefbuffer vbuf;
msgpack_vrefbuffer to;
size_t ref_size = 0;
size_t chunk_size = std::numeric_limits<size_t>::max();
EXPECT_FALSE(msgpack_vrefbuffer_init(&vbuf, ref_size, chunk_size));
EXPECT_EQ(-1, msgpack_vrefbuffer_migrate(&vbuf, &to));
}
TEST(MSGPACKC, object_print_buffer_overflow) {
msgpack_object obj;
obj.type = MSGPACK_OBJECT_NIL;
char buffer[4];
int ret;
ret = msgpack_object_print_buffer(buffer, 1, obj);
EXPECT_EQ(0, ret);
ret = msgpack_object_print_buffer(buffer, 2, obj);
EXPECT_EQ(0, ret);
ret = msgpack_object_print_buffer(buffer, 3, obj);
EXPECT_EQ(0, ret);
ret = msgpack_object_print_buffer(buffer, 4, obj);
EXPECT_EQ(3, ret);
EXPECT_STREQ("nil", buffer);
}
TEST(MSGPACKC, object_bin_print_buffer_overflow) {
msgpack_object obj;
obj.type = MSGPACK_OBJECT_BIN;
obj.via.bin.ptr = "test";
obj.via.bin.size = 4;
char buffer[7];
int ret;
ret = msgpack_object_print_buffer(buffer, 1, obj);
EXPECT_EQ(0, ret);
ret = msgpack_object_print_buffer(buffer, 2, obj);
EXPECT_EQ(0, ret);
ret = msgpack_object_print_buffer(buffer, 3, obj);
EXPECT_EQ(0, ret);
ret = msgpack_object_print_buffer(buffer, 4, obj);
EXPECT_EQ(0, ret);
ret = msgpack_object_print_buffer(buffer, 5, obj);
EXPECT_EQ(0, ret);
ret = msgpack_object_print_buffer(buffer, 6, obj);
EXPECT_EQ(0, ret);
ret = msgpack_object_print_buffer(buffer, 7, obj);
EXPECT_EQ(6, ret);
EXPECT_STREQ("\"test\"", buffer);
}