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

Side by Side Diff: blimp/client/session/assignment_source_unittest.cc

Issue 1696563002: Blimp: add support for SSL connections. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: data_deps => data Created 4 years, 9 months 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "blimp/client/session/assignment_source.h" 5 #include "blimp/client/session/assignment_source.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/files/file_path.h"
9 #include "base/files/file_util.h"
8 #include "base/json/json_reader.h" 10 #include "base/json/json_reader.h"
9 #include "base/json/json_writer.h" 11 #include "base/json/json_writer.h"
12 #include "base/message_loop/message_loop.h"
13 #include "base/path_service.h"
14 #include "base/run_loop.h"
10 #include "base/test/test_simple_task_runner.h" 15 #include "base/test/test_simple_task_runner.h"
11 #include "base/thread_task_runner_handle.h" 16 #include "base/thread_task_runner_handle.h"
12 #include "base/values.h" 17 #include "base/values.h"
13 #include "blimp/client/app/blimp_client_switches.h" 18 #include "blimp/client/app/blimp_client_switches.h"
14 #include "blimp/common/protocol_version.h" 19 #include "blimp/common/protocol_version.h"
20 #include "components/safe_json/testing_json_parser.h"
21 #include "net/base/test_data_directory.h"
15 #include "net/url_request/test_url_fetcher_factory.h" 22 #include "net/url_request/test_url_fetcher_factory.h"
16 #include "testing/gmock/include/gmock/gmock.h" 23 #include "testing/gmock/include/gmock/gmock.h"
17 #include "testing/gtest/include/gtest/gtest.h" 24 #include "testing/gtest/include/gtest/gtest.h"
18 25
19 using testing::_; 26 using testing::_;
27 using testing::DoAll;
20 using testing::InSequence; 28 using testing::InSequence;
29 using testing::NotNull;
30 using testing::Return;
31 using testing::SetArgPointee;
21 32
22 namespace blimp { 33 namespace blimp {
23 namespace client { 34 namespace client {
24 namespace { 35 namespace {
25 36
37 const uint8_t kTestIpAddress[] = {127, 0, 0, 1};
38 const uint16_t kTestPort = 8086;
39 const char kTestIpAddressString[] = "127.0.0.1";
40 const char kTcpTransportName[] = "tcp";
41 const char kSslTransportName[] = "ssl";
42 const char kCertRelativePath[] =
43 "blimp/client/session/test_selfsigned_cert.pem";
44 const char kTestClientToken[] = "secrett0ken";
45 const char kTestAuthToken[] = "UserAuthT0kenz";
46
26 MATCHER_P(AssignmentEquals, assignment, "") { 47 MATCHER_P(AssignmentEquals, assignment, "") {
27 return arg.transport_protocol == assignment.transport_protocol && 48 return arg.transport_protocol == assignment.transport_protocol &&
28 arg.ip_endpoint == assignment.ip_endpoint && 49 arg.engine_endpoint == assignment.engine_endpoint &&
29 arg.client_token == assignment.client_token && 50 arg.client_token == assignment.client_token &&
30 arg.certificate == assignment.certificate && 51 ((!assignment.cert && !arg.cert) ||
31 arg.certificate_fingerprint == assignment.certificate_fingerprint; 52 (arg.cert && assignment.cert &&
53 arg.cert->Equals(assignment.cert.get())));
32 } 54 }
33 55
34 net::IPEndPoint BuildIPEndPoint(const std::string& ip, int port) { 56 // Converts |value| to a JSON string.
35 net::IPAddress ip_address; 57 std::string ValueToString(const base::Value& value) {
36 EXPECT_TRUE(ip_address.AssignFromIPLiteral(ip));
37
38 return net::IPEndPoint(ip_address, port);
39 }
40
41 Assignment BuildValidAssignment() {
42 Assignment assignment;
43 assignment.transport_protocol = Assignment::TransportProtocol::SSL;
44 assignment.ip_endpoint = BuildIPEndPoint("100.150.200.250", 500);
45 assignment.client_token = "SecretT0kenz";
46 assignment.certificate_fingerprint = "WhaleWhaleWhale";
47 assignment.certificate = "whaaaaaaaaaaaaale";
48 return assignment;
49 }
50
51 std::string BuildResponseFromAssignment(const Assignment& assignment) {
52 base::DictionaryValue dict;
53 dict.SetString("clientToken", assignment.client_token);
54 dict.SetString("host", assignment.ip_endpoint.address().ToString());
55 dict.SetInteger("port", assignment.ip_endpoint.port());
56 dict.SetString("certificateFingerprint", assignment.certificate_fingerprint);
57 dict.SetString("certificate", assignment.certificate);
58
59 std::string json; 58 std::string json;
60 base::JSONWriter::Write(dict, &json); 59 base::JSONWriter::Write(value, &json);
61 return json; 60 return json;
62 } 61 }
63 62
64 class AssignmentSourceTest : public testing::Test { 63 class AssignmentSourceTest : public testing::Test {
65 public: 64 public:
66 AssignmentSourceTest() 65 AssignmentSourceTest()
67 : task_runner_(new base::TestSimpleTaskRunner), 66 : source_(message_loop_.task_runner(), message_loop_.task_runner()) {}
68 task_runner_handle_(task_runner_), 67
69 source_(task_runner_, task_runner_) {} 68 void SetUp() override {
69 base::FilePath src_root;
70 PathService::Get(base::DIR_SOURCE_ROOT, &src_root);
71 ASSERT_FALSE(src_root.empty());
72 cert_path_ = src_root.Append(kCertRelativePath);
73 ASSERT_TRUE(base::ReadFileToString(cert_path_, &cert_pem_));
74 cert_ = std::move(net::X509Certificate::CreateCertificateListFromBytes(
75 cert_pem_.data(), cert_pem_.size(),
76 net::X509Certificate::FORMAT_PEM_CERT_SEQUENCE)[0]);
Ryan Sleevi 2016/03/02 19:18:14 FWIW, this will crash if cert_pem_.data() is inval
Kevin M 2016/03/02 21:02:09 Done.
77 ASSERT_TRUE(cert_);
78 }
70 79
71 // This expects the AssignmentSource::GetAssignment to return a custom 80 // This expects the AssignmentSource::GetAssignment to return a custom
72 // endpoint without having to hit the network. This will typically be used 81 // endpoint without having to hit the network. This will typically be used
73 // for testing that specifying an assignment via the command line works as 82 // for testing that specifying an assignment via the command line works as
74 // expected. 83 // expected.
75 void GetAlternateAssignment() { 84 void GetAlternateAssignment() {
76 source_.GetAssignment("", 85 source_.GetAssignment("",
77 base::Bind(&AssignmentSourceTest::AssignmentResponse, 86 base::Bind(&AssignmentSourceTest::AssignmentResponse,
78 base::Unretained(this))); 87 base::Unretained(this)));
79 EXPECT_EQ(nullptr, factory_.GetFetcherByID(0)); 88 EXPECT_EQ(nullptr, factory_.GetFetcherByID(0));
80 task_runner_->RunUntilIdle(); 89 base::RunLoop().RunUntilIdle();
81 } 90 }
82 91
83 // See net/base/net_errors.h for possible status errors. 92 // See net/base/net_errors.h for possible status errors.
84 void GetNetworkAssignmentAndWaitForResponse( 93 void GetNetworkAssignmentAndWaitForResponse(
85 net::HttpStatusCode response_code, 94 net::HttpStatusCode response_code,
86 int status, 95 int status,
87 const std::string& response, 96 const std::string& response,
88 const std::string& client_auth_token, 97 const std::string& client_auth_token,
89 const std::string& protocol_version) { 98 const std::string& protocol_version) {
90 source_.GetAssignment(client_auth_token, 99 source_.GetAssignment(client_auth_token,
91 base::Bind(&AssignmentSourceTest::AssignmentResponse, 100 base::Bind(&AssignmentSourceTest::AssignmentResponse,
92 base::Unretained(this))); 101 base::Unretained(this)));
102 base::RunLoop().RunUntilIdle();
93 103
94 net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0); 104 net::TestURLFetcher* fetcher = factory_.GetFetcherByID(0);
95 105
96 task_runner_->RunUntilIdle();
97
98 EXPECT_NE(nullptr, fetcher); 106 EXPECT_NE(nullptr, fetcher);
99 EXPECT_EQ(kDefaultAssignerURL, fetcher->GetOriginalURL().spec()); 107 EXPECT_EQ(kDefaultAssignerURL, fetcher->GetOriginalURL().spec());
100 108
101 // Check that the request has a valid protocol_version. 109 // Check that the request has a valid protocol_version.
102 scoped_ptr<base::Value> json = 110 scoped_ptr<base::Value> json =
103 base::JSONReader::Read(fetcher->upload_data()); 111 base::JSONReader::Read(fetcher->upload_data());
104 EXPECT_NE(nullptr, json.get()); 112 EXPECT_NE(nullptr, json.get());
105 113
106 const base::DictionaryValue* dict; 114 const base::DictionaryValue* dict;
107 EXPECT_TRUE(json->GetAsDictionary(&dict)); 115 EXPECT_TRUE(json->GetAsDictionary(&dict));
(...skipping 10 matching lines...) Expand all
118 std::string authorization; 126 std::string authorization;
119 EXPECT_TRUE(headers.GetHeader("Authorization", &authorization)); 127 EXPECT_TRUE(headers.GetHeader("Authorization", &authorization));
120 EXPECT_EQ("Bearer " + client_auth_token, authorization); 128 EXPECT_EQ("Bearer " + client_auth_token, authorization);
121 129
122 // Send the fake response back. 130 // Send the fake response back.
123 fetcher->set_response_code(response_code); 131 fetcher->set_response_code(response_code);
124 fetcher->set_status(net::URLRequestStatus::FromError(status)); 132 fetcher->set_status(net::URLRequestStatus::FromError(status));
125 fetcher->SetResponseString(response); 133 fetcher->SetResponseString(response);
126 fetcher->delegate()->OnURLFetchComplete(fetcher); 134 fetcher->delegate()->OnURLFetchComplete(fetcher);
127 135
128 task_runner_->RunUntilIdle(); 136 base::RunLoop().RunUntilIdle();
129 } 137 }
130 138
131 MOCK_METHOD2(AssignmentResponse, 139 MOCK_METHOD2(AssignmentResponse,
132 void(AssignmentSource::Result, const Assignment&)); 140 void(AssignmentSource::Result, const Assignment&));
133 141
134 protected: 142 protected:
143 Assignment BuildSslAssignment();
144
145 // Builds simulated JSON response from the Assigner service.
146 scoped_ptr<base::DictionaryValue> BuildAssignerResponse();
147
135 // Used to drive all AssignmentSource tasks. 148 // Used to drive all AssignmentSource tasks.
136 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 149 // MessageLoop is required by TestingJsonParser's self-deletion logic.
137 base::ThreadTaskRunnerHandle task_runner_handle_; 150 // TODO(bauerb): Replace this with a TestSimpleTaskRunner once
151 // TestingJsonParser no longer requires having a MessageLoop.
152 base::MessageLoop message_loop_;
138 153
139 net::TestURLFetcherFactory factory_; 154 net::TestURLFetcherFactory factory_;
140 155
156 // Path to the PEM-encoded certificate chain.
157 base::FilePath cert_path_;
158
159 // Payload of PEM certificate chain at |cert_path_|.
160 std::string cert_pem_;
161
162 // X509 certificate decoded from |cert_path_|.
163 scoped_refptr<net::X509Certificate> cert_;
164
141 AssignmentSource source_; 165 AssignmentSource source_;
166
167 // Allows safe_json to parse JSON in-process, instead of depending on a
168 // utility proces.
169 safe_json::TestingJsonParser::ScopedFactoryOverride json_parsing_factory_;
142 }; 170 };
143 171
172 Assignment AssignmentSourceTest::BuildSslAssignment() {
173 Assignment assignment;
174 assignment.transport_protocol = Assignment::TransportProtocol::SSL;
175 assignment.engine_endpoint = net::IPEndPoint(kTestIpAddress, kTestPort);
176 assignment.client_token = kTestClientToken;
177 assignment.cert = cert_;
178 return assignment;
179 }
180
181 scoped_ptr<base::DictionaryValue>
182 AssignmentSourceTest::BuildAssignerResponse() {
183 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
184 dict->SetString("clientToken", kTestClientToken);
185 dict->SetString("host", kTestIpAddressString);
186 dict->SetInteger("port", kTestPort);
187 dict->SetString("certificate", cert_pem_);
188 return dict;
189 }
190
144 TEST_F(AssignmentSourceTest, TestTCPAlternateEndpointSuccess) { 191 TEST_F(AssignmentSourceTest, TestTCPAlternateEndpointSuccess) {
145 Assignment assignment; 192 Assignment assignment;
146 assignment.transport_protocol = Assignment::TransportProtocol::TCP; 193 assignment.transport_protocol = Assignment::TransportProtocol::TCP;
147 assignment.ip_endpoint = BuildIPEndPoint("100.150.200.250", 500); 194 assignment.engine_endpoint = net::IPEndPoint(kTestIpAddress, kTestPort);
148 assignment.client_token = kDummyClientToken; 195 assignment.client_token = kDummyClientToken;
196 assignment.cert = scoped_refptr<net::X509Certificate>(nullptr);
149 197
150 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 198 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
151 switches::kBlimpletEndpoint, "tcp:100.150.200.250:500"); 199 switches::kEngineIP, kTestIpAddressString);
200 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
201 switches::kEnginePort, std::to_string(kTestPort));
202 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
203 switches::kEngineTransport, kTcpTransportName);
152 204
153 EXPECT_CALL(*this, AssignmentResponse(AssignmentSource::Result::RESULT_OK, 205 EXPECT_CALL(*this, AssignmentResponse(AssignmentSource::Result::RESULT_OK,
154 AssignmentEquals(assignment))) 206 AssignmentEquals(assignment)))
155 .Times(1); 207 .Times(1);
156 208
157 GetAlternateAssignment(); 209 GetAlternateAssignment();
158 } 210 }
159 211
160 TEST_F(AssignmentSourceTest, TestSSLAlternateEndpointSuccess) { 212 TEST_F(AssignmentSourceTest, TestSSLAlternateEndpointSuccess) {
161 Assignment assignment; 213 Assignment assignment;
162 assignment.transport_protocol = Assignment::TransportProtocol::SSL; 214 assignment.transport_protocol = Assignment::TransportProtocol::SSL;
163 assignment.ip_endpoint = BuildIPEndPoint("100.150.200.250", 500); 215 assignment.engine_endpoint = net::IPEndPoint(kTestIpAddress, kTestPort);
164 assignment.client_token = kDummyClientToken; 216 assignment.client_token = kDummyClientToken;
217 assignment.cert = cert_;
165 218
166 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 219 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
167 switches::kBlimpletEndpoint, "ssl:100.150.200.250:500"); 220 switches::kEngineIP, kTestIpAddressString);
221 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
222 switches::kEnginePort, std::to_string(kTestPort));
223 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
224 switches::kEngineTransport, kSslTransportName);
225 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
226 switches::kEngineCertPath, cert_path_.value());
168 227
169 EXPECT_CALL(*this, AssignmentResponse(AssignmentSource::Result::RESULT_OK, 228 EXPECT_CALL(*this, AssignmentResponse(AssignmentSource::Result::RESULT_OK,
170 AssignmentEquals(assignment))) 229 AssignmentEquals(assignment)))
171 .Times(1);
172
173 GetAlternateAssignment();
174 }
175
176 TEST_F(AssignmentSourceTest, TestQUICAlternateEndpointSuccess) {
177 Assignment assignment;
178 assignment.transport_protocol = Assignment::TransportProtocol::QUIC;
179 assignment.ip_endpoint = BuildIPEndPoint("100.150.200.250", 500);
180 assignment.client_token = kDummyClientToken;
181
182 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
183 switches::kBlimpletEndpoint, "quic:100.150.200.250:500");
184
185 EXPECT_CALL(*this, AssignmentResponse(AssignmentSource::Result::RESULT_OK,
186 AssignmentEquals(assignment)))
187 .Times(1); 230 .Times(1);
188 231
189 GetAlternateAssignment(); 232 GetAlternateAssignment();
190 } 233 }
191 234
192 TEST_F(AssignmentSourceTest, TestSuccess) { 235 TEST_F(AssignmentSourceTest, TestSuccess) {
193 Assignment assignment = BuildValidAssignment(); 236 Assignment assignment = BuildSslAssignment();
194 237
195 EXPECT_CALL(*this, AssignmentResponse(AssignmentSource::Result::RESULT_OK, 238 EXPECT_CALL(*this, AssignmentResponse(AssignmentSource::Result::RESULT_OK,
196 AssignmentEquals(assignment))) 239 AssignmentEquals(assignment)))
197 .Times(1); 240 .Times(1);
198 241
199 GetNetworkAssignmentAndWaitForResponse( 242 GetNetworkAssignmentAndWaitForResponse(
200 net::HTTP_OK, net::Error::OK, BuildResponseFromAssignment(assignment), 243 net::HTTP_OK, net::Error::OK, ValueToString(*BuildAssignerResponse()),
201 "UserAuthT0kenz", kEngineVersion); 244 kTestAuthToken, kEngineVersion);
202 }
203
204 TEST_F(AssignmentSourceTest, TestSecondRequestInterruptsFirst) {
205 InSequence sequence;
206 Assignment assignment = BuildValidAssignment();
207
208 source_.GetAssignment("",
209 base::Bind(&AssignmentSourceTest::AssignmentResponse,
210 base::Unretained(this)));
211
212 EXPECT_CALL(*this, AssignmentResponse(
213 AssignmentSource::Result::RESULT_SERVER_INTERRUPTED,
214 AssignmentEquals(Assignment())))
215 .Times(1)
216 .RetiresOnSaturation();
217
218 EXPECT_CALL(*this, AssignmentResponse(AssignmentSource::Result::RESULT_OK,
219 AssignmentEquals(assignment)))
220 .Times(1)
221 .RetiresOnSaturation();
222
223 GetNetworkAssignmentAndWaitForResponse(
224 net::HTTP_OK, net::Error::OK, BuildResponseFromAssignment(assignment),
225 "UserAuthT0kenz", kEngineVersion);
226 } 245 }
227 246
228 TEST_F(AssignmentSourceTest, TestValidAfterError) { 247 TEST_F(AssignmentSourceTest, TestValidAfterError) {
229 InSequence sequence; 248 InSequence sequence;
230 Assignment assignment = BuildValidAssignment(); 249 Assignment assignment = BuildSslAssignment();
231 250
232 EXPECT_CALL(*this, AssignmentResponse( 251 EXPECT_CALL(*this, AssignmentResponse(
233 AssignmentSource::Result::RESULT_NETWORK_FAILURE, _)) 252 AssignmentSource::Result::RESULT_NETWORK_FAILURE, _))
234 .Times(1) 253 .Times(1)
235 .RetiresOnSaturation(); 254 .RetiresOnSaturation();
236 255
237 EXPECT_CALL(*this, AssignmentResponse(AssignmentSource::Result::RESULT_OK, 256 EXPECT_CALL(*this, AssignmentResponse(AssignmentSource::Result::RESULT_OK,
238 AssignmentEquals(assignment))) 257 AssignmentEquals(assignment)))
239 .Times(1) 258 .Times(1)
240 .RetiresOnSaturation(); 259 .RetiresOnSaturation();
241 260
242 GetNetworkAssignmentAndWaitForResponse(net::HTTP_OK, 261 GetNetworkAssignmentAndWaitForResponse(net::HTTP_OK,
243 net::Error::ERR_INSUFFICIENT_RESOURCES, 262 net::Error::ERR_INSUFFICIENT_RESOURCES,
244 "", "UserAuthT0kenz", kEngineVersion); 263 "", kTestAuthToken, kEngineVersion);
245 264
246 GetNetworkAssignmentAndWaitForResponse( 265 GetNetworkAssignmentAndWaitForResponse(
247 net::HTTP_OK, net::Error::OK, BuildResponseFromAssignment(assignment), 266 net::HTTP_OK, net::Error::OK, ValueToString(*BuildAssignerResponse()),
248 "UserAuthT0kenz", kEngineVersion); 267 kTestAuthToken, kEngineVersion);
249 } 268 }
250 269
251 TEST_F(AssignmentSourceTest, TestNetworkFailure) { 270 TEST_F(AssignmentSourceTest, TestNetworkFailure) {
252 EXPECT_CALL(*this, AssignmentResponse( 271 EXPECT_CALL(*this, AssignmentResponse(
253 AssignmentSource::Result::RESULT_NETWORK_FAILURE, _)); 272 AssignmentSource::Result::RESULT_NETWORK_FAILURE, _));
254 GetNetworkAssignmentAndWaitForResponse(net::HTTP_OK, 273 GetNetworkAssignmentAndWaitForResponse(net::HTTP_OK,
255 net::Error::ERR_INSUFFICIENT_RESOURCES, 274 net::Error::ERR_INSUFFICIENT_RESOURCES,
256 "", "UserAuthT0kenz", kEngineVersion); 275 "", kTestAuthToken, kEngineVersion);
257 } 276 }
258 277
259 TEST_F(AssignmentSourceTest, TestBadRequest) { 278 TEST_F(AssignmentSourceTest, TestBadRequest) {
260 EXPECT_CALL(*this, AssignmentResponse( 279 EXPECT_CALL(*this, AssignmentResponse(
261 AssignmentSource::Result::RESULT_BAD_REQUEST, _)); 280 AssignmentSource::Result::RESULT_BAD_REQUEST, _));
262 GetNetworkAssignmentAndWaitForResponse(net::HTTP_BAD_REQUEST, net::Error::OK, 281 GetNetworkAssignmentAndWaitForResponse(net::HTTP_BAD_REQUEST, net::Error::OK,
263 "", "UserAuthT0kenz", kEngineVersion); 282 "", kTestAuthToken, kEngineVersion);
264 } 283 }
265 284
266 TEST_F(AssignmentSourceTest, TestUnauthorized) { 285 TEST_F(AssignmentSourceTest, TestUnauthorized) {
267 EXPECT_CALL(*this, 286 EXPECT_CALL(*this,
268 AssignmentResponse( 287 AssignmentResponse(
269 AssignmentSource::Result::RESULT_EXPIRED_ACCESS_TOKEN, _)); 288 AssignmentSource::Result::RESULT_EXPIRED_ACCESS_TOKEN, _));
270 GetNetworkAssignmentAndWaitForResponse(net::HTTP_UNAUTHORIZED, net::Error::OK, 289 GetNetworkAssignmentAndWaitForResponse(net::HTTP_UNAUTHORIZED, net::Error::OK,
271 "", "UserAuthT0kenz", kEngineVersion); 290 "", kTestAuthToken, kEngineVersion);
272 } 291 }
273 292
274 TEST_F(AssignmentSourceTest, TestForbidden) { 293 TEST_F(AssignmentSourceTest, TestForbidden) {
275 EXPECT_CALL(*this, AssignmentResponse( 294 EXPECT_CALL(*this, AssignmentResponse(
276 AssignmentSource::Result::RESULT_USER_INVALID, _)); 295 AssignmentSource::Result::RESULT_USER_INVALID, _));
277 GetNetworkAssignmentAndWaitForResponse(net::HTTP_FORBIDDEN, net::Error::OK, 296 GetNetworkAssignmentAndWaitForResponse(net::HTTP_FORBIDDEN, net::Error::OK,
278 "", "UserAuthT0kenz", kEngineVersion); 297 "", kTestAuthToken, kEngineVersion);
279 } 298 }
280 299
281 TEST_F(AssignmentSourceTest, TestTooManyRequests) { 300 TEST_F(AssignmentSourceTest, TestTooManyRequests) {
282 EXPECT_CALL(*this, AssignmentResponse( 301 EXPECT_CALL(*this, AssignmentResponse(
283 AssignmentSource::Result::RESULT_OUT_OF_VMS, _)); 302 AssignmentSource::Result::RESULT_OUT_OF_VMS, _));
284 GetNetworkAssignmentAndWaitForResponse(static_cast<net::HttpStatusCode>(429), 303 GetNetworkAssignmentAndWaitForResponse(static_cast<net::HttpStatusCode>(429),
285 net::Error::OK, "", "UserAuthT0kenz", 304 net::Error::OK, "", kTestAuthToken,
286 kEngineVersion); 305 kEngineVersion);
287 } 306 }
288 307
289 TEST_F(AssignmentSourceTest, TestInternalServerError) { 308 TEST_F(AssignmentSourceTest, TestInternalServerError) {
290 EXPECT_CALL(*this, AssignmentResponse( 309 EXPECT_CALL(*this, AssignmentResponse(
291 AssignmentSource::Result::RESULT_SERVER_ERROR, _)); 310 AssignmentSource::Result::RESULT_SERVER_ERROR, _));
292 GetNetworkAssignmentAndWaitForResponse(net::HTTP_INTERNAL_SERVER_ERROR, 311 GetNetworkAssignmentAndWaitForResponse(net::HTTP_INTERNAL_SERVER_ERROR,
293 net::Error::OK, "", "UserAuthT0kenz", 312 net::Error::OK, "", kTestAuthToken,
294 kEngineVersion); 313 kEngineVersion);
295 } 314 }
296 315
297 TEST_F(AssignmentSourceTest, TestUnexpectedNetCodeFallback) { 316 TEST_F(AssignmentSourceTest, TestUnexpectedNetCodeFallback) {
298 EXPECT_CALL(*this, AssignmentResponse( 317 EXPECT_CALL(*this, AssignmentResponse(
299 AssignmentSource::Result::RESULT_BAD_RESPONSE, _)); 318 AssignmentSource::Result::RESULT_BAD_RESPONSE, _));
300 GetNetworkAssignmentAndWaitForResponse(net::HTTP_NOT_IMPLEMENTED, 319 GetNetworkAssignmentAndWaitForResponse(net::HTTP_NOT_IMPLEMENTED,
301 net::Error::OK, "", "UserAuthT0kenz", 320 net::Error::OK, "", kTestAuthToken,
302 kEngineVersion); 321 kEngineVersion);
303 } 322 }
304 323
305 TEST_F(AssignmentSourceTest, TestInvalidJsonResponse) { 324 TEST_F(AssignmentSourceTest, TestInvalidJsonResponse) {
306 Assignment assignment = BuildValidAssignment(); 325 Assignment assignment = BuildSslAssignment();
307 326
308 // Remove half the response. 327 // Remove half the response.
309 std::string response = BuildResponseFromAssignment(assignment); 328 std::string response = ValueToString(*BuildAssignerResponse());
310 response = response.substr(response.size() / 2); 329 response = response.substr(response.size() / 2);
311 330
312 EXPECT_CALL(*this, AssignmentResponse( 331 EXPECT_CALL(*this, AssignmentResponse(
313 AssignmentSource::Result::RESULT_BAD_RESPONSE, _)); 332 AssignmentSource::Result::RESULT_BAD_RESPONSE, _));
314 GetNetworkAssignmentAndWaitForResponse(net::HTTP_OK, net::Error::OK, response, 333 GetNetworkAssignmentAndWaitForResponse(net::HTTP_OK, net::Error::OK, response,
315 "UserAuthT0kenz", kEngineVersion); 334 kTestAuthToken, kEngineVersion);
316 } 335 }
317 336
318 TEST_F(AssignmentSourceTest, TestMissingResponsePort) { 337 TEST_F(AssignmentSourceTest, TestMissingResponsePort) {
319 // Purposely do not add the 'port' field to the response. 338 scoped_ptr<base::DictionaryValue> response = BuildAssignerResponse();
320 base::DictionaryValue dict; 339 response->Remove("port", nullptr);
321 dict.SetString("clientToken", "SecretT0kenz"); 340 EXPECT_CALL(*this, AssignmentResponse(
322 dict.SetString("host", "happywhales"); 341 AssignmentSource::Result::RESULT_BAD_RESPONSE, _));
323 dict.SetString("certificateFingerprint", "WhaleWhaleWhale"); 342 GetNetworkAssignmentAndWaitForResponse(net::HTTP_OK, net::Error::OK,
324 dict.SetString("certificate", "whaaaaaaaaaaaaale"); 343 ValueToString(*response),
344 kTestAuthToken, kEngineVersion);
345 }
325 346
326 std::string response; 347 TEST_F(AssignmentSourceTest, TestInvalidIPAddress) {
327 base::JSONWriter::Write(dict, &response); 348 scoped_ptr<base::DictionaryValue> response = BuildAssignerResponse();
349 response->SetString("host", "happywhales");
Ryan Sleevi 2016/03/02 19:18:14 Love the name, but make it happywhales.test (It's
Kevin M 2016/03/02 21:02:09 TIL the .test TLD!
328 350
329 EXPECT_CALL(*this, AssignmentResponse( 351 EXPECT_CALL(*this, AssignmentResponse(
330 AssignmentSource::Result::RESULT_BAD_RESPONSE, _)); 352 AssignmentSource::Result::RESULT_BAD_RESPONSE, _));
331 GetNetworkAssignmentAndWaitForResponse(net::HTTP_OK, net::Error::OK, response, 353 GetNetworkAssignmentAndWaitForResponse(net::HTTP_OK, net::Error::OK,
332 "UserAuthT0kenz", kEngineVersion); 354 ValueToString(*response),
355 kTestAuthToken, kEngineVersion);
333 } 356 }
334 357
335 TEST_F(AssignmentSourceTest, TestInvalidIPAddress) { 358 TEST_F(AssignmentSourceTest, TestMissingCert) {
336 // Purposely add an invalid IP field to the response. 359 scoped_ptr<base::DictionaryValue> response = BuildAssignerResponse();
337 base::DictionaryValue dict; 360 response->Remove("certificate", nullptr);
338 dict.SetString("clientToken", "SecretT0kenz");
339 dict.SetString("host", "happywhales");
340 dict.SetInteger("port", 500);
341 dict.SetString("certificateFingerprint", "WhaleWhaleWhale");
342 dict.SetString("certificate", "whaaaaaaaaaaaaale");
343
344 std::string response;
345 base::JSONWriter::Write(dict, &response);
346
347 EXPECT_CALL(*this, AssignmentResponse( 361 EXPECT_CALL(*this, AssignmentResponse(
348 AssignmentSource::Result::RESULT_BAD_RESPONSE, _)); 362 AssignmentSource::Result::RESULT_BAD_RESPONSE, _));
349 GetNetworkAssignmentAndWaitForResponse(net::HTTP_OK, net::Error::OK, response, 363 GetNetworkAssignmentAndWaitForResponse(net::HTTP_OK, net::Error::OK,
350 "UserAuthT0kenz", kEngineVersion); 364 ValueToString(*response),
365 kTestAuthToken, kEngineVersion);
366 }
367
368 TEST_F(AssignmentSourceTest, TestInvalidCert) {
369 scoped_ptr<base::DictionaryValue> response = BuildAssignerResponse();
370 response->SetString("certificate", "h4x0rz!");
371 EXPECT_CALL(*this, AssignmentResponse(
372 AssignmentSource::Result::RESULT_INVALID_CERT, _));
373 GetNetworkAssignmentAndWaitForResponse(net::HTTP_OK, net::Error::OK,
374 ValueToString(*response),
375 kTestAuthToken, kEngineVersion);
351 } 376 }
352 377
353 } // namespace 378 } // namespace
354 } // namespace client 379 } // namespace client
355 } // namespace blimp 380 } // namespace blimp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698