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..14e62a6596e72ab2028a41a3f5b8ecf6ad2b04b4 100644 |
--- a/chrome/browser/policy/device_token_fetcher_unittest.cc |
+++ b/chrome/browser/policy/device_token_fetcher_unittest.cc |
@@ -1,18 +1,18 @@ |
-// 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 "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 +29,171 @@ 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 MockDeviceManagementService : public DeviceManagementService { |
+ public: |
+ // Takes ownership of |backend|. |
+ MockDeviceManagementService() |
+ : DeviceManagementService(""), |
+ backend_(NULL) {} |
+ virtual ~MockDeviceManagementService() {} |
+ |
+ void set_backend(DeviceManagementBackend* backend) { |
+ backend_ = backend; |
+ } |
+ virtual DeviceManagementBackend* CreateBackend(); |
+ |
+ private: |
+ DeviceManagementBackend* backend_; |
danno
2011/02/22 17:32:09
nit: mark as weak
Jakob Kummerow
2011/02/23 10:04:56
Done.
...and landed.
|
+ DISALLOW_COPY_AND_ASSIGN(MockDeviceManagementService); |
+}; |
+ |
+// This proxy class is used so that expectations can be defined for a single |
+// persistant instance of DMBackend while the DeviceTokenFetcher under test |
+// merrily creates and destroys proxies. |
+class ProxyDeviceManagementBackend : public DeviceManagementBackend { |
+ public: |
+ explicit ProxyDeviceManagementBackend(DeviceManagementBackend* backend) |
+ : backend_(backend) { |
+ } |
+ virtual ~ProxyDeviceManagementBackend() {} |
+ |
+ virtual void ProcessRegisterRequest( |
+ const std::string& auth_token, |
+ const std::string& device_id, |
+ const em::DeviceRegisterRequest& request, |
+ DeviceRegisterResponseDelegate* delegate) { |
+ backend_->ProcessRegisterRequest(auth_token, device_id, request, delegate); |
+ } |
+ virtual void ProcessUnregisterRequest( |
+ const std::string& device_management_token, |
+ const std::string& device_id, |
+ const em::DeviceUnregisterRequest& request, |
+ DeviceUnregisterResponseDelegate* delegate) { |
+ backend_->ProcessUnregisterRequest(device_management_token, device_id, |
+ request, delegate); |
+ } |
+ virtual void ProcessPolicyRequest( |
+ const std::string& device_management_token, |
+ const std::string& device_id, |
+ const em::DevicePolicyRequest& request, |
+ DevicePolicyResponseDelegate* delegate) { |
+ backend_->ProcessPolicyRequest(device_management_token, device_id, |
+ request, delegate); |
+ } |
+ virtual void ProcessCloudPolicyRequest( |
+ const std::string& device_management_token, |
+ const std::string& device_id, |
+ const em::CloudPolicyRequest& request, |
+ DevicePolicyResponseDelegate* delegate) { |
+ backend_->ProcessCloudPolicyRequest(device_management_token, device_id, |
+ request, delegate); |
+ } |
+ |
+ private: |
+ DeviceManagementBackend* backend_; // weak |
+ DISALLOW_COPY_AND_ASSIGN(ProxyDeviceManagementBackend); |
+}; |
+ |
+DeviceManagementBackend* |
+ MockDeviceManagementService::CreateBackend() { |
+ return new ProxyDeviceManagementBackend(backend_); |
+} |
+ |
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"))); |
+ service_.set_backend(&backend_); |
} |
- 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_; |
+ MockDeviceManagementBackend backend_; |
+ MockDeviceManagementService 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( |
- MockDeviceManagementBackendSucceedRegister()); |
- SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); |
- ASSERT_FALSE(fetcher_->IsTokenPending()); |
-} |
- |
-TEST_F(DeviceTokenFetcherTest, StoreAndLoad) { |
- EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
+TEST_F(DeviceTokenFetcherTest, FetchToken) { |
+ testing::InSequence s; |
+ 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(); |
+ 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. |
+ 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()); |
+ 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; |
+ EXPECT_CALL(backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
MockDeviceManagementBackendFailRegister( |
- DeviceManagementBackend::kErrorRequestFailed)); |
- SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); |
- ASSERT_FALSE(fetcher_->IsTokenPending()); |
- const std::string token(fetcher_->GetDeviceToken()); |
- EXPECT_EQ("", token); |
+ DeviceManagementBackend::kErrorRequestFailed)).WillOnce( |
+ MockDeviceManagementBackendSucceedRegister()); |
+ 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( |
+ 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); |
- loop_.RunAllPending(); |
- |
- ASSERT_TRUE(fetcher_->IsTokenPending()); |
- ASSERT_FALSE(fetcher_->IsTokenValid()); |
-} |
- |
-TEST_F(DeviceTokenFetcherTest, FetchWithNonManagedUsername) { |
- EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).Times(0); |
- SimulateSuccessfulLoginAndRunPending("___@gmail.com"); |
- ASSERT_FALSE(fetcher_->IsTokenPending()); |
- ASSERT_FALSE(fetcher_->IsTokenValid()); |
-} |
- |
-TEST_F(DeviceTokenFetcherTest, RestartImmediately) { |
- // Create a token. |
- EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
- MockDeviceManagementBackendSucceedRegister()); |
- SimulateSuccessfulLoginAndRunPending(kTestManagedDomainUsername); |
- ASSERT_FALSE(fetcher_->IsTokenPending()); |
- std::string device_token = fetcher_->GetDeviceToken(); |
- |
- // 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( |
- new TestingDeviceTokenFetcher( |
- backend_.get(), profile_.get(), token_path)); |
- fetcher2->Restart(); |
- EXPECT_CALL(*backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce( |
- MockDeviceManagementBackendSucceedRegister()); |
- fetcher2->SimulateLogin(kTestManagedDomainUsername); |
+ 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_FALSE(fetcher2->IsTokenPending()); |
- ASSERT_NE(device_token, fetcher2->GetDeviceToken()); |
+ Mock::VerifyAndClearExpectations(&observer); |
+ EXPECT_EQ("", fetcher.GetDeviceToken()); |
+ EXPECT_TRUE(cache_->is_unmanaged()); |
+ fetcher.RemoveObserver(&observer); |
} |
} // namespace policy |