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

Side by Side Diff: chrome/browser/policy/auto_enrollment_client_unittest.cc

Issue 8872032: Added the AutoEnrollmentClient and unit tests for it. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years 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
(Empty)
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/auto_enrollment_client.h"
6
7 #include "base/rand_util.h"
8 #include "chrome/browser/policy/mock_device_management_backend.h"
9 #include "chrome/browser/policy/mock_device_management_service.h"
10 #include "crypto/sha2.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace policy {
15
16 namespace {
17
18 const char* kSerial = "serial";
19 const char* kSerialHash =
20 "\x01\x44\xb1\xde\xfc\xf7\x56\x10\x87\x01\x5f\x8d\x83\x0d\x65\xb1"
21 "\x6f\x02\x4a\xd7\xeb\x92\x45\xfc\xd4\xe4\x37\xa1\x55\x2b\x13\x8a";
22
23 using ::testing::AnyNumber;
24 using ::testing::DoAll;
25 using ::testing::Invoke;
26 using ::testing::Unused;
27 using ::testing::_;
28
29 ACTION_P(MockDeviceManagementBackendFailAutoEnrollment, error) {
30 arg2->OnError(error);
31 }
32
33 ACTION_P(MockDeviceManagementBackendSucceedAutoEnrollment, response) {
34 arg2->HandleAutoEnrollmentResponse(response);
35 }
36
37 class MockAutoEnrollmentClientDelegate : public AutoEnrollmentClient::Delegate {
38 public:
39 MockAutoEnrollmentClientDelegate() {}
40 virtual ~MockAutoEnrollmentClientDelegate() {}
41
42 MOCK_METHOD1(OnAutoEnrollmentComplete, void(AutoEnrollmentClient*));
43
44 private:
45 DISALLOW_COPY_AND_ASSIGN(MockAutoEnrollmentClientDelegate);
46 };
47
48 class AutoEnrollmentClientTest : public testing::Test {
Mattias Nissler (ping if slow) 2011/12/09 15:40:52 I think the test class itself usually doesn't go i
Joao da Silva 2011/12/09 17:26:06 I usually do this (see url_blacklist_manager_unitt
49 public:
Mattias Nissler (ping if slow) 2011/12/09 15:40:52 can be protected.
Joao da Silva 2011/12/09 17:26:06 Done.
50 AutoEnrollmentClientTest() {
51 }
52
53 virtual void SetUp() OVERRIDE {
54 CreateClient(kSerial, 4, 8);
55 }
56
57 void CreateClient(const std::string& serial,
58 int power_initial,
59 int power_limit) {
60 MockDeviceManagementService* service = new MockDeviceManagementService;
61 EXPECT_CALL(*service, CreateBackend())
62 .Times(AnyNumber())
Mattias Nissler (ping if slow) 2011/12/09 15:40:52 indentation.
Joao da Silva 2011/12/09 17:26:06 Done.
63 .WillRepeatedly(MockDeviceManagementServiceProxyBackend(&backend_));
64 client_.reset(new AutoEnrollmentClient(&delegate_,
65 service,
66 serial,
67 power_initial,
68 power_limit));
69 }
70
71 void ExpectNotification() {
72 EXPECT_CALL(delegate_, OnAutoEnrollmentComplete(client_.get())).Times(1);
73 }
74
75 void ServerWillFail(DeviceManagementBackend::ErrorCode error) {
76 EXPECT_CALL(backend_, ProcessAutoEnrollmentRequest(_, _, _))
77 .WillOnce(
78 DoAll(
79 Invoke(this,
80 &AutoEnrollmentClientTest::OnProcessAutoEnrollmentRequest),
81 MockDeviceManagementBackendFailAutoEnrollment(error)))
82 .RetiresOnSaturation();
83 }
84
85 void ServerWillReply(int64 modulus, bool with_hashes, bool with_serial_hash) {
86 em::DeviceAutoEnrollmentResponse response;
87 if (modulus >= 0)
88 response.set_modulus(modulus);
89 if (with_hashes) {
90 for (size_t i = 0; i < 10; ++i) {
91 response.mutable_hashes()->Add()->assign(
92 base::RandBytesAsString(crypto::kSHA256Length));
Mattias Nissler (ping if slow) 2011/12/09 15:40:52 Might this cause indeterminism? Are we sure the ra
Joao da Silva 2011/12/09 17:26:06 Done! :-)
93 }
94 }
95 if (with_serial_hash) {
96 response.mutable_hashes()->Add()->assign(kSerialHash,
97 crypto::kSHA256Length);
98 }
99 EXPECT_CALL(backend_, ProcessAutoEnrollmentRequest(_, _, _))
100 .WillOnce(
101 DoAll(
102 Invoke(this,
103 &AutoEnrollmentClientTest::OnProcessAutoEnrollmentRequest),
104 MockDeviceManagementBackendSucceedAutoEnrollment(response)))
105 .RetiresOnSaturation();
106 }
107
108 protected:
109 MockDeviceManagementBackend backend_;
110 MockAutoEnrollmentClientDelegate delegate_;
111 scoped_ptr<AutoEnrollmentClient> client_;
112 em::DeviceAutoEnrollmentRequest last_request_;
113
114 private:
115 void OnProcessAutoEnrollmentRequest(
Mattias Nissler (ping if slow) 2011/12/09 15:40:52 Maybe call this CaptureRequest()?
Joao da Silva 2011/12/09 17:26:06 Done.
116 Unused,
117 const em::DeviceAutoEnrollmentRequest& request,
118 Unused) {
119 last_request_ = request;
120 }
121
122 DISALLOW_COPY_AND_ASSIGN(AutoEnrollmentClientTest);
123 };
124
125 TEST_F(AutoEnrollmentClientTest, NetworkFailure) {
126 ServerWillFail(DeviceManagementBackend::kErrorTemporaryUnavailable);
127 ExpectNotification();
128 client_->Start();
129 EXPECT_FALSE(client_->should_auto_enroll());
130 }
131
132 TEST_F(AutoEnrollmentClientTest, EmptyReply) {
133 ServerWillReply(-1, false, false);
134 ExpectNotification();
135 client_->Start();
136 EXPECT_FALSE(client_->should_auto_enroll());
137 }
138
139 TEST_F(AutoEnrollmentClientTest, ClientUploadsRightBits) {
140 ServerWillReply(-1, false, false);
141 ExpectNotification();
142 client_->Start();
143 EXPECT_FALSE(client_->should_auto_enroll());
144 EXPECT_TRUE(last_request_.has_remainder());
145 EXPECT_TRUE(last_request_.has_modulus());
146 EXPECT_EQ(16, last_request_.modulus());
147 EXPECT_EQ(kSerialHash[31] & 0xf, last_request_.remainder());
148 }
149
150 TEST_F(AutoEnrollmentClientTest, AskForMoreThenFail) {
Mattias Nissler (ping if slow) 2011/12/09 15:40:52 Could use a comment that the expectations need to
Joao da Silva 2011/12/09 17:26:06 Indeed, InSequence is cooler. Also removed the "Re
151 ServerWillFail(DeviceManagementBackend::kErrorTemporaryUnavailable);
152 ServerWillReply(32, false, false);
153 ExpectNotification();
154 client_->Start();
155 EXPECT_FALSE(client_->should_auto_enroll());
156 }
157
158 TEST_F(AutoEnrollmentClientTest, AskForMoreThenEvenMore) {
159 ServerWillReply(64, false, false);
160 ServerWillReply(32, false, false);
161 ExpectNotification();
162 client_->Start();
163 EXPECT_FALSE(client_->should_auto_enroll());
164 }
165
166 TEST_F(AutoEnrollmentClientTest, AskForLess) {
167 ServerWillReply(8, false, false);
168 ExpectNotification();
169 client_->Start();
170 EXPECT_FALSE(client_->should_auto_enroll());
171 }
172
173 TEST_F(AutoEnrollmentClientTest, AskForSame) {
174 ServerWillReply(16, false, false);
175 ExpectNotification();
176 client_->Start();
177 EXPECT_FALSE(client_->should_auto_enroll());
178 }
179
180 TEST_F(AutoEnrollmentClientTest, AskForTooMuch) {
181 ServerWillReply(512, false, false);
182 ExpectNotification();
183 client_->Start();
184 EXPECT_FALSE(client_->should_auto_enroll());
185 }
186
187 TEST_F(AutoEnrollmentClientTest, AskNonPowerOf2) {
188 ServerWillReply(-1, false, false);
189 ServerWillReply(100, false, false);
190 ExpectNotification();
191 client_->Start();
192 EXPECT_FALSE(client_->should_auto_enroll());
193 EXPECT_TRUE(last_request_.has_remainder());
194 EXPECT_TRUE(last_request_.has_modulus());
195 EXPECT_EQ(128, last_request_.modulus());
196 EXPECT_EQ(kSerialHash[31] & 0x7f, last_request_.remainder());
197 }
198
199 TEST_F(AutoEnrollmentClientTest, ConsumerDevice) {
200 ServerWillReply(-1, true, false);
201 ExpectNotification();
202 client_->Start();
203 EXPECT_FALSE(client_->should_auto_enroll());
204 }
205
206 TEST_F(AutoEnrollmentClientTest, EnterpriseDevice) {
207 ServerWillReply(-1, true, true);
208 ExpectNotification();
209 client_->Start();
210 EXPECT_TRUE(client_->should_auto_enroll());
211 }
212
213 TEST_F(AutoEnrollmentClientTest, NoSerial) {
214 CreateClient("", 4, 8);
215 ExpectNotification();
216 client_->Start();
217 EXPECT_FALSE(client_->should_auto_enroll());
218 }
219
220 TEST_F(AutoEnrollmentClientTest, NoBitsUploaded) {
221 CreateClient(kSerial, 0, 0);
222 ServerWillReply(-1, false, false);
223 ExpectNotification();
224 client_->Start();
225 EXPECT_FALSE(client_->should_auto_enroll());
226 EXPECT_TRUE(last_request_.has_remainder());
227 EXPECT_TRUE(last_request_.has_modulus());
228 EXPECT_EQ(1, last_request_.modulus());
229 EXPECT_EQ(0, last_request_.remainder());
230 }
231
232 TEST_F(AutoEnrollmentClientTest, ManyBitsUploaded) {
233 int64 bottom62 = GG_LONGLONG(0x14e437a1552b138a);
234 for (int i = 0; i <= 62; ++i) {
235 CreateClient(kSerial, i, i);
236 ServerWillReply(-1, false, false);
237 ExpectNotification();
238 client_->Start();
239 EXPECT_FALSE(client_->should_auto_enroll());
240 EXPECT_TRUE(last_request_.has_remainder());
241 EXPECT_TRUE(last_request_.has_modulus());
242 EXPECT_EQ((int64) 1 << i, last_request_.modulus());
243 EXPECT_EQ(bottom62 % ((int64) 1 << i), last_request_.remainder());
244 }
245 }
246
247 } // namespace
248
249 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698