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

Side by Side Diff: chromeos/printing/ppd_provider_unittest.cc

Issue 2939373003: Convert PpdCache and PpdProvider to TaskScheduler. (Closed)
Patch Set: find can skip dir creation Created 3 years, 6 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
« no previous file with comments | « chromeos/printing/ppd_provider.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <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
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
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
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
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
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
OLDNEW
« no previous file with comments | « chromeos/printing/ppd_provider.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698