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