upb/upb/util/compare_test.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009-2021, Google LLC
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of Google LLC nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
20  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #include "upb/util/compare.h"
29 
30 #include <stdint.h>
31 
32 #include <string_view>
33 #include <vector>
34 
35 #include "absl/strings/string_view.h"
36 #include "gmock/gmock.h"
37 #include "gtest/gtest.h"
38 
39 struct UnknownField;
40 
41 using UnknownFields = std::vector<UnknownField>;
42 
43 enum class UnknownFieldType {
44  kVarint,
45  kLongVarint, // Over-encoded to have distinct wire format.
46  kDelimited,
47  kFixed64,
48  kFixed32,
49  kGroup,
50 };
51 
56  // NULL-terminated (strings must not have embedded NULL).
57  const char* delimited;
59 };
60 
61 struct TypeAndValue {
64 };
65 
66 struct UnknownField {
69 };
70 
73  ret.value.varint = val;
74  return ret;
75 }
76 
79  ret.value.varint = val;
80  return ret;
81 }
82 
85  ret.value.fixed64 = val;
86  return ret;
87 }
88 
91  ret.value.fixed32 = val;
92  return ret;
93 }
94 
95 TypeAndValue Delimited(const char* val) {
97  ret.value.delimited = val;
98  return ret;
99 }
100 
103  ret.value.group = &nested;
104  return ret;
105 }
106 
108  do {
109  char byte = val & 0x7fU;
110  val >>= 7;
111  if (val) byte |= 0x80U;
112  str->push_back(byte);
113  } while (val);
114 }
115 
117  static const upb_WireType wire_types[] = {
120  };
122 
123  for (const auto& field : fields) {
124  uint32_t tag = field.field_number << 3 |
125  (wire_types[static_cast<int>(field.value.type)]);
126  EncodeVarint(tag, &ret);
127  switch (field.value.type) {
129  EncodeVarint(field.value.value.varint, &ret);
130  break;
132  EncodeVarint(field.value.value.varint, &ret);
133  ret.back() |= 0x80;
134  ret.push_back(0);
135  break;
137  EncodeVarint(strlen(field.value.value.delimited), &ret);
138  ret.append(field.value.value.delimited);
139  break;
141  uint64_t val = _upb_BigEndian_Swap64(field.value.value.fixed64);
142  ret.append(reinterpret_cast<const char*>(&val), sizeof(val));
143  break;
144  }
146  uint32_t val = _upb_BigEndian_Swap32(field.value.value.fixed32);
147  ret.append(reinterpret_cast<const char*>(&val), sizeof(val));
148  break;
149  }
151  uint32_t end_tag = field.field_number << 3 | kUpb_WireType_EndGroup;
152  ret.append(ToBinaryPayload(*field.value.value.group));
153  EncodeVarint(end_tag, &ret);
154  break;
155  }
156  }
157  }
158 
159  return ret;
160 }
161 
163  UnknownFields uf2,
164  int max_depth) {
165  std::string buf1 = ToBinaryPayload(uf1);
167  return upb_Message_UnknownFieldsAreEqual(buf1.data(), buf1.size(),
168  buf2.data(), buf2.size(), max_depth);
169 }
170 
172  return CompareUnknownWithMaxDepth(uf1, uf2, 64);
173 }
174 
175 TEST(CompareTest, UnknownFieldsReflexive) {
178  CompareUnknown({{1, Varint(123)}, {2, Fixed32(456)}},
179  {{1, Varint(123)}, {2, Fixed32(456)}}));
180  EXPECT_EQ(
183  {{1, Group({{2, Group({{3, Fixed32(456)}, {4, Fixed64(123)}})}})}},
184  {{1, Group({{2, Group({{3, Fixed32(456)}, {4, Fixed64(123)}})}})}}));
185 }
186 
187 TEST(CompareTest, UnknownFieldsOrdering) {
189  CompareUnknown({{1, Varint(111)},
190  {2, Delimited("ABC")},
191  {3, Fixed32(456)},
192  {4, Fixed64(123)},
193  {5, Group({})}},
194  {{5, Group({})},
195  {4, Fixed64(123)},
196  {3, Fixed32(456)},
197  {2, Delimited("ABC")},
198  {1, Varint(111)}}));
200  CompareUnknown({{1, Varint(111)},
201  {2, Delimited("ABC")},
202  {3, Fixed32(456)},
203  {4, Fixed64(123)},
204  {5, Group({})}},
205  {{5, Group({})},
206  {4, Fixed64(123)},
207  {3, Fixed32(455)}, // Small difference.
208  {2, Delimited("ABC")},
209  {1, Varint(111)}}));
211  CompareUnknown({{3, Fixed32(456)}, {4, Fixed64(123)}},
212  {{4, Fixed64(123)}, {3, Fixed32(456)}}));
213  EXPECT_EQ(
216  {{1, Group({{2, Group({{3, Fixed32(456)}, {4, Fixed64(123)}})}})}},
217  {{1, Group({{2, Group({{4, Fixed64(123)}, {3, Fixed32(456)}})}})}}));
218 }
219 
220 TEST(CompareTest, LongVarint) {
222  CompareUnknown({{1, LongVarint(123)}, {2, LongVarint(456)}},
223  {{1, Varint(123)}, {2, Varint(456)}}));
225  CompareUnknown({{2, LongVarint(456)}, {1, LongVarint(123)}},
226  {{1, Varint(123)}, {2, Varint(456)}}));
227 }
228 
229 TEST(CompareTest, MaxDepth) {
230  EXPECT_EQ(
233  {{1, Group({{2, Group({{3, Fixed32(456)}, {4, Fixed64(123)}})}})}},
234  {{1, Group({{2, Group({{4, Fixed64(123)}, {3, Fixed32(456)}})}})}},
235  2));
236 }
xds_interop_client.str
str
Definition: xds_interop_client.py:487
kUpb_UnknownCompareResult_NotEqual
@ kUpb_UnknownCompareResult_NotEqual
Definition: upb/upb/util/compare.h:51
kUpb_WireType_Delimited
@ kUpb_WireType_Delimited
Definition: upb/upb/upb.h:277
ToBinaryPayload
std::string ToBinaryPayload(const UnknownFields &fields)
Definition: upb/upb/util/compare_test.cc:116
upb_UnknownCompareResult
upb_UnknownCompareResult
Definition: upb/upb/util/compare.h:49
Group
TypeAndValue Group(UnknownFields nested)
Definition: upb/upb/util/compare_test.cc:101
UnknownFieldType::kVarint
@ kVarint
TEST
TEST(CompareTest, UnknownFieldsReflexive)
Definition: upb/upb/util/compare_test.cc:175
UnknownField
Definition: upb/upb/util/compare_test.cc:66
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
kUpb_UnknownCompareResult_Equal
@ kUpb_UnknownCompareResult_Equal
Definition: upb/upb/util/compare.h:50
TypeAndValue::value
UnknownFieldValue value
Definition: upb/upb/util/compare_test.cc:63
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
UnknownFieldValue
Definition: upb/upb/util/compare_test.cc:52
upb_WireType
upb_WireType
Definition: upb/upb/upb.h:274
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
kUpb_WireType_EndGroup
@ kUpb_WireType_EndGroup
Definition: upb/upb/upb.h:279
CompareUnknownWithMaxDepth
upb_UnknownCompareResult CompareUnknownWithMaxDepth(UnknownFields uf1, UnknownFields uf2, int max_depth)
Definition: upb/upb/util/compare_test.cc:162
tag
static void * tag(intptr_t t)
Definition: bad_client.cc:318
EncodeVarint
void EncodeVarint(uint64_t val, std::string *str)
Definition: upb/upb/util/compare_test.cc:107
TypeAndValue
Definition: upb/upb/util/compare_test.cc:61
kUpb_WireType_Varint
@ kUpb_WireType_Varint
Definition: upb/upb/upb.h:275
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
UnknownFieldType::kFixed64
@ kFixed64
_upb_BigEndian_Swap64
UPB_INLINE uint64_t _upb_BigEndian_Swap64(uint64_t val)
Definition: upb/upb/upb.h:345
LongVarint
TypeAndValue LongVarint(uint64_t val)
Definition: upb/upb/util/compare_test.cc:77
TypeAndValue::type
UnknownFieldType type
Definition: upb/upb/util/compare_test.cc:62
Fixed64
TypeAndValue Fixed64(uint64_t val)
Definition: upb/upb/util/compare_test.cc:83
stdint.h
nested
static int nested
Definition: test-callback-stack.c:39
UnknownFieldType
UnknownFieldType
Definition: upb/upb/util/compare_test.cc:43
UnknownFieldValue::fixed32
uint32_t fixed32
Definition: upb/upb/util/compare_test.cc:55
UnknownFieldType::kLongVarint
@ kLongVarint
field
const FieldDescriptor * field
Definition: bloaty/third_party/protobuf/src/google/protobuf/compiler/parser_unittest.cc:2692
Varint
TypeAndValue Varint(uint64_t val)
Definition: upb/upb/util/compare_test.cc:71
kUpb_WireType_32Bit
@ kUpb_WireType_32Bit
Definition: upb/upb/upb.h:280
UnknownFields
std::vector< UnknownField > UnknownFields
Definition: upb/upb/util/compare_test.cc:41
UnknownField::field_number
uint32_t field_number
Definition: upb/upb/util/compare_test.cc:67
UnknownFieldValue::varint
uint64_t varint
Definition: upb/upb/util/compare_test.cc:53
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
CompareUnknown
upb_UnknownCompareResult CompareUnknown(UnknownFields uf1, UnknownFields uf2)
Definition: upb/upb/util/compare_test.cc:171
UnknownFieldValue::fixed64
uint64_t fixed64
Definition: upb/upb/util/compare_test.cc:54
UnknownFieldValue::group
UnknownFields * group
Definition: upb/upb/util/compare_test.cc:58
profile_analyzer.fields
list fields
Definition: profile_analyzer.py:266
compare.h
UnknownField::value
TypeAndValue value
Definition: upb/upb/util/compare_test.cc:68
kUpb_UnknownCompareResult_MaxDepthExceeded
@ kUpb_UnknownCompareResult_MaxDepthExceeded
Definition: upb/upb/util/compare.h:53
buf2
static char buf2[32]
Definition: test-fs.c:127
UnknownFieldValue::delimited
const char * delimited
Definition: upb/upb/util/compare_test.cc:57
_upb_BigEndian_Swap32
UPB_INLINE uint32_t _upb_BigEndian_Swap32(uint32_t val)
Definition: upb/upb/upb.h:336
UnknownFieldType::kFixed32
@ kFixed32
Fixed32
TypeAndValue Fixed32(uint32_t val)
Definition: upb/upb/util/compare_test.cc:89
upb_Message_UnknownFieldsAreEqual
upb_UnknownCompareResult upb_Message_UnknownFieldsAreEqual(const char *buf1, size_t size1, const char *buf2, size_t size2, int max_depth)
Definition: compare.c:263
Delimited
TypeAndValue Delimited(const char *val)
Definition: upb/upb/util/compare_test.cc:95
UnknownFieldType::kDelimited
@ kDelimited
kUpb_WireType_64Bit
@ kUpb_WireType_64Bit
Definition: upb/upb/upb.h:276
kUpb_WireType_StartGroup
@ kUpb_WireType_StartGroup
Definition: upb/upb/upb.h:278
UnknownFieldType::kGroup
@ kGroup


grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:00