blob: a02041e407785a2f9d556832a17b73bed44b5a70 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_TEST_PROTOBUF_MATCHERS_H_
#define BASE_TEST_PROTOBUF_MATCHERS_H_
#include <string>
#include <tuple>
#include "testing/gmock/include/gmock/gmock-matchers.h"
namespace base::test {
// Parses a binary proto and returns a raw TextProto, where all fields are
// unnamed. The input must be a valid serialized protobuf message.
std::string BinaryProtoToRawTextProto(const std::string& binary_message);
// Matcher that verifies two protobufs contain the same data.
MATCHER_P(EqualsProto,
message,
"Match a proto Message equal to the matcher's argument.") {
std::string expected_serialized;
if (!message.SerializeToString(&expected_serialized)) {
*result_listener << "Expected proto fails to serialize";
return false;
}
std::string actual_serialized;
if (!arg.SerializeToString(&actual_serialized)) {
*result_listener << "Actual proto fails to serialize";
return false;
}
if (expected_serialized != actual_serialized) {
*result_listener << "Provided proto did not match the expected proto"
<< "\n Expected Raw TextProto:\n"
<< BinaryProtoToRawTextProto(expected_serialized)
<< "\n Provided Raw TextProto:\n"
<< BinaryProtoToRawTextProto(actual_serialized);
return false;
}
return true;
}
// EqualsProto() implementation for 2-tuple matchers.
MATCHER(EqualsProto,
"Matches if the tuple's proto Message arguments are equal.") {
return ::testing::Matcher<decltype(std::get<0>(arg))>(
EqualsProto(std::get<1>(arg)))
.MatchAndExplain(std::get<0>(arg), result_listener);
}
} // namespace base::test
#endif // BASE_TEST_PROTOBUF_MATCHERS_H_