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

Side by Side Diff: remoting/test/chromoting_host_list_fetcher_unittest.cc

Issue 1212333011: Retrieved Hostlist information from Directory service. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleaned up fetcher code and added more unit test coverage. Created 5 years, 5 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
(Empty)
1 // Copyright 2015 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 "remoting/test/chromoting_host_list_fetcher.h"
6
7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/run_loop.h"
10 #include "base/strings/stringprintf.h"
11 #include "net/url_request/test_url_fetcher_factory.h"
12 #include "remoting/test/chromoting_host_info.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace {
16 // Used as a ChromotingHostListCallback for testing.
17 void OnHostlistRetrieved(
18 base::Closure done_closure,
19 std::vector<remoting::test::ChromotingHostInfo>* hostlist,
20 const std::vector<remoting::test::ChromotingHostInfo>& retrieved_hostlist,
21 bool request_success) {
joedow 2015/07/08 17:19:08 What is request_success used for? Can you remove
tonychun 2015/07/08 22:38:16 Done.
22 *hostlist = retrieved_hostlist;
23
24 done_closure.Run();
25 }
26
27 const char kAccessTokenValue[] = "test_access_token_value";
28 const char kChromotingHostListReadyResponse[] =
29 "{"
30 " \"data\":{"
31 " \"kind\":\"chromoting#hostList\","
32 " \"items\":["
33 " {"
34 " \"tokenUrlPatterns\":["
35 " \"tokenUrlPattern_1A\","
36 " \"tokenUrlPattern_1B\","
37 " \"tokenUrlPattern_1C\""
38 " ],"
39 " \"kind\":\"chromoting#host\","
40 " \"hostId\":\"test_host_id_1\","
41 " \"hostName\":\"test_host_name_1\","
42 " \"publicKey\":\"test_public_key_1\","
43 " \"jabberId\":\"test_jabber_id_1\","
44 " \"createdTime\":\"test_created_time_1\","
45 " \"updatedTime\":\"test_updated_time_1\","
46 " \"status\":\"ONLINE\","
47 " \"hostOfflineReason\":\"\","
48 " \"hostVersion\":\"test_host_version_1\""
49 " },"
50 " {"
51 " \"kind\":\"chromoting#host\","
52 " \"hostId\":\"test_host_id_2\","
53 " \"hostName\":\"test_host_name_2\","
54 " \"publicKey\":\"test_public_key_2\","
55 " \"jabberId\":\"test_jabber_id_2\","
56 " \"createdTime\":\"test_created_time_2\","
57 " \"updatedTime\":\"test_updated_time_2\","
58 " \"status\":\"OFFLINE\","
59 " \"hostOfflineReason\":\"test_host_offline_reason_2\","
60 " \"hostVersion\":\"test_host_version_2\""
61 " }"
62 " ]"
63 " }"
64 "}";
65 const char kChromotingHostListMissingParametersResponse[] =
66 "{"
67 " \"data\":{"
68 " \"kind\":\"chromoting#hostList\","
69 " \"items\":["
70 " {"
71 " \"tokenUrlPatterns\":["
72 " \"tokenUrlPattern_1A\","
73 " \"tokenUrlPattern_1B\","
74 " \"tokenUrlPattern_1C\""
75 " ],"
76 " \"kind\":\"chromoting#host\","
77 " \"hostId\":\"test_host_id_1\","
78 " \"hostName\":\"test_host_name_1\","
79 " \"publicKey\":\"test_public_key_1\","
80 " \"createdTime\":\"test_created_time_1\","
81 " \"updatedTime\":\"test_updated_time_1\","
82 " \"status\":\"ONLINE\","
83 " \"hostOfflineReason\":\"\","
84 " \"hostVersion\":\"test_host_version_1\""
85 " },"
86 " {"
87 " \"kind\":\"chromoting#host\","
88 " \"hostName\":\"test_host_name_2\","
89 " \"publicKey\":\"test_public_key_2\","
90 " \"jabberId\":\"test_jabber_id_2\","
91 " \"createdTime\":\"test_created_time_2\","
92 " \"updatedTime\":\"test_updated_time_2\","
93 " \"status\":\"ONLINE\","
94 " \"hostOfflineReason\":\"\","
95 " \"hostVersion\":\"test_host_version_2\""
96 " },"
97 " {"
98 " \"kind\":\"chromoting#host\","
99 " \"hostId\":\"test_host_id_3\","
100 " \"publicKey\":\"test_public_key_3\","
101 " \"jabberId\":\"test_jabber_id_3\","
102 " \"createdTime\":\"test_created_time_3\","
103 " \"updatedTime\":\"test_updated_time_3\","
104 " \"status\":\"ONLINE\","
105 " \"hostOfflineReason\":\"\","
106 " \"hostVersion\":\"test_host_version_3\""
107 " },"
108 " {"
109 " \"kind\":\"chromoting#host\","
110 " \"hostId\":\"test_host_id_4\","
111 " \"hostName\":\"test_host_name_4\","
112 " \"jabberId\":\"test_jabber_id_4\","
113 " \"createdTime\":\"test_created_time_4\","
114 " \"updatedTime\":\"test_updated_time_4\","
115 " \"status\":\"ONLINE\","
116 " \"hostOfflineReason\":\"\","
117 " \"hostVersion\":\"test_host_version_4\""
118 " },"
119 " {"
120 " \"kind\":\"chromoting#host\","
121 " \"hostId\":\"test_host_id_5\","
122 " \"hostName\":\"test_host_name_5\","
123 " \"publicKey\":\"test_public_key_5\","
124 " \"jabberId\":\"test_jabber_id_5\","
125 " \"createdTime\":\"test_created_time_5\","
126 " \"updatedTime\":\"test_updated_time_5\","
127 " \"status\":\"OFFLINE\","
128 " \"hostVersion\":\"test_host_version_5\""
129 " }"
130 " ]"
131 " }"
132 "}";
joedow 2015/07/08 17:19:08 Good mixture of data for testing, thanks for addin
tonychun 2015/07/08 22:38:16 Acknowledged.
133 const char kChromotingHostListEmptyTokenUrlPatternsResponse[] =
134 "{"
135 " \"data\":{"
136 " \"kind\":\"chromoting#hostList\","
137 " \"items\":["
138 " {"
139 " \"tokenUrlPatterns\":["
140 " ],"
141 " \"kind\":\"chromoting#host\","
142 " \"hostId\":\"test_host_id_1\","
143 " \"hostName\":\"test_host_name_1\","
144 " \"publicKey\":\"test_public_key_1\","
145 " \"jabberId\":\"test_jabber_id_1\","
146 " \"createdTime\":\"test_created_time_1\","
147 " \"updatedTime\":\"test_updated_time_1\","
148 " \"status\":\"ONLINE\","
149 " \"hostOfflineReason\":\"\","
150 " \"hostVersion\":\"test_host_version_1\""
151 " }"
152 " ]"
153 " }"
154 "}";
155 const char kChromotingHostListEmptyItemsResponse[] =
156 "{"
157 " \"data\":{"
158 " \"kind\":\"chromoting#hostList\","
159 " \"items\":["
160 " ]"
161 " }"
162 "}";
163 const char kChromotingHostListEmptyResponse[] = "{}";
164 } // namespace
165
166 namespace remoting {
167 namespace test {
168
169 // Provides base functionality for the ChromotingHostListFetcher Tests below.
170 // The FakeURLFetcherFactory allows us to override the response data and payload
171 // for specified URLs. We use this to stub out network calls made by the
172 // ChromotingHostListFetcher. This fixture also creates an IO MessageLoop
joedow 2015/07/08 17:19:08 nit: You can just say MessageLoop here, you don't
tonychun 2015/07/08 22:38:16 Done.
173 // for use by the ChromotingHostListFetcher.
174 class ChromotingHostListFetcherTest : public ::testing::Test {
175 public:
176 ChromotingHostListFetcherTest() : url_fetcher_factory_(nullptr) {}
177 ~ChromotingHostListFetcherTest() override {}
178
179 protected:
180 // testing::Test interface.
181 void SetUp() override;
182
183 // Sets the HTTP status and data returned for a specified URL.
184 void SetFakeResponse(const GURL& url,
185 const std::string& data,
186 net::HttpStatusCode code,
187 net::URLRequestStatus::Status status);
188
189 private:
190 net::FakeURLFetcherFactory url_fetcher_factory_;
191 scoped_ptr<base::MessageLoopForIO> message_loop_;
192
193 DISALLOW_COPY_AND_ASSIGN(ChromotingHostListFetcherTest);
194 };
195
196 void ChromotingHostListFetcherTest::SetUp() {
197 DCHECK(!message_loop_);
198 message_loop_.reset(new base::MessageLoopForIO);
199
200 SetFakeResponse(GURL(kChromotingHostListProdRequestUrl),
201 kChromotingHostListEmptyResponse, net::HTTP_NOT_FOUND,
202 net::URLRequestStatus::FAILED);
203 }
204
205 void ChromotingHostListFetcherTest::SetFakeResponse(
206 const GURL& url,
207 const std::string& data,
208 net::HttpStatusCode code,
209 net::URLRequestStatus::Status status) {
210 url_fetcher_factory_.SetFakeResponse(url, data, code, status);
211 }
212
213 TEST_F(ChromotingHostListFetcherTest, RetrieveHostListFromProd) {
214 SetFakeResponse(GURL(kChromotingHostListProdRequestUrl),
215 kChromotingHostListReadyResponse, net::HTTP_OK,
216 net::URLRequestStatus::SUCCESS);
217
218 std::vector<ChromotingHostInfo> hostlist;
219
220 base::RunLoop run_loop;
221 ChromotingHostListFetcher::HostlistCallback hostlist_fetch_callback =
222 base::Bind(&OnHostlistRetrieved, run_loop.QuitClosure(), &hostlist);
223
224 ChromotingHostListFetcher chromoting_host_list_fetcher;
225 chromoting_host_list_fetcher.RetrieveHostlist(kAccessTokenValue,
226 hostlist_fetch_callback);
227
228 run_loop.Run();
229
230 const unsigned int expected_host_list_size = 2;
231 EXPECT_EQ(hostlist.size(), expected_host_list_size);
232
233 ChromotingHostInfo online_chromoting_host_info = hostlist.at(0);
234 const unsigned int expected_patterns_size = 3;
235 EXPECT_EQ(online_chromoting_host_info.token_url_patterns.size(),
236 expected_patterns_size);
237 EXPECT_FALSE(online_chromoting_host_info.host_id.empty());
238 EXPECT_FALSE(online_chromoting_host_info.host_jid.empty());
239 EXPECT_FALSE(online_chromoting_host_info.host_name.empty());
240 EXPECT_EQ(online_chromoting_host_info.status,
241 ChromotingHostStatus::kChromotingHostStatusOnline);
joedow 2015/07/08 17:19:08 nit: this line would look better if the params wer
tonychun 2015/07/08 22:38:16 Done.
242 EXPECT_TRUE(online_chromoting_host_info.offline_reason.empty());
243 EXPECT_FALSE(online_chromoting_host_info.public_key.empty());
244
245 ChromotingHostInfo offline_chromoting_host_info = hostlist.at(1);
246 EXPECT_TRUE(offline_chromoting_host_info.token_url_patterns.empty());
247 EXPECT_FALSE(offline_chromoting_host_info.host_id.empty());
248 EXPECT_FALSE(offline_chromoting_host_info.host_jid.empty());
249 EXPECT_FALSE(offline_chromoting_host_info.host_name.empty());
250 EXPECT_EQ(offline_chromoting_host_info.status,
251 ChromotingHostStatus::kChromotingHostStatusOffline);
252 EXPECT_FALSE(offline_chromoting_host_info.offline_reason.empty());
253 EXPECT_FALSE(offline_chromoting_host_info.public_key.empty());
254 }
255
256 TEST_F(ChromotingHostListFetcherTest, RetrieveHostListWithEmptyPatterns) {
257 SetFakeResponse(
258 GURL(kChromotingHostListProdRequestUrl),
259 kChromotingHostListEmptyTokenUrlPatternsResponse, net::HTTP_OK,
260 net::URLRequestStatus::SUCCESS);
261
262 std::vector<ChromotingHostInfo> hostlist;
263
264 base::RunLoop run_loop;
265 ChromotingHostListFetcher::HostlistCallback hostlist_fetch_callback =
266 base::Bind(&OnHostlistRetrieved, run_loop.QuitClosure(), &hostlist);
267
268 ChromotingHostListFetcher chromoting_host_list_fetcher;
269 chromoting_host_list_fetcher.RetrieveHostlist(kAccessTokenValue,
270 hostlist_fetch_callback);
271
272 run_loop.Run();
273
274 const unsigned int expected_host_list_size = 1;
275 EXPECT_EQ(hostlist.size(), expected_host_list_size);
276
277 // While this is unlikely to happen, empty token url patterns are handled.
278 ChromotingHostInfo online_chromoting_host_info = hostlist.at(0);
279 EXPECT_TRUE(online_chromoting_host_info.token_url_patterns.empty());
280 EXPECT_FALSE(online_chromoting_host_info.host_id.empty());
281 EXPECT_FALSE(online_chromoting_host_info.host_jid.empty());
282 EXPECT_FALSE(online_chromoting_host_info.host_name.empty());
283 EXPECT_EQ(online_chromoting_host_info.status,
284 ChromotingHostStatus::kChromotingHostStatusOnline);
285 EXPECT_TRUE(online_chromoting_host_info.offline_reason.empty());
286 EXPECT_FALSE(online_chromoting_host_info.public_key.empty());
287 }
288
289 TEST_F(ChromotingHostListFetcherTest,
290 RetrieveHostListMissingParametersResponse) {
291 SetFakeResponse(GURL(kChromotingHostListProdRequestUrl),
292 kChromotingHostListMissingParametersResponse, net::HTTP_OK,
293 net::URLRequestStatus::SUCCESS);
294
295 std::vector<ChromotingHostInfo> hostlist;
296
297 base::RunLoop run_loop;
298 ChromotingHostListFetcher::HostlistCallback hostlist_fetch_callback =
299 base::Bind(&OnHostlistRetrieved, run_loop.QuitClosure(), &hostlist);
300
301 ChromotingHostListFetcher chromoting_host_list_fetcher;
302 chromoting_host_list_fetcher.RetrieveHostlist(kAccessTokenValue,
303 hostlist_fetch_callback);
304 run_loop.Run();
305
306 const unsigned int expected_host_list_size = 2;
307 EXPECT_EQ(hostlist.size(), expected_host_list_size);
308
309 ChromotingHostInfo missing_jabber_id_host_info = hostlist.at(0);
310 const unsigned int expected_patterns_size = 3;
311 EXPECT_EQ(missing_jabber_id_host_info.token_url_patterns.size(),
312 expected_patterns_size);
313 EXPECT_FALSE(missing_jabber_id_host_info.host_id.empty());
314 EXPECT_TRUE(missing_jabber_id_host_info.host_jid.empty());
315 EXPECT_FALSE(missing_jabber_id_host_info.host_name.empty());
316 EXPECT_EQ(missing_jabber_id_host_info.status,
317 ChromotingHostStatus::kChromotingHostStatusOnline);
318 EXPECT_TRUE(missing_jabber_id_host_info.offline_reason.empty());
319 EXPECT_FALSE(missing_jabber_id_host_info.public_key.empty());
320
321 ChromotingHostInfo missing_offline_reason_host_info = hostlist.at(1);
322 EXPECT_TRUE(missing_offline_reason_host_info.token_url_patterns.empty());
323 EXPECT_FALSE(missing_offline_reason_host_info.host_id.empty());
324 EXPECT_FALSE(missing_offline_reason_host_info.host_jid.empty());
325 EXPECT_FALSE(missing_offline_reason_host_info.host_name.empty());
326 EXPECT_EQ(missing_offline_reason_host_info.status,
327 ChromotingHostStatus::kChromotingHostStatusOffline);
328 EXPECT_TRUE(missing_offline_reason_host_info.offline_reason.empty());
329 EXPECT_FALSE(missing_offline_reason_host_info.public_key.empty());
330 }
331
332
333 TEST_F(ChromotingHostListFetcherTest, RetrieveHostListNetworkError) {
334 base::RunLoop run_loop;
335
336 std::vector<ChromotingHostInfo> hostlist;
337
338 ChromotingHostListFetcher::HostlistCallback hostlist_fetch_callback =
339 base::Bind(&OnHostlistRetrieved, run_loop.QuitClosure(), &hostlist);
340
341 ChromotingHostListFetcher chromoting_host_list_fetcher;
342 chromoting_host_list_fetcher.RetrieveHostlist(kAccessTokenValue,
343 hostlist_fetch_callback);
344 run_loop.Run();
345
346 // If there was a network error retrieving the host list, then the host list
347 // should be empty.
348 EXPECT_TRUE(hostlist.empty());
349 }
350
351 TEST_F(ChromotingHostListFetcherTest, RetrieveHostListEmptyItemsResponse) {
352 SetFakeResponse(GURL(kChromotingHostListProdRequestUrl),
353 kChromotingHostListEmptyItemsResponse, net::HTTP_OK,
354 net::URLRequestStatus::SUCCESS);
355
356 base::RunLoop run_loop;
357
358 std::vector<ChromotingHostInfo> hostlist;
359
360 ChromotingHostListFetcher::HostlistCallback hostlist_fetch_callback =
361 base::Bind(&OnHostlistRetrieved, run_loop.QuitClosure(), &hostlist);
362
363 ChromotingHostListFetcher chromoting_host_list_fetcher;
364 chromoting_host_list_fetcher.RetrieveHostlist(kAccessTokenValue,
365 hostlist_fetch_callback);
366 run_loop.Run();
367
368 // If we received an empty items response, then host list should be empty.
369 EXPECT_TRUE(hostlist.empty());
370 }
371
372 TEST_F(ChromotingHostListFetcherTest, RetrieveHostListEmptyResponse) {
373 SetFakeResponse(GURL(kChromotingHostListProdRequestUrl),
374 kChromotingHostListEmptyResponse, net::HTTP_OK,
375 net::URLRequestStatus::SUCCESS);
376
377 base::RunLoop run_loop;
378
379 std::vector<ChromotingHostInfo> hostlist;
380
381 ChromotingHostListFetcher::HostlistCallback hostlist_fetch_callback =
382 base::Bind(&OnHostlistRetrieved, run_loop.QuitClosure(), &hostlist);
383
384 ChromotingHostListFetcher chromoting_host_list_fetcher;
385 chromoting_host_list_fetcher.RetrieveHostlist(kAccessTokenValue,
386 hostlist_fetch_callback);
387 run_loop.Run();
388
389 // If we received an empty response, then host list should be empty.
390 EXPECT_TRUE(hostlist.empty());
391 }
392
393 TEST_F(ChromotingHostListFetcherTest, MultipleRetrieveHostListRequests) {
394 // First, we will retrieve a valid response from the Directory
395 SetFakeResponse(GURL(kChromotingHostListProdRequestUrl),
396 kChromotingHostListReadyResponse, net::HTTP_OK,
397 net::URLRequestStatus::SUCCESS);
398
399 std::vector<ChromotingHostInfo> ready_hostlist;
400
401 base::RunLoop ready_run_loop;
402 ChromotingHostListFetcher::HostlistCallback ready_hostlist_fetch_callback =
403 base::Bind(&OnHostlistRetrieved,
404 ready_run_loop.QuitClosure(),
405 &ready_hostlist);
406
407 ChromotingHostListFetcher chromoting_host_list_fetcher;
408 chromoting_host_list_fetcher.RetrieveHostlist(kAccessTokenValue,
409 ready_hostlist_fetch_callback);
410
411 ready_run_loop.Run();
412
413 const unsigned int expected_host_list_size = 2;
414 EXPECT_EQ(ready_hostlist.size(), expected_host_list_size);
415
416 ChromotingHostInfo online_chromoting_host_info = ready_hostlist.at(0);
417 const unsigned int expected_patterns_size = 3;
418 EXPECT_EQ(online_chromoting_host_info.token_url_patterns.size(),
419 expected_patterns_size);
420 EXPECT_FALSE(online_chromoting_host_info.host_id.empty());
421 EXPECT_FALSE(online_chromoting_host_info.host_jid.empty());
422 EXPECT_FALSE(online_chromoting_host_info.host_name.empty());
423 EXPECT_EQ(online_chromoting_host_info.status,
424 ChromotingHostStatus::kChromotingHostStatusOnline);
425 EXPECT_TRUE(online_chromoting_host_info.offline_reason.empty());
426 EXPECT_FALSE(online_chromoting_host_info.public_key.empty());
427
428 ChromotingHostInfo offline_chromoting_host_info = ready_hostlist.at(1);
429 EXPECT_TRUE(offline_chromoting_host_info.token_url_patterns.empty());
430 EXPECT_FALSE(offline_chromoting_host_info.host_id.empty());
431 EXPECT_FALSE(offline_chromoting_host_info.host_jid.empty());
432 EXPECT_FALSE(offline_chromoting_host_info.host_name.empty());
433 EXPECT_EQ(offline_chromoting_host_info.status,
434 ChromotingHostStatus::kChromotingHostStatusOffline);
435 EXPECT_FALSE(offline_chromoting_host_info.offline_reason.empty());
436 EXPECT_FALSE(offline_chromoting_host_info.public_key.empty());
437
438 // Next, we will retrieve an empty items response from the Directory
439 SetFakeResponse(GURL(kChromotingHostListProdRequestUrl),
440 kChromotingHostListEmptyItemsResponse, net::HTTP_OK,
441 net::URLRequestStatus::SUCCESS);
442
443 std::vector<ChromotingHostInfo> empty_items_hostlist;
444
445 base::RunLoop empty_items_run_loop;
446
447 ChromotingHostListFetcher::HostlistCallback empty_hostlist_fetch_callback =
448 base::Bind(&OnHostlistRetrieved,
449 empty_items_run_loop.QuitClosure(),
450 &empty_items_hostlist);
451
452 // Re-use the same chromoting_host_list_fetcher
453 chromoting_host_list_fetcher.RetrieveHostlist(kAccessTokenValue,
454 empty_hostlist_fetch_callback);
455
456 empty_items_run_loop.Run();
457 // If we received an empty items response, then host list should be empty.
458 EXPECT_TRUE(empty_items_hostlist.empty());
459 }
460
461 } // namespace test
462 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698