OLD | NEW |
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 <map> | 5 #include <map> |
6 #include <utility> | 6 #include <utility> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
11 #include "base/files/scoped_temp_dir.h" | 11 #include "base/files/scoped_temp_dir.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
14 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
15 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
16 #include "base/strings/stringprintf.h" | 16 #include "base/strings/stringprintf.h" |
| 17 #include "base/test/scoped_task_environment.h" |
17 #include "base/test/test_message_loop.h" | 18 #include "base/test/test_message_loop.h" |
18 #include "base/threading/sequenced_task_runner_handle.h" | 19 #include "base/threading/sequenced_task_runner_handle.h" |
19 #include "base/threading/thread_task_runner_handle.h" | 20 #include "base/threading/thread_task_runner_handle.h" |
20 #include "chromeos/chromeos_paths.h" | 21 #include "chromeos/chromeos_paths.h" |
21 #include "chromeos/printing/ppd_cache.h" | 22 #include "chromeos/printing/ppd_cache.h" |
22 #include "chromeos/printing/ppd_provider.h" | 23 #include "chromeos/printing/ppd_provider.h" |
23 #include "net/url_request/test_url_request_interceptor.h" | 24 #include "net/url_request/test_url_request_interceptor.h" |
24 #include "net/url_request/url_request_test_util.h" | 25 #include "net/url_request/url_request_test_util.h" |
25 #include "testing/gtest/include/gtest/gtest.h" | 26 #include "testing/gtest/include/gtest/gtest.h" |
26 | 27 |
(...skipping 25 matching lines...) Expand all Loading... |
52 More random contents that we don't care about | 53 More random contents that we don't care about |
53 *cupsFilter2: "foo bar 0 the_real_filter" | 54 *cupsFilter2: "foo bar 0 the_real_filter" |
54 *cupsFilter2: "bar baz 381 another_real_filter" | 55 *cupsFilter2: "bar baz 381 another_real_filter" |
55 Yet more randome contents that we don't care about. | 56 Yet more randome contents that we don't care about. |
56 More random contents that we don't care about. | 57 More random contents that we don't care about. |
57 )"; | 58 )"; |
58 | 59 |
59 class PpdProviderTest : public ::testing::Test { | 60 class PpdProviderTest : public ::testing::Test { |
60 public: | 61 public: |
61 PpdProviderTest() | 62 PpdProviderTest() |
62 : loop_(base::MessageLoop::TYPE_IO), | 63 : scoped_task_environment_( |
| 64 base::test::ScopedTaskEnvironment::MainThreadType::IO), |
63 request_context_getter_(new net::TestURLRequestContextGetter( | 65 request_context_getter_(new net::TestURLRequestContextGetter( |
64 base::MessageLoop::current()->task_runner())) {} | 66 scoped_task_environment_.GetMainThreadTaskRunner())) {} |
65 | 67 |
66 void SetUp() override { | 68 void SetUp() override { |
67 ASSERT_TRUE(ppd_cache_temp_dir_.CreateUniqueTempDir()); | 69 ASSERT_TRUE(ppd_cache_temp_dir_.CreateUniqueTempDir()); |
68 } | 70 } |
69 | 71 |
70 void TearDown() override { StopFakePpdServer(); } | 72 void TearDown() override { StopFakePpdServer(); } |
71 | 73 |
72 // Create and return a provider for a test that uses the given |locale|. | 74 // Create and return a provider for a test that uses the given |locale|. |
73 scoped_refptr<PpdProvider> CreateProvider(const std::string& locale) { | 75 scoped_refptr<PpdProvider> CreateProvider(const std::string& locale) { |
74 auto provider_options = PpdProvider::Options(); | 76 auto provider_options = PpdProvider::Options(); |
75 provider_options.ppd_server_root = std::string("https://") + kPpdServer; | 77 provider_options.ppd_server_root = std::string("https://") + kPpdServer; |
76 | 78 |
77 return PpdProvider::Create( | 79 return PpdProvider::Create(locale, request_context_getter_.get(), |
78 locale, request_context_getter_.get(), | 80 PpdCache::Create(ppd_cache_temp_dir_.GetPath()), |
79 PpdCache::Create(ppd_cache_temp_dir_.GetPath(), | 81 provider_options); |
80 base::MessageLoop::current()->task_runner()), | |
81 loop_.task_runner().get(), provider_options); | |
82 } | 82 } |
83 | 83 |
84 // Create an interceptor that serves a small fileset of ppd server files. | 84 // Create an interceptor that serves a small fileset of ppd server files. |
85 void StartFakePpdServer() { | 85 void StartFakePpdServer() { |
86 ASSERT_TRUE(interceptor_temp_dir_.CreateUniqueTempDir()); | 86 ASSERT_TRUE(interceptor_temp_dir_.CreateUniqueTempDir()); |
87 interceptor_ = base::MakeUnique<net::TestURLRequestInterceptor>( | 87 interceptor_ = base::MakeUnique<net::TestURLRequestInterceptor>( |
88 "https", kPpdServer, base::ThreadTaskRunnerHandle::Get(), | 88 "https", kPpdServer, scoped_task_environment_.GetMainThreadTaskRunner(), |
89 base::ThreadTaskRunnerHandle::Get()); | 89 scoped_task_environment_.GetMainThreadTaskRunner()); |
90 // Use brace initialization to express the desired server contents as "url", | 90 // Use brace initialization to express the desired server contents as "url", |
91 // "contents" pairs. | 91 // "contents" pairs. |
92 std::vector<std::pair<std::string, std::string>> server_contents = { | 92 std::vector<std::pair<std::string, std::string>> server_contents = { |
93 {"metadata/locales.json", | 93 {"metadata/locales.json", |
94 R"(["en", | 94 R"(["en", |
95 "es-mx", | 95 "es-mx", |
96 "en-gb"])"}, | 96 "en-gb"])"}, |
97 {"metadata/index.json", | 97 {"metadata/index.json", |
98 R"([ | 98 R"([ |
99 ["printer_a_ref", "printer_a.ppd"], | 99 ["printer_a_ref", "printer_a.ppd"], |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 | 150 |
151 // Interceptor posts a *task* during destruction that actually unregisters | 151 // Interceptor posts a *task* during destruction that actually unregisters |
152 // things. So we have to run the message loop post-interceptor-destruction to | 152 // things. So we have to run the message loop post-interceptor-destruction to |
153 // actually unregister the URLs, otherwise they won't *actually* be | 153 // actually unregister the URLs, otherwise they won't *actually* be |
154 // unregistered until the next time we invoke the message loop. Which may be | 154 // unregistered until the next time we invoke the message loop. Which may be |
155 // in the middle of the next test. | 155 // in the middle of the next test. |
156 // | 156 // |
157 // Note this is harmless to call if we haven't started a fake ppd server. | 157 // Note this is harmless to call if we haven't started a fake ppd server. |
158 void StopFakePpdServer() { | 158 void StopFakePpdServer() { |
159 interceptor_.reset(); | 159 interceptor_.reset(); |
160 base::RunLoop().RunUntilIdle(); | 160 scoped_task_environment_.RunUntilIdle(); |
161 } | 161 } |
162 | 162 |
163 // Capture the result of a ResolveManufacturers() call. | 163 // Capture the result of a ResolveManufacturers() call. |
164 void CaptureResolveManufacturers(PpdProvider::CallbackResultCode code, | 164 void CaptureResolveManufacturers(PpdProvider::CallbackResultCode code, |
165 const std::vector<std::string>& data) { | 165 const std::vector<std::string>& data) { |
166 captured_resolve_manufacturers_.push_back({code, data}); | 166 captured_resolve_manufacturers_.push_back({code, data}); |
167 } | 167 } |
168 | 168 |
169 // Capture the result of a ResolvePrinters() call. | 169 // Capture the result of a ResolvePrinters() call. |
170 void CaptureResolvePrinters(PpdProvider::CallbackResultCode code, | 170 void CaptureResolvePrinters(PpdProvider::CallbackResultCode code, |
(...skipping 24 matching lines...) Expand all Loading... |
195 | 195 |
196 protected: | 196 protected: |
197 // Run a ResolveManufacturers run from the given locale, expect to get | 197 // Run a ResolveManufacturers run from the given locale, expect to get |
198 // results in expected_used_locale. | 198 // results in expected_used_locale. |
199 void RunLocalizationTest(const std::string& browser_locale, | 199 void RunLocalizationTest(const std::string& browser_locale, |
200 const std::string& expected_used_locale) { | 200 const std::string& expected_used_locale) { |
201 captured_resolve_manufacturers_.clear(); | 201 captured_resolve_manufacturers_.clear(); |
202 auto provider = CreateProvider(browser_locale); | 202 auto provider = CreateProvider(browser_locale); |
203 provider->ResolveManufacturers(base::Bind( | 203 provider->ResolveManufacturers(base::Bind( |
204 &PpdProviderTest::CaptureResolveManufacturers, base::Unretained(this))); | 204 &PpdProviderTest::CaptureResolveManufacturers, base::Unretained(this))); |
205 base::RunLoop().RunUntilIdle(); | 205 scoped_task_environment_.RunUntilIdle(); |
206 provider = nullptr; | 206 provider = nullptr; |
207 ASSERT_EQ(captured_resolve_manufacturers_.size(), 1UL); | 207 ASSERT_EQ(captured_resolve_manufacturers_.size(), 1UL); |
208 EXPECT_EQ(captured_resolve_manufacturers_[0].first, PpdProvider::SUCCESS); | 208 EXPECT_EQ(captured_resolve_manufacturers_[0].first, PpdProvider::SUCCESS); |
209 | 209 |
210 const auto& result_vec = captured_resolve_manufacturers_[0].second; | 210 const auto& result_vec = captured_resolve_manufacturers_[0].second; |
211 | 211 |
212 // It's sufficient to check for one of the expected locale keys to make sure | 212 // It's sufficient to check for one of the expected locale keys to make sure |
213 // we got the right map. | 213 // we got the right map. |
214 EXPECT_FALSE(std::find(result_vec.begin(), result_vec.end(), | 214 EXPECT_FALSE(std::find(result_vec.begin(), result_vec.end(), |
215 "manufacturer_a_" + expected_used_locale) == | 215 "manufacturer_a_" + expected_used_locale) == |
216 result_vec.end()); | 216 result_vec.end()); |
217 } | 217 } |
218 | 218 |
219 // Drain tasks both on the loop we use for network/disk activity and the | 219 // Environment for task schedulers. |
220 // top-level loop that we're using in the test itself. Unfortunately, even | 220 base::test::ScopedTaskEnvironment scoped_task_environment_; |
221 // thought the TestURLRequestContextGetter tells the url fetcher to run on the | |
222 // current message loop, some deep backend processes can get put into other | |
223 // loops, which means we can't just trust RunLoop::RunUntilIdle() to drain | |
224 // outstanding work. | |
225 void Drain(const PpdProvider& provider) { | |
226 do { | |
227 base::RunLoop().RunUntilIdle(); | |
228 } while (!provider.Idle()); | |
229 } | |
230 | |
231 // Message loop that runs on the current thread. | |
232 base::TestMessageLoop loop_; | |
233 | 221 |
234 std::vector< | 222 std::vector< |
235 std::pair<PpdProvider::CallbackResultCode, std::vector<std::string>>> | 223 std::pair<PpdProvider::CallbackResultCode, std::vector<std::string>>> |
236 captured_resolve_manufacturers_; | 224 captured_resolve_manufacturers_; |
237 | 225 |
238 std::vector< | 226 std::vector< |
239 std::pair<PpdProvider::CallbackResultCode, std::vector<std::string>>> | 227 std::pair<PpdProvider::CallbackResultCode, std::vector<std::string>>> |
240 captured_resolve_printers_; | 228 captured_resolve_printers_; |
241 | 229 |
242 struct CapturedResolvePpdResults { | 230 struct CapturedResolvePpdResults { |
(...skipping 21 matching lines...) Expand all Loading... |
264 | 252 |
265 // Test that we get back manufacturer maps as expected. | 253 // Test that we get back manufacturer maps as expected. |
266 TEST_F(PpdProviderTest, ManufacturersFetch) { | 254 TEST_F(PpdProviderTest, ManufacturersFetch) { |
267 StartFakePpdServer(); | 255 StartFakePpdServer(); |
268 auto provider = CreateProvider("en"); | 256 auto provider = CreateProvider("en"); |
269 // Issue two requests at the same time, both should be resolved properly. | 257 // Issue two requests at the same time, both should be resolved properly. |
270 provider->ResolveManufacturers(base::Bind( | 258 provider->ResolveManufacturers(base::Bind( |
271 &PpdProviderTest::CaptureResolveManufacturers, base::Unretained(this))); | 259 &PpdProviderTest::CaptureResolveManufacturers, base::Unretained(this))); |
272 provider->ResolveManufacturers(base::Bind( | 260 provider->ResolveManufacturers(base::Bind( |
273 &PpdProviderTest::CaptureResolveManufacturers, base::Unretained(this))); | 261 &PpdProviderTest::CaptureResolveManufacturers, base::Unretained(this))); |
274 Drain(*provider); | 262 scoped_task_environment_.RunUntilIdle(); |
275 ASSERT_EQ(2UL, captured_resolve_manufacturers_.size()); | 263 ASSERT_EQ(2UL, captured_resolve_manufacturers_.size()); |
276 std::vector<std::string> expected_result( | 264 std::vector<std::string> expected_result( |
277 {"manufacturer_a_en", "manufacturer_b_en"}); | 265 {"manufacturer_a_en", "manufacturer_b_en"}); |
278 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_manufacturers_[0].first); | 266 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_manufacturers_[0].first); |
279 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_manufacturers_[1].first); | 267 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_manufacturers_[1].first); |
280 EXPECT_TRUE(captured_resolve_manufacturers_[0].second == expected_result); | 268 EXPECT_TRUE(captured_resolve_manufacturers_[0].second == expected_result); |
281 EXPECT_TRUE(captured_resolve_manufacturers_[1].second == expected_result); | 269 EXPECT_TRUE(captured_resolve_manufacturers_[1].second == expected_result); |
282 } | 270 } |
283 | 271 |
284 // Test that we get a reasonable error when we have no server to contact. Tis | 272 // Test that we get a reasonable error when we have no server to contact. Tis |
285 // is almost exactly the same as the above test, we just don't bring up the fake | 273 // is almost exactly the same as the above test, we just don't bring up the fake |
286 // server first. | 274 // server first. |
287 TEST_F(PpdProviderTest, ManufacturersFetchNoServer) { | 275 TEST_F(PpdProviderTest, ManufacturersFetchNoServer) { |
288 auto provider = CreateProvider("en"); | 276 auto provider = CreateProvider("en"); |
289 // Issue two requests at the same time, both should be resolved properly. | 277 // Issue two requests at the same time, both should be resolved properly. |
290 provider->ResolveManufacturers(base::Bind( | 278 provider->ResolveManufacturers(base::Bind( |
291 &PpdProviderTest::CaptureResolveManufacturers, base::Unretained(this))); | 279 &PpdProviderTest::CaptureResolveManufacturers, base::Unretained(this))); |
292 provider->ResolveManufacturers(base::Bind( | 280 provider->ResolveManufacturers(base::Bind( |
293 &PpdProviderTest::CaptureResolveManufacturers, base::Unretained(this))); | 281 &PpdProviderTest::CaptureResolveManufacturers, base::Unretained(this))); |
294 Drain(*provider); | 282 scoped_task_environment_.RunUntilIdle(); |
295 ASSERT_EQ(2UL, captured_resolve_manufacturers_.size()); | 283 ASSERT_EQ(2UL, captured_resolve_manufacturers_.size()); |
296 EXPECT_EQ(PpdProvider::SERVER_ERROR, | 284 EXPECT_EQ(PpdProvider::SERVER_ERROR, |
297 captured_resolve_manufacturers_[0].first); | 285 captured_resolve_manufacturers_[0].first); |
298 EXPECT_EQ(PpdProvider::SERVER_ERROR, | 286 EXPECT_EQ(PpdProvider::SERVER_ERROR, |
299 captured_resolve_manufacturers_[1].first); | 287 captured_resolve_manufacturers_[1].first); |
300 EXPECT_TRUE(captured_resolve_manufacturers_[0].second.empty()); | 288 EXPECT_TRUE(captured_resolve_manufacturers_[0].second.empty()); |
301 EXPECT_TRUE(captured_resolve_manufacturers_[1].second.empty()); | 289 EXPECT_TRUE(captured_resolve_manufacturers_[1].second.empty()); |
302 } | 290 } |
303 | 291 |
304 // Test that we get things in the requested locale, and that fallbacks are sane. | 292 // Test that we get things in the requested locale, and that fallbacks are sane. |
(...skipping 25 matching lines...) Expand all Loading... |
330 base::Bind(&PpdProviderTest::CaptureResolveUsbIds, | 318 base::Bind(&PpdProviderTest::CaptureResolveUsbIds, |
331 base::Unretained(this))); | 319 base::Unretained(this))); |
332 | 320 |
333 // Nonexistant vendor id, should get a NOT_FOUND in the real world, but | 321 // Nonexistant vendor id, should get a NOT_FOUND in the real world, but |
334 // the URL interceptor we're using considers all nonexistant files to | 322 // the URL interceptor we're using considers all nonexistant files to |
335 // be effectively CONNECTION REFUSED, so we just check for non-success | 323 // be effectively CONNECTION REFUSED, so we just check for non-success |
336 // on this one. | 324 // on this one. |
337 provider->ResolveUsbIds(1234, 1782, | 325 provider->ResolveUsbIds(1234, 1782, |
338 base::Bind(&PpdProviderTest::CaptureResolveUsbIds, | 326 base::Bind(&PpdProviderTest::CaptureResolveUsbIds, |
339 base::Unretained(this))); | 327 base::Unretained(this))); |
340 Drain(*provider); | 328 scoped_task_environment_.RunUntilIdle(); |
341 | 329 |
342 ASSERT_EQ(captured_resolve_usb_ids_.size(), static_cast<size_t>(4)); | 330 ASSERT_EQ(captured_resolve_usb_ids_.size(), static_cast<size_t>(4)); |
343 EXPECT_EQ(captured_resolve_usb_ids_[0].first, PpdProvider::SUCCESS); | 331 EXPECT_EQ(captured_resolve_usb_ids_[0].first, PpdProvider::SUCCESS); |
344 EXPECT_EQ(captured_resolve_usb_ids_[0].second, "Some canonical reference"); | 332 EXPECT_EQ(captured_resolve_usb_ids_[0].second, "Some canonical reference"); |
345 EXPECT_EQ(captured_resolve_usb_ids_[1].first, PpdProvider::SUCCESS); | 333 EXPECT_EQ(captured_resolve_usb_ids_[1].first, PpdProvider::SUCCESS); |
346 EXPECT_EQ(captured_resolve_usb_ids_[1].second, | 334 EXPECT_EQ(captured_resolve_usb_ids_[1].second, |
347 "Some other canonical reference"); | 335 "Some other canonical reference"); |
348 EXPECT_EQ(captured_resolve_usb_ids_[2].first, PpdProvider::NOT_FOUND); | 336 EXPECT_EQ(captured_resolve_usb_ids_[2].first, PpdProvider::NOT_FOUND); |
349 EXPECT_EQ(captured_resolve_usb_ids_[2].second, ""); | 337 EXPECT_EQ(captured_resolve_usb_ids_[2].second, ""); |
350 EXPECT_FALSE(captured_resolve_usb_ids_[3].first == PpdProvider::SUCCESS); | 338 EXPECT_FALSE(captured_resolve_usb_ids_[3].first == PpdProvider::SUCCESS); |
351 EXPECT_EQ(captured_resolve_usb_ids_[3].second, ""); | 339 EXPECT_EQ(captured_resolve_usb_ids_[3].second, ""); |
352 } | 340 } |
353 | 341 |
354 // For convenience a null ResolveManufacturers callback target. | 342 // For convenience a null ResolveManufacturers callback target. |
355 void ResolveManufacturersNop(PpdProvider::CallbackResultCode code, | 343 void ResolveManufacturersNop(PpdProvider::CallbackResultCode code, |
356 const std::vector<std::string>& v) {} | 344 const std::vector<std::string>& v) {} |
357 | 345 |
358 // Test basic ResolvePrinters() functionality. At the same time, make | 346 // Test basic ResolvePrinters() functionality. At the same time, make |
359 // sure we can get the PpdReference for each of the resolved printers. | 347 // sure we can get the PpdReference for each of the resolved printers. |
360 TEST_F(PpdProviderTest, ResolvePrinters) { | 348 TEST_F(PpdProviderTest, ResolvePrinters) { |
361 StartFakePpdServer(); | 349 StartFakePpdServer(); |
362 auto provider = CreateProvider("en"); | 350 auto provider = CreateProvider("en"); |
363 | 351 |
364 // Grab the manufacturer list, but don't bother to save it, we know what | 352 // Grab the manufacturer list, but don't bother to save it, we know what |
365 // should be in it and we check that elsewhere. We just need to run the | 353 // should be in it and we check that elsewhere. We just need to run the |
366 // resolve to populate the internal PpdProvider structures. | 354 // resolve to populate the internal PpdProvider structures. |
367 provider->ResolveManufacturers(base::Bind(&ResolveManufacturersNop)); | 355 provider->ResolveManufacturers(base::Bind(&ResolveManufacturersNop)); |
368 Drain(*provider); | 356 scoped_task_environment_.RunUntilIdle(); |
369 | 357 |
370 provider->ResolvePrinters("manufacturer_a_en", | 358 provider->ResolvePrinters("manufacturer_a_en", |
371 base::Bind(&PpdProviderTest::CaptureResolvePrinters, | 359 base::Bind(&PpdProviderTest::CaptureResolvePrinters, |
372 base::Unretained(this))); | 360 base::Unretained(this))); |
373 provider->ResolvePrinters("manufacturer_b_en", | 361 provider->ResolvePrinters("manufacturer_b_en", |
374 base::Bind(&PpdProviderTest::CaptureResolvePrinters, | 362 base::Bind(&PpdProviderTest::CaptureResolvePrinters, |
375 base::Unretained(this))); | 363 base::Unretained(this))); |
376 Drain(*provider); | 364 scoped_task_environment_.RunUntilIdle(); |
377 ASSERT_EQ(2UL, captured_resolve_printers_.size()); | 365 ASSERT_EQ(2UL, captured_resolve_printers_.size()); |
378 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_printers_[0].first); | 366 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_printers_[0].first); |
379 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_printers_[1].first); | 367 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_printers_[1].first); |
380 EXPECT_EQ(2UL, captured_resolve_printers_[0].second.size()); | 368 EXPECT_EQ(2UL, captured_resolve_printers_[0].second.size()); |
381 EXPECT_EQ(std::vector<std::string>({"printer_a", "printer_b"}), | 369 EXPECT_EQ(std::vector<std::string>({"printer_a", "printer_b"}), |
382 captured_resolve_printers_[0].second); | 370 captured_resolve_printers_[0].second); |
383 EXPECT_EQ(std::vector<std::string>({"printer_c"}), | 371 EXPECT_EQ(std::vector<std::string>({"printer_c"}), |
384 captured_resolve_printers_[1].second); | 372 captured_resolve_printers_[1].second); |
385 | 373 |
386 // We have manufacturers and models, we should be able to get a ppd out of | 374 // We have manufacturers and models, we should be able to get a ppd out of |
387 // this. | 375 // this. |
388 Printer::PpdReference ref; | 376 Printer::PpdReference ref; |
389 ASSERT_TRUE( | 377 ASSERT_TRUE( |
390 provider->GetPpdReference("manufacturer_a_en", "printer_b", &ref)); | 378 provider->GetPpdReference("manufacturer_a_en", "printer_b", &ref)); |
391 } | 379 } |
392 | 380 |
393 // Test that if we give a bad reference to ResolvePrinters(), we get an | 381 // Test that if we give a bad reference to ResolvePrinters(), we get an |
394 // INTERNAL_ERROR. | 382 // INTERNAL_ERROR. |
395 TEST_F(PpdProviderTest, ResolvePrintersBadReference) { | 383 TEST_F(PpdProviderTest, ResolvePrintersBadReference) { |
396 StartFakePpdServer(); | 384 StartFakePpdServer(); |
397 auto provider = CreateProvider("en"); | 385 auto provider = CreateProvider("en"); |
398 provider->ResolveManufacturers(base::Bind(&ResolveManufacturersNop)); | 386 provider->ResolveManufacturers(base::Bind(&ResolveManufacturersNop)); |
399 Drain(*provider); | 387 scoped_task_environment_.RunUntilIdle(); |
400 | 388 |
401 provider->ResolvePrinters("bogus_doesnt_exist", | 389 provider->ResolvePrinters("bogus_doesnt_exist", |
402 base::Bind(&PpdProviderTest::CaptureResolvePrinters, | 390 base::Bind(&PpdProviderTest::CaptureResolvePrinters, |
403 base::Unretained(this))); | 391 base::Unretained(this))); |
404 Drain(*provider); | 392 scoped_task_environment_.RunUntilIdle(); |
405 ASSERT_EQ(1UL, captured_resolve_printers_.size()); | 393 ASSERT_EQ(1UL, captured_resolve_printers_.size()); |
406 EXPECT_EQ(PpdProvider::INTERNAL_ERROR, captured_resolve_printers_[0].first); | 394 EXPECT_EQ(PpdProvider::INTERNAL_ERROR, captured_resolve_printers_[0].first); |
407 } | 395 } |
408 | 396 |
409 // Test that if the server is unavailable, we get SERVER_ERRORs back out. | 397 // Test that if the server is unavailable, we get SERVER_ERRORs back out. |
410 TEST_F(PpdProviderTest, ResolvePrintersNoServer) { | 398 TEST_F(PpdProviderTest, ResolvePrintersNoServer) { |
411 StartFakePpdServer(); | 399 StartFakePpdServer(); |
412 auto provider = CreateProvider("en"); | 400 auto provider = CreateProvider("en"); |
413 provider->ResolveManufacturers(base::Bind(&ResolveManufacturersNop)); | 401 provider->ResolveManufacturers(base::Bind(&ResolveManufacturersNop)); |
414 Drain(*provider); | 402 scoped_task_environment_.RunUntilIdle(); |
415 | 403 |
416 StopFakePpdServer(); | 404 StopFakePpdServer(); |
417 | 405 |
418 provider->ResolvePrinters("manufacturer_a_en", | 406 provider->ResolvePrinters("manufacturer_a_en", |
419 base::Bind(&PpdProviderTest::CaptureResolvePrinters, | 407 base::Bind(&PpdProviderTest::CaptureResolvePrinters, |
420 base::Unretained(this))); | 408 base::Unretained(this))); |
421 provider->ResolvePrinters("manufacturer_b_en", | 409 provider->ResolvePrinters("manufacturer_b_en", |
422 base::Bind(&PpdProviderTest::CaptureResolvePrinters, | 410 base::Bind(&PpdProviderTest::CaptureResolvePrinters, |
423 base::Unretained(this))); | 411 base::Unretained(this))); |
424 Drain(*provider); | 412 scoped_task_environment_.RunUntilIdle(); |
425 ASSERT_EQ(2UL, captured_resolve_printers_.size()); | 413 ASSERT_EQ(2UL, captured_resolve_printers_.size()); |
426 EXPECT_EQ(PpdProvider::SERVER_ERROR, captured_resolve_printers_[0].first); | 414 EXPECT_EQ(PpdProvider::SERVER_ERROR, captured_resolve_printers_[0].first); |
427 EXPECT_EQ(PpdProvider::SERVER_ERROR, captured_resolve_printers_[1].first); | 415 EXPECT_EQ(PpdProvider::SERVER_ERROR, captured_resolve_printers_[1].first); |
428 } | 416 } |
429 | 417 |
430 // Test a successful ppd resolution from an effective_make_and_model reference. | 418 // Test a successful ppd resolution from an effective_make_and_model reference. |
431 TEST_F(PpdProviderTest, ResolveServerKeyPpd) { | 419 TEST_F(PpdProviderTest, ResolveServerKeyPpd) { |
432 StartFakePpdServer(); | 420 StartFakePpdServer(); |
433 auto provider = CreateProvider("en"); | 421 auto provider = CreateProvider("en"); |
434 Printer::PpdReference ref; | 422 Printer::PpdReference ref; |
435 ref.effective_make_and_model = "printer_b_ref"; | 423 ref.effective_make_and_model = "printer_b_ref"; |
436 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, | 424 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, |
437 base::Unretained(this))); | 425 base::Unretained(this))); |
438 ref.effective_make_and_model = "printer_c_ref"; | 426 ref.effective_make_and_model = "printer_c_ref"; |
439 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, | 427 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, |
440 base::Unretained(this))); | 428 base::Unretained(this))); |
441 Drain(*provider); | 429 scoped_task_environment_.RunUntilIdle(); |
442 | 430 |
443 ASSERT_EQ(2UL, captured_resolve_ppd_.size()); | 431 ASSERT_EQ(2UL, captured_resolve_ppd_.size()); |
444 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[0].code); | 432 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[0].code); |
445 EXPECT_EQ(kCupsFilter2PpdContents, captured_resolve_ppd_[0].ppd_contents); | 433 EXPECT_EQ(kCupsFilter2PpdContents, captured_resolve_ppd_[0].ppd_contents); |
446 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[1].code); | 434 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[1].code); |
447 EXPECT_EQ("c", captured_resolve_ppd_[1].ppd_contents); | 435 EXPECT_EQ("c", captured_resolve_ppd_[1].ppd_contents); |
448 } | 436 } |
449 | 437 |
450 // Test that we *don't* resolve a ppd URL over non-file schemes. It's not clear | 438 // Test that we *don't* resolve a ppd URL over non-file schemes. It's not clear |
451 // whether we'll want to do this in the long term, but for now this is | 439 // whether we'll want to do this in the long term, but for now this is |
452 // disallowed because we're not sure we completely understand the security | 440 // disallowed because we're not sure we completely understand the security |
453 // implications. | 441 // implications. |
454 TEST_F(PpdProviderTest, ResolveUserSuppliedUrlPpdFromNetworkFails) { | 442 TEST_F(PpdProviderTest, ResolveUserSuppliedUrlPpdFromNetworkFails) { |
455 StartFakePpdServer(); | 443 StartFakePpdServer(); |
456 auto provider = CreateProvider("en"); | 444 auto provider = CreateProvider("en"); |
457 | 445 |
458 Printer::PpdReference ref; | 446 Printer::PpdReference ref; |
459 ref.user_supplied_ppd_url = base::StringPrintf( | 447 ref.user_supplied_ppd_url = base::StringPrintf( |
460 "https://%s/user_supplied_ppd_directory/user_supplied.ppd", kPpdServer); | 448 "https://%s/user_supplied_ppd_directory/user_supplied.ppd", kPpdServer); |
461 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, | 449 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, |
462 base::Unretained(this))); | 450 base::Unretained(this))); |
463 Drain(*provider); | 451 scoped_task_environment_.RunUntilIdle(); |
464 | 452 |
465 ASSERT_EQ(1UL, captured_resolve_ppd_.size()); | 453 ASSERT_EQ(1UL, captured_resolve_ppd_.size()); |
466 EXPECT_EQ(PpdProvider::INTERNAL_ERROR, captured_resolve_ppd_[0].code); | 454 EXPECT_EQ(PpdProvider::INTERNAL_ERROR, captured_resolve_ppd_[0].code); |
467 EXPECT_TRUE(captured_resolve_ppd_[0].ppd_contents.empty()); | 455 EXPECT_TRUE(captured_resolve_ppd_[0].ppd_contents.empty()); |
468 } | 456 } |
469 | 457 |
470 // Test a successful ppd resolution from a user_supplied_url field when | 458 // Test a successful ppd resolution from a user_supplied_url field when |
471 // reading from a file. Note we shouldn't need the server to be up | 459 // reading from a file. Note we shouldn't need the server to be up |
472 // to do this successfully, as we should be able to do this offline. | 460 // to do this successfully, as we should be able to do this offline. |
473 TEST_F(PpdProviderTest, ResolveUserSuppliedUrlPpdFromFile) { | 461 TEST_F(PpdProviderTest, ResolveUserSuppliedUrlPpdFromFile) { |
474 auto provider = CreateProvider("en"); | 462 auto provider = CreateProvider("en"); |
475 base::ScopedTempDir temp_dir; | 463 base::ScopedTempDir temp_dir; |
476 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 464 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
477 base::FilePath filename = temp_dir.GetPath().Append("my_spiffy.ppd"); | 465 base::FilePath filename = temp_dir.GetPath().Append("my_spiffy.ppd"); |
478 | 466 |
479 std::string user_ppd_contents = "Woohoo"; | 467 std::string user_ppd_contents = "Woohoo"; |
480 | 468 |
481 ASSERT_EQ(base::WriteFile(filename, user_ppd_contents.data(), | 469 ASSERT_EQ(base::WriteFile(filename, user_ppd_contents.data(), |
482 user_ppd_contents.size()), | 470 user_ppd_contents.size()), |
483 static_cast<int>(user_ppd_contents.size())); | 471 static_cast<int>(user_ppd_contents.size())); |
484 | 472 |
485 Printer::PpdReference ref; | 473 Printer::PpdReference ref; |
486 ref.user_supplied_ppd_url = | 474 ref.user_supplied_ppd_url = |
487 base::StringPrintf("file://%s", filename.MaybeAsASCII().c_str()); | 475 base::StringPrintf("file://%s", filename.MaybeAsASCII().c_str()); |
488 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, | 476 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, |
489 base::Unretained(this))); | 477 base::Unretained(this))); |
490 Drain(*provider); | 478 scoped_task_environment_.RunUntilIdle(); |
491 | 479 |
492 ASSERT_EQ(1UL, captured_resolve_ppd_.size()); | 480 ASSERT_EQ(1UL, captured_resolve_ppd_.size()); |
493 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[0].code); | 481 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[0].code); |
494 EXPECT_EQ(user_ppd_contents, captured_resolve_ppd_[0].ppd_contents); | 482 EXPECT_EQ(user_ppd_contents, captured_resolve_ppd_[0].ppd_contents); |
495 } | 483 } |
496 | 484 |
497 // Test that we cache ppd resolutions when we fetch them and that we can resolve | 485 // Test that we cache ppd resolutions when we fetch them and that we can resolve |
498 // from the cache without the server available. | 486 // from the cache without the server available. |
499 TEST_F(PpdProviderTest, ResolvedPpdsGetCached) { | 487 TEST_F(PpdProviderTest, ResolvedPpdsGetCached) { |
500 auto provider = CreateProvider("en"); | 488 auto provider = CreateProvider("en"); |
501 std::string user_ppd_contents = "Woohoo"; | 489 std::string user_ppd_contents = "Woohoo"; |
502 Printer::PpdReference ref; | 490 Printer::PpdReference ref; |
503 { | 491 { |
504 base::ScopedTempDir temp_dir; | 492 base::ScopedTempDir temp_dir; |
505 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 493 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
506 base::FilePath filename = temp_dir.GetPath().Append("my_spiffy.ppd"); | 494 base::FilePath filename = temp_dir.GetPath().Append("my_spiffy.ppd"); |
507 | 495 |
508 ASSERT_EQ(base::WriteFile(filename, user_ppd_contents.data(), | 496 ASSERT_EQ(base::WriteFile(filename, user_ppd_contents.data(), |
509 user_ppd_contents.size()), | 497 user_ppd_contents.size()), |
510 static_cast<int>(user_ppd_contents.size())); | 498 static_cast<int>(user_ppd_contents.size())); |
511 | 499 |
512 ref.user_supplied_ppd_url = | 500 ref.user_supplied_ppd_url = |
513 base::StringPrintf("file://%s", filename.MaybeAsASCII().c_str()); | 501 base::StringPrintf("file://%s", filename.MaybeAsASCII().c_str()); |
514 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, | 502 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, |
515 base::Unretained(this))); | 503 base::Unretained(this))); |
516 Drain(*provider); | 504 scoped_task_environment_.RunUntilIdle(); |
517 | 505 |
518 ASSERT_EQ(1UL, captured_resolve_ppd_.size()); | 506 ASSERT_EQ(1UL, captured_resolve_ppd_.size()); |
519 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[0].code); | 507 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[0].code); |
520 EXPECT_EQ(user_ppd_contents, captured_resolve_ppd_[0].ppd_contents); | 508 EXPECT_EQ(user_ppd_contents, captured_resolve_ppd_[0].ppd_contents); |
521 } | 509 } |
522 // ScopedTempDir goes out of scope, so the source file should now be | 510 // ScopedTempDir goes out of scope, so the source file should now be |
523 // deleted. But if we resolve again, we should hit the cache and | 511 // deleted. But if we resolve again, we should hit the cache and |
524 // still be successful. | 512 // still be successful. |
525 | 513 |
526 captured_resolve_ppd_.clear(); | 514 captured_resolve_ppd_.clear(); |
527 | 515 |
528 // Recreate the provider to make sure we don't have any memory caches which | 516 // Recreate the provider to make sure we don't have any memory caches which |
529 // would mask problems with disk persistence. | 517 // would mask problems with disk persistence. |
530 provider = CreateProvider("en"); | 518 provider = CreateProvider("en"); |
531 | 519 |
532 // Re-resolve. | 520 // Re-resolve. |
533 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, | 521 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, |
534 base::Unretained(this))); | 522 base::Unretained(this))); |
535 Drain(*provider); | 523 scoped_task_environment_.RunUntilIdle(); |
536 | 524 |
537 ASSERT_EQ(1UL, captured_resolve_ppd_.size()); | 525 ASSERT_EQ(1UL, captured_resolve_ppd_.size()); |
538 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[0].code); | 526 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[0].code); |
539 EXPECT_EQ(user_ppd_contents, captured_resolve_ppd_[0].ppd_contents); | 527 EXPECT_EQ(user_ppd_contents, captured_resolve_ppd_[0].ppd_contents); |
540 } | 528 } |
541 | 529 |
542 // Test that the filter extraction code successfully pulls the filters | 530 // Test that the filter extraction code successfully pulls the filters |
543 // from the ppds resolved. | 531 // from the ppds resolved. |
544 TEST_F(PpdProviderTest, ExtractPpdFilters) { | 532 TEST_F(PpdProviderTest, ExtractPpdFilters) { |
545 StartFakePpdServer(); | 533 StartFakePpdServer(); |
546 auto provider = CreateProvider("en"); | 534 auto provider = CreateProvider("en"); |
547 Printer::PpdReference ref; | 535 Printer::PpdReference ref; |
548 ref.effective_make_and_model = "printer_a_ref"; | 536 ref.effective_make_and_model = "printer_a_ref"; |
549 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, | 537 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, |
550 base::Unretained(this))); | 538 base::Unretained(this))); |
551 ref.effective_make_and_model = "printer_b_ref"; | 539 ref.effective_make_and_model = "printer_b_ref"; |
552 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, | 540 provider->ResolvePpd(ref, base::Bind(&PpdProviderTest::CaptureResolvePpd, |
553 base::Unretained(this))); | 541 base::Unretained(this))); |
554 Drain(*provider); | 542 scoped_task_environment_.RunUntilIdle(); |
555 | 543 |
556 ASSERT_EQ(2UL, captured_resolve_ppd_.size()); | 544 ASSERT_EQ(2UL, captured_resolve_ppd_.size()); |
557 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[0].code); | 545 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[0].code); |
558 EXPECT_EQ(kCupsFilterPpdContents, captured_resolve_ppd_[0].ppd_contents); | 546 EXPECT_EQ(kCupsFilterPpdContents, captured_resolve_ppd_[0].ppd_contents); |
559 EXPECT_EQ( | 547 EXPECT_EQ( |
560 std::vector<std::string>({"a_different_filter", "filter3", "my_filter"}), | 548 std::vector<std::string>({"a_different_filter", "filter3", "my_filter"}), |
561 captured_resolve_ppd_[0].ppd_filters); | 549 captured_resolve_ppd_[0].ppd_filters); |
562 | 550 |
563 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[1].code); | 551 EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_[1].code); |
564 EXPECT_EQ(kCupsFilter2PpdContents, captured_resolve_ppd_[1].ppd_contents); | 552 EXPECT_EQ(kCupsFilter2PpdContents, captured_resolve_ppd_[1].ppd_contents); |
565 EXPECT_EQ( | 553 EXPECT_EQ( |
566 std::vector<std::string>({"another_real_filter", "the_real_filter"}), | 554 std::vector<std::string>({"another_real_filter", "the_real_filter"}), |
567 captured_resolve_ppd_[1].ppd_filters); | 555 captured_resolve_ppd_[1].ppd_filters); |
568 } | 556 } |
569 | 557 |
570 } // namespace | 558 } // namespace |
571 } // namespace printing | 559 } // namespace printing |
572 } // namespace chromeos | 560 } // namespace chromeos |
OLD | NEW |