scanapp: Parse scanner name from USB descriptors
The expected scanner name is currently hardcoded, which has been fine
because all the tests load the same set of USB descriptors. We want to
add a new test that uses a different descriptor, so the printer name
will be different. Since the name is fully derived from the USB string
descriptors and we're already parsing the file to get VID and PID out,
switch to getting the printable name out of the file as well.
BUG=b:199521284
TEST=tast run '("dep:virtual_usb_printer")'
Change-Id: I633cfe4e810c9688fae76a98cc944d58f1993a4e
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/tast-tests/+/3611986
Commit-Queue: Benjamin Gordon <bmgordon@chromium.org>
Reviewed-by: Matt Stark <msta@google.com>
Reviewed-by: Paul Moy <pmoy@chromium.org>
Tested-by: Benjamin Gordon <bmgordon@chromium.org>
Reviewed-by: David Welling <davidwelling@google.com>
diff --git a/src/chromiumos/tast/local/bundles/cros/scanapp/large_paper_scans.go b/src/chromiumos/tast/local/bundles/cros/scanapp/large_paper_scans.go
index 72d6eae..aa795de 100644
--- a/src/chromiumos/tast/local/bundles/cros/scanapp/large_paper_scans.go
+++ b/src/chromiumos/tast/local/bundles/cros/scanapp/large_paper_scans.go
@@ -53,7 +53,6 @@
{
Name: "paper_size_a3",
Settings: scanapp.ScanSettings{
- Scanner: scanning.ScannerName,
Source: scanapp.SourceFlatbed,
FileType: scanapp.FileTypePNG,
ColorMode: scanapp.ColorModeColor,
@@ -64,7 +63,6 @@
}, {
Name: "paper_size_a4",
Settings: scanapp.ScanSettings{
- Scanner: scanning.ScannerName,
Source: scanapp.SourceFlatbed,
FileType: scanapp.FileTypePNG,
ColorMode: scanapp.ColorModeColor,
@@ -75,7 +73,6 @@
}, {
Name: "paper_size_b4",
Settings: scanapp.ScanSettings{
- Scanner: scanning.ScannerName,
Source: scanapp.SourceFlatbed,
FileType: scanapp.FileTypePNG,
ColorMode: scanapp.ColorModeColor,
@@ -86,7 +83,6 @@
}, {
Name: "paper_size_legal",
Settings: scanapp.ScanSettings{
- Scanner: scanning.ScannerName,
Source: scanapp.SourceFlatbed,
FileType: scanapp.FileTypePNG,
ColorMode: scanapp.ColorModeColor,
@@ -97,7 +93,6 @@
}, {
Name: "paper_size_letter",
Settings: scanapp.ScanSettings{
- Scanner: scanning.ScannerName,
Source: scanapp.SourceFlatbed,
FileType: scanapp.FileTypePNG,
ColorMode: scanapp.ColorModeColor,
@@ -108,7 +103,6 @@
}, {
Name: "paper_size_tabloid",
Settings: scanapp.ScanSettings{
- Scanner: scanning.ScannerName,
Source: scanapp.SourceFlatbed,
FileType: scanapp.FileTypePNG,
ColorMode: scanapp.ColorModeColor,
diff --git a/src/chromiumos/tast/local/bundles/cros/scanapp/multi_page_scan.go b/src/chromiumos/tast/local/bundles/cros/scanapp/multi_page_scan.go
index e563347..bdc7583 100644
--- a/src/chromiumos/tast/local/bundles/cros/scanapp/multi_page_scan.go
+++ b/src/chromiumos/tast/local/bundles/cros/scanapp/multi_page_scan.go
@@ -116,7 +116,7 @@
if err := cups.RestartPrintingSystem(ctx); err != nil {
s.Fatal("Failed to restart printing system: ", err)
}
- if _, err := ash.WaitForNotification(ctx, tconn, 30*time.Second, ash.WaitMessageContains(scanning.ScannerName)); err != nil {
+ if _, err := ash.WaitForNotification(ctx, tconn, 30*time.Second, ash.WaitMessageContains(printer.VisibleName)); err != nil {
s.Fatal("Failed to wait for printer notification: ", err)
}
if err := ippusbbridge.ContactPrinterEndpoint(ctx, printer.DevInfo, "/eSCL/ScannerCapabilities"); err != nil {
@@ -135,7 +135,7 @@
if err := uiauto.Combine("set scan settings",
app.SetScanSettings(scanapp.ScanSettings{
- Scanner: scanning.ScannerName,
+ Scanner: printer.VisibleName,
Source: scanapp.SourceFlatbed,
FileType: scanapp.FileTypePDF,
ColorMode: scanapp.ColorModeColor,
diff --git a/src/chromiumos/tast/local/bundles/cros/scanapp/open_scan_in_files_app.go b/src/chromiumos/tast/local/bundles/cros/scanapp/open_scan_in_files_app.go
index 60c6af4..5d6eda4 100644
--- a/src/chromiumos/tast/local/bundles/cros/scanapp/open_scan_in_files_app.go
+++ b/src/chromiumos/tast/local/bundles/cros/scanapp/open_scan_in_files_app.go
@@ -46,7 +46,6 @@
}
var settings = scanapp.ScanSettings{
- Scanner: scanning.ScannerName,
Source: scanapp.SourceFlatbed,
FileType: scanapp.FileTypePNG,
ColorMode: scanapp.ColorModeColor,
@@ -93,7 +92,7 @@
if err = cups.RestartPrintingSystem(ctx); err != nil {
s.Fatal("Failed to reset printing system: ", err)
}
- if _, err := ash.WaitForNotification(ctx, tconn, 30*time.Second, ash.WaitMessageContains(scanning.ScannerName)); err != nil {
+ if _, err := ash.WaitForNotification(ctx, tconn, 30*time.Second, ash.WaitMessageContains(printer.VisibleName)); err != nil {
s.Fatal("Failed to wait for printer notification: ", err)
}
if err = ippusbbridge.ContactPrinterEndpoint(ctx, printer.DevInfo, "/eSCL/ScannerCapabilities"); err != nil {
@@ -124,9 +123,11 @@
s.Fatal("Failed to close notifications: ", err)
}
+ scanSettings := settings
+ scanSettings.Scanner = printer.VisibleName
if err := uiauto.Combine("scan",
app.ClickMoreSettings(),
- app.SetScanSettings(settings),
+ app.SetScanSettings(scanSettings),
app.Scan(),
app.ClickMyFilesLink(),
)(ctx); err != nil {
diff --git a/src/chromiumos/tast/local/bundles/cros/scanapp/scan.go b/src/chromiumos/tast/local/bundles/cros/scanapp/scan.go
index ef792d4..d2ce1da 100644
--- a/src/chromiumos/tast/local/bundles/cros/scanapp/scan.go
+++ b/src/chromiumos/tast/local/bundles/cros/scanapp/scan.go
@@ -52,7 +52,6 @@
{
Name: "flatbed_png_color_letter_300_dpi",
Settings: scanapp.ScanSettings{
- Scanner: scanning.ScannerName,
Source: scanapp.SourceFlatbed,
FileType: scanapp.FileTypePNG,
ColorMode: scanapp.ColorModeColor,
@@ -63,7 +62,6 @@
}, {
Name: "adf_simplex_jpg_grayscale_a4_150_dpi",
Settings: scanapp.ScanSettings{
- Scanner: scanning.ScannerName,
Source: scanapp.SourceADFOneSided,
FileType: scanapp.FileTypeJPG,
// TODO(b/181773386): Change this to black and white when the virtual
@@ -76,7 +74,6 @@
}, {
Name: "adf_duplex_pdf_grayscale_max_300_dpi",
Settings: scanapp.ScanSettings{
- Scanner: scanning.ScannerName,
Source: scanapp.SourceADFTwoSided,
FileType: scanapp.FileTypePDF,
ColorMode: scanapp.ColorModeGrayscale,
diff --git a/src/chromiumos/tast/local/bundles/cros/scanapp/scanning/scanning.go b/src/chromiumos/tast/local/bundles/cros/scanapp/scanning/scanning.go
index 3f3bd30..6a90230 100644
--- a/src/chromiumos/tast/local/bundles/cros/scanapp/scanning/scanning.go
+++ b/src/chromiumos/tast/local/bundles/cros/scanapp/scanning/scanning.go
@@ -33,18 +33,17 @@
)
const (
- // ScannerName is the name of the virtual USB scanner.
- ScannerName = "DavieV Virtual USB Printer (USB)"
-
// SourceImage is the image used to configure the virtual USB scanner.
SourceImage = "scan_source.jpg"
// Attributes is the path to the attributes used to configure the virtual
// USB scanner.
Attributes = "/usr/local/etc/virtual-usb-printer/ipp_attributes.json"
+
// Descriptors is the path to the descriptors used to configure the virtual
// USB scanner.
Descriptors = "/usr/local/etc/virtual-usb-printer/ippusb_printer.json"
+
// EsclCapabilities is the path to the capabilities used to configure the
// virtual USB scanner.
EsclCapabilities = "/usr/local/etc/virtual-usb-printer/escl_capabilities.json"
@@ -304,6 +303,7 @@
if err != nil {
s.Fatal("Failed to attach virtual printer: ", err)
}
+ s.Logf("Started virtual printer: %s", printer.VisibleName)
defer func(ctx context.Context) {
if err := printer.Stop(ctx); err != nil {
s.Error("Failed to stop printer: ", err)
@@ -315,7 +315,7 @@
if err = cups.RestartPrintingSystem(ctx); err != nil {
s.Fatal("Failed to restart printing system: ", err)
}
- if _, err := ash.WaitForNotification(ctx, tconn, 30*time.Second, ash.WaitMessageContains(ScannerName)); err != nil {
+ if _, err := ash.WaitForNotification(ctx, tconn, 30*time.Second, ash.WaitMessageContains(printer.VisibleName)); err != nil {
s.Fatal("Failed to wait for printer notification: ", err)
}
if err = ippusbbridge.ContactPrinterEndpoint(ctx, printer.DevInfo, "/eSCL/ScannerCapabilities"); err != nil {
@@ -333,6 +333,8 @@
}
for _, test := range testParams {
+ settings := test.Settings
+ settings.Scanner = printer.VisibleName
s.Run(ctx, test.Name, func(ctx context.Context, s *testing.State) {
defer faillog.DumpUITreeWithScreenshotOnError(cleanupCtx, s.OutDir(), s.HasError, cr, "ui_tree_"+test.Name)
defer func() {
@@ -347,7 +349,7 @@
}
if err := uiauto.Combine("scan",
- app.SetScanSettings(test.Settings),
+ app.SetScanSettings(settings),
app.Scan(),
app.ClickDone(),
)(ctx); err != nil {
diff --git a/src/chromiumos/tast/local/printing/usbprinter/setup.go b/src/chromiumos/tast/local/printing/usbprinter/setup.go
index 052a4de..bf439f7 100644
--- a/src/chromiumos/tast/local/printing/usbprinter/setup.go
+++ b/src/chromiumos/tast/local/printing/usbprinter/setup.go
@@ -159,6 +159,11 @@
// Whether or not Stop() should propagate an error if
// no udev event is observed on stoppage.
expectUdevEventOnStop bool
+
+ // The human-readable printer name as it would be displayed
+ // in the UI. This is parsed from its USB descriptors, e.g.
+ // "DavieV Virtual USB Printer (USB)".
+ VisibleName string
}
func ippUSBPrinterURI(devInfo DevInfo) string {
@@ -168,10 +173,10 @@
// loadPrinterIDs loads the JSON file located at path and attempts to extract
// the "vid" and "pid" from the USB device descriptor which should be defined
// in path.
-func loadPrinterIDs(path string) (devInfo DevInfo, err error) {
+func loadPrinterIDs(path string) (devInfo DevInfo, deviceName string, err error) {
f, err := os.Open(path)
if err != nil {
- return devInfo, errors.Wrapf(err, "failed to open %s", path)
+ return devInfo, "", errors.Wrapf(err, "failed to open %s", path)
}
defer f.Close()
@@ -180,13 +185,15 @@
Vendor int `json:"idVendor"`
Product int `json:"idProduct"`
} `json:"device_descriptor"`
+ VendorModel []string `json:"string_descriptors"`
}
if err := json.NewDecoder(f).Decode(&cfg); err != nil {
- return devInfo, errors.Wrapf(err, "failed to decode JSON in %s", path)
+ return devInfo, "", errors.Wrapf(err, "failed to decode JSON in %s", path)
}
- return DevInfo{fmt.Sprintf("%04x", cfg.DevDesc.Vendor), fmt.Sprintf("%04x", cfg.DevDesc.Product)}, nil
+ deviceName = fmt.Sprintf("%s %s (USB)", cfg.VendorModel[0], cfg.VendorModel[1])
+ return DevInfo{fmt.Sprintf("%04x", cfg.DevDesc.Vendor), fmt.Sprintf("%04x", cfg.DevDesc.Product)}, deviceName, nil
}
// absoluteConfigPath returns configPath untouched if it is absolute.
@@ -253,7 +260,7 @@
return nil, errors.New("missing required WithDescriptors() option")
}
- devInfo, err := loadPrinterIDs(op.descriptors)
+ devInfo, deviceName, err := loadPrinterIDs(op.descriptors)
if err != nil {
return nil, err
}
@@ -292,6 +299,7 @@
DevInfo: devInfo,
cmd: cmd,
expectUdevEventOnStop: op.expectUdevEventOnStop,
+ VisibleName: deviceName,
}, nil
}