blob: ed7811ea9d3ead58f926ef38815ca323cf073246 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/policy/webhid_device_policy_handler.h"
#include <memory>
#include <utility>
#include "base/strings/string_util.h"
#include "base/test/values_test_util.h"
#include "chrome/common/pref_names.h"
#include "components/policy/core/browser/configuration_policy_pref_store.h"
#include "components/policy/core/browser/configuration_policy_pref_store_test.h"
#include "components/policy/core/browser/policy_error_map.h"
#include "components/policy/core/common/policy_map.h"
#include "components/policy/core/common/policy_types.h"
#include "components/policy/core/common/schema.h"
#include "components/policy/policy_constants.h"
namespace policy {
namespace {
using ::base::test::IsJson;
using ::base::test::ParseJson;
using ::testing::WithParamInterface;
constexpr char kDevicesKey[] = "devices";
constexpr char kUsagesKey[] = "usages";
constexpr char kUrlsKey[] = "urls";
constexpr char kVendorIdKey[] = "vendor_id";
constexpr char kProductIdKey[] = "product_id";
constexpr char kUsagePageKey[] = "usage_page";
constexpr char kUsageKey[] = "usage";
} // namespace
class WebHidDevicePolicyHandlerTest : public ConfigurationPolicyPrefStoreTest {
public:
WebHidDevicePolicyHandlerTest() = default;
WebHidDevicePolicyHandlerTest(const WebHidDevicePolicyHandlerTest&) = delete;
WebHidDevicePolicyHandlerTest& operator=(
const WebHidDevicePolicyHandlerTest&) = delete;
~WebHidDevicePolicyHandlerTest() override = default;
protected:
SchemaValidatingPolicyHandler* AddHandler(const char* policy_name) {
auto handler = CreateHandler(policy_name);
EXPECT_TRUE(handler) << "no policy handler for " << policy_name;
if (!handler)
return nullptr;
auto* handler_ptr = handler.get();
handler_list_.AddHandler(std::move(handler));
return handler_ptr;
}
private:
// Returns the appropriate handler for `policy_name`, which must be a
// `policy::key::` constant.
std::unique_ptr<SchemaValidatingPolicyHandler> CreateHandler(
const char* policy_name) {
Schema chrome_schema = Schema::Wrap(GetChromeSchemaData());
if (policy_name == key::kWebHidAllowDevicesForUrls) {
return std::make_unique<WebHidDevicePolicyHandler>(
key::kWebHidAllowDevicesForUrls,
prefs::kManagedWebHidAllowDevicesForUrls, chrome_schema);
}
if (policy_name == key::kWebHidAllowDevicesWithHidUsagesForUrls) {
return std::make_unique<WebHidDevicePolicyHandler>(
key::kWebHidAllowDevicesWithHidUsagesForUrls,
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls, chrome_schema);
}
return nullptr;
}
};
namespace {
constexpr uint16_t kTestVendorId1 = 1234;
constexpr uint16_t kTestVendorId2 = 4321;
constexpr uint16_t kTestVendorId3 = 2000;
constexpr uint16_t kTestProductId = 5678;
constexpr uint16_t kTestUsagePage1 = 1;
constexpr uint16_t kTestUsagePage2 = 2;
constexpr uint16_t kTestUsagePage3 = 3;
constexpr uint16_t kTestUsage = 4;
constexpr char kAllowDevicesForUrls[] = R"(
[
{
"devices": [
{
"vendor_id": 1234,
"product_id": 5678
},
{
"vendor_id": 4321
}
],
"urls": [
"https://origin1",
"https://origin2"
]
}, {
"devices": [
{
"vendor_id": 2000
}
],
"urls": [
"https://origin3"
]
}
])";
constexpr char kAllowDevicesWithHidUsagesForUrls[] = R"(
[
{
"usages": [
{
"usage_page": 1,
"usage": 4
},
{
"usage_page": 2
}
],
"urls": [
"https://origin1",
"https://origin2"
]
}, {
"usages": [
{
"usage_page": 3
}
],
"urls": [
"https://origin3"
]
}
])";
} // namespace
TEST_F(WebHidDevicePolicyHandlerTest, CheckPolicySettingsWithDevicePolicy) {
auto* handler = AddHandler(key::kWebHidAllowDevicesForUrls);
PolicyMap policy;
PolicyErrorMap errors;
policy.Set(
key::kWebHidAllowDevicesForUrls, PolicyLevel::POLICY_LEVEL_MANDATORY,
PolicyScope::POLICY_SCOPE_MACHINE, PolicySource::POLICY_SOURCE_CLOUD,
ParseJson(kAllowDevicesForUrls), /*external_data_fetcher=*/nullptr);
ASSERT_TRUE(errors.empty());
EXPECT_TRUE(handler->CheckPolicySettings(policy, &errors));
EXPECT_TRUE(errors.empty());
}
TEST_F(WebHidDevicePolicyHandlerTest, CheckPolicySettingsWithUsagePolicy) {
auto* handler = AddHandler(key::kWebHidAllowDevicesWithHidUsagesForUrls);
PolicyMap policy;
PolicyErrorMap errors;
policy.Set(key::kWebHidAllowDevicesWithHidUsagesForUrls,
PolicyLevel::POLICY_LEVEL_MANDATORY,
PolicyScope::POLICY_SCOPE_MACHINE,
PolicySource::POLICY_SOURCE_CLOUD,
ParseJson(kAllowDevicesWithHidUsagesForUrls),
/*external_data_fetcher=*/nullptr);
ASSERT_TRUE(errors.empty());
EXPECT_TRUE(handler->CheckPolicySettings(policy, &errors));
EXPECT_TRUE(errors.empty());
}
TEST_F(WebHidDevicePolicyHandlerTest, ApplyPolicySettingsWithDevicePolicy) {
AddHandler(key::kWebHidAllowDevicesForUrls);
EXPECT_FALSE(store_->GetValue(prefs::kManagedWebHidAllowDevicesForUrls,
/*result=*/nullptr));
PolicyMap policy;
policy.Set(
key::kWebHidAllowDevicesForUrls, PolicyLevel::POLICY_LEVEL_MANDATORY,
PolicyScope::POLICY_SCOPE_MACHINE, PolicySource::POLICY_SOURCE_CLOUD,
ParseJson(kAllowDevicesForUrls), nullptr);
UpdateProviderPolicy(policy);
const base::Value* pref_value = nullptr;
EXPECT_TRUE(
store_->GetValue(prefs::kManagedWebHidAllowDevicesForUrls, &pref_value));
ASSERT_TRUE(pref_value);
ASSERT_TRUE(pref_value->is_list());
// Ensure that the kManagedWebHidAllowDevicesForUrls pref is set correctly.
const auto& list = pref_value->GetList();
ASSERT_EQ(2ul, list.size());
// Check the first item's devices list.
const base::Value::List* first_devices_list =
list[0].GetDict().FindList(kDevicesKey);
ASSERT_TRUE(first_devices_list);
ASSERT_EQ(2ul, first_devices_list->size());
const base::Value* vendor_id =
(*first_devices_list)[0].GetDict().Find(kVendorIdKey);
ASSERT_TRUE(vendor_id);
EXPECT_EQ(base::Value(kTestVendorId1), *vendor_id);
const base::Value* product_id =
(*first_devices_list)[0].GetDict().Find(kProductIdKey);
ASSERT_TRUE(product_id);
EXPECT_EQ(base::Value(kTestProductId), *product_id);
vendor_id = (*first_devices_list)[1].GetDict().Find(kVendorIdKey);
ASSERT_TRUE(vendor_id);
EXPECT_EQ(base::Value(kTestVendorId2), *vendor_id);
product_id = (*first_devices_list)[1].GetDict().Find(kProductIdKey);
EXPECT_FALSE(product_id);
// Check the first item's urls list.
const base::Value::List* urls = list[0].GetDict().FindList(kUrlsKey);
ASSERT_TRUE(urls);
ASSERT_EQ(2ul, urls->size());
EXPECT_EQ(base::Value("https://origin1"), (*urls)[0]);
EXPECT_EQ(base::Value("https://origin2"), (*urls)[1]);
// Check the second item's devices list.
const base::Value::List* second_devices_list =
list[1].GetDict().FindList(kDevicesKey);
ASSERT_TRUE(second_devices_list);
ASSERT_EQ(1ul, second_devices_list->size());
vendor_id = (*second_devices_list)[0].GetDict().Find(kVendorIdKey);
ASSERT_TRUE(vendor_id);
EXPECT_EQ(base::Value(kTestVendorId3), *vendor_id);
product_id = (*second_devices_list)[0].GetDict().Find(kProductIdKey);
EXPECT_FALSE(product_id);
// Check the second item's urls list.
urls = list[1].GetDict().FindList(kUrlsKey);
ASSERT_TRUE(urls);
ASSERT_EQ(1ul, urls->size());
EXPECT_EQ(base::Value("https://origin3"), (*urls)[0]);
}
TEST_F(WebHidDevicePolicyHandlerTest, ApplyPolicySettingsWithUsagePolicy) {
AddHandler(key::kWebHidAllowDevicesWithHidUsagesForUrls);
EXPECT_FALSE(
store_->GetValue(prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
/*result=*/nullptr));
PolicyMap policy;
policy.Set(key::kWebHidAllowDevicesWithHidUsagesForUrls,
PolicyLevel::POLICY_LEVEL_MANDATORY,
PolicyScope::POLICY_SCOPE_MACHINE,
PolicySource::POLICY_SOURCE_CLOUD,
ParseJson(kAllowDevicesWithHidUsagesForUrls), nullptr);
UpdateProviderPolicy(policy);
const base::Value* pref_value = nullptr;
EXPECT_TRUE(store_->GetValue(
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls, &pref_value));
ASSERT_TRUE(pref_value);
ASSERT_TRUE(pref_value->is_list());
// Ensure that the kManagedWebHidAllowDevicesWithHidUsagesForUrls pref is set
// correctly.
const auto& list = pref_value->GetList();
ASSERT_EQ(2ul, list.size());
// Check the first item's usages list.
const base::Value::List* first_usages_list =
list[0].GetDict().FindList(kUsagesKey);
ASSERT_TRUE(first_usages_list);
ASSERT_EQ(2ul, first_usages_list->size());
const base::Value* usage_page =
(*first_usages_list)[0].GetDict().Find(kUsagePageKey);
ASSERT_TRUE(usage_page);
EXPECT_EQ(base::Value(kTestUsagePage1), *usage_page);
const base::Value* usage = (*first_usages_list)[0].GetDict().Find(kUsageKey);
ASSERT_TRUE(usage);
EXPECT_EQ(base::Value(kTestUsage), *usage);
usage_page = (*first_usages_list)[1].GetDict().Find(kUsagePageKey);
ASSERT_TRUE(usage_page);
EXPECT_EQ(base::Value(kTestUsagePage2), *usage_page);
usage = (*first_usages_list)[1].GetDict().Find(kUsageKey);
EXPECT_FALSE(usage);
// Check the first item's urls list.
const base::Value::List* urls = list[0].GetDict().FindList(kUrlsKey);
ASSERT_TRUE(urls);
ASSERT_EQ(2ul, urls->size());
EXPECT_EQ(base::Value("https://origin1"), (*urls)[0]);
EXPECT_EQ(base::Value("https://origin2"), (*urls)[1]);
// Check the second item's usages list.
const base::Value::List* second_usages_list =
list[1].GetDict().FindList(kUsagesKey);
ASSERT_TRUE(second_usages_list);
ASSERT_EQ(1ul, second_usages_list->size());
usage_page = (*second_usages_list)[0].GetDict().Find(kUsagePageKey);
ASSERT_TRUE(usage_page);
EXPECT_EQ(base::Value(kTestUsagePage3), *usage_page);
usage = (*second_usages_list)[0].GetDict().Find(kUsageKey);
EXPECT_FALSE(usage);
// Check the second item's urls list.
urls = list[1].GetDict().FindList(kUrlsKey);
ASSERT_TRUE(urls);
ASSERT_EQ(1ul, urls->size());
EXPECT_EQ(base::Value("https://origin3"), (*urls)[0]);
}
struct WebHidInvalidPolicyTestData {
const char* policy_name;
const char* pref_name;
const char* policy;
const char16_t* expected_errors;
const char16_t* expected_warnings;
const char* expected_pref;
};
class WebHidInvalidPolicyTest
: public WebHidDevicePolicyHandlerTest,
public WithParamInterface<WebHidInvalidPolicyTestData> {};
TEST_P(WebHidInvalidPolicyTest, CheckPolicySettingsWithInvalidPolicy) {
const auto& test_data = GetParam();
auto* handler = AddHandler(test_data.policy_name);
PolicyMap policy;
policy.Set(test_data.policy_name, PolicyLevel::POLICY_LEVEL_MANDATORY,
PolicyScope::POLICY_SCOPE_MACHINE,
PolicySource::POLICY_SOURCE_CLOUD, ParseJson(test_data.policy),
/*external_data_fetcher=*/nullptr);
// Try CheckPolicySettings with the invalid policy. It returns success if the
// policy can be successfully applied, even if there are errors.
PolicyErrorMap errors;
bool success = handler->CheckPolicySettings(policy, &errors);
EXPECT_EQ(success, test_data.expected_pref != nullptr);
EXPECT_EQ(test_data.expected_errors,
errors.GetErrorMessages(test_data.policy_name));
EXPECT_EQ(test_data.expected_warnings,
errors.GetErrorMessages(test_data.policy_name,
policy::PolicyMap::MessageType::kWarning));
EXPECT_FALSE(store_->GetValue(test_data.pref_name, /*result=*/nullptr));
// Try updating the policy.
UpdateProviderPolicy(policy);
// Check that the preference has the expected value.
if (test_data.expected_pref) {
const base::Value* pref_value = nullptr;
EXPECT_TRUE(store_->GetValue(test_data.pref_name, &pref_value));
ASSERT_TRUE(pref_value);
EXPECT_THAT(*pref_value, IsJson(test_data.expected_pref));
} else {
EXPECT_FALSE(store_->GetValue(test_data.pref_name, /*result=*/nullptr));
}
}
WebHidInvalidPolicyTestData kTestData[]{
{
key::kWebHidAllowDevicesForUrls,
prefs::kManagedWebHidAllowDevicesForUrls,
R"(
[
{
"urls": [
"https://google.com"
]
}
])",
u"",
u"Error at WebHidAllowDevicesForUrls[0]: Schema validation error: "
u"Missing or invalid required property: devices",
"[]",
},
{
key::kWebHidAllowDevicesForUrls,
prefs::kManagedWebHidAllowDevicesForUrls,
R"(
[
{
"devices": [
{
"vendor_id": 1234
}
]
}
])",
u"",
u"Error at WebHidAllowDevicesForUrls[0]: Schema validation error: "
u"Missing or invalid required property: urls",
"[]",
},
{
key::kWebHidAllowDevicesForUrls,
prefs::kManagedWebHidAllowDevicesForUrls,
R"(
[
{
"devices": [
{
"vendor_id": 1234,
"serial_number": "1234ABCD"
}
],
"urls": [
"https://google.com"
]
}
])",
u"",
u"Error at WebHidAllowDevicesForUrls[0].devices[0]: Schema validation "
u"error: Unknown property: serial_number",
R"(
[
{
"devices": [
{
"vendor_id": 1234
}
],
"urls": [
"https://google.com"
]
}
])",
},
{
key::kWebHidAllowDevicesForUrls,
prefs::kManagedWebHidAllowDevicesForUrls,
R"(
[
{
"devices": [
{
"vendor_id": 65536
}
],
"urls": [
"https://google.com"
]
}
])",
u"",
u"Error at WebHidAllowDevicesForUrls[0].devices[0].vendor_id: Schema "
u"validation error: Invalid value for integer",
R"(
[
{
"devices": [],
"urls": [
"https://google.com"
]
}
])",
},
{
key::kWebHidAllowDevicesForUrls,
prefs::kManagedWebHidAllowDevicesForUrls,
R"(
[
{
"devices": [
{
"vendor_id": 1234,
"product_id": 65536
}
],
"urls": [
"https://google.com"
]
}
])",
u"",
u"Error at WebHidAllowDevicesForUrls[0].devices[0].product_id: Schema "
u"validation error: Invalid value for integer",
R"(
[
{
"devices": [],
"urls": [
"https://google.com"
]
}
])",
},
{
key::kWebHidAllowDevicesForUrls,
prefs::kManagedWebHidAllowDevicesForUrls,
R"(
[
{
"devices": [
{
"product_id": 1234
}
],
"urls": [
"https://google.com"
]
}
])",
u"",
u"Error at WebHidAllowDevicesForUrls[0].devices[0]: Schema validation "
u"error: Missing or invalid required property: vendor_id",
R"(
[
{
"devices": [],
"urls": [
"https://google.com"
]
}
])",
},
{
key::kWebHidAllowDevicesForUrls,
prefs::kManagedWebHidAllowDevicesForUrls,
R"(
[
{
"devices": [
{
"vendor_id": 1234
}
],
"urls": [
"not-a-valid-url"
]
}
])",
u"Error at WebHidAllowDevicesForUrls[0].urls[0]: Invalid URL.",
u"",
R"(
[
{
"devices": [
{
"vendor_id": 1234
}
],
"urls": [
"not-a-valid-url"
]
}
])",
},
{
key::kWebHidAllowDevicesForUrls,
prefs::kManagedWebHidAllowDevicesForUrls,
R"(
[
{
"devices": [
{
"vendor_id": 1234
}
],
"urls": [
""
]
}
])",
u"Error at WebHidAllowDevicesForUrls[0].urls[0]: Invalid URL.",
u"",
R"(
[
{
"devices": [
{
"vendor_id": 1234
}
],
"urls": [
""
]
}
])",
},
{
key::kWebHidAllowDevicesForUrls,
prefs::kManagedWebHidAllowDevicesForUrls,
R"(
[
{
"devices": [
{
"vendor_id": 1234
}
],
"urls": [
"invalid-url-1",
"invalid-url-2"
]
}
])",
u"Error at WebHidAllowDevicesForUrls[0].urls[0]: Invalid URL.\n"
u"Error at WebHidAllowDevicesForUrls[0].urls[1]: Invalid URL.",
u"",
R"(
[
{
"devices": [
{
"vendor_id": 1234
}
],
"urls": [
"invalid-url-1",
"invalid-url-2"
]
}
])",
},
{
key::kWebHidAllowDevicesForUrls,
prefs::kManagedWebHidAllowDevicesForUrls,
R"(
[
{
"devices": [
{
"vendor_id": 1234
}
],
"urls": [
123
]
}
])",
u"Error at WebHidAllowDevicesForUrls[0].urls[0]: Invalid URL.",
u"Error at WebHidAllowDevicesForUrls[0].urls[0]: Schema validation "
u"error: Policy type mismatch: expected: \"string\", actual: "
u"\"integer\".",
R"(
[
{
"devices": [
{
"vendor_id": 1234
}
],
"urls": [
]
}
])",
},
{
key::kWebHidAllowDevicesForUrls,
prefs::kManagedWebHidAllowDevicesForUrls,
R"(
[123]
)",
u"",
u"Error at WebHidAllowDevicesForUrls[0]: Schema validation error: "
u"Policy type mismatch: expected: \"dictionary\", actual: \"integer\".",
R"(
[]
)",
},
{
key::kWebHidAllowDevicesWithHidUsagesForUrls,
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
R"(
[
{
"urls": [
"https://google.com"
]
}
])",
u"",
u"Error at WebHidAllowDevicesWithHidUsagesForUrls[0]: Schema "
u"validation error: Missing or invalid required property: usages",
"[]",
},
{
key::kWebHidAllowDevicesWithHidUsagesForUrls,
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
R"(
[
{
"usages": [
{
"usage_page": 1234
}
]
}
])",
u"",
u"Error at WebHidAllowDevicesWithHidUsagesForUrls[0]: Schema "
u"validation "
u"error: Missing or invalid required property: urls",
"[]",
},
{
key::kWebHidAllowDevicesWithHidUsagesForUrls,
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
R"(
[
{
"usages": [
{
"usage_page": 1234,
"serial_number": "1234ABCD"
}
],
"urls": [
"https://google.com"
]
}
])",
u"",
u"Error at WebHidAllowDevicesWithHidUsagesForUrls[0].usages[0]: "
u"Schema "
u"validation error: Unknown property: serial_number",
R"(
[
{
"usages": [
{
"usage_page": 1234
}
],
"urls": [
"https://google.com"
]
}
])",
},
{
key::kWebHidAllowDevicesWithHidUsagesForUrls,
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
R"(
[
{
"usages": [
{
"usage_page": 65536
}
],
"urls": [
"https://google.com"
]
}
])",
u"",
u"Error at "
u"WebHidAllowDevicesWithHidUsagesForUrls[0].usages[0].usage_page: "
u"Schema validation error: Invalid value for integer",
R"(
[
{
"usages": [],
"urls": [
"https://google.com"
]
}
])",
},
{
key::kWebHidAllowDevicesWithHidUsagesForUrls,
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
R"(
[
{
"usages": [
{
"usage_page": 1234,
"usage": 65536
}
],
"urls": [
"https://google.com"
]
}
])",
u"",
u"Error at WebHidAllowDevicesWithHidUsagesForUrls[0].usages[0].usage: "
u"Schema validation error: Invalid value for integer",
R"(
[
{
"usages": [],
"urls": [
"https://google.com"
]
}
])",
},
{
key::kWebHidAllowDevicesWithHidUsagesForUrls,
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
R"(
[
{
"usages": [
{
"usage": 1234
}
],
"urls": [
"https://google.com"
]
}
])",
u"",
u"Error at WebHidAllowDevicesWithHidUsagesForUrls[0].usages[0]: Schema "
u"validation error: Missing or invalid required property: usage_page",
R"(
[
{
"usages": [],
"urls": [
"https://google.com"
]
}
])",
},
{
key::kWebHidAllowDevicesWithHidUsagesForUrls,
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
R"(
[
{
"usages": [
{
"usage_page": 1234
}
],
"urls": [
"not-a-valid-url"
]
}
])",
u"Error at WebHidAllowDevicesWithHidUsagesForUrls[0].urls[0]: Invalid "
u"URL.",
u"",
R"(
[
{
"usages": [
{
"usage_page": 1234
}
],
"urls": [
"not-a-valid-url"
]
}
])",
},
{
key::kWebHidAllowDevicesWithHidUsagesForUrls,
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
R"(
[
{
"usages": [
{
"usage_page": 1234
}
],
"urls": [
""
]
}
])",
u"Error at WebHidAllowDevicesWithHidUsagesForUrls[0].urls[0]: Invalid "
u"URL.",
u"",
R"(
[
{
"usages": [
{
"usage_page": 1234
}
],
"urls": [
""
]
}
])",
},
{
key::kWebHidAllowDevicesWithHidUsagesForUrls,
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
R"(
[
{
"usages": [
{
"usage_page": 1234
}
],
"urls": [
"invalid-url-1",
"invalid-url-2"
]
}
])",
u"Error at WebHidAllowDevicesWithHidUsagesForUrls[0].urls[0]: Invalid "
u"URL.\n"
u"Error at WebHidAllowDevicesWithHidUsagesForUrls[0].urls[1]: Invalid "
u"URL.",
u"",
R"(
[
{
"usages": [
{
"usage_page": 1234
}
],
"urls": [
"invalid-url-1",
"invalid-url-2"
]
}
])",
},
{
key::kWebHidAllowDevicesWithHidUsagesForUrls,
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
R"(
[
{
"usages": [
{
"usage_page": 1234
}
],
"urls": [
123
]
}
])",
u"Error at WebHidAllowDevicesWithHidUsagesForUrls[0].urls[0]: Invalid "
u"URL.",
u"Error at WebHidAllowDevicesWithHidUsagesForUrls[0].urls[0]: Schema "
u"validation error: Policy type mismatch: expected: \"string\", "
u"actual: \"integer\".",
R"(
[
{
"usages": [
{
"usage_page": 1234
}
],
"urls": [
]
}
])",
},
{
key::kWebHidAllowDevicesWithHidUsagesForUrls,
prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
R"(
[123]
)",
u"",
u"Error at WebHidAllowDevicesWithHidUsagesForUrls[0]: Schema "
u"validation error: Policy type mismatch: expected: \"dictionary\", "
u"actual: \"integer\".",
R"(
[]
)",
},
};
INSTANTIATE_TEST_SUITE_P(WebHidInvalidPolicyTests,
WebHidInvalidPolicyTest,
testing::ValuesIn(kTestData));
} // namespace policy