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.
7 #include "base/command_line.h"
8 #include "base/location.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/prefs/testing_pref_service.h"
12 #include "base/run_loop.h"
13 #include "base/single_thread_task_runner.h"
14 #include "base/thread_task_runner_handle.h"
15 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service.h"
16 #include "chrome/browser/printing/cloud_print/cloud_print_proxy_service_factory.h"
17 #include "chrome/browser/service_process/service_process_control.h"
18 #include "chrome/browser/ui/startup/startup_browser_creator.h"
19 #include "chrome/common/chrome_switches.h"
20 #include "chrome/common/cloud_print/cloud_print_proxy_info.h"
21 #include "chrome/common/pref_names.h"
22 #include "chrome/common/service_messages.h"
23 #include "chrome/test/base/testing_browser_process.h"
24 #include "chrome/test/base/testing_pref_service_syncable.h"
25 #include "chrome/test/base/testing_profile.h"
26 #include "chrome/test/base/testing_profile_manager.h"
27 #include "content/public/browser/browser_thread.h"
28 #include "content/public/test/test_browser_thread.h"
29 #include "testing/gmock/include/gmock/gmock.h"
30 #include "testing/gtest/include/gtest/gtest.h"
32 using ::testing::Assign
;
33 using ::testing::AtMost
;
34 using ::testing::DeleteArg
;
35 using ::testing::DoAll
;
36 using ::testing::Invoke
;
37 using ::testing::Property
;
38 using ::testing::Return
;
39 using ::testing::ReturnPointee
;
40 using ::testing::WithArgs
;
41 using ::testing::WithoutArgs
;
44 class MockServiceProcessControl
: public ServiceProcessControl
{
46 static std::string
EnabledUserId();
48 MockServiceProcessControl() : connected_(false) { }
50 MOCK_CONST_METHOD0(IsConnected
, bool());
52 MOCK_METHOD2(Launch
, void(const base::Closure
&, const base::Closure
&));
53 MOCK_METHOD0(Disconnect
, void());
55 MOCK_METHOD1(OnMessageReceived
, bool(const IPC::Message
&));
56 MOCK_METHOD1(OnChannelConnected
, void(int32 peer_pid
));
57 MOCK_METHOD0(OnChannelError
, void());
59 MOCK_METHOD1(Send
, bool(IPC::Message
*));
62 kServiceStateDisabled
,
67 void SetConnectSuccessMockExpectations(ServiceState state
, bool post_task
);
69 void SetServiceEnabledExpectations();
70 void SetServiceDisabledExpectations();
71 void SetWillBeEnabledExpectations();
72 void SetWillBeDisabledExpectations();
74 bool SendEnabledInfo();
75 bool SendDisabledInfo();
79 cloud_print::CloudPrintProxyInfo info_
;
83 std::string
MockServiceProcessControl::EnabledUserId() {
84 return std::string("dorothy@somewhere.otr");
87 void CallTask(const base::Closure
& task
) {
92 void PostTask(const base::Closure
& task
) {
94 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE
, task
);
97 void MockServiceProcessControl::SetConnectSuccessMockExpectations(
98 ServiceState service_state
,
100 EXPECT_CALL(*this, IsConnected()).WillRepeatedly(ReturnPointee(&connected_
));
102 EXPECT_CALL(*this, Launch(_
, _
))
104 DoAll(Assign(&connected_
, true),
105 WithArgs
<0>(Invoke(post_task
? PostTask
: CallTask
))));
107 EXPECT_CALL(*this, Disconnect()).Times(AtMost(1))
108 .WillRepeatedly(Assign(&connected_
, false));
110 EXPECT_CALL(*this, Send(_
)).Times(0);
112 if (service_state
== kServiceStateEnabled
)
113 SetServiceEnabledExpectations();
114 else if (service_state
== kServiceStateDisabled
)
115 SetServiceDisabledExpectations();
118 void MockServiceProcessControl::SetServiceEnabledExpectations() {
121 Send(Property(&IPC::Message::type
,
122 static_cast<int32
>(ServiceMsg_GetCloudPrintProxyInfo::ID
))))
127 Invoke(this, &MockServiceProcessControl::SendEnabledInfo
))));
130 void MockServiceProcessControl::SetServiceDisabledExpectations() {
133 Send(Property(&IPC::Message::type
,
134 static_cast<int32
>(ServiceMsg_GetCloudPrintProxyInfo::ID
))))
139 Invoke(this, &MockServiceProcessControl::SendDisabledInfo
))));
142 void MockServiceProcessControl::SetWillBeEnabledExpectations() {
143 int32 message_id
= ServiceMsg_EnableCloudPrintProxyWithRobot::ID
;
146 Send(Property(&IPC::Message::type
, message_id
)))
147 .Times(1).WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
150 void MockServiceProcessControl::SetWillBeDisabledExpectations() {
153 Send(Property(&IPC::Message::type
,
154 static_cast<int32
>(ServiceMsg_DisableCloudPrintProxy::ID
))))
155 .Times(1).WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
158 bool MockServiceProcessControl::SendEnabledInfo() {
159 info_
.enabled
= true;
160 info_
.email
= EnabledUserId();
161 PostTask(base::Bind(&MockServiceProcessControl::OnCloudPrintProxyInfo
,
162 base::Unretained(this), info_
));
166 bool MockServiceProcessControl::SendDisabledInfo() {
167 info_
.enabled
= false;
168 info_
.email
= std::string();
169 PostTask(base::Bind(&MockServiceProcessControl::OnCloudPrintProxyInfo
,
170 base::Unretained(this), info_
));
174 class TestCloudPrintProxyService
: public CloudPrintProxyService
{
176 explicit TestCloudPrintProxyService(Profile
* profile
)
177 : CloudPrintProxyService(profile
) { }
180 CloudPrintProxyService::Initialize();
181 base::RunLoop().RunUntilIdle();
184 void RefreshStatusFromService() {
185 CloudPrintProxyService::RefreshStatusFromService();
186 base::RunLoop().RunUntilIdle();
189 ServiceProcessControl
* GetServiceProcessControl() override
{
190 return &process_control_
;
192 MockServiceProcessControl
* GetMockServiceProcessControl() {
193 return &process_control_
;
196 void EnableForUser() {
197 EnableForUserWithRobot("123", "123@gmail.com",
198 MockServiceProcessControl::EnabledUserId(),
199 base::DictionaryValue());
203 MockServiceProcessControl process_control_
;
206 class CloudPrintProxyPolicyTest
: public ::testing::Test
{
208 CloudPrintProxyPolicyTest()
209 : ui_thread_(content::BrowserThread::UI
, &message_loop_
) {
212 bool LaunchBrowser(const base::CommandLine
& command_line
, Profile
* profile
) {
213 StartupBrowserCreator browser_creator
;
214 return StartupBrowserCreator::ProcessCmdLineImpl(
215 command_line
, base::FilePath(), false, profile
,
216 StartupBrowserCreator::Profiles(), &browser_creator
);
220 base::MessageLoopForUI message_loop_
;
221 content::TestBrowserThread ui_thread_
;
222 TestingProfile profile_
;
225 TEST_F(CloudPrintProxyPolicyTest
, VerifyExpectations
) {
226 MockServiceProcessControl mock_control
;
227 mock_control
.SetConnectSuccessMockExpectations(
228 MockServiceProcessControl::kServiceStateNone
, false);
230 EXPECT_FALSE(mock_control
.IsConnected());
231 mock_control
.Launch(base::Closure(), base::Closure());
232 EXPECT_TRUE(mock_control
.IsConnected());
233 mock_control
.Launch(base::Closure(), base::Closure());
234 EXPECT_TRUE(mock_control
.IsConnected());
235 mock_control
.Disconnect();
236 EXPECT_FALSE(mock_control
.IsConnected());
239 TEST_F(CloudPrintProxyPolicyTest
, StartWithNoPolicyProxyDisabled
) {
240 TestCloudPrintProxyService
service(&profile_
);
242 service
.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations(
243 MockServiceProcessControl::kServiceStateDisabled
, false);
245 TestingPrefServiceSyncable
* prefs
= profile_
.GetTestingPrefService();
247 prefs::kCloudPrintEmail
,
248 new base::StringValue(MockServiceProcessControl::EnabledUserId()));
250 service
.Initialize();
252 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
255 TEST_F(CloudPrintProxyPolicyTest
, StartWithNoPolicyProxyEnabled
) {
256 TestCloudPrintProxyService
service(&profile_
);
258 service
.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations(
259 MockServiceProcessControl::kServiceStateEnabled
, false);
261 TestingPrefServiceSyncable
* prefs
= profile_
.GetTestingPrefService();
262 prefs
->SetUserPref(prefs::kCloudPrintEmail
,
263 new base::StringValue(std::string()));
265 service
.Initialize();
266 service
.RefreshStatusFromService();
268 EXPECT_EQ(MockServiceProcessControl::EnabledUserId(),
269 prefs
->GetString(prefs::kCloudPrintEmail
));
272 TEST_F(CloudPrintProxyPolicyTest
, StartWithPolicySetProxyDisabled
) {
273 TestCloudPrintProxyService
service(&profile_
);
275 service
.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations(
276 MockServiceProcessControl::kServiceStateDisabled
, false);
278 TestingPrefServiceSyncable
* prefs
= profile_
.GetTestingPrefService();
279 prefs
->SetUserPref(prefs::kCloudPrintEmail
,
280 new base::StringValue(std::string()));
281 prefs
->SetManagedPref(prefs::kCloudPrintProxyEnabled
,
282 new base::FundamentalValue(false));
284 service
.Initialize();
286 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
289 TEST_F(CloudPrintProxyPolicyTest
, StartWithPolicySetProxyEnabled
) {
290 TestCloudPrintProxyService
service(&profile_
);
292 service
.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations(
293 MockServiceProcessControl::kServiceStateEnabled
, false);
294 service
.GetMockServiceProcessControl()->SetWillBeDisabledExpectations();
296 TestingPrefServiceSyncable
* prefs
= profile_
.GetTestingPrefService();
297 prefs
->SetUserPref(prefs::kCloudPrintEmail
,
298 new base::StringValue(std::string()));
299 prefs
->SetManagedPref(prefs::kCloudPrintProxyEnabled
,
300 new base::FundamentalValue(false));
302 service
.Initialize();
304 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
307 TEST_F(CloudPrintProxyPolicyTest
, StartWithNoPolicyProxyDisabledThenSetPolicy
) {
308 TestCloudPrintProxyService
service(&profile_
);
310 service
.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations(
311 MockServiceProcessControl::kServiceStateDisabled
, false);
313 TestingPrefServiceSyncable
* prefs
= profile_
.GetTestingPrefService();
315 prefs::kCloudPrintEmail
,
316 new base::StringValue(MockServiceProcessControl::EnabledUserId()));
318 service
.Initialize();
320 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
322 prefs
->SetManagedPref(prefs::kCloudPrintProxyEnabled
,
323 new base::FundamentalValue(false));
325 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
328 TEST_F(CloudPrintProxyPolicyTest
, StartWithNoPolicyProxyEnabledThenSetPolicy
) {
329 TestCloudPrintProxyService
service(&profile_
);
331 service
.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations(
332 MockServiceProcessControl::kServiceStateEnabled
, false);
334 TestingPrefServiceSyncable
* prefs
= profile_
.GetTestingPrefService();
335 prefs
->SetUserPref(prefs::kCloudPrintEmail
,
336 new base::StringValue(std::string()));
338 service
.Initialize();
339 service
.RefreshStatusFromService();
341 EXPECT_EQ(MockServiceProcessControl::EnabledUserId(),
342 prefs
->GetString(prefs::kCloudPrintEmail
));
344 service
.GetMockServiceProcessControl()->SetWillBeDisabledExpectations();
345 prefs
->SetManagedPref(prefs::kCloudPrintProxyEnabled
,
346 new base::FundamentalValue(false));
348 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
351 TEST_F(CloudPrintProxyPolicyTest
,
352 StartWithPolicySetProxyDisabledThenClearPolicy
) {
353 TestCloudPrintProxyService
service(&profile_
);
355 service
.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations(
356 MockServiceProcessControl::kServiceStateDisabled
, false);
358 TestingPrefServiceSyncable
* prefs
= profile_
.GetTestingPrefService();
359 prefs
->SetUserPref(prefs::kCloudPrintEmail
,
360 new base::StringValue(std::string()));
361 prefs
->SetManagedPref(prefs::kCloudPrintProxyEnabled
,
362 new base::FundamentalValue(false));
364 service
.Initialize();
366 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
367 prefs
->RemoveManagedPref(prefs::kCloudPrintProxyEnabled
);
368 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
371 TEST_F(CloudPrintProxyPolicyTest
,
372 StartWithPolicySetProxyEnabledThenClearPolicy
) {
373 TestCloudPrintProxyService
service(&profile_
);
375 service
.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations(
376 MockServiceProcessControl::kServiceStateEnabled
, false);
377 service
.GetMockServiceProcessControl()->SetWillBeDisabledExpectations();
379 TestingPrefServiceSyncable
* prefs
= profile_
.GetTestingPrefService();
380 prefs
->SetUserPref(prefs::kCloudPrintEmail
,
381 new base::StringValue(std::string()));
382 prefs
->SetManagedPref(prefs::kCloudPrintProxyEnabled
,
383 new base::FundamentalValue(false));
385 service
.Initialize();
387 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
388 prefs
->RemoveManagedPref(prefs::kCloudPrintProxyEnabled
);
389 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
392 TEST_F(CloudPrintProxyPolicyTest
, StartWithNoPolicyProxyDisabledThenEnable
) {
393 TestCloudPrintProxyService
service(&profile_
);
395 service
.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations(
396 MockServiceProcessControl::kServiceStateDisabled
, false);
398 TestingPrefServiceSyncable
* prefs
= profile_
.GetTestingPrefService();
400 prefs::kCloudPrintEmail
,
401 new base::StringValue(MockServiceProcessControl::EnabledUserId()));
403 service
.Initialize();
404 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
406 service
.GetMockServiceProcessControl()->SetWillBeEnabledExpectations();
407 service
.EnableForUser();
409 EXPECT_EQ(MockServiceProcessControl::EnabledUserId(),
410 prefs
->GetString(prefs::kCloudPrintEmail
));
413 TEST_F(CloudPrintProxyPolicyTest
,
414 StartWithPolicySetProxyEnabledThenClearPolicyAndEnable
) {
415 TestCloudPrintProxyService
service(&profile_
);
417 service
.GetMockServiceProcessControl()->SetConnectSuccessMockExpectations(
418 MockServiceProcessControl::kServiceStateEnabled
, false);
419 service
.GetMockServiceProcessControl()->SetWillBeDisabledExpectations();
421 TestingPrefServiceSyncable
* prefs
= profile_
.GetTestingPrefService();
422 prefs
->SetUserPref(prefs::kCloudPrintEmail
,
423 new base::StringValue(std::string()));
424 prefs
->SetManagedPref(prefs::kCloudPrintProxyEnabled
,
425 new base::FundamentalValue(false));
427 service
.Initialize();
429 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
430 service
.EnableForUser();
431 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
433 prefs
->RemoveManagedPref(prefs::kCloudPrintProxyEnabled
);
434 EXPECT_EQ(std::string(), prefs
->GetString(prefs::kCloudPrintEmail
));
436 service
.GetMockServiceProcessControl()->SetWillBeEnabledExpectations();
437 service
.EnableForUser();
439 EXPECT_EQ(MockServiceProcessControl::EnabledUserId(),
440 prefs
->GetString(prefs::kCloudPrintEmail
));