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_TEST_PROTO_LOADER_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_TEST_TEST_PROTO_LOADER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <string> 10*6777b538SAndroid Build Coastguard Worker #include <string_view> 11*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h" 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker namespace base { 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker #if defined(COMPONENT_BUILD) 16*6777b538SAndroid Build Coastguard Worker #if defined(WIN32) 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker #if defined(PROTO_TEST_IMPLEMENTATION) 19*6777b538SAndroid Build Coastguard Worker #define PROTO_TEST_EXPORT __declspec(dllexport) 20*6777b538SAndroid Build Coastguard Worker #else 21*6777b538SAndroid Build Coastguard Worker #define PROTO_TEST_EXPORT __declspec(dllimport) 22*6777b538SAndroid Build Coastguard Worker #endif // defined(PROTO_TEST_IMPLEMENTATION) 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker #else // defined(WIN32) 25*6777b538SAndroid Build Coastguard Worker #if defined(PROTO_TEST_IMPLEMENTATION) 26*6777b538SAndroid Build Coastguard Worker #define PROTO_TEST_EXPORT __attribute__((visibility("default"))) 27*6777b538SAndroid Build Coastguard Worker #else 28*6777b538SAndroid Build Coastguard Worker #define PROTO_TEST_EXPORT 29*6777b538SAndroid Build Coastguard Worker #endif 30*6777b538SAndroid Build Coastguard Worker #endif 31*6777b538SAndroid Build Coastguard Worker #else // defined(COMPONENT_BUILD) 32*6777b538SAndroid Build Coastguard Worker #define PROTO_TEST_EXPORT 33*6777b538SAndroid Build Coastguard Worker #endif 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker // This class works around the fact that chrome only includes the lite runtime 36*6777b538SAndroid Build Coastguard Worker // of protobufs. Lite protobufs inherit from |MessageLite| and cannot be used to 37*6777b538SAndroid Build Coastguard Worker // parse from text format. Parsing from text 38*6777b538SAndroid Build Coastguard Worker // format is useful in tests. We cannot include the full version of a protobuf 39*6777b538SAndroid Build Coastguard Worker // in test code because it would clash with the lite version. 40*6777b538SAndroid Build Coastguard Worker // 41*6777b538SAndroid Build Coastguard Worker // This class uses the protobuf descriptors (generated at compile time) to 42*6777b538SAndroid Build Coastguard Worker // generate a |Message| that can be used to parse from text. This message can 43*6777b538SAndroid Build Coastguard Worker // then be serialized to binary which can be parsed by the |MessageLite|. 44*6777b538SAndroid Build Coastguard Worker class PROTO_TEST_EXPORT TestProtoSetLoader { 45*6777b538SAndroid Build Coastguard Worker public: 46*6777b538SAndroid Build Coastguard Worker explicit TestProtoSetLoader(const base::FilePath& descriptor_path); 47*6777b538SAndroid Build Coastguard Worker explicit TestProtoSetLoader(std::string_view descriptor_binary_proto); 48*6777b538SAndroid Build Coastguard Worker ~TestProtoSetLoader(); 49*6777b538SAndroid Build Coastguard Worker TestProtoSetLoader(const TestProtoSetLoader&) = delete; 50*6777b538SAndroid Build Coastguard Worker TestProtoSetLoader& operator=(const TestProtoSetLoader&) = delete; 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker // Parse a text proto into a binary proto. `type_name` is the full message 53*6777b538SAndroid Build Coastguard Worker // type name including the package. This CHECK fails if the type is not 54*6777b538SAndroid Build Coastguard Worker // found, or if the text cannot be parsed. 55*6777b538SAndroid Build Coastguard Worker std::string ParseFromText(std::string_view type_name, 56*6777b538SAndroid Build Coastguard Worker const std::string& proto_text) const; 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker // Returns the text proto format of `message`. This CHECK fails on error. 59*6777b538SAndroid Build Coastguard Worker std::string PrintToText(std::string_view type_name, 60*6777b538SAndroid Build Coastguard Worker const std::string& message) const; 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker private: 63*6777b538SAndroid Build Coastguard Worker // Hide dependencies of protobuf_full from the header, so that 64*6777b538SAndroid Build Coastguard Worker // proto_test_support doesn't need to add protobuf_full as a public dep. 65*6777b538SAndroid Build Coastguard Worker class State; 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker std::unique_ptr<State> state_; 68*6777b538SAndroid Build Coastguard Worker }; 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker // Same as TestProtoSetLoader, but for a single message type. 71*6777b538SAndroid Build Coastguard Worker class PROTO_TEST_EXPORT TestProtoLoader { 72*6777b538SAndroid Build Coastguard Worker public: 73*6777b538SAndroid Build Coastguard Worker TestProtoLoader(const base::FilePath& descriptor_path, 74*6777b538SAndroid Build Coastguard Worker std::string_view type_name); 75*6777b538SAndroid Build Coastguard Worker TestProtoLoader(std::string_view descriptor_binary_proto, 76*6777b538SAndroid Build Coastguard Worker std::string_view type_name); 77*6777b538SAndroid Build Coastguard Worker ~TestProtoLoader(); 78*6777b538SAndroid Build Coastguard Worker TestProtoLoader(const TestProtoLoader&) = delete; 79*6777b538SAndroid Build Coastguard Worker TestProtoLoader& operator=(const TestProtoLoader&) = delete; 80*6777b538SAndroid Build Coastguard Worker 81*6777b538SAndroid Build Coastguard Worker void ParseFromText(const std::string& proto_text, std::string& message) const; 82*6777b538SAndroid Build Coastguard Worker void PrintToText(const std::string& message, std::string& proto_text) const; 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker private: 85*6777b538SAndroid Build Coastguard Worker TestProtoSetLoader set_loader_; 86*6777b538SAndroid Build Coastguard Worker std::string type_name_; 87*6777b538SAndroid Build Coastguard Worker }; 88*6777b538SAndroid Build Coastguard Worker 89*6777b538SAndroid Build Coastguard Worker } // namespace base 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Worker #endif // BASE_TEST_TEST_PROTO_LOADER_H_ 92