1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "sync/notifier/unacked_invalidation_set_test_util.h"
6
7 #include "base/json/json_string_value_serializer.h"
8 #include "sync/notifier/object_id_invalidation_map.h"
9 #include "testing/gmock/include/gmock/gmock-matchers.h"
10
11 namespace syncer {
12
13 using ::testing::MakeMatcher;
14 using ::testing::MatchResultListener;
15 using ::testing::Matcher;
16 using ::testing::MatcherInterface;
17 using ::testing::PrintToString;
18
19 namespace test_util {
20
21 // This class needs to be declared outside the null namespace so the
22 // UnackedInvalidationSet can declare it as a friend. This class needs access
23 // to the UnackedInvalidationSet internals to implement its comparispon
24 // function.
25 class UnackedInvalidationSetEqMatcher
26 : public testing::MatcherInterface<const UnackedInvalidationSet&> {
27 public:
28 explicit UnackedInvalidationSetEqMatcher(
29 const UnackedInvalidationSet& expected);
30
31 virtual bool MatchAndExplain(
32 const UnackedInvalidationSet& actual,
33 MatchResultListener* listener) const OVERRIDE;
34 virtual void DescribeTo(::std::ostream* os) const OVERRIDE;
35 virtual void DescribeNegationTo(::std::ostream* os) const OVERRIDE;
36
37 private:
38 const UnackedInvalidationSet expected_;
39
40 DISALLOW_COPY_AND_ASSIGN(UnackedInvalidationSetEqMatcher);
41 };
42
43 namespace {
44
45 struct InvalidationEq {
operator ()syncer::test_util::__anon87dbd9670111::InvalidationEq46 bool operator()(const syncer::Invalidation& a,
47 const syncer::Invalidation& b) const {
48 return a.Equals(b);
49 }
50 };
51
52 } // namespace
53
UnackedInvalidationSetEqMatcher(const UnackedInvalidationSet & expected)54 UnackedInvalidationSetEqMatcher::UnackedInvalidationSetEqMatcher(
55 const UnackedInvalidationSet& expected)
56 : expected_(expected) {}
57
MatchAndExplain(const UnackedInvalidationSet & actual,MatchResultListener * listener) const58 bool UnackedInvalidationSetEqMatcher::MatchAndExplain(
59 const UnackedInvalidationSet& actual,
60 MatchResultListener* listener) const {
61 // Use our friendship with this class to compare the internals of two
62 // instances.
63 //
64 // Note that the registration status is intentionally not considered
65 // when performing this comparison.
66 return expected_.object_id_ == actual.object_id_
67 && std::equal(expected_.invalidations_.begin(),
68 expected_.invalidations_.end(),
69 actual.invalidations_.begin(),
70 InvalidationEq());
71 }
72
DescribeTo(::std::ostream * os) const73 void UnackedInvalidationSetEqMatcher::DescribeTo(::std::ostream* os) const {
74 *os << " is equal to " << PrintToString(expected_);
75 }
76
DescribeNegationTo(::std::ostream * os) const77 void UnackedInvalidationSetEqMatcher::DescribeNegationTo(
78 ::std::ostream* os) const {
79 *os << " isn't equal to " << PrintToString(expected_);
80 }
81
82 // We're done declaring UnackedInvalidationSetEqMatcher. Everything else can
83 // go into the null namespace.
84 namespace {
85
UnackedInvalidationsMapToObjectIdInvalidationMap(const UnackedInvalidationsMap & state_map)86 ObjectIdInvalidationMap UnackedInvalidationsMapToObjectIdInvalidationMap(
87 const UnackedInvalidationsMap& state_map) {
88 ObjectIdInvalidationMap object_id_invalidation_map;
89 for (UnackedInvalidationsMap::const_iterator it = state_map.begin();
90 it != state_map.end(); ++it) {
91 it->second.ExportInvalidations(syncer::WeakHandle<AckHandler>(),
92 &object_id_invalidation_map);
93 }
94 return object_id_invalidation_map;
95 }
96
97 class UnackedInvalidationsMapEqMatcher
98 : public testing::MatcherInterface<const UnackedInvalidationsMap&> {
99 public:
100 explicit UnackedInvalidationsMapEqMatcher(
101 const UnackedInvalidationsMap& expected);
102
103 virtual bool MatchAndExplain(const UnackedInvalidationsMap& actual,
104 MatchResultListener* listener) const;
105 virtual void DescribeTo(::std::ostream* os) const;
106 virtual void DescribeNegationTo(::std::ostream* os) const;
107
108 private:
109 const UnackedInvalidationsMap expected_;
110
111 DISALLOW_COPY_AND_ASSIGN(UnackedInvalidationsMapEqMatcher);
112 };
113
UnackedInvalidationsMapEqMatcher(const UnackedInvalidationsMap & expected)114 UnackedInvalidationsMapEqMatcher::UnackedInvalidationsMapEqMatcher(
115 const UnackedInvalidationsMap& expected)
116 : expected_(expected) {
117 }
118
MatchAndExplain(const UnackedInvalidationsMap & actual,MatchResultListener * listener) const119 bool UnackedInvalidationsMapEqMatcher::MatchAndExplain(
120 const UnackedInvalidationsMap& actual,
121 MatchResultListener* listener) const {
122 ObjectIdInvalidationMap expected_inv =
123 UnackedInvalidationsMapToObjectIdInvalidationMap(expected_);
124 ObjectIdInvalidationMap actual_inv =
125 UnackedInvalidationsMapToObjectIdInvalidationMap(actual);
126
127 return expected_inv == actual_inv;
128 }
129
DescribeTo(::std::ostream * os) const130 void UnackedInvalidationsMapEqMatcher::DescribeTo(
131 ::std::ostream* os) const {
132 *os << " is equal to " << PrintToString(expected_);
133 }
134
DescribeNegationTo(::std::ostream * os) const135 void UnackedInvalidationsMapEqMatcher::DescribeNegationTo(
136 ::std::ostream* os) const {
137 *os << " isn't equal to " << PrintToString(expected_);
138 }
139
140 } // namespace
141
PrintTo(const UnackedInvalidationSet & invalidations,::std::ostream * os)142 void PrintTo(const UnackedInvalidationSet& invalidations,
143 ::std::ostream* os) {
144 scoped_ptr<base::DictionaryValue> value = invalidations.ToValue();
145
146 std::string output;
147 JSONStringValueSerializer serializer(&output);
148 serializer.set_pretty_print(true);
149 serializer.Serialize(*value.get());
150
151 (*os) << output;
152 }
153
PrintTo(const UnackedInvalidationsMap & map,::std::ostream * os)154 void PrintTo(const UnackedInvalidationsMap& map, ::std::ostream* os) {
155 scoped_ptr<base::ListValue> list(new base::ListValue);
156 for (UnackedInvalidationsMap::const_iterator it = map.begin();
157 it != map.end(); ++it) {
158 list->Append(it->second.ToValue().release());
159 }
160
161 std::string output;
162 JSONStringValueSerializer serializer(&output);
163 serializer.set_pretty_print(true);
164 serializer.Serialize(*list.get());
165
166 (*os) << output;
167 }
168
Eq(const UnackedInvalidationSet & expected)169 Matcher<const UnackedInvalidationSet&> Eq(
170 const UnackedInvalidationSet& expected) {
171 return MakeMatcher(new UnackedInvalidationSetEqMatcher(expected));
172 }
173
Eq(const UnackedInvalidationsMap & expected)174 Matcher<const UnackedInvalidationsMap&> Eq(
175 const UnackedInvalidationsMap& expected) {
176 return MakeMatcher(new UnackedInvalidationsMapEqMatcher(expected));
177 }
178
179 } // namespace test_util
180
181 };
182