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

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: fix nits 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 MockDeviceManagementService : public DeviceManagementService {
39 public:
40 // Takes ownership of |backend|.
41 MockDeviceManagementService()
42 : DeviceManagementService(""),
43 backend_(NULL) {}
44 virtual ~MockDeviceManagementService() {}
45
46 void set_backend(DeviceManagementBackend* backend) {
47 backend_ = backend;
48 }
49 virtual DeviceManagementBackend* CreateBackend();
50
51 private:
52 DeviceManagementBackend* backend_;
danno 2011/02/22 17:32:09 nit: mark as weak
Jakob Kummerow 2011/02/23 10:04:56 Done. ...and landed.
53 DISALLOW_COPY_AND_ASSIGN(MockDeviceManagementService);
54 };
55
56 // This proxy class is used so that expectations can be defined for a single
57 // persistant instance of DMBackend while the DeviceTokenFetcher under test
58 // merrily creates and destroys proxies.
59 class ProxyDeviceManagementBackend : public DeviceManagementBackend {
60 public:
61 explicit ProxyDeviceManagementBackend(DeviceManagementBackend* backend)
62 : backend_(backend) {
63 }
64 virtual ~ProxyDeviceManagementBackend() {}
65
66 virtual void ProcessRegisterRequest(
67 const std::string& auth_token,
68 const std::string& device_id,
69 const em::DeviceRegisterRequest& request,
70 DeviceRegisterResponseDelegate* delegate) {
71 backend_->ProcessRegisterRequest(auth_token, device_id, request, delegate);
72 }
73 virtual void ProcessUnregisterRequest(
74 const std::string& device_management_token,
75 const std::string& device_id,
76 const em::DeviceUnregisterRequest& request,
77 DeviceUnregisterResponseDelegate* delegate) {
78 backend_->ProcessUnregisterRequest(device_management_token, device_id,
79 request, delegate);
80 }
81 virtual void ProcessPolicyRequest(
82 const std::string& device_management_token,
83 const std::string& device_id,
84 const em::DevicePolicyRequest& request,
85 DevicePolicyResponseDelegate* delegate) {
86 backend_->ProcessPolicyRequest(device_management_token, device_id,
87 request, delegate);
88 }
89 virtual void ProcessCloudPolicyRequest(
90 const std::string& device_management_token,
91 const std::string& device_id,
92 const em::CloudPolicyRequest& request,
93 DevicePolicyResponseDelegate* delegate) {
94 backend_->ProcessCloudPolicyRequest(device_management_token, device_id,
95 request, delegate);
96 }
97
98 private:
99 DeviceManagementBackend* backend_; // weak
100 DISALLOW_COPY_AND_ASSIGN(ProxyDeviceManagementBackend);
101 };
102
103 DeviceManagementBackend*
104 MockDeviceManagementService::CreateBackend() {
105 return new ProxyDeviceManagementBackend(backend_);
106 }
107
40 class DeviceTokenFetcherTest : public testing::Test { 108 class DeviceTokenFetcherTest : public testing::Test {
41 protected: 109 protected:
42 DeviceTokenFetcherTest() 110 DeviceTokenFetcherTest()
43 : ui_thread_(BrowserThread::UI, &loop_), 111 : ui_thread_(BrowserThread::UI, &loop_),
44 file_thread_(BrowserThread::FILE, &loop_) { 112 file_thread_(BrowserThread::FILE, &loop_) {
45 EXPECT_TRUE(temp_user_data_dir_.CreateUniqueTempDir()); 113 EXPECT_TRUE(temp_user_data_dir_.CreateUniqueTempDir());
46 fetcher_ = NewTestFetcher(temp_user_data_dir_.path()); 114 }
47 fetcher_->StartFetching(); 115
116 virtual void SetUp() {
117 cache_.reset(new CloudPolicyCache(
118 temp_user_data_dir_.path().AppendASCII("DeviceTokenFetcherTest")));
119 service_.set_backend(&backend_);
48 } 120 }
49 121
50 virtual void TearDown() { 122 virtual void TearDown() {
51 backend_.reset();
52 profile_.reset();
53 loop_.RunAllPending(); 123 loop_.RunAllPending();
54 } 124 }
55 125
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_; 126 MessageLoop loop_;
83 scoped_ptr<MockDeviceManagementBackend> backend_; 127 MockDeviceManagementBackend backend_;
128 MockDeviceManagementService service_;
129 scoped_ptr<CloudPolicyCache> cache_;
84 ScopedTempDir temp_user_data_dir_; 130 ScopedTempDir temp_user_data_dir_;
85 scoped_refptr<TestingDeviceTokenFetcher> fetcher_;
86 scoped_ptr<Profile> profile_;
87 131
88 private: 132 private:
89 BrowserThread ui_thread_; 133 BrowserThread ui_thread_;
90 BrowserThread file_thread_; 134 BrowserThread file_thread_;
91 }; 135 };
92 136
93 TEST_F(DeviceTokenFetcherTest, IsPending) { 137 TEST_F(DeviceTokenFetcherTest, FetchToken) {
94 ASSERT_TRUE(fetcher_->IsTokenPending()); 138 testing::InSequence s;
95 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( 139 EXPECT_CALL(backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
96 MockDeviceManagementBackendSucceedRegister()); 140 MockDeviceManagementBackendSucceedRegister());
97 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); 141 DeviceTokenFetcher fetcher(&service_, cache_.get());
98 ASSERT_FALSE(fetcher_->IsTokenPending()); 142 MockTokenAvailableObserver observer;
143 EXPECT_CALL(observer, OnDeviceTokenAvailable());
144 fetcher.AddObserver(&observer);
145 EXPECT_EQ("", fetcher.GetDeviceToken());
146 fetcher.FetchToken("fake_auth_token", "fake_device_id");
147 loop_.RunAllPending();
148 Mock::VerifyAndClearExpectations(&observer);
149 std::string token = fetcher.GetDeviceToken();
150 EXPECT_NE("", token);
151
152 // Calling FetchToken() again should result in a new token being fetched.
153 EXPECT_CALL(backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
154 MockDeviceManagementBackendSucceedRegister());
155 EXPECT_CALL(observer, OnDeviceTokenAvailable());
156 fetcher.FetchToken("fake_auth_token", "fake_device_id");
157 loop_.RunAllPending();
158 Mock::VerifyAndClearExpectations(&observer);
159 std::string token2 = fetcher.GetDeviceToken();
160 EXPECT_NE("", token2);
161 EXPECT_NE(token, token2);
162 fetcher.RemoveObserver(&observer);
99 } 163 }
100 164
101 TEST_F(DeviceTokenFetcherTest, StoreAndLoad) { 165 TEST_F(DeviceTokenFetcherTest, RetryOnError) {
102 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( 166 testing::InSequence s;
167 EXPECT_CALL(backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
168 MockDeviceManagementBackendFailRegister(
169 DeviceManagementBackend::kErrorRequestFailed)).WillOnce(
103 MockDeviceManagementBackendSucceedRegister()); 170 MockDeviceManagementBackendSucceedRegister());
104 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); 171 DeviceTokenFetcher fetcher(&service_, cache_.get(), 0, 0);
105 ASSERT_FALSE(fetcher_->IsTokenPending()); 172 MockTokenAvailableObserver observer;
106 std::string device_token = fetcher_->GetDeviceToken(); 173 EXPECT_CALL(observer, OnDeviceTokenAvailable());
107 std::string device_id = fetcher_->GetDeviceID(); 174 fetcher.AddObserver(&observer);
108 ASSERT_NE("", device_id); 175 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(); 176 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); 177 Mock::VerifyAndClearExpectations(&observer);
160 178 EXPECT_NE("", fetcher.GetDeviceToken());
161 // Swap out the fetchers, including copying the device management token on 179 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 } 180 }
190 181
191 TEST_F(DeviceTokenFetcherTest, UnmanagedDevice) { 182 TEST_F(DeviceTokenFetcherTest, UnmanagedDevice) {
192 FilePath token_path; 183 EXPECT_CALL(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( 184 MockDeviceManagementBackendFailRegister(
198 DeviceManagementBackend::kErrorServiceManagementNotSupported)); 185 DeviceManagementBackend::kErrorServiceManagementNotSupported));
199 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); 186 EXPECT_FALSE(cache_->is_unmanaged());
200 ASSERT_FALSE(fetcher_->IsTokenPending()); 187 DeviceTokenFetcher fetcher(&service_, cache_.get());
201 ASSERT_EQ("", fetcher_->GetDeviceToken()); 188 MockTokenAvailableObserver observer;
202 ASSERT_EQ("", device_id(fetcher_)); 189 EXPECT_CALL(observer, OnDeviceTokenAvailable()).Times(0);
203 ASSERT_FALSE(file_util::PathExists(token_path)); 190 fetcher.AddObserver(&observer);
204 } 191 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(); 192 loop_.RunAllPending();
212 profile_->GetTokenService()->IssueAuthTokenForTest( 193 Mock::VerifyAndClearExpectations(&observer);
213 GaiaConstants::kDeviceManagementService, kTestToken); 194 EXPECT_EQ("", fetcher.GetDeviceToken());
214 loop_.RunAllPending(); 195 EXPECT_TRUE(cache_->is_unmanaged());
215 196 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 } 197 }
250 198
251 } // namespace policy 199 } // namespace policy
OLDNEW
« no previous file with comments | « chrome/browser/policy/device_token_fetcher.cc ('k') | chrome/browser/policy/profile_policy_connector.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698