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