Skip to content

Commit 709d6f4

Browse files
committed
Fixed #754.
Fixed `msgpack::object` packing visitor and equal comparison visitor. NOTE: In the function `visit_ext(const char* v, uint32_t size)`, v contains type and size means buffer `v` size. See #175.
1 parent 27cf578 commit 709d6f4

File tree

2 files changed

+101
-3
lines changed

2 files changed

+101
-3
lines changed

include/msgpack/v1/object.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,8 @@ struct object_pack_visitor {
352352
return true;
353353
}
354354
bool visit_ext(const char* v, uint32_t size) {
355-
m_packer.pack_ext(size, *v);
356-
m_packer.pack_ext_body(v, size);
355+
m_packer.pack_ext(size - 1, *v);
356+
m_packer.pack_ext_body(v + 1, size - 1);
357357
return true;
358358
}
359359
bool start_array(uint32_t num_elements) {
@@ -938,7 +938,7 @@ struct object_equal_visitor {
938938
}
939939
bool visit_ext(const char* v, uint32_t size) {
940940
if (m_ptr->type != msgpack::type::EXT ||
941-
m_ptr->via.ext.size != size ||
941+
m_ptr->via.ext.size != size - 1 ||
942942
std::memcmp(m_ptr->via.ext.ptr, v, size) != 0) {
943943
m_result = false;
944944
return false;

test/msgpack_basic.cpp

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,16 @@ TEST(MSGPACK, simple_buffer_fixext1)
331331
EXPECT_EQ(1ul, oh.get().via.ext.size);
332332
EXPECT_EQ(1, oh.get().via.ext.type());
333333
EXPECT_EQ(2, oh.get().via.ext.data()[0]);
334+
335+
msgpack::sbuffer sbuf2;
336+
msgpack::pack(sbuf2, oh.get());
337+
msgpack::object_handle oh2 =
338+
msgpack::unpack(sbuf2.data(), sbuf2.size());
339+
EXPECT_EQ(1ul, oh2.get().via.ext.size);
340+
EXPECT_EQ(1, oh2.get().via.ext.type());
341+
EXPECT_EQ(2, oh2.get().via.ext.data()[0]);
342+
343+
EXPECT_EQ(oh.get(), oh2.get());
334344
}
335345

336346
TEST(MSGPACK, simple_buffer_fixext2)
@@ -347,6 +357,17 @@ TEST(MSGPACK, simple_buffer_fixext2)
347357
EXPECT_EQ(0, oh.get().via.ext.type());
348358
EXPECT_TRUE(
349359
std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
360+
361+
msgpack::sbuffer sbuf2;
362+
msgpack::pack(sbuf2, oh.get());
363+
msgpack::object_handle oh2 =
364+
msgpack::unpack(sbuf2.data(), sbuf2.size());
365+
EXPECT_EQ(2ul, oh2.get().via.ext.size);
366+
EXPECT_EQ(0, oh2.get().via.ext.type());
367+
EXPECT_TRUE(
368+
std::equal(buf, buf + sizeof(buf), oh2.get().via.ext.data()));
369+
370+
EXPECT_EQ(oh.get(), oh2.get());
350371
}
351372

352373
TEST(MSGPACK, simple_buffer_fixext4)
@@ -363,6 +384,17 @@ TEST(MSGPACK, simple_buffer_fixext4)
363384
EXPECT_EQ(1, oh.get().via.ext.type());
364385
EXPECT_TRUE(
365386
std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
387+
388+
msgpack::sbuffer sbuf2;
389+
msgpack::pack(sbuf2, oh.get());
390+
msgpack::object_handle oh2 =
391+
msgpack::unpack(sbuf2.data(), sbuf2.size());
392+
EXPECT_EQ(4ul, oh2.get().via.ext.size);
393+
EXPECT_EQ(1, oh2.get().via.ext.type());
394+
EXPECT_TRUE(
395+
std::equal(buf, buf + sizeof(buf), oh2.get().via.ext.data()));
396+
397+
EXPECT_EQ(oh.get(), oh2.get());
366398
}
367399

368400
TEST(MSGPACK, simple_buffer_fixext8)
@@ -379,6 +411,17 @@ TEST(MSGPACK, simple_buffer_fixext8)
379411
EXPECT_EQ(1, oh.get().via.ext.type());
380412
EXPECT_TRUE(
381413
std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
414+
415+
msgpack::sbuffer sbuf2;
416+
msgpack::pack(sbuf2, oh.get());
417+
msgpack::object_handle oh2 =
418+
msgpack::unpack(sbuf2.data(), sbuf2.size());
419+
EXPECT_EQ(8ul, oh2.get().via.ext.size);
420+
EXPECT_EQ(1, oh2.get().via.ext.type());
421+
EXPECT_TRUE(
422+
std::equal(buf, buf + sizeof(buf), oh2.get().via.ext.data()));
423+
424+
EXPECT_EQ(oh.get(), oh2.get());
382425
}
383426

384427
TEST(MSGPACK, simple_buffer_fixext16)
@@ -395,6 +438,17 @@ TEST(MSGPACK, simple_buffer_fixext16)
395438
EXPECT_EQ(1, oh.get().via.ext.type());
396439
EXPECT_TRUE(
397440
std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
441+
442+
msgpack::sbuffer sbuf2;
443+
msgpack::pack(sbuf2, oh.get());
444+
msgpack::object_handle oh2 =
445+
msgpack::unpack(sbuf2.data(), sbuf2.size());
446+
EXPECT_EQ(16ul, oh2.get().via.ext.size);
447+
EXPECT_EQ(1, oh2.get().via.ext.type());
448+
EXPECT_TRUE(
449+
std::equal(buf, buf + sizeof(buf), oh2.get().via.ext.data()));
450+
451+
EXPECT_EQ(oh.get(), oh2.get());
398452
}
399453

400454
TEST(MSGPACK, simple_buffer_fixext_1byte_0)
@@ -426,6 +480,17 @@ TEST(MSGPACK, simple_buffer_fixext_1byte_255)
426480
EXPECT_EQ(77, oh.get().via.ext.type());
427481
EXPECT_TRUE(
428482
std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
483+
484+
msgpack::sbuffer sbuf2;
485+
msgpack::pack(sbuf2, oh.get());
486+
msgpack::object_handle oh2 =
487+
msgpack::unpack(sbuf2.data(), sbuf2.size());
488+
EXPECT_EQ(size, oh2.get().via.ext.size);
489+
EXPECT_EQ(77, oh2.get().via.ext.type());
490+
EXPECT_TRUE(
491+
std::equal(buf, buf + sizeof(buf), oh2.get().via.ext.data()));
492+
493+
EXPECT_EQ(oh.get(), oh2.get());
429494
}
430495

431496
TEST(MSGPACK, simple_buffer_fixext_2byte_256)
@@ -444,6 +509,17 @@ TEST(MSGPACK, simple_buffer_fixext_2byte_256)
444509
EXPECT_EQ(77, oh.get().via.ext.type());
445510
EXPECT_TRUE(
446511
std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
512+
513+
msgpack::sbuffer sbuf2;
514+
msgpack::pack(sbuf2, oh.get());
515+
msgpack::object_handle oh2 =
516+
msgpack::unpack(sbuf2.data(), sbuf2.size());
517+
EXPECT_EQ(size, oh2.get().via.ext.size);
518+
EXPECT_EQ(77, oh2.get().via.ext.type());
519+
EXPECT_TRUE(
520+
std::equal(buf, buf + sizeof(buf), oh2.get().via.ext.data()));
521+
522+
EXPECT_EQ(oh.get(), oh2.get());
447523
}
448524

449525
TEST(MSGPACK, simple_buffer_fixext_2byte_65535)
@@ -462,6 +538,17 @@ TEST(MSGPACK, simple_buffer_fixext_2byte_65535)
462538
EXPECT_EQ(77, oh.get().via.ext.type());
463539
EXPECT_TRUE(
464540
std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
541+
542+
msgpack::sbuffer sbuf2;
543+
msgpack::pack(sbuf2, oh.get());
544+
msgpack::object_handle oh2 =
545+
msgpack::unpack(sbuf2.data(), sbuf2.size());
546+
EXPECT_EQ(size, oh2.get().via.ext.size);
547+
EXPECT_EQ(77, oh2.get().via.ext.type());
548+
EXPECT_TRUE(
549+
std::equal(buf, buf + sizeof(buf), oh2.get().via.ext.data()));
550+
551+
EXPECT_EQ(oh.get(), oh2.get());
465552
}
466553

467554
TEST(MSGPACK, simple_buffer_fixext_4byte_65536)
@@ -480,6 +567,17 @@ TEST(MSGPACK, simple_buffer_fixext_4byte_65536)
480567
EXPECT_EQ(77, oh.get().via.ext.type());
481568
EXPECT_TRUE(
482569
std::equal(buf, buf + sizeof(buf), oh.get().via.ext.data()));
570+
571+
msgpack::sbuffer sbuf2;
572+
msgpack::pack(sbuf2, oh.get());
573+
msgpack::object_handle oh2 =
574+
msgpack::unpack(sbuf2.data(), sbuf2.size());
575+
EXPECT_EQ(size, oh2.get().via.ext.size);
576+
EXPECT_EQ(77, oh2.get().via.ext.type());
577+
EXPECT_TRUE(
578+
std::equal(buf, buf + sizeof(buf), oh2.get().via.ext.data()));
579+
580+
EXPECT_EQ(oh.get(), oh2.get());
483581
}
484582

485583
TEST(MSGPACK, simple_buffer_ext_convert)

0 commit comments

Comments
 (0)