Add usb resolution support to ppd provider.

This allows us to download information about the make/model of a printer based on the vendor and device ids.

BUG=chromium:616866

Review-Url: https://codereview.chromium.org/2697733003
Cr-Commit-Position: refs/heads/master@{#450501}
diff --git a/chromeos/printing/ppd_provider_unittest.cc b/chromeos/printing/ppd_provider_unittest.cc
index 6f64f4c..8c10a98 100644
--- a/chromeos/printing/ppd_provider_unittest.cc
+++ b/chromeos/printing/ppd_provider_unittest.cc
@@ -76,6 +76,11 @@
              ["printer_b_ref", "printer_b.ppd"],
              ["printer_c_ref", "printer_c.ppd"]
             ])"},
+        {"metadata/usb-031f.json",
+         R"([
+             [1592, "Some canonical reference"],
+             [6535, "Some other canonical reference"]
+            ])"},
         {"metadata/manufacturers-en.json",
          R"([
             ["manufacturer_a_en", "manufacturer_a.json"],
@@ -149,6 +154,12 @@
     captured_resolve_ppd_.push_back({code, contents});
   }
 
+  // Capture the result of a ResolveUsbIds() call.
+  void CaptureResolveUsbIds(PpdProvider::CallbackResultCode code,
+                            const std::string& contents) {
+    captured_resolve_usb_ids_.push_back({code, contents});
+  }
+
   // Discard the result of a ResolvePpd() call.
   void DiscardResolvePpd(PpdProvider::CallbackResultCode code,
                          const std::string& contents) {}
@@ -202,6 +213,9 @@
   std::vector<std::pair<PpdProvider::CallbackResultCode, std::string>>
       captured_resolve_ppd_;
 
+  std::vector<std::pair<PpdProvider::CallbackResultCode, std::string>>
+      captured_resolve_usb_ids_;
+
   std::unique_ptr<net::TestURLRequestInterceptor> interceptor_;
 
   base::ScopedTempDir ppd_cache_temp_dir_;
@@ -264,6 +278,46 @@
   RunLocalizationTest("bogus", "en");
 }
 
+// Test successful and unsuccessful usb resolutions.
+TEST_F(PpdProviderTest, UsbResolution) {
+  StartFakePpdServer();
+  auto provider = CreateProvider("en");
+
+  // Should get back "Some canonical reference"
+  provider->ResolveUsbIds(0x031f, 1592,
+                          base::Bind(&PpdProviderTest::CaptureResolveUsbIds,
+                                     base::Unretained(this)));
+  // Should get back "Some other canonical reference"
+  provider->ResolveUsbIds(0x031f, 6535,
+                          base::Bind(&PpdProviderTest::CaptureResolveUsbIds,
+                                     base::Unretained(this)));
+
+  // Extant vendor id, nonexistant device id, should get a NOT_FOUND
+  provider->ResolveUsbIds(0x031f, 8162,
+                          base::Bind(&PpdProviderTest::CaptureResolveUsbIds,
+                                     base::Unretained(this)));
+
+  // Nonexistant vendor id, should get a NOT_FOUND in the real world, but
+  // the URL interceptor we're using considers all nonexistant files to
+  // be effectively CONNECTION REFUSED, so we just check for non-success
+  // on this one.
+  provider->ResolveUsbIds(1234, 1782,
+                          base::Bind(&PpdProviderTest::CaptureResolveUsbIds,
+                                     base::Unretained(this)));
+  Drain(*provider);
+
+  ASSERT_EQ(captured_resolve_usb_ids_.size(), static_cast<size_t>(4));
+  EXPECT_EQ(captured_resolve_usb_ids_[0].first, PpdProvider::SUCCESS);
+  EXPECT_EQ(captured_resolve_usb_ids_[0].second, "Some canonical reference");
+  EXPECT_EQ(captured_resolve_usb_ids_[1].first, PpdProvider::SUCCESS);
+  EXPECT_EQ(captured_resolve_usb_ids_[1].second,
+            "Some other canonical reference");
+  EXPECT_EQ(captured_resolve_usb_ids_[2].first, PpdProvider::NOT_FOUND);
+  EXPECT_EQ(captured_resolve_usb_ids_[2].second, "");
+  EXPECT_FALSE(captured_resolve_usb_ids_[3].first == PpdProvider::SUCCESS);
+  EXPECT_EQ(captured_resolve_usb_ids_[3].second, "");
+}
+
 // For convenience a null ResolveManufacturers callback target.
 void ResolveManufacturersNop(PpdProvider::CallbackResultCode code,
                              const std::vector<std::string>& v) {}