blob: 6eab78847b694cd7b0735e1ae6e750d5e90b53ed [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/cloud_devices/common/printer_description.h"
#include <memory>
#include <utility>
#include "base/containers/flat_set.h"
#include "base/json/json_writer.h"
#include "base/strings/string_util.h"
#include "base/test/values_test_util.h"
#include "base/values.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/rect.h"
namespace cloud_devices {
namespace printer {
// Makes sure that same JSON value represented by same strings to simplify
// comparison.
std::string NormalizeJson(const std::string& json) {
std::string result;
base::JSONWriter::Write(base::test::ParseJson(json), &result);
return result;
}
const char kCdd[] = R"(
{
"version": "1.0",
"printer": {
"supported_content_type": [ {
"content_type": "image/pwg-raster"
}, {
"content_type": "image/jpeg"
} ],
"pwg_raster_config": {
"document_sheet_back": "MANUAL_TUMBLE",
"reverse_order_streaming": true
},
"color": {
"option": [ {
"type": "STANDARD_COLOR"
}, {
"type": "STANDARD_MONOCHROME"
}, {
"type": "CUSTOM_MONOCHROME",
"vendor_id": "123",
"custom_display_name": "monochrome"
} ]
},
"duplex": {
"option": [ {
"is_default": true,
"type": "LONG_EDGE"
}, {
"type": "SHORT_EDGE"
}, {
"type": "NO_DUPLEX"
} ]
},
"page_orientation": {
"option": [ {
"type": "PORTRAIT"
}, {
"type": "LANDSCAPE"
}, {
"is_default": true,
"type": "AUTO"
} ]
},
"copies": {
"default": 1,
"max": 1
},
"margins": {
"option": [ {
"is_default": true,
"type": "BORDERLESS",
"top_microns": 0,
"right_microns": 0,
"bottom_microns": 0,
"left_microns": 0
}, {
"type": "STANDARD",
"top_microns": 100,
"right_microns": 200,
"bottom_microns": 300,
"left_microns": 400
}, {
"type": "CUSTOM",
"top_microns": 1,
"right_microns": 2,
"bottom_microns": 3,
"left_microns": 4
} ]
},
"dpi": {
"option": [ {
"horizontal_dpi": 150,
"vertical_dpi": 250
}, {
"is_default": true,
"horizontal_dpi": 600,
"vertical_dpi": 1600
} ]
},
"fit_to_page": {
"option": [ {
"is_default": true,
"type": "NO_FITTING"
}, {
"type": "FIT_TO_PAGE"
}, {
"type": "GROW_TO_PAGE"
}, {
"type": "SHRINK_TO_PAGE"
}, {
"type": "FILL_PAGE"
} ]
},
"page_range": {
},
"media_size": {
"option": [ {
"imageable_area_left_microns": 0,
"imageable_area_right_microns": 2222,
"imageable_area_bottom_microns": 0,
"imageable_area_top_microns": 3333,
"is_default": true,
"name": "NA_LETTER",
"width_microns": 2222,
"height_microns": 3333
}, {
"imageable_area_bottom_microns": 0,
"imageable_area_left_microns": 0,
"imageable_area_right_microns": 4444,
"imageable_area_top_microns": 5555,
"name": "ISO_A6",
"width_microns": 4444,
"height_microns": 5555
}, {
"imageable_area_bottom_microns": 0,
"imageable_area_left_microns": 0,
"imageable_area_right_microns": 6666,
"imageable_area_top_microns": 7777,
"name": "JPN_YOU4",
"width_microns": 6666,
"height_microns": 7777
}, {
"width_microns": 1111,
"is_continuous_feed": true,
"custom_display_name": "Feed",
"vendor_id": "FEED"
} ]
},
"collate": {
"default": false
},
"reverse_order": {
"default": true
}
}
})";
const char kDefaultCdd[] = R"(
{
"version": "1.0"
})";
const char kBadVersionCdd[] = R"(
{
"version": "1.1",
"printer": {
}
})";
const char kMultyDefaultCdd[] = R"(
{
"version": "1.0",
"printer": {
"color": {
"option": [ {
"is_default": true,
"type": "STANDARD_COLOR"
}, {
"is_default": true,
"type": "STANDARD_MONOCHROME"
} ]
}
}
})";
const char kDocumentTypeColorOnlyCdd[] = R"(
{
"version": "1.0",
"printer": {
"pwg_raster_config": {
"document_type_supported": [ "SRGB_8" ],
"document_sheet_back": "ROTATED"
}
}
})";
const char kDocumentTypeGrayOnlyCdd[] = R"(
{
"version": "1.0",
"printer": {
"pwg_raster_config": {
"document_type_supported": [ "SGRAY_8" ],
"document_sheet_back": "ROTATED"
}
}
})";
const char kDocumentTypeColorAndGrayCdd[] = R"(
{
"version": "1.0",
"printer": {
"pwg_raster_config": {
"document_type_supported": [ "SRGB_8", "SGRAY_8" ],
"document_sheet_back": "ROTATED"
}
}
})";
const char kDocumentTypeColorAndUnsupportedCdd[] = R"(
{
"version": "1.0",
"printer": {
"pwg_raster_config": {
"document_type_supported": [ "SRGB_8", "SRGB_16" ],
"document_sheet_back": "ROTATED"
}
}
})";
const char kDocumentTypeNoneCdd[] = R"(
{
"version": "1.0",
"printer": {
"pwg_raster_config": {
"document_sheet_back": "ROTATED"
}
}
})";
const char kDocumentTypeNotStringCdd[] = R"(
{
"version": "1.0",
"printer": {
"pwg_raster_config": {
"document_type_supported": [ 8, 16 ],
"document_sheet_back": "ROTATED"
}
}
})";
const char kDocumentTypeNotListCdd[] = R"(
{
"version": "1.0",
"printer": {
"pwg_raster_config": {
"document_type_supported": "ROTATED",
"document_sheet_back": "ROTATED"
}
}
})";
const char kIntegerRangeVendorCapabilityJson[] = R"(
{
"value_type": "INTEGER",
"min": "0",
"max": "10"
})";
const char kFloatDefaultRangeVendorCapabilityJson[] = R"(
{
"value_type": "FLOAT",
"min": "0.0",
"max": "1.0",
"default": "0.5"
})";
const char kInvalidTypeRangeVendorCapabilityJson[] = R"(
{
"value_type": "BOOLEAN",
"min": "0.0",
"max": "1.0"
})";
const char kMissingMinValueRangeVendorCapabilityJson[] = R"(
{
"value_type": "INT",
"max": "10"
})";
const char kInvalidBoundariesRangeVendorCapabilityJson[] = R"(
{
"value_type": "INT",
"min": "10",
"max": "0"
})";
const char kInvalidDefaultValueRangeVendorCapabilityJson[] = R"(
{
"value_type": "FLOAT",
"min": "0.0",
"max": "5.0",
"default": "10.0"
})";
const char kSelectVendorCapabilityJson[] = R"(
{
"option": [ {
"value": "value_1",
"display_name": "name_1"
}, {
"value": "value_2",
"display_name": "name_2",
"is_default": true
} ]
})";
const char kNotListSelectVendorCapabilityJson[] = R"(
{
"option": {
"value": "value",
"display_name": "name"
}
})";
const char kMissingValueSelectVendorCapabilityJson[] = R"(
{
"option": [ {
"display_name": "name"
} ]
})";
const char kMissingDisplayNameSelectVendorCapabilityJson[] = R"(
{
"option": [ {
"value": "value"
} ]
})";
const char kNoDefaultSelectVendorCapabilityJson[] = R"(
{
"option": [ {
"value": "value_1",
"display_name": "name_1"
}, {
"value": "value_2",
"display_name": "name_2"
} ]
})";
const char kSeveralDefaultsSelectVendorCapabilityJson[] = R"(
{
"option": [ {
"value": "value_1",
"display_name": "name_1",
"is_default": true
}, {
"value": "value_2",
"display_name": "name_2",
"is_default": true
} ]
})";
const char kBooleanTypedValueVendorCapabilityJson[] = R"(
{
"value_type": "BOOLEAN",
"default": "true"
})";
const char kFloatTypedValueVendorCapabilityJson[] = R"(
{
"value_type": "FLOAT",
"default": "1.0"
})";
const char kIntegerTypedValueVendorCapabilityJson[] = R"(
{
"value_type": "INTEGER",
"default": "10"
})";
const char kStringTypedValueVendorCapabilityJson[] = R"(
{
"value_type": "STRING",
"default": "value"
})";
const char kMissingValueTypeTypedValueVendorCapabilityJson[] = R"(
{
"default": "value"
})";
const char kInvalidBooleanTypedValueVendorCapabilityJson[] = R"(
{
"value_type": "BOOLEAN",
"default": "1"
})";
const char kInvalidFloatTypedValueVendorCapabilityJson[] = R"(
{
"value_type": "FLOAT",
"default": "1.1.1.1"
})";
const char kInvalidIntegerTypedValueVendorCapabilityJson[] = R"(
{
"value_type": "INTEGER",
"default": "true"
})";
const char kVendorCapabilityOnlyCdd[] = R"(
{
"version": "1.0",
"printer": {
"vendor_capability": [ {
"id": "id_1",
"display_name": "name_1",
"type": "RANGE",
"range_cap": {
"value_type": "INTEGER",
"min": "1",
"max": "10"
}
}, {
"id": "id_2",
"display_name": "name_2",
"type": "SELECT",
"select_cap": {
"option": [ {
"value": "value",
"display_name": "name",
"is_default": true
} ]
}
}, {
"id": "id_3",
"display_name": "name_3",
"type": "TYPED_VALUE",
"typed_value_cap": {
"value_type": "INTEGER",
"default": "1"
}
} ]
}
})";
const char kMissingIdVendorCapabilityCdd[] = R"(
{
"version": "1.0",
"printer": {
"vendor_capability": [ {
"display_name": "name_1",
"type": "RANGE",
"range_cap": {
"value_type": "INTEGER",
"min": "1",
"max": "10"
}
} ]
}
})";
const char kInvalidInnerCapabilityVendorCapabilityCdd[] = R"(
{
"version": "1.0",
"printer": {
"vendor_capability": [ {
"display_name": "name_1",
"type": "RANGE",
"range_cap": {
"value_type": "INTEGER",
"min": "10",
"max": "1"
}
} ]
}
})";
const char kNoInnerCapabilityVendorCapabilityCdd[] = R"(
{
"version": "1.0",
"printer": {
"vendor_capability": [ {
"display_name": "name_1",
"type": "RANGE"
} ]
}
})";
const char kSeveralInnerCapabilitiesVendorCapabilityCdd[] = R"(
{
"version": "1.0",
"printer": {
"vendor_capability": [ {
"id": "id_1",
"display_name": "name_1",
"type": "RANGE",
"range_cap": {
"value_type": "INTEGER",
"min": "1",
"max": "10"
},
"select_cap": {
"option": [ {
"value": "value",
"display_name": "name",
"is_default": true
} ]
}
} ]
}
})";
#if BUILDFLAG(IS_CHROMEOS)
const char kPinOnlyCdd[] = R"(
{
"version": "1.0",
"printer": {
"pin": {
"supported": true
}
}
})";
#endif // BUILDFLAG(IS_CHROMEOS)
const char kCjt[] = R"(
{
"version": "1.0",
"print": {
"pwg_raster_config": {
"document_sheet_back": "MANUAL_TUMBLE",
"reverse_order_streaming": true
},
"vendor_ticket_item": [
{
"id": "finishings",
"value": "trim"
}
],
"color": {
"type": "STANDARD_MONOCHROME"
},
"duplex": {
"type": "NO_DUPLEX"
},
"page_orientation": {
"type": "LANDSCAPE"
},
"copies": {
"copies": 123
},
"margins": {
"type": "CUSTOM",
"top_microns": 7,
"right_microns": 6,
"bottom_microns": 3,
"left_microns": 1
},
"dpi": {
"horizontal_dpi": 562,
"vertical_dpi": 125
},
"fit_to_page": {
"type": "SHRINK_TO_PAGE"
},
"page_range": {
"interval": [ {
"start": 1,
"end": 99
}, {
"start": 150
} ]
},
"media_size": {
"imageable_area_bottom_microns": 100,
"imageable_area_left_microns": 300,
"imageable_area_right_microns": 3961,
"imageable_area_top_microns": 234,
"name": "ISO_C7C6",
"width_microns": 4261,
"height_microns": 334
},
"collate": {
"collate": false
},
"reverse_order": {
"reverse_order": true
}
}
})";
const char kDefaultCjt[] = R"(
{
"version": "1.0"
})";
const char kBadVersionCjt[] = R"(
{
"version": "1.1",
"print": {
}
})";
const struct TestRangeCapabilities {
const char* const json_name;
RangeVendorCapability range_capability;
} kTestRangeCapabilities[] = {
{kIntegerRangeVendorCapabilityJson,
RangeVendorCapability(RangeVendorCapability::ValueType::INTEGER,
"0",
"10")},
{kFloatDefaultRangeVendorCapabilityJson,
RangeVendorCapability(RangeVendorCapability::ValueType::FLOAT,
"0.0",
"1.0",
"0.5")}};
const struct TestTypedValueCapabilities {
const char* const json_name;
TypedValueVendorCapability typed_value_capability;
} kTestTypedValueCapabilities[] = {
{kBooleanTypedValueVendorCapabilityJson,
TypedValueVendorCapability(TypedValueVendorCapability::ValueType::BOOLEAN,
"true")},
{kFloatTypedValueVendorCapabilityJson,
TypedValueVendorCapability(TypedValueVendorCapability::ValueType::FLOAT,
"1.0")},
{kIntegerTypedValueVendorCapabilityJson,
TypedValueVendorCapability(TypedValueVendorCapability::ValueType::INTEGER,
"10")},
{kStringTypedValueVendorCapabilityJson,
TypedValueVendorCapability(TypedValueVendorCapability::ValueType::STRING,
"value")},
};
TEST(PrinterDescriptionTest, CddInit) {
CloudDeviceDescription description;
EXPECT_EQ(NormalizeJson(kDefaultCdd),
NormalizeJson(description.ToStringForTesting()));
ContentTypesCapability content_types;
PwgRasterConfigCapability pwg_raster;
ColorCapability color;
DuplexCapability duplex;
OrientationCapability orientation;
MarginsCapability margins;
DpiCapability dpi;
FitToPageCapability fit_to_page;
MediaCapability media;
CopiesCapability copies;
PageRangeCapability page_range;
CollateCapability collate;
ReverseCapability reverse;
EXPECT_FALSE(content_types.LoadFrom(description));
EXPECT_FALSE(pwg_raster.LoadFrom(description));
EXPECT_FALSE(color.LoadFrom(description));
EXPECT_FALSE(duplex.LoadFrom(description));
EXPECT_FALSE(orientation.LoadFrom(description));
EXPECT_FALSE(copies.LoadFrom(description));
EXPECT_FALSE(margins.LoadFrom(description));
EXPECT_FALSE(dpi.LoadFrom(description));
EXPECT_FALSE(fit_to_page.LoadFrom(description));
EXPECT_FALSE(page_range.LoadFrom(description));
EXPECT_FALSE(media.LoadFrom(description));
EXPECT_FALSE(collate.LoadFrom(description));
EXPECT_FALSE(reverse.LoadFrom(description));
EXPECT_FALSE(media.LoadFrom(description));
}
TEST(PrinterDescriptionTest, CddInvalid) {
CloudDeviceDescription description;
ColorCapability color;
EXPECT_FALSE(description.InitFromString(kBadVersionCdd));
EXPECT_TRUE(description.InitFromString(kMultyDefaultCdd));
EXPECT_FALSE(color.LoadFrom(description));
}
TEST(PrinterDescriptionTest, CddSetAll) {
CloudDeviceDescription description;
ContentTypesCapability content_types;
PwgRasterConfigCapability pwg_raster_config;
ColorCapability color;
DuplexCapability duplex;
OrientationCapability orientation;
MarginsCapability margins;
DpiCapability dpi;
FitToPageCapability fit_to_page;
MediaCapability media;
CopiesCapability copies;
PageRangeCapability page_range;
CollateCapability collate;
ReverseCapability reverse;
content_types.AddOption("image/pwg-raster");
content_types.AddOption("image/jpeg");
PwgRasterConfig custom_raster;
custom_raster.document_sheet_back = DocumentSheetBack::MANUAL_TUMBLE;
custom_raster.reverse_order_streaming = true;
custom_raster.rotate_all_pages = false;
pwg_raster_config.set_value(custom_raster);
color.AddOption(Color(ColorType::STANDARD_COLOR));
color.AddOption(Color(ColorType::STANDARD_MONOCHROME));
Color custom(ColorType::CUSTOM_MONOCHROME);
custom.vendor_id = "123";
custom.custom_display_name = "monochrome";
color.AddOption(custom);
duplex.AddDefaultOption(DuplexType::LONG_EDGE, true);
duplex.AddOption(DuplexType::SHORT_EDGE);
duplex.AddOption(DuplexType::NO_DUPLEX);
orientation.AddOption(OrientationType::PORTRAIT);
orientation.AddOption(OrientationType::LANDSCAPE);
orientation.AddDefaultOption(OrientationType::AUTO_ORIENTATION, true);
margins.AddDefaultOption(Margins(MarginsType::NO_MARGINS, 0, 0, 0, 0), true);
margins.AddOption(Margins(MarginsType::STANDARD_MARGINS, 100, 200, 300, 400));
margins.AddOption(Margins(MarginsType::CUSTOM_MARGINS, 1, 2, 3, 4));
dpi.AddOption(Dpi(150, 250));
dpi.AddDefaultOption(Dpi(600, 1600), true);
fit_to_page.AddDefaultOption(FitToPageType::NO_FITTING, true);
fit_to_page.AddOption(FitToPageType::FIT_TO_PAGE);
fit_to_page.AddOption(FitToPageType::GROW_TO_PAGE);
fit_to_page.AddOption(FitToPageType::SHRINK_TO_PAGE);
fit_to_page.AddOption(FitToPageType::FILL_PAGE);
media.AddDefaultOption(Media(MediaType::NA_LETTER, gfx::Size(2222, 3333)),
true);
media.AddOption(Media(MediaType::ISO_A6, gfx::Size(4444, 5555)));
media.AddOption(Media(MediaType::JPN_YOU4, gfx::Size(6666, 7777)));
media.AddOption(Media("Feed", "FEED", gfx::Size(1111, 0)));
collate.set_default_value(false);
reverse.set_default_value(true);
content_types.SaveTo(&description);
color.SaveTo(&description);
duplex.SaveTo(&description);
orientation.SaveTo(&description);
copies.SaveTo(&description);
margins.SaveTo(&description);
dpi.SaveTo(&description);
fit_to_page.SaveTo(&description);
page_range.SaveTo(&description);
media.SaveTo(&description);
collate.SaveTo(&description);
reverse.SaveTo(&description);
pwg_raster_config.SaveTo(&description);
EXPECT_EQ(NormalizeJson(kCdd),
NormalizeJson(description.ToStringForTesting()));
}
TEST(PrinterDescriptionTest, CddGetDocumentTypeSupported) {
{
CloudDeviceDescription description;
ASSERT_TRUE(description.InitFromString(kDocumentTypeColorOnlyCdd));
PwgRasterConfigCapability pwg_raster;
EXPECT_TRUE(pwg_raster.LoadFrom(description));
ASSERT_EQ(1U, pwg_raster.value().document_types_supported.size());
EXPECT_EQ(PwgDocumentTypeSupported::SRGB_8,
pwg_raster.value().document_types_supported[0]);
EXPECT_EQ(DocumentSheetBack::ROTATED,
pwg_raster.value().document_sheet_back);
EXPECT_FALSE(pwg_raster.value().reverse_order_streaming);
}
{
CloudDeviceDescription description;
ASSERT_TRUE(description.InitFromString(kDocumentTypeGrayOnlyCdd));
PwgRasterConfigCapability pwg_raster;
EXPECT_TRUE(pwg_raster.LoadFrom(description));
ASSERT_EQ(1U, pwg_raster.value().document_types_supported.size());
EXPECT_EQ(PwgDocumentTypeSupported::SGRAY_8,
pwg_raster.value().document_types_supported[0]);
EXPECT_EQ(DocumentSheetBack::ROTATED,
pwg_raster.value().document_sheet_back);
EXPECT_FALSE(pwg_raster.value().reverse_order_streaming);
}
{
CloudDeviceDescription description;
ASSERT_TRUE(description.InitFromString(kDocumentTypeColorAndGrayCdd));
PwgRasterConfigCapability pwg_raster;
EXPECT_TRUE(pwg_raster.LoadFrom(description));
ASSERT_EQ(2U, pwg_raster.value().document_types_supported.size());
EXPECT_EQ(PwgDocumentTypeSupported::SRGB_8,
pwg_raster.value().document_types_supported[0]);
EXPECT_EQ(PwgDocumentTypeSupported::SGRAY_8,
pwg_raster.value().document_types_supported[1]);
EXPECT_EQ(DocumentSheetBack::ROTATED,
pwg_raster.value().document_sheet_back);
EXPECT_FALSE(pwg_raster.value().reverse_order_streaming);
}
{
CloudDeviceDescription description;
ASSERT_TRUE(
description.InitFromString(kDocumentTypeColorAndUnsupportedCdd));
PwgRasterConfigCapability pwg_raster;
EXPECT_TRUE(pwg_raster.LoadFrom(description));
ASSERT_EQ(1U, pwg_raster.value().document_types_supported.size());
EXPECT_EQ(PwgDocumentTypeSupported::SRGB_8,
pwg_raster.value().document_types_supported[0]);
EXPECT_EQ(DocumentSheetBack::ROTATED,
pwg_raster.value().document_sheet_back);
EXPECT_FALSE(pwg_raster.value().reverse_order_streaming);
}
{
CloudDeviceDescription description;
ASSERT_TRUE(description.InitFromString(kDocumentTypeNoneCdd));
PwgRasterConfigCapability pwg_raster;
EXPECT_TRUE(pwg_raster.LoadFrom(description));
EXPECT_EQ(0U, pwg_raster.value().document_types_supported.size());
EXPECT_EQ(DocumentSheetBack::ROTATED,
pwg_raster.value().document_sheet_back);
EXPECT_FALSE(pwg_raster.value().reverse_order_streaming);
}
{
CloudDeviceDescription description;
ASSERT_TRUE(description.InitFromString(kDocumentTypeNotStringCdd));
PwgRasterConfigCapability pwg_raster;
EXPECT_FALSE(pwg_raster.LoadFrom(description));
}
{
CloudDeviceDescription description;
ASSERT_TRUE(description.InitFromString(kDocumentTypeNotListCdd));
PwgRasterConfigCapability pwg_raster;
EXPECT_FALSE(pwg_raster.LoadFrom(description));
}
}
TEST(PrinterDescriptionTest, CddSetDocumentTypeSupported) {
{
CloudDeviceDescription description;
PwgRasterConfig custom_raster;
custom_raster.document_types_supported.push_back(
PwgDocumentTypeSupported::SRGB_8);
custom_raster.document_sheet_back = DocumentSheetBack::ROTATED;
PwgRasterConfigCapability pwg_raster;
pwg_raster.set_value(custom_raster);
pwg_raster.SaveTo(&description);
EXPECT_EQ(NormalizeJson(kDocumentTypeColorOnlyCdd),
NormalizeJson(description.ToStringForTesting()));
}
{
CloudDeviceDescription description;
PwgRasterConfig custom_raster;
custom_raster.document_types_supported.push_back(
PwgDocumentTypeSupported::SGRAY_8);
custom_raster.document_sheet_back = DocumentSheetBack::ROTATED;
PwgRasterConfigCapability pwg_raster;
pwg_raster.set_value(custom_raster);
pwg_raster.SaveTo(&description);
EXPECT_EQ(NormalizeJson(kDocumentTypeGrayOnlyCdd),
NormalizeJson(description.ToStringForTesting()));
}
{
CloudDeviceDescription description;
PwgRasterConfig custom_raster;
custom_raster.document_types_supported.push_back(
PwgDocumentTypeSupported::SRGB_8);
custom_raster.document_types_supported.push_back(
PwgDocumentTypeSupported::SGRAY_8);
custom_raster.document_sheet_back = DocumentSheetBack::ROTATED;
PwgRasterConfigCapability pwg_raster;
pwg_raster.set_value(custom_raster);
pwg_raster.SaveTo(&description);
EXPECT_EQ(NormalizeJson(kDocumentTypeColorAndGrayCdd),
NormalizeJson(description.ToStringForTesting()));
}
{
CloudDeviceDescription description;
PwgRasterConfig custom_raster;
custom_raster.document_sheet_back = DocumentSheetBack::ROTATED;
PwgRasterConfigCapability pwg_raster;
pwg_raster.set_value(custom_raster);
pwg_raster.SaveTo(&description);
EXPECT_EQ(NormalizeJson(kDocumentTypeNoneCdd),
NormalizeJson(description.ToStringForTesting()));
}
}
TEST(PrinterDescriptionTest, CddGetRangeVendorCapability) {
for (const auto& capacity : kTestRangeCapabilities) {
base::Value description = base::test::ParseJson(capacity.json_name);
ASSERT_TRUE(description.is_dict());
RangeVendorCapability range_capability;
EXPECT_TRUE(range_capability.LoadFrom(description.GetDict()));
EXPECT_EQ(capacity.range_capability, range_capability);
}
const char* const kInvalidJsonNames[] = {
kMissingMinValueRangeVendorCapabilityJson,
kInvalidTypeRangeVendorCapabilityJson,
kInvalidBoundariesRangeVendorCapabilityJson,
kInvalidDefaultValueRangeVendorCapabilityJson};
for (const char* invalid_json_name : kInvalidJsonNames) {
base::Value description = base::test::ParseJson(invalid_json_name);
ASSERT_TRUE(description.is_dict());
RangeVendorCapability range_capability;
EXPECT_FALSE(range_capability.LoadFrom(description.GetDict()));
}
}
TEST(PrinterDescriptionTest, CddSetRangeVendorCapability) {
for (const auto& capacity : kTestRangeCapabilities) {
base::Value::Dict range_capability_value;
capacity.range_capability.SaveTo(&range_capability_value);
std::string range_capability_str;
EXPECT_TRUE(base::JSONWriter::WriteWithOptions(
range_capability_value, base::JSONWriter::OPTIONS_PRETTY_PRINT,
&range_capability_str));
EXPECT_EQ(NormalizeJson(capacity.json_name),
NormalizeJson(range_capability_str));
}
}
TEST(PrinterDescriptionTest, CddGetSelectVendorCapability) {
{
base::Value description =
base::test::ParseJson(kSelectVendorCapabilityJson);
ASSERT_TRUE(description.is_dict());
SelectVendorCapability select_capability;
EXPECT_TRUE(select_capability.LoadFrom(description.GetDict()));
EXPECT_EQ(2u, select_capability.size());
EXPECT_TRUE(select_capability.Contains(
SelectVendorCapabilityOption("value_1", "name_1")));
EXPECT_TRUE(select_capability.Contains(
SelectVendorCapabilityOption("value_2", "name_2")));
EXPECT_EQ(SelectVendorCapabilityOption("value_2", "name_2"),
select_capability.GetDefault());
}
{
base::Value description =
base::test::ParseJson(kNoDefaultSelectVendorCapabilityJson);
ASSERT_TRUE(description.is_dict());
SelectVendorCapability select_capability;
EXPECT_TRUE(select_capability.LoadFrom(description.GetDict()));
EXPECT_EQ(2u, select_capability.size());
EXPECT_TRUE(select_capability.Contains(
SelectVendorCapabilityOption("value_1", "name_1")));
EXPECT_TRUE(select_capability.Contains(
SelectVendorCapabilityOption("value_2", "name_2")));
EXPECT_EQ(SelectVendorCapabilityOption("value_1", "name_1"),
select_capability.GetDefault());
}
const char* const kInvalidJsonNames[] = {
kNotListSelectVendorCapabilityJson,
kMissingValueSelectVendorCapabilityJson,
kMissingDisplayNameSelectVendorCapabilityJson,
kSeveralDefaultsSelectVendorCapabilityJson};
for (const char* invalid_json_name : kInvalidJsonNames) {
base::Value description = base::test::ParseJson(invalid_json_name);
ASSERT_TRUE(description.is_dict());
SelectVendorCapability select_capability;
EXPECT_FALSE(select_capability.LoadFrom(description.GetDict()));
}
}
TEST(PrinterDescriptionTest, CddSetSelectVendorCapability) {
{
SelectVendorCapability select_capability;
select_capability.AddOption(
SelectVendorCapabilityOption("value_1", "name_1"));
select_capability.AddDefaultOption(
SelectVendorCapabilityOption("value_2", "name_2"), true);
base::Value::Dict select_capability_value;
select_capability.SaveTo(&select_capability_value);
std::string select_capability_str;
EXPECT_TRUE(base::JSONWriter::WriteWithOptions(
select_capability_value, base::JSONWriter::OPTIONS_PRETTY_PRINT,
&select_capability_str));
EXPECT_EQ(NormalizeJson(kSelectVendorCapabilityJson),
NormalizeJson(select_capability_str));
}
{
SelectVendorCapability select_capability;
select_capability.AddOption(
SelectVendorCapabilityOption("value_1", "name_1"));
select_capability.AddOption(
SelectVendorCapabilityOption("value_2", "name_2"));
base::Value::Dict select_capability_value;
select_capability.SaveTo(&select_capability_value);
std::string select_capability_str;
EXPECT_TRUE(base::JSONWriter::WriteWithOptions(
select_capability_value, base::JSONWriter::OPTIONS_PRETTY_PRINT,
&select_capability_str));
EXPECT_EQ(NormalizeJson(kNoDefaultSelectVendorCapabilityJson),
NormalizeJson(select_capability_str));
}
}
TEST(PrinterDescriptionTest, CddGetTypedValueVendorCapability) {
for (const auto& capacity : kTestTypedValueCapabilities) {
base::Value description = base::test::ParseJson(capacity.json_name);
ASSERT_TRUE(description.is_dict());
TypedValueVendorCapability typed_value_capability;
EXPECT_TRUE(typed_value_capability.LoadFrom(description.GetDict()));
EXPECT_EQ(capacity.typed_value_capability, typed_value_capability);
}
const char* const kInvalidJsonNames[] = {
kMissingValueTypeTypedValueVendorCapabilityJson,
kInvalidBooleanTypedValueVendorCapabilityJson,
kInvalidFloatTypedValueVendorCapabilityJson,
kInvalidIntegerTypedValueVendorCapabilityJson};
for (const char* invalid_json_name : kInvalidJsonNames) {
base::Value description = base::test::ParseJson(invalid_json_name);
ASSERT_TRUE(description.is_dict());
TypedValueVendorCapability typed_value_capability;
EXPECT_FALSE(typed_value_capability.LoadFrom(description.GetDict()));
}
}
TEST(PrinterDescriptionTest, CddSetTypedValueVendorCapability) {
for (const auto& capacity : kTestTypedValueCapabilities) {
base::Value::Dict typed_value_capability_value;
capacity.typed_value_capability.SaveTo(&typed_value_capability_value);
std::string typed_value_capability_str;
EXPECT_TRUE(base::JSONWriter::WriteWithOptions(
typed_value_capability_value, base::JSONWriter::OPTIONS_PRETTY_PRINT,
&typed_value_capability_str));
EXPECT_EQ(NormalizeJson(capacity.json_name),
NormalizeJson(typed_value_capability_str));
}
}
TEST(PrinterDescriptionTest, CddGetVendorCapability) {
{
CloudDeviceDescription description;
ASSERT_TRUE(description.InitFromString(kVendorCapabilityOnlyCdd));
VendorCapabilities vendor_capabilities;
EXPECT_TRUE(vendor_capabilities.LoadFrom(description));
EXPECT_EQ(3u, vendor_capabilities.size());
EXPECT_TRUE(vendor_capabilities.Contains(VendorCapability(
"id_1", "name_1",
RangeVendorCapability(RangeVendorCapability::ValueType::INTEGER, "1",
"10"))));
SelectVendorCapability select_capability;
select_capability.AddDefaultOption(
SelectVendorCapabilityOption("value", "name"), true);
EXPECT_TRUE(vendor_capabilities.Contains(
VendorCapability("id_2", "name_2", std::move(select_capability))));
EXPECT_TRUE(vendor_capabilities.Contains(VendorCapability(
"id_3", "name_3",
TypedValueVendorCapability(
TypedValueVendorCapability::ValueType::INTEGER, "1"))));
}
const char* const kInvalidJsonNames[] = {
kMissingIdVendorCapabilityCdd, kInvalidInnerCapabilityVendorCapabilityCdd,
kNoInnerCapabilityVendorCapabilityCdd,
kSeveralInnerCapabilitiesVendorCapabilityCdd};
for (const char* invalid_json_name : kInvalidJsonNames) {
CloudDeviceDescription description;
ASSERT_TRUE(description.InitFromString(invalid_json_name));
VendorCapabilities vendor_capabilities;
EXPECT_FALSE(vendor_capabilities.LoadFrom(description));
}
}
TEST(PrinterDescriptionTest, CddSetVendorCapability) {
CloudDeviceDescription description;
VendorCapabilities vendor_capabilities;
vendor_capabilities.AddOption(VendorCapability(
"id_1", "name_1",
RangeVendorCapability(RangeVendorCapability::ValueType::INTEGER, "1",
"10")));
SelectVendorCapability select_capability;
select_capability.AddDefaultOption(
SelectVendorCapabilityOption("value", "name"), true);
vendor_capabilities.AddOption(
VendorCapability("id_2", "name_2", std::move(select_capability)));
vendor_capabilities.AddOption(VendorCapability(
"id_3", "name_3",
TypedValueVendorCapability(TypedValueVendorCapability::ValueType::INTEGER,
"1")));
vendor_capabilities.SaveTo(&description);
EXPECT_EQ(NormalizeJson(kVendorCapabilityOnlyCdd),
NormalizeJson(description.ToStringForTesting()));
}
#if BUILDFLAG(IS_CHROMEOS)
TEST(PrinterDescriptionTest, CddGetPin) {
{
CloudDeviceDescription description;
ASSERT_TRUE(description.InitFromString(kPinOnlyCdd));
PinCapability pin_capability;
EXPECT_TRUE(pin_capability.LoadFrom(description));
EXPECT_TRUE(pin_capability.value());
}
{
CloudDeviceDescription description;
ASSERT_TRUE(description.InitFromString(kDefaultCdd));
PinCapability pin_capability;
EXPECT_FALSE(pin_capability.LoadFrom(description));
}
}
TEST(PrinterDescriptionTest, CddSetPin) {
CloudDeviceDescription description;
PinCapability pin_capability;
pin_capability.set_value(true);
pin_capability.SaveTo(&description);
EXPECT_EQ(NormalizeJson(kPinOnlyCdd),
NormalizeJson(description.ToStringForTesting()));
}
#endif // BUILDFLAG(IS_CHROMEOS)
TEST(PrinterDescriptionTest, CddGetAll) {
CloudDeviceDescription description;
ASSERT_TRUE(description.InitFromString(kCdd));
ContentTypesCapability content_types;
PwgRasterConfigCapability pwg_raster_config;
ColorCapability color;
DuplexCapability duplex;
OrientationCapability orientation;
MarginsCapability margins;
DpiCapability dpi;
FitToPageCapability fit_to_page;
MediaCapability media;
CopiesCapability copies;
PageRangeCapability page_range;
CollateCapability collate;
ReverseCapability reverse;
EXPECT_TRUE(content_types.LoadFrom(description));
EXPECT_TRUE(color.LoadFrom(description));
EXPECT_TRUE(duplex.LoadFrom(description));
EXPECT_TRUE(orientation.LoadFrom(description));
EXPECT_TRUE(copies.LoadFrom(description));
EXPECT_TRUE(margins.LoadFrom(description));
EXPECT_TRUE(dpi.LoadFrom(description));
EXPECT_TRUE(fit_to_page.LoadFrom(description));
EXPECT_TRUE(page_range.LoadFrom(description));
EXPECT_TRUE(media.LoadFrom(description));
EXPECT_TRUE(collate.LoadFrom(description));
EXPECT_TRUE(reverse.LoadFrom(description));
EXPECT_TRUE(media.LoadFrom(description));
EXPECT_TRUE(pwg_raster_config.LoadFrom(description));
EXPECT_TRUE(content_types.Contains("image/pwg-raster"));
EXPECT_TRUE(content_types.Contains("image/jpeg"));
EXPECT_EQ(0U, pwg_raster_config.value().document_types_supported.size());
EXPECT_EQ(DocumentSheetBack::MANUAL_TUMBLE,
pwg_raster_config.value().document_sheet_back);
EXPECT_TRUE(pwg_raster_config.value().reverse_order_streaming);
EXPECT_FALSE(pwg_raster_config.value().rotate_all_pages);
EXPECT_TRUE(color.Contains(Color(ColorType::STANDARD_COLOR)));
EXPECT_TRUE(color.Contains(Color(ColorType::STANDARD_MONOCHROME)));
Color custom(ColorType::CUSTOM_MONOCHROME);
custom.vendor_id = "123";
custom.custom_display_name = "monochrome";
EXPECT_TRUE(color.Contains(custom));
EXPECT_EQ(Color(ColorType::STANDARD_COLOR), color.GetDefault());
EXPECT_TRUE(duplex.Contains(DuplexType::LONG_EDGE));
EXPECT_TRUE(duplex.Contains(DuplexType::SHORT_EDGE));
EXPECT_TRUE(duplex.Contains(DuplexType::NO_DUPLEX));
EXPECT_EQ(DuplexType::LONG_EDGE, duplex.GetDefault());
EXPECT_TRUE(orientation.Contains(OrientationType::PORTRAIT));
EXPECT_TRUE(orientation.Contains(OrientationType::LANDSCAPE));
EXPECT_TRUE(orientation.Contains(OrientationType::AUTO_ORIENTATION));
EXPECT_EQ(OrientationType::AUTO_ORIENTATION, orientation.GetDefault());
EXPECT_TRUE(margins.Contains(Margins(MarginsType::NO_MARGINS, 0, 0, 0, 0)));
EXPECT_TRUE(margins.Contains(
Margins(MarginsType::STANDARD_MARGINS, 100, 200, 300, 400)));
EXPECT_TRUE(
margins.Contains(Margins(MarginsType::CUSTOM_MARGINS, 1, 2, 3, 4)));
EXPECT_EQ(Margins(MarginsType::NO_MARGINS, 0, 0, 0, 0), margins.GetDefault());
EXPECT_TRUE(dpi.Contains(Dpi(150, 250)));
EXPECT_TRUE(dpi.Contains(Dpi(600, 1600)));
EXPECT_EQ(Dpi(600, 1600), dpi.GetDefault());
EXPECT_TRUE(fit_to_page.Contains(FitToPageType::NO_FITTING));
EXPECT_TRUE(fit_to_page.Contains(FitToPageType::FIT_TO_PAGE));
EXPECT_TRUE(fit_to_page.Contains(FitToPageType::GROW_TO_PAGE));
EXPECT_TRUE(fit_to_page.Contains(FitToPageType::SHRINK_TO_PAGE));
EXPECT_TRUE(fit_to_page.Contains(FitToPageType::FILL_PAGE));
EXPECT_EQ(FitToPageType::NO_FITTING, fit_to_page.GetDefault());
EXPECT_TRUE(
media.Contains(Media(MediaType::NA_LETTER, gfx::Size(2222, 3333))));
EXPECT_TRUE(media.Contains(Media(MediaType::ISO_A6, gfx::Size(4444, 5555))));
EXPECT_TRUE(
media.Contains(Media(MediaType::JPN_YOU4, gfx::Size(6666, 7777))));
EXPECT_TRUE(media.Contains(Media("Feed", "FEED", gfx::Size(1111, 0))));
EXPECT_EQ(Media(MediaType::NA_LETTER, gfx::Size(2222, 3333)),
media.GetDefault());
EXPECT_FALSE(collate.default_value());
EXPECT_TRUE(reverse.default_value());
EXPECT_EQ(NormalizeJson(kCdd),
NormalizeJson(description.ToStringForTesting()));
}
TEST(PrinterDescriptionTest, CjtInit) {
CloudDeviceDescription description;
EXPECT_EQ(NormalizeJson(kDefaultCjt),
NormalizeJson(description.ToStringForTesting()));
PwgRasterConfigTicketItem pwg_raster_config;
VendorTicketItems vendor_items;
ColorTicketItem color;
DuplexTicketItem duplex;
OrientationTicketItem orientation;
MarginsTicketItem margins;
DpiTicketItem dpi;
FitToPageTicketItem fit_to_page;
MediaTicketItem media;
CopiesTicketItem copies;
PageRangeTicketItem page_range;
CollateTicketItem collate;
ReverseTicketItem reverse;
EXPECT_FALSE(pwg_raster_config.LoadFrom(description));
EXPECT_FALSE(vendor_items.LoadFrom(description));
EXPECT_FALSE(color.LoadFrom(description));
EXPECT_FALSE(duplex.LoadFrom(description));
EXPECT_FALSE(orientation.LoadFrom(description));
EXPECT_FALSE(copies.LoadFrom(description));
EXPECT_FALSE(margins.LoadFrom(description));
EXPECT_FALSE(dpi.LoadFrom(description));
EXPECT_FALSE(fit_to_page.LoadFrom(description));
EXPECT_FALSE(page_range.LoadFrom(description));
EXPECT_FALSE(media.LoadFrom(description));
EXPECT_FALSE(collate.LoadFrom(description));
EXPECT_FALSE(reverse.LoadFrom(description));
EXPECT_FALSE(media.LoadFrom(description));
}
TEST(PrinterDescriptionTest, CjtInvalid) {
CloudDeviceDescription ticket;
EXPECT_FALSE(ticket.InitFromString(kBadVersionCjt));
}
TEST(PrinterDescriptionTest, CjtSetAll) {
CloudDeviceDescription description;
PwgRasterConfigTicketItem pwg_raster_config;
VendorTicketItems vendor_items;
ColorTicketItem color;
DuplexTicketItem duplex;
OrientationTicketItem orientation;
MarginsTicketItem margins;
DpiTicketItem dpi;
FitToPageTicketItem fit_to_page;
MediaTicketItem media;
CopiesTicketItem copies;
PageRangeTicketItem page_range;
CollateTicketItem collate;
ReverseTicketItem reverse;
PwgRasterConfig custom_raster;
custom_raster.document_sheet_back = DocumentSheetBack::MANUAL_TUMBLE;
custom_raster.reverse_order_streaming = true;
custom_raster.rotate_all_pages = false;
pwg_raster_config.set_value(custom_raster);
VendorItem label_cutter("finishings", "trim");
vendor_items.AddOption(std::move(label_cutter));
color.set_value(Color(ColorType::STANDARD_MONOCHROME));
duplex.set_value(DuplexType::NO_DUPLEX);
orientation.set_value(OrientationType::LANDSCAPE);
copies.set_value(123);
margins.set_value(Margins(MarginsType::CUSTOM_MARGINS, 7, 6, 3, 1));
dpi.set_value(Dpi(562, 125));
fit_to_page.set_value(FitToPageType::SHRINK_TO_PAGE);
PageRange page_ranges;
page_ranges.push_back(Interval(1, 99));
page_ranges.push_back(Interval(150));
page_range.set_value(page_ranges);
media.set_value(Media(MediaType::ISO_C7C6, gfx::Size(4261, 334),
gfx::Rect(300, 100, 3661, 134)));
collate.set_value(false);
reverse.set_value(true);
pwg_raster_config.SaveTo(&description);
vendor_items.SaveTo(&description);
color.SaveTo(&description);
duplex.SaveTo(&description);
orientation.SaveTo(&description);
copies.SaveTo(&description);
margins.SaveTo(&description);
dpi.SaveTo(&description);
fit_to_page.SaveTo(&description);
page_range.SaveTo(&description);
media.SaveTo(&description);
collate.SaveTo(&description);
reverse.SaveTo(&description);
EXPECT_EQ(NormalizeJson(kCjt),
NormalizeJson(description.ToStringForTesting()));
}
TEST(PrinterDescriptionTest, CjtGetAll) {
CloudDeviceDescription description;
ASSERT_TRUE(description.InitFromString(kCjt));
VendorTicketItems vendor_items;
ColorTicketItem color;
DuplexTicketItem duplex;
OrientationTicketItem orientation;
MarginsTicketItem margins;
DpiTicketItem dpi;
FitToPageTicketItem fit_to_page;
MediaTicketItem media;
CopiesTicketItem copies;
PageRangeTicketItem page_range;
CollateTicketItem collate;
ReverseTicketItem reverse;
PwgRasterConfigTicketItem pwg_raster_config;
EXPECT_TRUE(pwg_raster_config.LoadFrom(description));
EXPECT_TRUE(vendor_items.LoadFrom(description));
EXPECT_TRUE(color.LoadFrom(description));
EXPECT_TRUE(duplex.LoadFrom(description));
EXPECT_TRUE(orientation.LoadFrom(description));
EXPECT_TRUE(copies.LoadFrom(description));
EXPECT_TRUE(margins.LoadFrom(description));
EXPECT_TRUE(dpi.LoadFrom(description));
EXPECT_TRUE(fit_to_page.LoadFrom(description));
EXPECT_TRUE(page_range.LoadFrom(description));
EXPECT_TRUE(media.LoadFrom(description));
EXPECT_TRUE(collate.LoadFrom(description));
EXPECT_TRUE(reverse.LoadFrom(description));
EXPECT_TRUE(media.LoadFrom(description));
EXPECT_EQ(DocumentSheetBack::MANUAL_TUMBLE,
pwg_raster_config.value().document_sheet_back);
EXPECT_TRUE(pwg_raster_config.value().reverse_order_streaming);
EXPECT_FALSE(pwg_raster_config.value().rotate_all_pages);
ASSERT_EQ(vendor_items.size(), 1u);
EXPECT_EQ(vendor_items[0].id, "finishings");
EXPECT_EQ(vendor_items[0].value, "trim");
EXPECT_EQ(color.value(), Color(ColorType::STANDARD_MONOCHROME));
EXPECT_EQ(duplex.value(), DuplexType::NO_DUPLEX);
EXPECT_EQ(orientation.value(), OrientationType::LANDSCAPE);
EXPECT_EQ(copies.value(), 123);
EXPECT_EQ(margins.value(), Margins(MarginsType::CUSTOM_MARGINS, 7, 6, 3, 1));
EXPECT_EQ(dpi.value(), Dpi(562, 125));
EXPECT_EQ(fit_to_page.value(), FitToPageType::SHRINK_TO_PAGE);
PageRange page_ranges;
page_ranges.push_back(Interval(1, 99));
page_ranges.push_back(Interval(150));
EXPECT_EQ(page_range.value(), page_ranges);
EXPECT_EQ(media.value(), Media(MediaType::ISO_C7C6, gfx::Size(4261, 334),
gfx::Rect(300, 100, 3661, 134)));
EXPECT_FALSE(collate.value());
EXPECT_TRUE(reverse.value());
EXPECT_EQ(NormalizeJson(kCjt),
NormalizeJson(description.ToStringForTesting()));
}
TEST(PrinterDescriptionTest, ContentTypesCapabilityIterator) {
ContentTypesCapability content_types;
base::flat_set<ContentType> expected_types{"type1", "type2", "type3"};
for (ContentType type : expected_types) {
content_types.AddOption(std::move(type));
}
for (const auto& content_type : content_types) {
EXPECT_EQ(expected_types.erase(content_type), 1u);
}
}
} // namespace printer
} // namespace cloud_devices