xref: /aosp_15_r20/external/cronet/base/test/test_proto_loader.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_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