blob: 0a03f4eaf5fd44f68f4d7f18b43b813c3aafa6d7 [file] [log] [blame]
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/hid/hid_policy_allowed_devices.h"
#include <string>
#include <utility>
#include "base/strings/string_number_conversions.h"
#include "base/test/values_test_util.h"
#include "chrome/browser/prefs/browser_prefs.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_profile.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/testing_pref_service.h"
#include "content/public/test/browser_task_environment.h"
#include "services/device/public/cpp/hid/fake_hid_manager.h"
#include "services/device/public/mojom/hid.mojom.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace {
using ::base::test::ParseJson;
using ::testing::UnorderedElementsAre;
class HidPolicyAllowedDevicesTest : public testing::Test {
public:
HidPolicyAllowedDevicesTest() { RegisterLocalState(local_state_.registry()); }
~HidPolicyAllowedDevicesTest() override = default;
void InitializePolicy() {
EXPECT_FALSE(policy_);
policy_ = std::make_unique<HidPolicyAllowedDevices>(&local_state_);
}
void SetAllowDevicesForUrlsPrefValue(base::StringPiece policy) {
local_state_.Set(prefs::kManagedWebHidAllowDevicesForUrls,
ParseJson(policy));
}
void SetAllowDevicesWithHidUsagesForUrlsPrefValue(base::StringPiece policy) {
local_state_.Set(prefs::kManagedWebHidAllowDevicesWithHidUsagesForUrls,
ParseJson(policy));
}
void SetAllowAllDevicesForUrlsPrefValue(base::StringPiece policy) {
local_state_.Set(prefs::kManagedWebHidAllowAllDevicesForUrls,
ParseJson(policy));
}
protected:
device::FakeHidManager& hid_manager() { return hid_manager_; }
HidPolicyAllowedDevices* policy() { return policy_.get(); }
device::mojom::HidDeviceInfoPtr CreateAndAddDevice(uint16_t vendor_id,
uint16_t product_id,
uint16_t usage_page,
uint16_t usage) {
static int next_physical_device_id = 0;
return hid_manager_.CreateAndAddDeviceWithTopLevelUsage(
base::NumberToString(next_physical_device_id++), vendor_id, product_id,
"product-name", "serial-number",
device::mojom::HidBusType::kHIDBusTypeUSB, usage_page, usage);
}
private:
device::FakeHidManager hid_manager_;
content::BrowserTaskEnvironment task_environment_;
TestingPrefServiceSimple local_state_;
std::unique_ptr<HidPolicyAllowedDevices> policy_;
};
} // namespace
TEST_F(HidPolicyAllowedDevicesTest, InitializeWithMissingPrefValue) {
InitializePolicy();
EXPECT_EQ(0u, policy()->all_devices_policy().size());
EXPECT_EQ(0u, policy()->vendor_policy().size());
EXPECT_EQ(0u, policy()->device_policy().size());
EXPECT_EQ(0u, policy()->usage_page_policy().size());
EXPECT_EQ(0u, policy()->usage_policy().size());
}
TEST_F(HidPolicyAllowedDevicesTest, InitializeWithExistingEmptyPrefValue) {
SetAllowDevicesForUrlsPrefValue("[]");
SetAllowDevicesWithHidUsagesForUrlsPrefValue("[]");
SetAllowAllDevicesForUrlsPrefValue("[]");
InitializePolicy();
EXPECT_EQ(0u, policy()->all_devices_policy().size());
EXPECT_EQ(0u, policy()->vendor_policy().size());
EXPECT_EQ(0u, policy()->device_policy().size());
EXPECT_EQ(0u, policy()->usage_page_policy().size());
EXPECT_EQ(0u, policy()->usage_policy().size());
}
namespace {
constexpr uint16_t kTestVendorId1 = 1234;
constexpr uint16_t kTestVendorId2 = 4321;
constexpr uint16_t kTestProductId1 = 5678;
constexpr uint16_t kTestProductId2 = 8765;
constexpr uint16_t kTestUsagePage1 = 1;
constexpr uint16_t kTestUsagePage2 = 2;
constexpr uint16_t kTestUsage1 = 4;
constexpr uint16_t kTestUsage2 = 5;
constexpr char kAllowDevicesForUrls[] = R"(
[
{
"devices": [
{ "vendor_id": 1234, "product_id": 5678 },
{ "vendor_id": 4321 }
],
"urls": [ "https://origin1" ]
}
])";
constexpr char kAllowDevicesWithHidUsagesForUrls[] = R"(
[
{
"usages": [
{ "usage_page": 1, "usage": 4 },
{ "usage_page": 2 }
],
"urls": [ "https://origin2" ]
}
])";
constexpr char kAllowAllDevicesForUrls[] = R"([ "https://origin3" ])";
} // namespace
TEST_F(HidPolicyAllowedDevicesTest, InitializeWithPrefValues) {
const auto kOrigin1 = url::Origin::Create(GURL("https://origin1"));
const auto kOrigin2 = url::Origin::Create(GURL("https://origin2"));
const auto kOrigin3 = url::Origin::Create(GURL("https://origin3"));
SetAllowDevicesForUrlsPrefValue(kAllowDevicesForUrls);
SetAllowDevicesWithHidUsagesForUrlsPrefValue(
kAllowDevicesWithHidUsagesForUrls);
SetAllowAllDevicesForUrlsPrefValue(kAllowAllDevicesForUrls);
InitializePolicy();
EXPECT_EQ(1u, policy()->device_policy().size());
EXPECT_EQ(1u, policy()->vendor_policy().size());
EXPECT_EQ(1u, policy()->usage_page_policy().size());
EXPECT_EQ(1u, policy()->usage_policy().size());
EXPECT_EQ(1u, policy()->all_devices_policy().size());
const auto device_key = std::make_pair(kTestVendorId1, kTestProductId1);
ASSERT_TRUE(base::Contains(policy()->device_policy(), device_key));
EXPECT_THAT(policy()->device_policy().at(device_key),
UnorderedElementsAre(kOrigin1));
ASSERT_TRUE(base::Contains(policy()->vendor_policy(), kTestVendorId2));
EXPECT_THAT(policy()->vendor_policy().at(kTestVendorId2),
UnorderedElementsAre(kOrigin1));
const auto usage_key = std::make_pair(kTestUsagePage1, kTestUsage1);
ASSERT_TRUE(base::Contains(policy()->usage_policy(), usage_key));
EXPECT_THAT(policy()->usage_policy().at(usage_key),
UnorderedElementsAre(kOrigin2));
ASSERT_TRUE(base::Contains(policy()->usage_page_policy(), kTestUsagePage2));
EXPECT_THAT(policy()->usage_page_policy().at(kTestUsagePage2),
UnorderedElementsAre(kOrigin2));
EXPECT_THAT(policy()->all_devices_policy(), UnorderedElementsAre(kOrigin3));
auto device = CreateAndAddDevice(kTestVendorId1, kTestProductId1,
/*usage_page=*/0xff00, /*usage=*/1);
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
device = CreateAndAddDevice(kTestVendorId1, kTestProductId2,
/*usage_page=*/0xff00, /*usage=*/1);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
device = CreateAndAddDevice(kTestVendorId2, kTestProductId2,
/*usage_page=*/0xff00, /*usage=*/1);
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
device = CreateAndAddDevice(/*vendor_id=*/1, /*product_id=*/1,
kTestUsagePage1, kTestUsage1);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
device = CreateAndAddDevice(/*vendor_id=*/1, /*product_id=*/1,
kTestUsagePage1, kTestUsage2);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
device = CreateAndAddDevice(/*vendor_id=*/1, /*product_id=*/1,
kTestUsagePage2, kTestUsage2);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
}
TEST_F(HidPolicyAllowedDevicesTest, InitializeWithMissingPrefValuesThenUpdate) {
const auto kOrigin1 = url::Origin::Create(GURL("https://origin1"));
const auto kOrigin2 = url::Origin::Create(GURL("https://origin2"));
const auto kOrigin3 = url::Origin::Create(GURL("https://origin3"));
InitializePolicy();
EXPECT_EQ(0u, policy()->device_policy().size());
EXPECT_EQ(0u, policy()->vendor_policy().size());
EXPECT_EQ(0u, policy()->usage_page_policy().size());
EXPECT_EQ(0u, policy()->usage_policy().size());
EXPECT_EQ(0u, policy()->all_devices_policy().size());
SetAllowDevicesForUrlsPrefValue(kAllowDevicesForUrls);
SetAllowDevicesWithHidUsagesForUrlsPrefValue(
kAllowDevicesWithHidUsagesForUrls);
SetAllowAllDevicesForUrlsPrefValue(kAllowAllDevicesForUrls);
EXPECT_EQ(1u, policy()->device_policy().size());
EXPECT_EQ(1u, policy()->vendor_policy().size());
EXPECT_EQ(1u, policy()->usage_page_policy().size());
EXPECT_EQ(1u, policy()->usage_policy().size());
EXPECT_EQ(1u, policy()->all_devices_policy().size());
const auto device_key = std::make_pair(kTestVendorId1, kTestProductId1);
ASSERT_TRUE(base::Contains(policy()->device_policy(), device_key));
EXPECT_THAT(policy()->device_policy().at(device_key),
UnorderedElementsAre(kOrigin1));
ASSERT_TRUE(base::Contains(policy()->vendor_policy(), kTestVendorId2));
EXPECT_THAT(policy()->vendor_policy().at(kTestVendorId2),
UnorderedElementsAre(kOrigin1));
const auto usage_key = std::make_pair(kTestUsagePage1, kTestUsage1);
ASSERT_TRUE(base::Contains(policy()->usage_policy(), usage_key));
EXPECT_THAT(policy()->usage_policy().at(usage_key),
UnorderedElementsAre(kOrigin2));
ASSERT_TRUE(base::Contains(policy()->usage_page_policy(), kTestUsagePage2));
EXPECT_THAT(policy()->usage_page_policy().at(kTestUsagePage2),
UnorderedElementsAre(kOrigin2));
EXPECT_THAT(policy()->all_devices_policy(), UnorderedElementsAre(kOrigin3));
auto device = CreateAndAddDevice(kTestVendorId1, kTestProductId1,
/*usage_page=*/0xff00, /*usage=*/1);
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
device = CreateAndAddDevice(kTestVendorId1, kTestProductId2,
/*usage_page=*/0xff00, /*usage=*/1);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
device = CreateAndAddDevice(kTestVendorId2, kTestProductId2,
/*usage_page=*/0xff00, /*usage=*/1);
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
device = CreateAndAddDevice(/*vendor_id=*/1, /*product_id=*/1,
kTestUsagePage1, kTestUsage1);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
device = CreateAndAddDevice(/*vendor_id=*/1, /*product_id=*/1,
kTestUsagePage1, kTestUsage2);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
device = CreateAndAddDevice(/*vendor_id=*/1, /*product_id=*/1,
kTestUsagePage2, kTestUsage2);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
}
TEST_F(HidPolicyAllowedDevicesTest, InitializeWithPrefValuesThenRemovePolicy) {
SetAllowDevicesForUrlsPrefValue(kAllowDevicesForUrls);
SetAllowDevicesWithHidUsagesForUrlsPrefValue(
kAllowDevicesWithHidUsagesForUrls);
SetAllowAllDevicesForUrlsPrefValue(kAllowAllDevicesForUrls);
InitializePolicy();
EXPECT_EQ(1u, policy()->device_policy().size());
EXPECT_EQ(1u, policy()->vendor_policy().size());
EXPECT_EQ(1u, policy()->usage_page_policy().size());
EXPECT_EQ(1u, policy()->usage_policy().size());
EXPECT_EQ(1u, policy()->all_devices_policy().size());
// Change each preference back to the default value.
SetAllowDevicesForUrlsPrefValue("[]");
SetAllowDevicesWithHidUsagesForUrlsPrefValue("[]");
SetAllowAllDevicesForUrlsPrefValue("[]");
EXPECT_EQ(0u, policy()->device_policy().size());
EXPECT_EQ(0u, policy()->vendor_policy().size());
EXPECT_EQ(0u, policy()->usage_page_policy().size());
EXPECT_EQ(0u, policy()->usage_policy().size());
EXPECT_EQ(0u, policy()->all_devices_policy().size());
}
TEST_F(HidPolicyAllowedDevicesTest, MultipleUrls) {
const auto kOrigin1 = url::Origin::Create(GURL("https://origin1"));
const auto kOrigin2 = url::Origin::Create(GURL("https://origin2"));
SetAllowDevicesForUrlsPrefValue(R"(
[
{
"devices": [{ "vendor_id": 1234, "product_id": 5678 }],
"urls": [
"https://origin1",
"https://origin2"
]
},
{
"devices": [{ "vendor_id": 1234 }],
"urls": [
"https://origin1",
"https://origin2"
]
}
])");
SetAllowDevicesWithHidUsagesForUrlsPrefValue(R"(
[
{
"usages": [{ "usage_page": 1, "usage": 4 }],
"urls": [
"https://origin1",
"https://origin2"
]
},
{
"usages": [{ "usage_page": 1 }],
"urls": [
"https://origin1",
"https://origin2"
]
}
])");
SetAllowAllDevicesForUrlsPrefValue(R"(
[
"https://origin1",
"https://origin2"
])");
InitializePolicy();
EXPECT_EQ(1u, policy()->device_policy().size());
EXPECT_EQ(1u, policy()->vendor_policy().size());
EXPECT_EQ(1u, policy()->usage_page_policy().size());
EXPECT_EQ(1u, policy()->usage_policy().size());
EXPECT_EQ(2u, policy()->all_devices_policy().size());
const auto device_key = std::make_pair(kTestVendorId1, kTestProductId1);
ASSERT_TRUE(base::Contains(policy()->device_policy(), device_key));
EXPECT_THAT(policy()->device_policy().at(device_key),
UnorderedElementsAre(kOrigin1, kOrigin2));
ASSERT_TRUE(base::Contains(policy()->vendor_policy(), kTestVendorId1));
EXPECT_THAT(policy()->vendor_policy().at(kTestVendorId1),
UnorderedElementsAre(kOrigin1, kOrigin2));
const auto usage_key = std::make_pair(kTestUsagePage1, kTestUsage1);
ASSERT_TRUE(base::Contains(policy()->usage_policy(), usage_key));
EXPECT_THAT(policy()->usage_policy().at(usage_key),
UnorderedElementsAre(kOrigin1, kOrigin2));
ASSERT_TRUE(base::Contains(policy()->usage_page_policy(), kTestUsagePage1));
EXPECT_THAT(policy()->usage_page_policy().at(kTestUsagePage1),
UnorderedElementsAre(kOrigin1, kOrigin2));
EXPECT_THAT(policy()->all_devices_policy(),
UnorderedElementsAre(kOrigin1, kOrigin2));
auto device = CreateAndAddDevice(kTestVendorId1, kTestProductId1,
kTestUsagePage1, kTestUsage1);
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin2, *device));
}
TEST_F(HidPolicyAllowedDevicesTest, MultipleItemsWithOverlap) {
const auto kOrigin1 = url::Origin::Create(GURL("https://origin1"));
const auto kOrigin2 = url::Origin::Create(GURL("https://origin2"));
const auto kOrigin3 = url::Origin::Create(GURL("https://origin3"));
const auto kOrigin4 = url::Origin::Create(GURL("https://origin4"));
SetAllowDevicesForUrlsPrefValue(R"(
[
{
"devices": [
{ "vendor_id": 1234, "product_id": 5678 },
{ "vendor_id": 4321 }
],
"urls": [ "https://origin1" ]
},
{
"devices": [
{ "vendor_id": 1234 },
{ "vendor_id": 4321, "product_id": 8765 }
],
"urls": [ "https://origin2" ]
}
])");
SetAllowDevicesWithHidUsagesForUrlsPrefValue(R"(
[
{
"usages": [
{ "usage_page": 1, "usage": 4 },
{ "usage_page": 2 }
],
"urls": [ "https://origin3" ]
},
{
"usages": [
{ "usage_page": 1 },
{ "usage_page": 2, "usage": 5 }
],
"urls": [ "https://origin4" ]
}
])");
InitializePolicy();
EXPECT_EQ(2u, policy()->device_policy().size());
EXPECT_EQ(2u, policy()->vendor_policy().size());
EXPECT_EQ(2u, policy()->usage_policy().size());
EXPECT_EQ(2u, policy()->usage_page_policy().size());
EXPECT_EQ(0u, policy()->all_devices_policy().size());
const auto device_key1 = std::make_pair(kTestVendorId1, kTestProductId1);
ASSERT_TRUE(base::Contains(policy()->device_policy(), device_key1));
EXPECT_THAT(policy()->device_policy().at(device_key1),
UnorderedElementsAre(kOrigin1));
const auto device_key2 = std::make_pair(kTestVendorId2, kTestProductId2);
ASSERT_TRUE(base::Contains(policy()->device_policy(), device_key2));
EXPECT_THAT(policy()->device_policy().at(device_key2),
UnorderedElementsAre(kOrigin2));
ASSERT_TRUE(base::Contains(policy()->vendor_policy(), kTestVendorId1));
EXPECT_THAT(policy()->vendor_policy().at(kTestVendorId1),
UnorderedElementsAre(kOrigin2));
ASSERT_TRUE(base::Contains(policy()->vendor_policy(), kTestVendorId2));
EXPECT_THAT(policy()->vendor_policy().at(kTestVendorId2),
UnorderedElementsAre(kOrigin1));
const auto usage_key1 = std::make_pair(kTestUsagePage1, kTestUsage1);
ASSERT_TRUE(base::Contains(policy()->usage_policy(), usage_key1));
EXPECT_THAT(policy()->usage_policy().at(usage_key1),
UnorderedElementsAre(kOrigin3));
const auto usage_key2 = std::make_pair(kTestUsagePage2, kTestUsage2);
ASSERT_TRUE(base::Contains(policy()->usage_policy(), usage_key2));
EXPECT_THAT(policy()->usage_policy().at(usage_key2),
UnorderedElementsAre(kOrigin4));
ASSERT_TRUE(base::Contains(policy()->usage_page_policy(), kTestUsagePage1));
EXPECT_THAT(policy()->usage_page_policy().at(kTestUsagePage1),
UnorderedElementsAre(kOrigin4));
ASSERT_TRUE(base::Contains(policy()->usage_page_policy(), kTestUsagePage2));
EXPECT_THAT(policy()->usage_page_policy().at(kTestUsagePage2),
UnorderedElementsAre(kOrigin3));
auto device = CreateAndAddDevice(kTestVendorId1, kTestProductId1,
/*usage_page=*/0xff00, /*usage=*/1);
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin3, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin4, *device));
device = CreateAndAddDevice(kTestVendorId1, kTestProductId2,
/*usage_page=*/0xff00, /*usage=*/1);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin3, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin4, *device));
device = CreateAndAddDevice(kTestVendorId2, kTestProductId2,
/*usage_page=*/0xff00, /*usage=*/1);
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin3, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin4, *device));
device = CreateAndAddDevice(kTestVendorId2, kTestProductId1,
/*usage_page=*/0xff00, /*usage=*/1);
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin3, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin4, *device));
device = CreateAndAddDevice(/*vendor_id=*/1, /*product_id=*/1,
kTestUsagePage1, kTestUsage1);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin4, *device));
device = CreateAndAddDevice(/*vendor_id=*/1, /*product_id=*/1,
kTestUsagePage1, kTestUsage2);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin3, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin4, *device));
device = CreateAndAddDevice(/*vendor_id=*/1, /*product_id=*/1,
kTestUsagePage2, kTestUsage2);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin4, *device));
device = CreateAndAddDevice(/*vendor_id=*/1, /*product_id=*/1,
kTestUsagePage2, kTestUsage1);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_TRUE(policy()->HasDevicePermission(kOrigin3, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin4, *device));
device = CreateAndAddDevice(/*vendor_id=*/1, /*product_id=*/1,
/*usage_page=*/0xff00, /*usage=*/1);
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin1, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin2, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin3, *device));
EXPECT_FALSE(policy()->HasDevicePermission(kOrigin4, *device));
}