Chromium Code Reviews| Index: chrome/browser/policy/device_token_fetcher_unittest.cc |
| diff --git a/chrome/browser/policy/device_token_fetcher_unittest.cc b/chrome/browser/policy/device_token_fetcher_unittest.cc |
| index 28d11b0fc6b6d08961e854365884e414a851b350..801f23cb1b3750c4c134fabe5351261161928404 100644 |
| --- a/chrome/browser/policy/device_token_fetcher_unittest.cc |
| +++ b/chrome/browser/policy/device_token_fetcher_unittest.cc |
| @@ -1,18 +1,21 @@ |
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| -#include <string> |
| +#include "chrome/browser/policy/device_token_fetcher.h" |
| + |
| +#include <deque> |
| +#include <vector> |
| #include "base/file_util.h" |
| #include "base/message_loop.h" |
| #include "base/scoped_temp_dir.h" |
| #include "chrome/browser/browser_thread.h" |
| #include "chrome/browser/net/gaia/token_service.h" |
| -#include "chrome/browser/policy/device_token_fetcher.h" |
| +#include "chrome/browser/policy/cloud_policy_cache.h" |
| +#include "chrome/browser/policy/device_management_service.h" |
| #include "chrome/browser/policy/mock_device_management_backend.h" |
| #include "chrome/common/net/gaia/gaia_constants.h" |
| -#include "chrome/test/testing_device_token_fetcher.h" |
| #include "chrome/test/testing_profile.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| @@ -29,223 +32,165 @@ class MockTokenAvailableObserver : public DeviceTokenFetcher::Observer { |
| MockTokenAvailableObserver() {} |
| virtual ~MockTokenAvailableObserver() {} |
| - MOCK_METHOD0(OnTokenSuccess, void()); |
| - MOCK_METHOD0(OnTokenError, void()); |
| - MOCK_METHOD0(OnNotManaged, void()); |
| + MOCK_METHOD0(OnDeviceTokenAvailable, void()); |
| private: |
| DISALLOW_COPY_AND_ASSIGN(MockTokenAvailableObserver); |
| }; |
| +class TestingDeviceManagementService : public DeviceManagementService { |
| + public: |
| + TestingDeviceManagementService() |
| + : DeviceManagementService("") {} |
| + ~TestingDeviceManagementService() { |
| + // Make sure we don't leak memory. |
| + EXPECT_EQ(0U, backends_.size()); |
| + } |
| + |
| + // Takes ownership of |backend| and puts it into the queue of backends that |
| + // will be returned by subsequent calls to CreateBackend(). |
| + void put_backend(DeviceManagementBackend* backend) { |
| + backends_.push_back(backend); |
| + } |
|
Mattias Nissler (ping if slow)
2011/02/21 14:39:13
Newline before comments.
Jakob Kummerow
2011/02/22 10:02:33
Done.
|
| + // If backends have been queued up by calls to put_backend(), these will be |
| + // returned one by one in FIFO order. Otherwise, a new backend is created. |
| + // Caller takes ownership. |
| + virtual DeviceManagementBackend* CreateBackend() { |
| + if (backends_.size() > 0) { |
| + DeviceManagementBackend* backend = backends_.front(); |
| + backends_.pop_front(); |
| + return backend; |
| + } |
| + return new MockDeviceManagementBackend(); |
| + } |
|
Mattias Nissler (ping if slow)
2011/02/21 14:39:13
newline before visibility decl?
Jakob Kummerow
2011/02/22 10:02:33
Done.
|
| + private: |
| + 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.
|
| + DISALLOW_COPY_AND_ASSIGN(TestingDeviceManagementService); |
| +}; |
| + |
| class DeviceTokenFetcherTest : public testing::Test { |
| protected: |
| DeviceTokenFetcherTest() |
| : ui_thread_(BrowserThread::UI, &loop_), |
| file_thread_(BrowserThread::FILE, &loop_) { |
| EXPECT_TRUE(temp_user_data_dir_.CreateUniqueTempDir()); |
| - fetcher_ = NewTestFetcher(temp_user_data_dir_.path()); |
| - fetcher_->StartFetching(); |
| } |
| - virtual void TearDown() { |
| - backend_.reset(); |
| - profile_.reset(); |
| - loop_.RunAllPending(); |
| + virtual void SetUp() { |
| + cache_.reset(new CloudPolicyCache( |
| + temp_user_data_dir_.path().AppendASCII("DeviceTokenFetcherTest"))); |
| } |
| - void SimulateSuccessfulLoginAndRunPending(const std::string& username) { |
| - loop_.RunAllPending(); |
| - profile_->GetTokenService()->IssueAuthTokenForTest( |
| - GaiaConstants::kDeviceManagementService, kTestToken); |
| - fetcher_->SimulateLogin(username); |
| + virtual void TearDown() { |
| loop_.RunAllPending(); |
| } |
| - TestingDeviceTokenFetcher* NewTestFetcher(const FilePath& token_dir) { |
| - profile_.reset(new TestingProfile()); |
| - backend_.reset(new MockDeviceManagementBackend()); |
| - return new TestingDeviceTokenFetcher( |
| - backend_.get(), |
| - profile_.get(), |
| - token_dir.Append(FILE_PATH_LITERAL("test-token-file.txt"))); |
| - } |
| - |
| - static void GetDeviceTokenPath(const DeviceTokenFetcher* fetcher, |
| - FilePath* path) { |
| - fetcher->GetDeviceTokenPath(path); |
| - } |
| - |
| - const std::string& device_id(const DeviceTokenFetcher* fetcher) { |
| - return fetcher->device_id_; |
| - } |
| - |
| MessageLoop loop_; |
| - scoped_ptr<MockDeviceManagementBackend> backend_; |
| + TestingDeviceManagementService service_; |
| + scoped_ptr<CloudPolicyCache> cache_; |
| ScopedTempDir temp_user_data_dir_; |
| - scoped_refptr<TestingDeviceTokenFetcher> fetcher_; |
| - scoped_ptr<Profile> profile_; |
| private: |
| BrowserThread ui_thread_; |
| BrowserThread file_thread_; |
| }; |
| -TEST_F(DeviceTokenFetcherTest, IsPending) { |
| - ASSERT_TRUE(fetcher_->IsTokenPending()); |
| - EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| +TEST_F(DeviceTokenFetcherTest, FetchToken) { |
| + MockDeviceManagementBackend* backend = new MockDeviceManagementBackend(); |
| + EXPECT_CALL(*backend, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| MockDeviceManagementBackendSucceedRegister()); |
| - SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); |
| - ASSERT_FALSE(fetcher_->IsTokenPending()); |
| -} |
| - |
| -TEST_F(DeviceTokenFetcherTest, StoreAndLoad) { |
| - EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| - MockDeviceManagementBackendSucceedRegister()); |
| - SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); |
| - ASSERT_FALSE(fetcher_->IsTokenPending()); |
| - std::string device_token = fetcher_->GetDeviceToken(); |
| - std::string device_id = fetcher_->GetDeviceID(); |
| - ASSERT_NE("", device_id); |
| - |
| - FilePath token_path; |
| - GetDeviceTokenPath(fetcher_, &token_path); |
| - scoped_refptr<DeviceTokenFetcher> fetcher2( |
| - new TestingDeviceTokenFetcher( |
| - backend_.get(), profile_.get(), token_path)); |
| - fetcher2->StartFetching(); |
| + service_.put_backend(backend); |
| + DeviceTokenFetcher fetcher(&service_, cache_.get()); |
| + MockTokenAvailableObserver observer; |
| + EXPECT_CALL(observer, OnDeviceTokenAvailable()); |
| + fetcher.AddObserver(&observer); |
| + EXPECT_EQ("", fetcher.GetDeviceToken()); |
| + fetcher.FetchToken("fake_auth_token", "fake_device_id"); |
| loop_.RunAllPending(); |
| - ASSERT_EQ(device_id, fetcher2->GetDeviceID()); |
| - ASSERT_EQ(device_token, fetcher2->GetDeviceToken()); |
| -} |
| - |
| -TEST_F(DeviceTokenFetcherTest, SimpleFetchSingleLogin) { |
| - EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| - MockDeviceManagementBackendSucceedRegister()); |
| - SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); |
| - ASSERT_FALSE(fetcher_->IsTokenPending()); |
| - ASSERT_TRUE(fetcher_->IsTokenValid()); |
| - const std::string token(fetcher_->GetDeviceToken()); |
| - EXPECT_NE("", token); |
| -} |
| - |
| -TEST_F(DeviceTokenFetcherTest, SimpleFetchDoubleLogin) { |
| - EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| - MockDeviceManagementBackendSucceedRegister()); |
| - SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); |
| - ASSERT_FALSE(fetcher_->IsTokenPending()); |
| - const std::string token(fetcher_->GetDeviceToken()); |
| + Mock::VerifyAndClearExpectations(&observer); |
| + std::string token = fetcher.GetDeviceToken(); |
| EXPECT_NE("", token); |
| - SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); |
| - ASSERT_FALSE(fetcher_->IsTokenPending()); |
| - const std::string token2(fetcher_->GetDeviceToken()); |
| - EXPECT_NE("", token2); |
| - EXPECT_EQ(token, token2); |
| -} |
| - |
| -TEST_F(DeviceTokenFetcherTest, FetchBetweenBrowserLaunchAndNotify) { |
| - MockTokenAvailableObserver observer; |
| - DeviceTokenFetcher::ObserverRegistrar registrar; |
| - registrar.Init(fetcher_); |
| - registrar.AddObserver(&observer); |
| - EXPECT_CALL(observer, OnTokenSuccess()).Times(1); |
| - EXPECT_CALL(observer, OnTokenError()).Times(0); |
| - EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| + // Calling FetchToken() again should result in a new token being fetched. |
| + backend = new MockDeviceManagementBackend(); |
| + EXPECT_CALL(*backend, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| MockDeviceManagementBackendSucceedRegister()); |
| - SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); |
| - ASSERT_FALSE(fetcher_->IsTokenPending()); |
| - const std::string token(fetcher_->GetDeviceToken()); |
| - EXPECT_NE("", token); |
| - Mock::VerifyAndClearExpectations(&observer); |
| - |
| - // Swap out the fetchers, including copying the device management token on |
| - // disk to where the new fetcher expects it. |
| - registrar.RemoveAll(); |
| - fetcher_ = NewTestFetcher(temp_user_data_dir_.path()); |
| - registrar.Init(fetcher_); |
| - fetcher_->StartFetching(); |
| - ASSERT_TRUE(fetcher_->IsTokenPending()); |
| + service_.put_backend(backend); |
| + EXPECT_CALL(observer, OnDeviceTokenAvailable()); |
| + fetcher.FetchToken("fake_auth_token", "fake_device_id"); |
| loop_.RunAllPending(); |
| - ASSERT_FALSE(fetcher_->IsTokenPending()); |
| - const std::string token2(fetcher_->GetDeviceToken()); |
| + Mock::VerifyAndClearExpectations(&observer); |
| + std::string token2 = fetcher.GetDeviceToken(); |
| EXPECT_NE("", token2); |
| - EXPECT_EQ(token, token2); |
| + EXPECT_NE(token, token2); |
| + |
| + fetcher.RemoveObserver(&observer); |
| } |
| -TEST_F(DeviceTokenFetcherTest, FailedServerRequest) { |
| - MockTokenAvailableObserver observer; |
| - DeviceTokenFetcher::ObserverRegistrar registrar; |
| - registrar.Init(fetcher_); |
| - registrar.AddObserver(&observer); |
| - EXPECT_CALL(observer, OnTokenSuccess()).Times(0); |
| - EXPECT_CALL(observer, OnTokenError()).Times(1); |
| - EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| +TEST_F(DeviceTokenFetcherTest, RetryOnError) { |
| + testing::InSequence s; |
| + MockDeviceManagementBackend* backend = new MockDeviceManagementBackend(); |
| + EXPECT_CALL(*backend, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| MockDeviceManagementBackendFailRegister( |
| DeviceManagementBackend::kErrorRequestFailed)); |
| - SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); |
| - ASSERT_FALSE(fetcher_->IsTokenPending()); |
| - const std::string token(fetcher_->GetDeviceToken()); |
| - EXPECT_EQ("", token); |
| + service_.put_backend(backend); |
| + backend = new MockDeviceManagementBackend(); |
| + EXPECT_CALL(*backend, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| + MockDeviceManagementBackendSucceedRegister()); |
| + service_.put_backend(backend); |
| + DeviceTokenFetcher fetcher(&service_, cache_.get(), 0, 0); |
| + MockTokenAvailableObserver observer; |
| + EXPECT_CALL(observer, OnDeviceTokenAvailable()); |
| + fetcher.AddObserver(&observer); |
| + fetcher.FetchToken("fake_auth_token", "fake_device_id"); |
| + loop_.RunAllPending(); |
| + Mock::VerifyAndClearExpectations(&observer); |
| + EXPECT_NE("", fetcher.GetDeviceToken()); |
| + fetcher.RemoveObserver(&observer); |
| } |
| TEST_F(DeviceTokenFetcherTest, UnmanagedDevice) { |
| - FilePath token_path; |
| - GetDeviceTokenPath(fetcher_, &token_path); |
| - file_util::WriteFile(token_path, "foo", 3); |
| - ASSERT_TRUE(file_util::PathExists(token_path)); |
| - EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| + MockDeviceManagementBackend* backend = new MockDeviceManagementBackend(); |
| + EXPECT_CALL(*backend, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| MockDeviceManagementBackendFailRegister( |
| DeviceManagementBackend::kErrorServiceManagementNotSupported)); |
| - SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); |
| - ASSERT_FALSE(fetcher_->IsTokenPending()); |
| - ASSERT_EQ("", fetcher_->GetDeviceToken()); |
| - ASSERT_EQ("", device_id(fetcher_)); |
| - ASSERT_FALSE(file_util::PathExists(token_path)); |
| -} |
| - |
| - |
| -TEST_F(DeviceTokenFetcherTest, FetchBetweenTokenNotifyAndLoginNotify) { |
| - EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).Times(0); |
| - |
| - // Simulate an available token, but without available user name. |
| - loop_.RunAllPending(); |
| - profile_->GetTokenService()->IssueAuthTokenForTest( |
| - GaiaConstants::kDeviceManagementService, kTestToken); |
| + service_.put_backend(backend); |
| + EXPECT_FALSE(cache_->is_unmanaged()); |
| + DeviceTokenFetcher fetcher(&service_, cache_.get()); |
| + MockTokenAvailableObserver observer; |
| + EXPECT_CALL(observer, OnDeviceTokenAvailable()).Times(0); |
| + fetcher.AddObserver(&observer); |
| + fetcher.FetchToken("fake_auth_token", "fake_device_id"); |
| loop_.RunAllPending(); |
| - |
| - ASSERT_TRUE(fetcher_->IsTokenPending()); |
| - ASSERT_FALSE(fetcher_->IsTokenValid()); |
| + Mock::VerifyAndClearExpectations(&observer); |
| + EXPECT_EQ("", fetcher.GetDeviceToken()); |
| + EXPECT_TRUE(cache_->is_unmanaged()); |
| + fetcher.RemoveObserver(&observer); |
| } |
| -TEST_F(DeviceTokenFetcherTest, FetchWithNonManagedUsername) { |
| - EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).Times(0); |
| - SimulateSuccessfulLoginAndRunPending("___@gmail.com"); |
| - ASSERT_FALSE(fetcher_->IsTokenPending()); |
| - ASSERT_FALSE(fetcher_->IsTokenValid()); |
| -} |
| +#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.
|
| -TEST_F(DeviceTokenFetcherTest, RestartImmediately) { |
| - // Create a token. |
| +// TODO(jkummerow): use this as inspiration for a test for |
| +// UserPolicyIdentityStrategy::TokenCache |
| +TEST_F(DeviceTokenFetcherTest, StoreAndLoad) { |
| EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| MockDeviceManagementBackendSucceedRegister()); |
| SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); |
| ASSERT_FALSE(fetcher_->IsTokenPending()); |
| std::string device_token = fetcher_->GetDeviceToken(); |
| + std::string device_id = fetcher_->GetDeviceID(); |
| + ASSERT_NE("", device_id); |
| - // Restart a new fetcher immediately without calling StartFetching(). The |
| - // existing token should not be loaded, but rather a new token generated. |
| FilePath token_path; |
| GetDeviceTokenPath(fetcher_, &token_path); |
| - scoped_refptr<TestingDeviceTokenFetcher> fetcher2( |
| + scoped_refptr<DeviceTokenFetcher> fetcher2( |
| new TestingDeviceTokenFetcher( |
| backend_.get(), profile_.get(), token_path)); |
| - fetcher2->Restart(); |
| - EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
| - MockDeviceManagementBackendSucceedRegister()); |
| - fetcher2->SimulateLogin(kTestManagedDomainUsername); |
| + fetcher2->StartFetching(); |
| loop_.RunAllPending(); |
| - ASSERT_FALSE(fetcher2->IsTokenPending()); |
| - ASSERT_NE(device_token, fetcher2->GetDeviceToken()); |
| + ASSERT_EQ(device_id, fetcher2->GetDeviceID()); |
| + ASSERT_EQ(device_token, fetcher2->GetDeviceToken()); |
| } |
| +#endif |
| } // namespace policy |