xref: /aosp_15_r20/external/cronet/base/test/protobuf_matchers.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2023 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_TEST_PROTOBUF_MATCHERS_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_TEST_PROTOBUF_MATCHERS_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <string>
9*6777b538SAndroid Build Coastguard Worker #include <tuple>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock-matchers.h"
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker namespace base::test {
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker // Parses a binary proto and returns a raw TextProto, where all fields are
16*6777b538SAndroid Build Coastguard Worker // unnamed. The input must be a valid serialized protobuf message.
17*6777b538SAndroid Build Coastguard Worker std::string BinaryProtoToRawTextProto(const std::string& binary_message);
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker // Matcher that verifies two protobufs contain the same data.
20*6777b538SAndroid Build Coastguard Worker MATCHER_P(EqualsProto,
21*6777b538SAndroid Build Coastguard Worker           message,
22*6777b538SAndroid Build Coastguard Worker           "Match a proto Message equal to the matcher's argument.") {
23*6777b538SAndroid Build Coastguard Worker   std::string expected_serialized;
24*6777b538SAndroid Build Coastguard Worker   if (!message.SerializeToString(&expected_serialized)) {
25*6777b538SAndroid Build Coastguard Worker     *result_listener << "Expected proto fails to serialize";
26*6777b538SAndroid Build Coastguard Worker     return false;
27*6777b538SAndroid Build Coastguard Worker   }
28*6777b538SAndroid Build Coastguard Worker   std::string actual_serialized;
29*6777b538SAndroid Build Coastguard Worker   if (!arg.SerializeToString(&actual_serialized)) {
30*6777b538SAndroid Build Coastguard Worker     *result_listener << "Actual proto fails to serialize";
31*6777b538SAndroid Build Coastguard Worker     return false;
32*6777b538SAndroid Build Coastguard Worker   }
33*6777b538SAndroid Build Coastguard Worker   if (expected_serialized != actual_serialized) {
34*6777b538SAndroid Build Coastguard Worker     *result_listener << "Provided proto did not match the expected proto"
35*6777b538SAndroid Build Coastguard Worker                      << "\n Expected Raw TextProto:\n"
36*6777b538SAndroid Build Coastguard Worker                      << BinaryProtoToRawTextProto(expected_serialized)
37*6777b538SAndroid Build Coastguard Worker                      << "\n Provided Raw TextProto:\n"
38*6777b538SAndroid Build Coastguard Worker                      << BinaryProtoToRawTextProto(actual_serialized);
39*6777b538SAndroid Build Coastguard Worker     return false;
40*6777b538SAndroid Build Coastguard Worker   }
41*6777b538SAndroid Build Coastguard Worker   return true;
42*6777b538SAndroid Build Coastguard Worker }
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker // EqualsProto() implementation for 2-tuple matchers.
45*6777b538SAndroid Build Coastguard Worker MATCHER(EqualsProto,
46*6777b538SAndroid Build Coastguard Worker         "Matches if the tuple's proto Message arguments are equal.") {
47*6777b538SAndroid Build Coastguard Worker   return ::testing::Matcher<decltype(std::get<0>(arg))>(
48*6777b538SAndroid Build Coastguard Worker              EqualsProto(std::get<1>(arg)))
49*6777b538SAndroid Build Coastguard Worker       .MatchAndExplain(std::get<0>(arg), result_listener);
50*6777b538SAndroid Build Coastguard Worker }
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker }  // namespace base::test
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker #endif  // BASE_TEST_PROTOBUF_MATCHERS_H_
55