// 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 "chrome/browser/policy/device_token_fetcher.h"
#include "base/file_util.h"
#include "base/memory/scoped_temp_dir.h"
#include "base/message_loop.h"
#include "chrome/browser/net/gaia/token_service.h"
#include "chrome/browser/policy/device_management_service.h"
#include "chrome/browser/policy/mock_device_management_backend.h"
#include "chrome/browser/policy/mock_device_management_service.h"
#include "chrome/browser/policy/policy_notifier.h"
#include "chrome/browser/policy/proto/device_management_backend.pb.h"
#include "chrome/browser/policy/user_policy_cache.h"
#include "chrome/common/net/gaia/gaia_constants.h"
#include "chrome/test/testing_profile.h"
#include "content/browser/browser_thread.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace policy {
const char kTestToken[] = "device_token_fetcher_test_auth_token";
using testing::_;
using testing::Mock;
class MockTokenAvailableObserver : public DeviceTokenFetcher::Observer {
public:
MockTokenAvailableObserver() {}
virtual ~MockTokenAvailableObserver() {}
MOCK_METHOD0(OnDeviceTokenAvailable, void());
private:
DISALLOW_COPY_AND_ASSIGN(MockTokenAvailableObserver);
};
class DeviceTokenFetcherTest : public testing::Test {
protected:
DeviceTokenFetcherTest()
: ui_thread_(BrowserThread::UI, &loop_),
file_thread_(BrowserThread::FILE, &loop_) {
EXPECT_TRUE(temp_user_data_dir_.CreateUniqueTempDir());
}
virtual void SetUp() {
cache_.reset(new UserPolicyCache(
temp_user_data_dir_.path().AppendASCII("DeviceTokenFetcherTest")));
service_.set_backend(&backend_);
}
virtual void TearDown() {
loop_.RunAllPending();
}
MessageLoop loop_;
MockDeviceManagementBackend backend_;
MockDeviceManagementService service_;
scoped_ptr<CloudPolicyCacheBase> cache_;
PolicyNotifier notifier_;
ScopedTempDir temp_user_data_dir_;
private:
BrowserThread ui_thread_;
BrowserThread file_thread_;
};
TEST_F(DeviceTokenFetcherTest, FetchToken) {
testing::InSequence s;
EXPECT_CALL(backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
MockDeviceManagementBackendSucceedRegister());
DeviceTokenFetcher fetcher(&service_, cache_.get(), ¬ifier_);
MockTokenAvailableObserver observer;
EXPECT_CALL(observer, OnDeviceTokenAvailable());
fetcher.AddObserver(&observer);
EXPECT_EQ("", fetcher.GetDeviceToken());
fetcher.FetchToken("fake_auth_token", "fake_device_id",
em::DeviceRegisterRequest::USER,
"fake_machine_id", "fake_machine_model");
loop_.RunAllPending();
Mock::VerifyAndClearExpectations(&observer);
std::string token = fetcher.GetDeviceToken();
EXPECT_NE("", token);
// Calling FetchToken() again should result in a new token being fetched.
EXPECT_CALL(backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
MockDeviceManagementBackendSucceedRegister());
EXPECT_CALL(observer, OnDeviceTokenAvailable());
fetcher.FetchToken("fake_auth_token", "fake_device_id",
em::DeviceRegisterRequest::USER,
"fake_machine_id", "fake_machine_model");
loop_.RunAllPending();
Mock::VerifyAndClearExpectations(&observer);
std::string token2 = fetcher.GetDeviceToken();
EXPECT_NE("", token2);
EXPECT_NE(token, token2);
fetcher.RemoveObserver(&observer);
}
TEST_F(DeviceTokenFetcherTest, RetryOnError) {
testing::InSequence s;
EXPECT_CALL(backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
MockDeviceManagementBackendFailRegister(
DeviceManagementBackend::kErrorRequestFailed)).WillOnce(
MockDeviceManagementBackendSucceedRegister());
DeviceTokenFetcher fetcher(&service_, cache_.get(), ¬ifier_, 0, 0, 0);
MockTokenAvailableObserver observer;
EXPECT_CALL(observer, OnDeviceTokenAvailable());
fetcher.AddObserver(&observer);
fetcher.FetchToken("fake_auth_token", "fake_device_id",
em::DeviceRegisterRequest::USER,
"fake_machine_id", "fake_machine_model");
loop_.RunAllPending();
Mock::VerifyAndClearExpectations(&observer);
EXPECT_NE("", fetcher.GetDeviceToken());
fetcher.RemoveObserver(&observer);
}
TEST_F(DeviceTokenFetcherTest, UnmanagedDevice) {
EXPECT_CALL(backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
MockDeviceManagementBackendFailRegister(
DeviceManagementBackend::kErrorServiceManagementNotSupported));
EXPECT_FALSE(cache_->is_unmanaged());
DeviceTokenFetcher fetcher(&service_, cache_.get(), ¬ifier_);
MockTokenAvailableObserver observer;
EXPECT_CALL(observer, OnDeviceTokenAvailable()).Times(0);
fetcher.AddObserver(&observer);
fetcher.FetchToken("fake_auth_token", "fake_device_id",
em::DeviceRegisterRequest::USER,
"fake_machine_id", "fake_machine_model");
loop_.RunAllPending();
Mock::VerifyAndClearExpectations(&observer);
EXPECT_EQ("", fetcher.GetDeviceToken());
EXPECT_TRUE(cache_->is_unmanaged());
fetcher.RemoveObserver(&observer);
}
} // namespace policy