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

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 ChromeOS tests 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
7 #include <deque>
8 #include <vector>
6 9
7 #include "base/file_util.h" 10 #include "base/file_util.h"
8 #include "base/message_loop.h" 11 #include "base/message_loop.h"
9 #include "base/scoped_temp_dir.h" 12 #include "base/scoped_temp_dir.h"
10 #include "chrome/browser/browser_thread.h" 13 #include "chrome/browser/browser_thread.h"
11 #include "chrome/browser/net/gaia/token_service.h" 14 #include "chrome/browser/net/gaia/token_service.h"
12 #include "chrome/browser/policy/device_token_fetcher.h" 15 #include "chrome/browser/policy/cloud_policy_cache.h"
16 #include "chrome/browser/policy/device_management_service.h"
13 #include "chrome/browser/policy/mock_device_management_backend.h" 17 #include "chrome/browser/policy/mock_device_management_backend.h"
14 #include "chrome/common/net/gaia/gaia_constants.h" 18 #include "chrome/common/net/gaia/gaia_constants.h"
15 #include "chrome/test/testing_device_token_fetcher.h"
16 #include "chrome/test/testing_profile.h" 19 #include "chrome/test/testing_profile.h"
17 #include "testing/gmock/include/gmock/gmock.h" 20 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h" 21 #include "testing/gtest/include/gtest/gtest.h"
19 22
20 namespace policy { 23 namespace policy {
21 24
22 const char kTestToken[] = "device_token_fetcher_test_auth_token"; 25 const char kTestToken[] = "device_token_fetcher_test_auth_token";
23 26
24 using testing::_; 27 using testing::_;
25 using testing::Mock; 28 using testing::Mock;
26 29
27 class MockTokenAvailableObserver : public DeviceTokenFetcher::Observer { 30 class MockTokenAvailableObserver : public DeviceTokenFetcher::Observer {
28 public: 31 public:
29 MockTokenAvailableObserver() {} 32 MockTokenAvailableObserver() {}
30 virtual ~MockTokenAvailableObserver() {} 33 virtual ~MockTokenAvailableObserver() {}
31 34
32 MOCK_METHOD0(OnTokenSuccess, void()); 35 MOCK_METHOD0(OnDeviceTokenAvailable, void());
33 MOCK_METHOD0(OnTokenError, void());
34 MOCK_METHOD0(OnNotManaged, void());
35 36
36 private: 37 private:
37 DISALLOW_COPY_AND_ASSIGN(MockTokenAvailableObserver); 38 DISALLOW_COPY_AND_ASSIGN(MockTokenAvailableObserver);
38 }; 39 };
39 40
41 class TestingDeviceManagementService : public DeviceManagementService {
42 public:
43 TestingDeviceManagementService()
44 : DeviceManagementService("") {}
45 ~TestingDeviceManagementService() {
46 // Make sure we don't leak memory.
47 EXPECT_EQ(0U, backends_.size());
48 }
49
50 // Takes ownership of |backend| and puts it into the queue of backends that
51 // will be returned by subsequent calls to CreateBackend().
52 void put_backend(DeviceManagementBackend* backend) {
53 backends_.push_back(backend);
54 }
Mattias Nissler (ping if slow) 2011/02/21 14:39:13 Newline before comments.
Jakob Kummerow 2011/02/22 10:02:33 Done.
55 // If backends have been queued up by calls to put_backend(), these will be
56 // returned one by one in FIFO order. Otherwise, a new backend is created.
57 // Caller takes ownership.
58 virtual DeviceManagementBackend* CreateBackend() {
59 if (backends_.size() > 0) {
60 DeviceManagementBackend* backend = backends_.front();
61 backends_.pop_front();
62 return backend;
63 }
64 return new MockDeviceManagementBackend();
65 }
Mattias Nissler (ping if slow) 2011/02/21 14:39:13 newline before visibility decl?
Jakob Kummerow 2011/02/22 10:02:33 Done.
66 private:
67 std::deque<DeviceManagementBackend*> backends_;
Mattias Nissler (ping if slow) 2011/02/21 14:39:13 Hm. I've thought about this a bit and the problem
Jakob Kummerow 2011/02/22 10:02:33 Done.
68 DISALLOW_COPY_AND_ASSIGN(TestingDeviceManagementService);
69 };
70
40 class DeviceTokenFetcherTest : public testing::Test { 71 class DeviceTokenFetcherTest : public testing::Test {
41 protected: 72 protected:
42 DeviceTokenFetcherTest() 73 DeviceTokenFetcherTest()
43 : ui_thread_(BrowserThread::UI, &loop_), 74 : ui_thread_(BrowserThread::UI, &loop_),
44 file_thread_(BrowserThread::FILE, &loop_) { 75 file_thread_(BrowserThread::FILE, &loop_) {
45 EXPECT_TRUE(temp_user_data_dir_.CreateUniqueTempDir()); 76 EXPECT_TRUE(temp_user_data_dir_.CreateUniqueTempDir());
46 fetcher_ = NewTestFetcher(temp_user_data_dir_.path()); 77 }
47 fetcher_->StartFetching(); 78
79 virtual void SetUp() {
80 cache_.reset(new CloudPolicyCache(
81 temp_user_data_dir_.path().AppendASCII("DeviceTokenFetcherTest")));
48 } 82 }
49 83
50 virtual void TearDown() { 84 virtual void TearDown() {
51 backend_.reset();
52 profile_.reset();
53 loop_.RunAllPending(); 85 loop_.RunAllPending();
54 } 86 }
55 87
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_; 88 MessageLoop loop_;
83 scoped_ptr<MockDeviceManagementBackend> backend_; 89 TestingDeviceManagementService service_;
90 scoped_ptr<CloudPolicyCache> cache_;
84 ScopedTempDir temp_user_data_dir_; 91 ScopedTempDir temp_user_data_dir_;
85 scoped_refptr<TestingDeviceTokenFetcher> fetcher_;
86 scoped_ptr<Profile> profile_;
87 92
88 private: 93 private:
89 BrowserThread ui_thread_; 94 BrowserThread ui_thread_;
90 BrowserThread file_thread_; 95 BrowserThread file_thread_;
91 }; 96 };
92 97
93 TEST_F(DeviceTokenFetcherTest, IsPending) { 98 TEST_F(DeviceTokenFetcherTest, FetchToken) {
94 ASSERT_TRUE(fetcher_->IsTokenPending()); 99 MockDeviceManagementBackend* backend = new MockDeviceManagementBackend();
95 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( 100 EXPECT_CALL(*backend, ProcessRegisterRequest(_, _, _, _)).WillOnce(
96 MockDeviceManagementBackendSucceedRegister()); 101 MockDeviceManagementBackendSucceedRegister());
97 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); 102 service_.put_backend(backend);
98 ASSERT_FALSE(fetcher_->IsTokenPending()); 103 DeviceTokenFetcher fetcher(&service_, cache_.get());
104 MockTokenAvailableObserver observer;
105 EXPECT_CALL(observer, OnDeviceTokenAvailable());
106 fetcher.AddObserver(&observer);
107 EXPECT_EQ("", fetcher.GetDeviceToken());
108 fetcher.FetchToken("fake_auth_token", "fake_device_id");
109 loop_.RunAllPending();
110 Mock::VerifyAndClearExpectations(&observer);
111 std::string token = fetcher.GetDeviceToken();
112 EXPECT_NE("", token);
113
114 // Calling FetchToken() again should result in a new token being fetched.
115 backend = new MockDeviceManagementBackend();
116 EXPECT_CALL(*backend, ProcessRegisterRequest(_, _, _, _)).WillOnce(
117 MockDeviceManagementBackendSucceedRegister());
118 service_.put_backend(backend);
119 EXPECT_CALL(observer, OnDeviceTokenAvailable());
120 fetcher.FetchToken("fake_auth_token", "fake_device_id");
121 loop_.RunAllPending();
122 Mock::VerifyAndClearExpectations(&observer);
123 std::string token2 = fetcher.GetDeviceToken();
124 EXPECT_NE("", token2);
125 EXPECT_NE(token, token2);
126
127 fetcher.RemoveObserver(&observer);
99 } 128 }
100 129
130 TEST_F(DeviceTokenFetcherTest, RetryOnError) {
131 testing::InSequence s;
132 MockDeviceManagementBackend* backend = new MockDeviceManagementBackend();
133 EXPECT_CALL(*backend, ProcessRegisterRequest(_, _, _, _)).WillOnce(
134 MockDeviceManagementBackendFailRegister(
135 DeviceManagementBackend::kErrorRequestFailed));
136 service_.put_backend(backend);
137 backend = new MockDeviceManagementBackend();
138 EXPECT_CALL(*backend, ProcessRegisterRequest(_, _, _, _)).WillOnce(
139 MockDeviceManagementBackendSucceedRegister());
140 service_.put_backend(backend);
141 DeviceTokenFetcher fetcher(&service_, cache_.get(), 0, 0);
142 MockTokenAvailableObserver observer;
143 EXPECT_CALL(observer, OnDeviceTokenAvailable());
144 fetcher.AddObserver(&observer);
145 fetcher.FetchToken("fake_auth_token", "fake_device_id");
146 loop_.RunAllPending();
147 Mock::VerifyAndClearExpectations(&observer);
148 EXPECT_NE("", fetcher.GetDeviceToken());
149 fetcher.RemoveObserver(&observer);
150 }
151
152 TEST_F(DeviceTokenFetcherTest, UnmanagedDevice) {
153 MockDeviceManagementBackend* backend = new MockDeviceManagementBackend();
154 EXPECT_CALL(*backend, ProcessRegisterRequest(_, _, _, _)).WillOnce(
155 MockDeviceManagementBackendFailRegister(
156 DeviceManagementBackend::kErrorServiceManagementNotSupported));
157 service_.put_backend(backend);
158 EXPECT_FALSE(cache_->is_unmanaged());
159 DeviceTokenFetcher fetcher(&service_, cache_.get());
160 MockTokenAvailableObserver observer;
161 EXPECT_CALL(observer, OnDeviceTokenAvailable()).Times(0);
162 fetcher.AddObserver(&observer);
163 fetcher.FetchToken("fake_auth_token", "fake_device_id");
164 loop_.RunAllPending();
165 Mock::VerifyAndClearExpectations(&observer);
166 EXPECT_EQ("", fetcher.GetDeviceToken());
167 EXPECT_TRUE(cache_->is_unmanaged());
168 fetcher.RemoveObserver(&observer);
169 }
170
171 #if 0
Mattias Nissler (ping if slow) 2011/02/21 14:39:13 Delete? If you want the TODO, I'd rather put it on
Jakob Kummerow 2011/02/22 10:02:33 Done.
172
173 // TODO(jkummerow): use this as inspiration for a test for
174 // UserPolicyIdentityStrategy::TokenCache
101 TEST_F(DeviceTokenFetcherTest, StoreAndLoad) { 175 TEST_F(DeviceTokenFetcherTest, StoreAndLoad) {
102 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( 176 EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
103 MockDeviceManagementBackendSucceedRegister()); 177 MockDeviceManagementBackendSucceedRegister());
104 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); 178 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername);
105 ASSERT_FALSE(fetcher_->IsTokenPending()); 179 ASSERT_FALSE(fetcher_->IsTokenPending());
106 std::string device_token = fetcher_->GetDeviceToken(); 180 std::string device_token = fetcher_->GetDeviceToken();
107 std::string device_id = fetcher_->GetDeviceID(); 181 std::string device_id = fetcher_->GetDeviceID();
108 ASSERT_NE("", device_id); 182 ASSERT_NE("", device_id);
109 183
110 FilePath token_path; 184 FilePath token_path;
111 GetDeviceTokenPath(fetcher_, &token_path); 185 GetDeviceTokenPath(fetcher_, &token_path);
112 scoped_refptr<DeviceTokenFetcher> fetcher2( 186 scoped_refptr<DeviceTokenFetcher> fetcher2(
113 new TestingDeviceTokenFetcher( 187 new TestingDeviceTokenFetcher(
114 backend_.get(), profile_.get(), token_path)); 188 backend_.get(), profile_.get(), token_path));
115 fetcher2->StartFetching(); 189 fetcher2->StartFetching();
116 loop_.RunAllPending(); 190 loop_.RunAllPending();
117 ASSERT_EQ(device_id, fetcher2->GetDeviceID()); 191 ASSERT_EQ(device_id, fetcher2->GetDeviceID());
118 ASSERT_EQ(device_token, fetcher2->GetDeviceToken()); 192 ASSERT_EQ(device_token, fetcher2->GetDeviceToken());
119 } 193 }
120 194
121 TEST_F(DeviceTokenFetcherTest, SimpleFetchSingleLogin) { 195 #endif
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);
160
161 // Swap out the fetchers, including copying the device management token on
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 }
190
191 TEST_F(DeviceTokenFetcherTest, UnmanagedDevice) {
192 FilePath token_path;
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(
198 DeviceManagementBackend::kErrorServiceManagementNotSupported));
199 SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername);
200 ASSERT_FALSE(fetcher_->IsTokenPending());
201 ASSERT_EQ("", fetcher_->GetDeviceToken());
202 ASSERT_EQ("", device_id(fetcher_));
203 ASSERT_FALSE(file_util::PathExists(token_path));
204 }
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();
212 profile_->GetTokenService()->IssueAuthTokenForTest(
213 GaiaConstants::kDeviceManagementService, kTestToken);
214 loop_.RunAllPending();
215
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 }
250
251 } // namespace policy 196 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698