Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: sync/engine/sync_session_job_unittest.cc

Issue 10917234: sync: make scheduling logic and job ownership more obvious. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: test + comment + rebase Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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/engine/sync_session_job.h"
6
7 #include "base/bind.h"
8 #include "base/bind_helpers.h"
9 #include "base/time.h"
10 #include "sync/internal_api/public/base/model_type_state_map.h"
11 #include "sync/sessions/sync_session.h"
12 #include "sync/sessions/sync_session_context.h"
13 #include "sync/sessions/test_util.h"
14 #include "sync/test/engine/fake_model_worker.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 using base::TimeTicks;
19
20 namespace syncer {
21
22 using sessions::SyncSession;
23
24 class MockDelegate : public SyncSession::Delegate {
25 public:
26 MockDelegate() {}
27 ~MockDelegate() {}
28
29 MOCK_METHOD0(IsSyncingCurrentlySilenced, bool());
30 MOCK_METHOD1(OnReceivedShortPollIntervalUpdate, void(const base::TimeDelta&));
31 MOCK_METHOD1(OnReceivedLongPollIntervalUpdate ,void(const base::TimeDelta&));
32 MOCK_METHOD1(OnReceivedSessionsCommitDelay, void(const base::TimeDelta&));
33 MOCK_METHOD1(OnSyncProtocolError, void(const sessions::SyncSessionSnapshot&));
34 MOCK_METHOD0(OnShouldStopSyncingPermanently, void());
35 MOCK_METHOD1(OnSilencedUntil, void(const base::TimeTicks&));
36 };
37
38 class SyncSessionJobTest : public testing::Test {
39 public:
40 SyncSessionJobTest() : config_params_callback_invoked_(false) {}
41 virtual void SetUp() {
42 routes_.clear();
43 workers_.clear();
44 config_params_callback_invoked_ = false;
45 routes_[BOOKMARKS] = GROUP_PASSIVE;
46 scoped_refptr<ModelSafeWorker> passive_worker(
47 new FakeModelWorker(GROUP_PASSIVE));
48 workers_.push_back(passive_worker);
49 std::vector<ModelSafeWorker*> workers;
50 GetWorkers(&workers);
51 context_.reset(new sessions::SyncSessionContext(
52 NULL, // |connection_manager|
53 NULL, // |directory|
54 workers,
55 NULL, // |extensions_activity_monitor|
56 NULL, // |throttled_data_type_tracker|
57 std::vector<SyncEngineEventListener*>(),
58 NULL, // |debug_info_getter|
59 NULL, // |traffic_recorder|
60 true /* |enable keystore encryption| */));
61 context_->set_routing_info(routes_);
62 }
63
64 scoped_ptr<SyncSession> NewLocalSession() {
65 sessions::SyncSourceInfo info(
66 sync_pb::GetUpdatesCallerInfo::LOCAL, ModelTypeStateMap());
67 return scoped_ptr<SyncSession>(new SyncSession(context_.get(),
68 &delegate_, info, context_->routing_info(),
69 context_->workers()));
70 }
71
72 void GetWorkers(std::vector<ModelSafeWorker*>* out) const {
73 out->clear();
74 for (std::vector<scoped_refptr<ModelSafeWorker> >::const_iterator it =
75 workers_.begin(); it != workers_.end(); ++it) {
76 out->push_back(it->get());
77 }
78 }
79
80 void ConfigurationParamsCallback() {
81 config_params_callback_invoked_ = true;
82 }
83
84 bool config_params_callback_invoked() const {
85 return config_params_callback_invoked_;
86 }
87
88 sessions::SyncSessionContext* context() { return context_.get(); }
89 SyncSession::Delegate* delegate() { return &delegate_; }
90 const ModelSafeRoutingInfo& routes() { return routes_; }
91
92 // Checks that the two jobs are "clones" as defined by SyncSessionJob,
93 // minus location and SyncSession checking, for reuse in different
94 // scenarios.
95 void ExpectClonesBase(SyncSessionJob* job, SyncSessionJob* clone) {
96 EXPECT_EQ(job->purpose(), clone->purpose());
97 EXPECT_EQ(job->scheduled_start(), clone->scheduled_start());
98 EXPECT_EQ(job->start_step(), clone->start_step());
99 EXPECT_EQ(job->end_step(), clone->end_step());
100 EXPECT_FALSE(clone->is_canary());
101 EXPECT_FALSE(clone->Succeeded());
102 }
103
104 private:
105 scoped_ptr<sessions::SyncSessionContext> context_;
106 std::vector<scoped_refptr<ModelSafeWorker> > workers_;
107 MockDelegate delegate_;
108 ModelSafeRoutingInfo routes_;
109 bool config_params_callback_invoked_;
110 };
111
112 TEST_F(SyncSessionJobTest, Clone) {
113 SyncSessionJob job1(SyncSessionJob::NUDGE, TimeTicks::Now(),
114 NewLocalSession().Pass(), ConfigurationParams(), FROM_HERE);
115
116 sessions::test_util::SimulateSuccess(job1.mutable_session(),
117 job1.start_step(),
118 job1.end_step());
119 job1.Finish(false);
120 ModelSafeRoutingInfo new_routes;
121 new_routes[AUTOFILL] = GROUP_PASSIVE;
122 context()->set_routing_info(new_routes);
123 const tracked_objects::Location from_here1(FROM_HERE);
124 scoped_ptr<SyncSessionJob> clone1 = job1.Clone();
125 scoped_ptr<SyncSessionJob> clone1_loc = job1.CloneFromLocation(from_here1);
126
127 ExpectClonesBase(&job1, clone1.get());
128 ExpectClonesBase(&job1, clone1_loc.get());
129 EXPECT_NE(job1.session(), clone1->session());
130 EXPECT_EQ(job1.session()->routing_info(),
131 clone1->session()->routing_info());
132 EXPECT_EQ(job1.from_location().ToString(),
133 clone1->from_location().ToString());
134 EXPECT_NE(job1.session(), clone1_loc->session());
135 EXPECT_EQ(job1.session()->routing_info(),
136 clone1_loc->session()->routing_info());
137 EXPECT_EQ(from_here1.ToString(), clone1_loc->from_location().ToString());
138
139 context()->set_routing_info(routes());
140 clone1->GrantCanaryPrivilege();
141 sessions::test_util::SimulateSuccess(clone1->mutable_session(),
142 clone1->start_step(),
143 clone1->end_step());
144 clone1->Finish(false);
145 const tracked_objects::Location from_here2(FROM_HERE);
146 scoped_ptr<SyncSessionJob> clone2 = clone1->Clone();
147 scoped_ptr<SyncSessionJob> clone2_loc(clone1->CloneFromLocation(from_here2));
148
149 ExpectClonesBase(clone1.get(), clone2.get());
150 ExpectClonesBase(clone1.get(), clone2_loc.get());
151 EXPECT_NE(clone1->session(), clone2->session());
152 EXPECT_EQ(clone1->session()->routing_info(),
153 clone2->session()->routing_info());
154 EXPECT_EQ(clone1->from_location().ToString(),
155 clone2->from_location().ToString());
156 EXPECT_NE(clone1->session(), clone2->session());
157 EXPECT_EQ(clone1->session()->routing_info(),
158 clone2->session()->routing_info());
159 EXPECT_EQ(from_here2.ToString(), clone2_loc->from_location().ToString());
160
161 clone1.reset();
162 clone1_loc.reset();
163 ExpectClonesBase(&job1, clone2.get());
164 EXPECT_NE(job1.session(), clone2->session());
165 EXPECT_EQ(job1.session()->routing_info(),
166 clone2->session()->routing_info());
167 EXPECT_EQ(job1.from_location().ToString(),
168 clone2->from_location().ToString());
169 }
170
171 TEST_F(SyncSessionJobTest, CloneAfterEarlyExit) {
172 SyncSessionJob job1(SyncSessionJob::NUDGE, TimeTicks::Now(),
173 NewLocalSession().Pass(), ConfigurationParams(), FROM_HERE);
174 job1.Finish(true);
175 scoped_ptr<SyncSessionJob> job2 = job1.Clone();
176 scoped_ptr<SyncSessionJob> job2_loc = job1.CloneFromLocation(FROM_HERE);
177 ExpectClonesBase(&job1, job2.get());
178 ExpectClonesBase(&job1, job2_loc.get());
179 }
180
181 TEST_F(SyncSessionJobTest, CloneAndAbandon) {
182 scoped_ptr<SyncSession> session = NewLocalSession();
183 SyncSession* session_ptr = session.get();
184
185 SyncSessionJob job1(SyncSessionJob::NUDGE, TimeTicks::Now(),
186 session.Pass(), ConfigurationParams(), FROM_HERE);
187 ModelSafeRoutingInfo new_routes;
188 new_routes[AUTOFILL] = GROUP_PASSIVE;
189 context()->set_routing_info(new_routes);
190
191 scoped_ptr<SyncSessionJob> clone1 = job1.CloneAndAbandon();
192 ExpectClonesBase(&job1, clone1.get());
193 EXPECT_FALSE(job1.session());
194 EXPECT_EQ(session_ptr, clone1->session());
195 EXPECT_EQ(session_ptr->routing_info(), clone1->session()->routing_info());
196 }
197
198 // Tests interaction between Finish, sync cycle success / failure, and
199 // SyncSessionJob::Succeeded().
200 TEST_F(SyncSessionJobTest, Succeeded) {
201 SyncSessionJob job1(SyncSessionJob::NUDGE, TimeTicks::Now(),
202 NewLocalSession().Pass(), ConfigurationParams(), FROM_HERE);
203
204 EXPECT_FALSE(job1.Succeeded());
205 sessions::test_util::SimulateSuccess(job1.mutable_session(),
206 job1.start_step(),
207 job1.end_step());
208 EXPECT_FALSE(job1.Succeeded());
209 job1.Finish(false /* |early_exit| */);
210 EXPECT_TRUE(job1.Succeeded());
211
212 scoped_ptr<SyncSessionJob> job2 = job1.Clone();
213 EXPECT_FALSE(job2->Succeeded());
214 sessions::test_util::SimulateConnectionFailure(job2->mutable_session(),
215 job2->start_step(),
216 job2->end_step());
217 job2->Finish(false);
218 EXPECT_FALSE(job2->Succeeded());
219
220 scoped_ptr<SyncSessionJob> job3 = job2->Clone();
221 job3->Finish(true);
222 EXPECT_FALSE(job3->Succeeded());
223 }
224
225 TEST_F(SyncSessionJobTest, FinishCallsReadyTask) {
226 ConfigurationParams params;
227 params.ready_task = base::Bind(
228 &SyncSessionJobTest::ConfigurationParamsCallback,
229 base::Unretained(this));
230
231 sessions::SyncSourceInfo info(
232 sync_pb::GetUpdatesCallerInfo::RECONFIGURATION, ModelTypeStateMap());
233 scoped_ptr<SyncSession> session(new SyncSession(context(),
234 delegate(), info, context()->routing_info(),
235 context()->workers()));
236
237 SyncSessionJob job1(SyncSessionJob::CONFIGURATION, TimeTicks::Now(),
238 session.Pass(), params, FROM_HERE);
239 sessions::test_util::SimulateSuccess(job1.mutable_session(),
240 job1.start_step(),
241 job1.end_step());
242 job1.Finish(false);
243 EXPECT_TRUE(config_params_callback_invoked());
244 }
245
246 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698