xref: /aosp_15_r20/external/cronet/base/test/values_test_util.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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_VALUES_TEST_UTIL_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_TEST_VALUES_TEST_UTIL_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <iosfwd>
9*6777b538SAndroid Build Coastguard Worker #include <memory>
10*6777b538SAndroid Build Coastguard Worker #include <string>
11*6777b538SAndroid Build Coastguard Worker #include <string_view>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/types/expected.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
16*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock-matchers.h"
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace base {
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker // All the functions below expect that the value for the given path in
21*6777b538SAndroid Build Coastguard Worker // the given dictionary equals the given expected value.
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker void ExpectDictBooleanValue(bool expected_value,
24*6777b538SAndroid Build Coastguard Worker                             const Value::Dict& dict,
25*6777b538SAndroid Build Coastguard Worker                             std::string_view path);
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker void ExpectDictIntegerValue(int expected_value,
28*6777b538SAndroid Build Coastguard Worker                             const Value::Dict& dict,
29*6777b538SAndroid Build Coastguard Worker                             std::string_view path);
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker void ExpectDictStringValue(std::string_view expected_value,
32*6777b538SAndroid Build Coastguard Worker                            const Value::Dict& dict,
33*6777b538SAndroid Build Coastguard Worker                            std::string_view path);
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker void ExpectDictValue(const Value::Dict& expected_value,
36*6777b538SAndroid Build Coastguard Worker                      const Value::Dict& dict,
37*6777b538SAndroid Build Coastguard Worker                      std::string_view path);
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker void ExpectDictValue(const Value& expected_value,
40*6777b538SAndroid Build Coastguard Worker                      const Value::Dict& dict,
41*6777b538SAndroid Build Coastguard Worker                      std::string_view path);
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker void ExpectStringValue(const std::string& expected_str, const Value& actual);
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker namespace test {
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker // A custom GMock matcher which matches if a base::Value::Dict has a key |key|
48*6777b538SAndroid Build Coastguard Worker // that is equal to |value|.
49*6777b538SAndroid Build Coastguard Worker testing::Matcher<const base::Value::Dict&> DictionaryHasValue(
50*6777b538SAndroid Build Coastguard Worker     const std::string& key,
51*6777b538SAndroid Build Coastguard Worker     const base::Value& expected_value);
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker // A custom GMock matcher which matches if a base::Value::Dict contains all
54*6777b538SAndroid Build Coastguard Worker // key/value pairs from |template_value|.
55*6777b538SAndroid Build Coastguard Worker testing::Matcher<const base::Value::Dict&> DictionaryHasValues(
56*6777b538SAndroid Build Coastguard Worker     const base::Value::Dict& template_value);
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker // A custom GMock matcher.  For details, see
59*6777b538SAndroid Build Coastguard Worker // https://github.com/google/googletest/blob/644319b9f06f6ca9bf69fe791be399061044bc3d/googlemock/docs/CookBook.md#writing-new-polymorphic-matchers
60*6777b538SAndroid Build Coastguard Worker class IsJsonMatcher {
61*6777b538SAndroid Build Coastguard Worker  public:
62*6777b538SAndroid Build Coastguard Worker   explicit IsJsonMatcher(std::string_view json);
63*6777b538SAndroid Build Coastguard Worker   explicit IsJsonMatcher(const base::Value& value);
64*6777b538SAndroid Build Coastguard Worker   explicit IsJsonMatcher(const base::Value::Dict& value);
65*6777b538SAndroid Build Coastguard Worker   explicit IsJsonMatcher(const base::Value::List& value);
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   IsJsonMatcher(const IsJsonMatcher& other);
68*6777b538SAndroid Build Coastguard Worker   IsJsonMatcher& operator=(const IsJsonMatcher& other);
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker   ~IsJsonMatcher();
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker   bool MatchAndExplain(std::string_view json,
73*6777b538SAndroid Build Coastguard Worker                        testing::MatchResultListener* listener) const;
74*6777b538SAndroid Build Coastguard Worker   bool MatchAndExplain(const base::Value& value,
75*6777b538SAndroid Build Coastguard Worker                        testing::MatchResultListener* listener) const;
76*6777b538SAndroid Build Coastguard Worker   bool MatchAndExplain(const base::Value::Dict& dict,
77*6777b538SAndroid Build Coastguard Worker                        testing::MatchResultListener* listener) const;
78*6777b538SAndroid Build Coastguard Worker   bool MatchAndExplain(const base::Value::List& list,
79*6777b538SAndroid Build Coastguard Worker                        testing::MatchResultListener* listener) const;
80*6777b538SAndroid Build Coastguard Worker   void DescribeTo(std::ostream* os) const;
81*6777b538SAndroid Build Coastguard Worker   void DescribeNegationTo(std::ostream* os) const;
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker  private:
84*6777b538SAndroid Build Coastguard Worker   base::Value expected_value_;
85*6777b538SAndroid Build Coastguard Worker };
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker // Creates a GMock matcher for testing equivalence of JSON values represented as
88*6777b538SAndroid Build Coastguard Worker // either JSON strings or base::Value objects.  Parsing of the expected value
89*6777b538SAndroid Build Coastguard Worker // uses ParseJson(), which allows trailing commas for convenience.  Parsing of
90*6777b538SAndroid Build Coastguard Worker // the actual value follows the JSON spec strictly.
91*6777b538SAndroid Build Coastguard Worker //
92*6777b538SAndroid Build Coastguard Worker // Although it possible to use this matcher when the actual and expected values
93*6777b538SAndroid Build Coastguard Worker // are both base::Value objects, there is no advantage in that case to using
94*6777b538SAndroid Build Coastguard Worker // this matcher in place of GMock's normal equality semantics.
95*6777b538SAndroid Build Coastguard Worker template <typename T>
IsJson(const T & value)96*6777b538SAndroid Build Coastguard Worker inline testing::PolymorphicMatcher<IsJsonMatcher> IsJson(const T& value) {
97*6777b538SAndroid Build Coastguard Worker   return testing::MakePolymorphicMatcher(IsJsonMatcher(value));
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker // Parses `json` as JSON, allowing trailing commas, and returns the resulting
101*6777b538SAndroid Build Coastguard Worker // value.  If `json` fails to parse, causes an EXPECT failure and returns the
102*6777b538SAndroid Build Coastguard Worker // Null Value.
103*6777b538SAndroid Build Coastguard Worker Value ParseJson(std::string_view json);
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker // Just like ParseJson(), except returns Dicts/Lists. If `json` fails to parse
106*6777b538SAndroid Build Coastguard Worker // or is not of the expected type, causes an EXPECT failure and returns an empty
107*6777b538SAndroid Build Coastguard Worker // container.
108*6777b538SAndroid Build Coastguard Worker Value::Dict ParseJsonDict(std::string_view json);
109*6777b538SAndroid Build Coastguard Worker Value::List ParseJsonList(std::string_view json);
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker // Similar to `ParseJsonDict`, however it loads its contents from a file.
112*6777b538SAndroid Build Coastguard Worker // Returns the parsed `Value::Dict` when successful. Otherwise, it causes an
113*6777b538SAndroid Build Coastguard Worker // EXPECT failure, and returns an empty dict.
114*6777b538SAndroid Build Coastguard Worker Value::Dict ParseJsonDictFromFile(const FilePath& json_file_path);
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker // An enumaration with the possible types of errors when calling
117*6777b538SAndroid Build Coastguard Worker // `WriteJsonFile`.
118*6777b538SAndroid Build Coastguard Worker enum class WriteJsonError {
119*6777b538SAndroid Build Coastguard Worker   // Failed to generate a json string with the value provided.
120*6777b538SAndroid Build Coastguard Worker   kGenerateJsonFailure,
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker   // Failed to write the json string into a file.
123*6777b538SAndroid Build Coastguard Worker   kWriteFileFailure,
124*6777b538SAndroid Build Coastguard Worker };
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker // Serialises `root` as a json string to a file. Returns a empty expected when
127*6777b538SAndroid Build Coastguard Worker // successful. Otherwise returns an error.
128*6777b538SAndroid Build Coastguard Worker expected<void, WriteJsonError> WriteJsonFile(const FilePath& json_file_path,
129*6777b538SAndroid Build Coastguard Worker                                              ValueView root);
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker }  // namespace test
132*6777b538SAndroid Build Coastguard Worker }  // namespace base
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker #endif  // BASE_TEST_VALUES_TEST_UTIL_H_
135