blob: 601a3dd4019bcd45c3ddd0efe9d7cd1db5e416a0 [file] [log] [blame]
// 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