| // Protocol Buffers - Google's data interchange format |
| // Copyright 2023 Google LLC. All rights reserved. |
| // |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file or at |
| // https://developers.google.com/open-source/licenses/bsd |
| |
| #include "upb/message/internal/compare_unknown.h" |
| |
| #include <stdint.h> |
| |
| #include <initializer_list> |
| #include <string> |
| |
| #include <gtest/gtest.h> |
| #include "google/protobuf/test_messages_proto2.upb.h" |
| #include "upb/base/upcast.h" |
| #include "upb/mem/arena.hpp" |
| #include "upb/wire/test_util/wire_message.h" |
| |
| // Must be last. |
| #include "upb/port/def.inc" |
| |
| namespace upb { |
| namespace test { |
| |
| namespace { |
| |
| using ::upb::test::wire_types::Delimited; |
| using ::upb::test::wire_types::Fixed32; |
| using ::upb::test::wire_types::Fixed64; |
| using ::upb::test::wire_types::Group; |
| using ::upb::test::wire_types::Varint; |
| using ::upb::test::wire_types::WireMessage; |
| |
| upb_UnknownCompareResult CompareUnknownWithMaxDepth( |
| WireMessage uf1, WireMessage uf2, int max_depth, int min_tag_length = 1, |
| int min_val_varint_length = 1) { |
| upb::Arena arena1; |
| upb::Arena arena2; |
| protobuf_test_messages_proto2_TestAllTypesProto2* msg1 = |
| protobuf_test_messages_proto2_TestAllTypesProto2_new(arena1.ptr()); |
| protobuf_test_messages_proto2_TestAllTypesProto2* msg2 = |
| protobuf_test_messages_proto2_TestAllTypesProto2_new(arena2.ptr()); |
| // Add the unknown fields to the messages. |
| std::string buf1 = ToBinaryPayloadWithLongVarints(uf1, min_tag_length, |
| min_val_varint_length); |
| std::string buf2 = ToBinaryPayloadWithLongVarints(uf2, min_tag_length, |
| min_val_varint_length); |
| UPB_PRIVATE(_upb_Message_AddUnknown)(UPB_UPCAST(msg1), buf1.data(), |
| buf1.size(), arena1.ptr(), nullptr); |
| UPB_PRIVATE(_upb_Message_AddUnknown)(UPB_UPCAST(msg2), buf2.data(), |
| buf2.size(), arena2.ptr(), nullptr); |
| return UPB_PRIVATE(_upb_Message_UnknownFieldsAreEqual)( |
| UPB_UPCAST(msg1), UPB_UPCAST(msg2), max_depth); |
| } |
| |
| upb_UnknownCompareResult CompareUnknown(WireMessage uf1, WireMessage uf2) { |
| return CompareUnknownWithMaxDepth(uf1, uf2, 64); |
| } |
| |
| TEST(CompareTest, UnknownFieldsReflexive) { |
| EXPECT_EQ(kUpb_UnknownCompareResult_Equal, CompareUnknown({}, {})); |
| EXPECT_EQ(kUpb_UnknownCompareResult_Equal, |
| CompareUnknown({{1, Varint(123)}, {2, Fixed32(456)}}, |
| {{1, Varint(123)}, {2, Fixed32(456)}})); |
| EXPECT_EQ( |
| kUpb_UnknownCompareResult_Equal, |
| CompareUnknown( |
| {{1, Group({{2, Group({{3, Fixed32(456)}, {4, Fixed64(123)}})}})}}, |
| {{1, Group({{2, Group({{3, Fixed32(456)}, {4, Fixed64(123)}})}})}})); |
| } |
| |
| TEST(CompareTest, UnknownFieldsOrdering) { |
| EXPECT_EQ(kUpb_UnknownCompareResult_Equal, |
| CompareUnknown({{1, Varint(111)}, |
| {2, Delimited("ABC")}, |
| {3, Fixed32(456)}, |
| {4, Fixed64(123)}, |
| {5, Group({})}}, |
| {{5, Group({})}, |
| {4, Fixed64(123)}, |
| {3, Fixed32(456)}, |
| {2, Delimited("ABC")}, |
| {1, Varint(111)}})); |
| EXPECT_EQ(kUpb_UnknownCompareResult_NotEqual, |
| CompareUnknown({{1, Varint(111)}, |
| {2, Delimited("ABC")}, |
| {3, Fixed32(456)}, |
| {4, Fixed64(123)}, |
| {5, Group({})}}, |
| {{5, Group({})}, |
| {4, Fixed64(123)}, |
| {3, Fixed32(455)}, // Small difference. |
| {2, Delimited("ABC")}, |
| {1, Varint(111)}})); |
| EXPECT_EQ(kUpb_UnknownCompareResult_Equal, |
| CompareUnknown({{3, Fixed32(456)}, {4, Fixed64(123)}}, |
| {{4, Fixed64(123)}, {3, Fixed32(456)}})); |
| EXPECT_EQ( |
| kUpb_UnknownCompareResult_Equal, |
| CompareUnknown( |
| {{1, Group({{2, Group({{3, Fixed32(456)}, {4, Fixed64(123)}})}})}}, |
| {{1, Group({{2, Group({{4, Fixed64(123)}, {3, Fixed32(456)}})}})}})); |
| } |
| |
| TEST(CompareTest, LongVarint) { |
| EXPECT_EQ(kUpb_UnknownCompareResult_Equal, |
| CompareUnknownWithMaxDepth({{1, Varint(123)}, {2, Varint(456)}}, |
| {{1, Varint(123)}, {2, Varint(456)}}, 64, |
| 5, 10)); |
| EXPECT_EQ(kUpb_UnknownCompareResult_Equal, |
| CompareUnknownWithMaxDepth({{2, Varint(456)}, {1, Varint(123)}}, |
| {{1, Varint(123)}, {2, Varint(456)}}, 64, |
| 5, 10)); |
| } |
| |
| TEST(CompareTest, MaxDepth) { |
| EXPECT_EQ( |
| kUpb_UnknownCompareResult_MaxDepthExceeded, |
| CompareUnknownWithMaxDepth( |
| {{1, Group({{2, Group({{3, Fixed32(456)}, {4, Fixed64(123)}})}})}}, |
| {{1, Group({{2, Group({{4, Fixed64(123)}, {3, Fixed32(456)}})}})}}, |
| 1)); |
| } |
| |
| } // namespace |
| |
| } // namespace test |
| } // namespace upb |