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

Side by Side Diff: chrome/browser/policy/device_token_fetcher_unittest.cc

Issue 6520008: Device policy infrastructure (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address Mattias' comments Created 9 years, 10 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
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <string> 5 #include "chrome/browser/policy/device_token_fetcher.h"
6 6
7 #include "base/file_util.h" 7 #include "base/file_util.h"
8 #include "base/message_loop.h" 8 #include "base/message_loop.h"
9 #include "base/scoped_temp_dir.h" 9 #include "base/scoped_temp_dir.h"
10 #include "chrome/browser/browser_thread.h" 10 #include "chrome/browser/browser_thread.h"
11 #include "chrome/browser/net/gaia/token_service.h" 11 #include "chrome/browser/net/gaia/token_service.h"
12 #include "chrome/browser/policy/device_token_fetcher.h" 12 #include "chrome/browser/policy/cloud_policy_cache.h"
13 #include "chrome/browser/policy/device_management_service.h"
13 #include "chrome/browser/policy/mock_device_management_backend.h" 14 #include "chrome/browser/policy/mock_device_management_backend.h"
14 #include "chrome/common/net/gaia/gaia_constants.h" 15 #include "chrome/common/net/gaia/gaia_constants.h"
15 #include "chrome/test/testing_device_token_fetcher.h"
16 #include "chrome/test/testing_profile.h" 16 #include "chrome/test/testing_profile.h"
17 #include "testing/gmock/include/gmock/gmock.h" 17 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
19 19
20 namespace policy { 20 namespace policy {
21 21
22 const char kTestToken[] = "device_token_fetcher_test_auth_token"; 22 const char kTestToken[] = "device_token_fetcher_test_auth_token";
23 23
24 using testing::_; 24 using testing::_;
25 using testing::Mock; 25 using testing::Mock;
26 26
27 class MockTokenAvailableObserver : public DeviceTokenFetcher::Observer { 27 class MockTokenAvailableObserver : public DeviceTokenFetcher::Observer {
28 public: 28 public:
29 MockTokenAvailableObserver() {} 29 MockTokenAvailableObserver() {}
30 virtual ~MockTokenAvailableObserver() {} 30 virtual ~MockTokenAvailableObserver() {}
31 31
32 MOCK_METHOD0(OnTokenSuccess, void()); 32 MOCK_METHOD0(OnDeviceTokenAvailable, void());
33 MOCK_METHOD0(OnTokenError, void());
34 MOCK_METHOD0(OnNotManaged, void());
35 33
36 private: 34 private:
37 DISALLOW_COPY_AND_ASSIGN(MockTokenAvailableObserver); 35 DISALLOW_COPY_AND_ASSIGN(MockTokenAvailableObserver);
38 }; 36 };
39 37
38 class ProxyDeviceManagementBackend;
Mattias Nissler (ping if slow) 2011/02/22 12:01:20 Don't need that forward declaration.
Jakob Kummerow 2011/02/22 16:53:58 Done.
39
40 class DeviceManagementServiceBackendHybrid
Mattias Nissler (ping if slow) 2011/02/22 12:01:20 How about a comment?
Jakob Kummerow 2011/02/22 16:53:58 Done.
41 : public DeviceManagementService,
42 public MockDeviceManagementBackend {
danno 2011/02/22 15:02:54 Can you make the DeviceManagementServiceBackendHyb
Jakob Kummerow 2011/02/22 16:53:58 Done.
43 public:
44 DeviceManagementServiceBackendHybrid()
45 : DeviceManagementService(""),
46 MockDeviceManagementBackend() {}
47 ~DeviceManagementServiceBackendHybrid() { }
48
49 virtual DeviceManagementBackend* CreateBackend();
50
51 private:
52 DISALLOW_COPY_AND_ASSIGN(DeviceManagementServiceBackendHybrid);
53 };
54
55 class ProxyDeviceManagementBackend : public DeviceManagementBackend {
56 public:
57 explicit ProxyDeviceManagementBackend(
58 DeviceManagementServiceBackendHybrid* hybrid)
59 : hybrid_(hybrid) {
60 }
61 virtual void ProcessRegisterRequest(const std::string& a,
62 const std::string& b,
63 const em::DeviceRegisterRequest& c,
64 DeviceRegisterResponseDelegate* d) {
65 hybrid_->ProcessRegisterRequest(a, b, c, d);
66 }
67 virtual void ProcessUnregisterRequest(const std::string& a,
68 const std::string& b,
69 const em::DeviceUnregisterRequest& c,
70 DeviceUnregisterResponseDelegate* d) {
71 hybrid_->ProcessUnregisterRequest(a, b, c, d);
72 }
73 virtual void ProcessPolicyRequest(const std::string& a,
74 const std::string& b,
75 const em::DevicePolicyRequest& c,
76 DevicePolicyResponseDelegate* d) {
77 hybrid_->ProcessPolicyRequest(a, b, c, d);
78 }
79 virtual void ProcessCloudPolicyRequest(const std::string& a,
80 const std::string& b,
81 const em::CloudPolicyRequest& c,
82 DevicePolicyResponseDelegate* d) {
83 hybrid_->ProcessCloudPolicyRequest(a, b, c, d);
84 }
85
86 private:
87 DeviceManagementServiceBackendHybrid* hybrid_;
88 DISALLOW_COPY_AND_ASSIGN(ProxyDeviceManagementBackend);
89 };
90
91 DeviceManagementBackend*
92 DeviceManagementServiceBackendHybrid::CreateBackend() {
93 return new ProxyDeviceManagementBackend(this);
94 }
95
40 class DeviceTokenFetcherTest : public testing::Test { 96 class DeviceTokenFetcherTest : public testing::Test {
41 protected: 97 protected:
42 DeviceTokenFetcherTest() 98 DeviceTokenFetcherTest()
43 : ui_thread_(BrowserThread::UI, &loop_), 99 : ui_thread_(BrowserThread::UI, &loop_),
44 file_thread_(BrowserThread::FILE, &loop_) { 100 file_thread_(BrowserThread::FILE, &loop_) {
45 EXPECT_TRUE(temp_user_data_dir_.CreateUniqueTempDir()); 101 EXPECT_TRUE(temp_user_data_dir_.CreateUniqueTempDir());
46 fetcher_ = NewTestFetcher(temp_user_data_dir_.path()); 102 }
47 fetcher_->StartFetching(); 103
104 virtual void SetUp() {
105 cache_.reset(new CloudPolicyCache(
106 temp_user_data_dir_.path().AppendASCII("DeviceTokenFetcherTest")));
48 } 107 }
49 108
50 virtual void TearDown() { 109 virtual void TearDown() {
51 backend_.reset();
52 profile_.reset();
53 loop_.RunAllPending(); 110 loop_.RunAllPending();
54 } 111 }
55 112
56 void SimulateSuccessfulLoginAndRunPending(const std::string& username) {
57 loop_.RunAllPending();
58 profile_->GetTokenService()->IssueAuthTokenForTest(
59 GaiaConstants::kDeviceManagementService, kTestToken);
60 fetcher_->SimulateLogin(username);
61 loop_.RunAllPending();
62 }
63
64 TestingDeviceTokenFetcher* NewTestFetcher(const FilePath& token_dir) {
65 profile_.reset(new TestingProfile());
66 backend_.reset(new MockDeviceManagementBackend());
67 return new TestingDeviceTokenFetcher(
68 backend_.get(),
69 profile_.get(),
70 token_dir.Append(FILE_PATH_LITERAL("test-token-file.txt")));
71 }
72
73 static void GetDeviceTokenPath(const DeviceTokenFetcher* fetcher,
74 FilePath* path) {
75 fetcher->GetDeviceTokenPath(path);
76 }
77
78 const std::string& device_id(const DeviceTokenFetcher* fetcher) {
79 return fetcher->device_id_;
80 }
81
82 MessageLoop loop_; 113 MessageLoop loop_;
83 scoped_ptr<MockDeviceManagementBackend> backend_; 114 DeviceManagementServiceBackendHybrid service_backend_;
115 scoped_ptr<CloudPolicyCache> cache_;
84 ScopedTempDir temp_user_data_dir_; 116 ScopedTempDir temp_user_data_dir_;
85 scoped_refptr<TestingDeviceTokenFetcher> fetcher_;
86 scoped_ptr<Profile> profile_;
87 117
88 private: 118 private:
89 BrowserThread ui_thread_; 119 BrowserThread ui_thread_;
90 BrowserThread file_thread_; 120 BrowserThread file_thread_;
91 }; 121 };
92 122
93 TEST_F(DeviceTokenFetcherTest, IsPending) { 123 TEST_F(DeviceTokenFetcherTest, FetchToken) {
94 ASSERT_TRUE(fetcher_->IsTokenPending()); 124 testing::InSequence s;
95 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( 125 EXPECT_CALL(service_backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
96 MockDeviceManagementBackendSucceedRegister()); 126 MockDeviceManagementBackendSucceedRegister());
97 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); 127 DeviceTokenFetcher fetcher(&service_backend_, cache_.get());
98 ASSERT_FALSE(fetcher_->IsTokenPending()); 128 MockTokenAvailableObserver observer;
129 EXPECT_CALL(observer, OnDeviceTokenAvailable());
130 fetcher.AddObserver(&observer);
131 EXPECT_EQ("", fetcher.GetDeviceToken());
132 fetcher.FetchToken("fake_auth_token", "fake_device_id");
133 loop_.RunAllPending();
134 Mock::VerifyAndClearExpectations(&observer);
135 std::string token = fetcher.GetDeviceToken();
136 EXPECT_NE("", token);
137
138 // Calling FetchToken() again should result in a new token being fetched.
139 EXPECT_CALL(service_backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
140 MockDeviceManagementBackendSucceedRegister());
141 EXPECT_CALL(observer, OnDeviceTokenAvailable());
142 fetcher.FetchToken("fake_auth_token", "fake_device_id");
143 loop_.RunAllPending();
144 Mock::VerifyAndClearExpectations(&observer);
145 std::string token2 = fetcher.GetDeviceToken();
146 EXPECT_NE("", token2);
147 EXPECT_NE(token, token2);
148 fetcher.RemoveObserver(&observer);
99 } 149 }
100 150
101 TEST_F(DeviceTokenFetcherTest, StoreAndLoad) { 151 TEST_F(DeviceTokenFetcherTest, RetryOnError) {
102 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( 152 testing::InSequence s;
153 EXPECT_CALL(service_backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
154 MockDeviceManagementBackendFailRegister(
155 DeviceManagementBackend::kErrorRequestFailed)).WillOnce(
103 MockDeviceManagementBackendSucceedRegister()); 156 MockDeviceManagementBackendSucceedRegister());
104 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); 157 DeviceTokenFetcher fetcher(&service_backend_, cache_.get(), 0, 0);
105 ASSERT_FALSE(fetcher_->IsTokenPending()); 158 MockTokenAvailableObserver observer;
106 std::string device_token = fetcher_->GetDeviceToken(); 159 EXPECT_CALL(observer, OnDeviceTokenAvailable());
107 std::string device_id = fetcher_->GetDeviceID(); 160 fetcher.AddObserver(&observer);
108 ASSERT_NE("", device_id); 161 fetcher.FetchToken("fake_auth_token", "fake_device_id");
109
110 FilePath token_path;
111 GetDeviceTokenPath(fetcher_, &token_path);
112 scoped_refptr<DeviceTokenFetcher> fetcher2(
113 new TestingDeviceTokenFetcher(
114 backend_.get(), profile_.get(), token_path));
115 fetcher2->StartFetching();
116 loop_.RunAllPending(); 162 loop_.RunAllPending();
117 ASSERT_EQ(device_id, fetcher2->GetDeviceID());
118 ASSERT_EQ(device_token, fetcher2->GetDeviceToken());
119 }
120
121 TEST_F(DeviceTokenFetcherTest, SimpleFetchSingleLogin) {
122 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
123 MockDeviceManagementBackendSucceedRegister());
124 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername);
125 ASSERT_FALSE(fetcher_->IsTokenPending());
126 ASSERT_TRUE(fetcher_->IsTokenValid());
127 const std::string token(fetcher_->GetDeviceToken());
128 EXPECT_NE("", token);
129 }
130
131 TEST_F(DeviceTokenFetcherTest, SimpleFetchDoubleLogin) {
132 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
133 MockDeviceManagementBackendSucceedRegister());
134 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername);
135 ASSERT_FALSE(fetcher_->IsTokenPending());
136 const std::string token(fetcher_->GetDeviceToken());
137 EXPECT_NE("", token);
138
139 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername);
140 ASSERT_FALSE(fetcher_->IsTokenPending());
141 const std::string token2(fetcher_->GetDeviceToken());
142 EXPECT_NE("", token2);
143 EXPECT_EQ(token, token2);
144 }
145
146 TEST_F(DeviceTokenFetcherTest, FetchBetweenBrowserLaunchAndNotify) {
147 MockTokenAvailableObserver observer;
148 DeviceTokenFetcher::ObserverRegistrar registrar;
149 registrar.Init(fetcher_);
150 registrar.AddObserver(&observer);
151 EXPECT_CALL(observer, OnTokenSuccess()).Times(1);
152 EXPECT_CALL(observer, OnTokenError()).Times(0);
153 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
154 MockDeviceManagementBackendSucceedRegister());
155 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername);
156 ASSERT_FALSE(fetcher_->IsTokenPending());
157 const std::string token(fetcher_->GetDeviceToken());
158 EXPECT_NE("", token);
159 Mock::VerifyAndClearExpectations(&observer); 163 Mock::VerifyAndClearExpectations(&observer);
160 164 EXPECT_NE("", fetcher.GetDeviceToken());
161 // Swap out the fetchers, including copying the device management token on 165 fetcher.RemoveObserver(&observer);
162 // disk to where the new fetcher expects it.
163 registrar.RemoveAll();
164 fetcher_ = NewTestFetcher(temp_user_data_dir_.path());
165 registrar.Init(fetcher_);
166 fetcher_->StartFetching();
167 ASSERT_TRUE(fetcher_->IsTokenPending());
168 loop_.RunAllPending();
169 ASSERT_FALSE(fetcher_->IsTokenPending());
170 const std::string token2(fetcher_->GetDeviceToken());
171 EXPECT_NE("", token2);
172 EXPECT_EQ(token, token2);
173 }
174
175 TEST_F(DeviceTokenFetcherTest, FailedServerRequest) {
176 MockTokenAvailableObserver observer;
177 DeviceTokenFetcher::ObserverRegistrar registrar;
178 registrar.Init(fetcher_);
179 registrar.AddObserver(&observer);
180 EXPECT_CALL(observer, OnTokenSuccess()).Times(0);
181 EXPECT_CALL(observer, OnTokenError()).Times(1);
182 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
183 MockDeviceManagementBackendFailRegister(
184 DeviceManagementBackend::kErrorRequestFailed));
185 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername);
186 ASSERT_FALSE(fetcher_->IsTokenPending());
187 const std::string token(fetcher_->GetDeviceToken());
188 EXPECT_EQ("", token);
189 } 166 }
190 167
191 TEST_F(DeviceTokenFetcherTest, UnmanagedDevice) { 168 TEST_F(DeviceTokenFetcherTest, UnmanagedDevice) {
192 FilePath token_path; 169 EXPECT_CALL(service_backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
193 GetDeviceTokenPath(fetcher_, &token_path);
194 file_util::WriteFile(token_path, "foo", 3);
195 ASSERT_TRUE(file_util::PathExists(token_path));
196 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
197 MockDeviceManagementBackendFailRegister( 170 MockDeviceManagementBackendFailRegister(
198 DeviceManagementBackend::kErrorServiceManagementNotSupported)); 171 DeviceManagementBackend::kErrorServiceManagementNotSupported));
199 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); 172 EXPECT_FALSE(cache_->is_unmanaged());
200 ASSERT_FALSE(fetcher_->IsTokenPending()); 173 DeviceTokenFetcher fetcher(&service_backend_, cache_.get());
201 ASSERT_EQ("", fetcher_->GetDeviceToken()); 174 MockTokenAvailableObserver observer;
202 ASSERT_EQ("", device_id(fetcher_)); 175 EXPECT_CALL(observer, OnDeviceTokenAvailable()).Times(0);
203 ASSERT_FALSE(file_util::PathExists(token_path)); 176 fetcher.AddObserver(&observer);
204 } 177 fetcher.FetchToken("fake_auth_token", "fake_device_id");
205
206
207 TEST_F(DeviceTokenFetcherTest, FetchBetweenTokenNotifyAndLoginNotify) {
208 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).Times(0);
209
210 // Simulate an available token, but without available user name.
211 loop_.RunAllPending(); 178 loop_.RunAllPending();
212 profile_->GetTokenService()->IssueAuthTokenForTest( 179 Mock::VerifyAndClearExpectations(&observer);
213 GaiaConstants::kDeviceManagementService, kTestToken); 180 EXPECT_EQ("", fetcher.GetDeviceToken());
214 loop_.RunAllPending(); 181 EXPECT_TRUE(cache_->is_unmanaged());
215 182 fetcher.RemoveObserver(&observer);
216 ASSERT_TRUE(fetcher_->IsTokenPending());
217 ASSERT_FALSE(fetcher_->IsTokenValid());
218 }
219
220 TEST_F(DeviceTokenFetcherTest, FetchWithNonManagedUsername) {
221 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).Times(0);
222 SimulateSuccessfulLoginAndRunPending("___@gmail.com");
223 ASSERT_FALSE(fetcher_->IsTokenPending());
224 ASSERT_FALSE(fetcher_->IsTokenValid());
225 }
226
227 TEST_F(DeviceTokenFetcherTest, RestartImmediately) {
228 // Create a token.
229 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
230 MockDeviceManagementBackendSucceedRegister());
231 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername);
232 ASSERT_FALSE(fetcher_->IsTokenPending());
233 std::string device_token = fetcher_->GetDeviceToken();
234
235 // Restart a new fetcher immediately without calling StartFetching(). The
236 // existing token should not be loaded, but rather a new token generated.
237 FilePath token_path;
238 GetDeviceTokenPath(fetcher_, &token_path);
239 scoped_refptr<TestingDeviceTokenFetcher> fetcher2(
240 new TestingDeviceTokenFetcher(
241 backend_.get(), profile_.get(), token_path));
242 fetcher2->Restart();
243 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
244 MockDeviceManagementBackendSucceedRegister());
245 fetcher2->SimulateLogin(kTestManagedDomainUsername);
246 loop_.RunAllPending();
247 ASSERT_FALSE(fetcher2->IsTokenPending());
248 ASSERT_NE(device_token, fetcher2->GetDeviceToken());
249 } 183 }
250 184
251 } // namespace policy 185 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698