• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/policy/device_token_fetcher.h"
6 
7 #include "base/file_util.h"
8 #include "base/memory/scoped_temp_dir.h"
9 #include "base/message_loop.h"
10 #include "chrome/browser/net/gaia/token_service.h"
11 #include "chrome/browser/policy/device_management_service.h"
12 #include "chrome/browser/policy/mock_device_management_backend.h"
13 #include "chrome/browser/policy/mock_device_management_service.h"
14 #include "chrome/browser/policy/policy_notifier.h"
15 #include "chrome/browser/policy/proto/device_management_backend.pb.h"
16 #include "chrome/browser/policy/user_policy_cache.h"
17 #include "chrome/common/net/gaia/gaia_constants.h"
18 #include "chrome/test/testing_profile.h"
19 #include "content/browser/browser_thread.h"
20 #include "testing/gmock/include/gmock/gmock.h"
21 #include "testing/gtest/include/gtest/gtest.h"
22 
23 namespace policy {
24 
25 const char kTestToken[] = "device_token_fetcher_test_auth_token";
26 
27 using testing::_;
28 using testing::Mock;
29 
30 class MockTokenAvailableObserver : public DeviceTokenFetcher::Observer {
31  public:
MockTokenAvailableObserver()32   MockTokenAvailableObserver() {}
~MockTokenAvailableObserver()33   virtual ~MockTokenAvailableObserver() {}
34 
35   MOCK_METHOD0(OnDeviceTokenAvailable, void());
36 
37  private:
38   DISALLOW_COPY_AND_ASSIGN(MockTokenAvailableObserver);
39 };
40 
41 class DeviceTokenFetcherTest : public testing::Test {
42  protected:
DeviceTokenFetcherTest()43   DeviceTokenFetcherTest()
44       : ui_thread_(BrowserThread::UI, &loop_),
45         file_thread_(BrowserThread::FILE, &loop_) {
46     EXPECT_TRUE(temp_user_data_dir_.CreateUniqueTempDir());
47   }
48 
SetUp()49   virtual void SetUp() {
50     cache_.reset(new UserPolicyCache(
51         temp_user_data_dir_.path().AppendASCII("DeviceTokenFetcherTest")));
52     service_.set_backend(&backend_);
53   }
54 
TearDown()55   virtual void TearDown() {
56     loop_.RunAllPending();
57   }
58 
59   MessageLoop loop_;
60   MockDeviceManagementBackend backend_;
61   MockDeviceManagementService service_;
62   scoped_ptr<CloudPolicyCacheBase> cache_;
63   PolicyNotifier notifier_;
64   ScopedTempDir temp_user_data_dir_;
65 
66  private:
67   BrowserThread ui_thread_;
68   BrowserThread file_thread_;
69 };
70 
TEST_F(DeviceTokenFetcherTest,FetchToken)71 TEST_F(DeviceTokenFetcherTest, FetchToken) {
72   testing::InSequence s;
73   EXPECT_CALL(backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
74       MockDeviceManagementBackendSucceedRegister());
75   DeviceTokenFetcher fetcher(&service_, cache_.get(), &notifier_);
76   MockTokenAvailableObserver observer;
77   EXPECT_CALL(observer, OnDeviceTokenAvailable());
78   fetcher.AddObserver(&observer);
79   EXPECT_EQ("", fetcher.GetDeviceToken());
80   fetcher.FetchToken("fake_auth_token", "fake_device_id",
81                      em::DeviceRegisterRequest::USER,
82                      "fake_machine_id", "fake_machine_model");
83   loop_.RunAllPending();
84   Mock::VerifyAndClearExpectations(&observer);
85   std::string token = fetcher.GetDeviceToken();
86   EXPECT_NE("", token);
87 
88   // Calling FetchToken() again should result in a new token being fetched.
89   EXPECT_CALL(backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
90       MockDeviceManagementBackendSucceedRegister());
91   EXPECT_CALL(observer, OnDeviceTokenAvailable());
92   fetcher.FetchToken("fake_auth_token", "fake_device_id",
93                      em::DeviceRegisterRequest::USER,
94                      "fake_machine_id", "fake_machine_model");
95   loop_.RunAllPending();
96   Mock::VerifyAndClearExpectations(&observer);
97   std::string token2 = fetcher.GetDeviceToken();
98   EXPECT_NE("", token2);
99   EXPECT_NE(token, token2);
100   fetcher.RemoveObserver(&observer);
101 }
102 
TEST_F(DeviceTokenFetcherTest,RetryOnError)103 TEST_F(DeviceTokenFetcherTest, RetryOnError) {
104   testing::InSequence s;
105   EXPECT_CALL(backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
106       MockDeviceManagementBackendFailRegister(
107           DeviceManagementBackend::kErrorRequestFailed)).WillOnce(
108       MockDeviceManagementBackendSucceedRegister());
109   DeviceTokenFetcher fetcher(&service_, cache_.get(), &notifier_, 0, 0, 0);
110   MockTokenAvailableObserver observer;
111   EXPECT_CALL(observer, OnDeviceTokenAvailable());
112   fetcher.AddObserver(&observer);
113   fetcher.FetchToken("fake_auth_token", "fake_device_id",
114                      em::DeviceRegisterRequest::USER,
115                      "fake_machine_id", "fake_machine_model");
116   loop_.RunAllPending();
117   Mock::VerifyAndClearExpectations(&observer);
118   EXPECT_NE("", fetcher.GetDeviceToken());
119   fetcher.RemoveObserver(&observer);
120 }
121 
TEST_F(DeviceTokenFetcherTest,UnmanagedDevice)122 TEST_F(DeviceTokenFetcherTest, UnmanagedDevice) {
123   EXPECT_CALL(backend_, ProcessRegisterRequest(_, _, _, _)).WillOnce(
124       MockDeviceManagementBackendFailRegister(
125           DeviceManagementBackend::kErrorServiceManagementNotSupported));
126   EXPECT_FALSE(cache_->is_unmanaged());
127   DeviceTokenFetcher fetcher(&service_, cache_.get(), &notifier_);
128   MockTokenAvailableObserver observer;
129   EXPECT_CALL(observer, OnDeviceTokenAvailable()).Times(0);
130   fetcher.AddObserver(&observer);
131   fetcher.FetchToken("fake_auth_token", "fake_device_id",
132                      em::DeviceRegisterRequest::USER,
133                      "fake_machine_id", "fake_machine_model");
134   loop_.RunAllPending();
135   Mock::VerifyAndClearExpectations(&observer);
136   EXPECT_EQ("", fetcher.GetDeviceToken());
137   EXPECT_TRUE(cache_->is_unmanaged());
138   fetcher.RemoveObserver(&observer);
139 }
140 
141 }  // namespace policy
142