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