blob: a8915bbe3ad127e5cda0f917d6dae97fa53729c9 [file] [log] [blame]
// Copyright 2019 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 "device/gamepad/gamepad_blocklist.h"
#include "base/stl_util.h"
#include "device/gamepad/gamepad_id_list.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace device {
namespace {
// Blocked devices, taken from the gamepad blocklist.
constexpr std::pair<uint16_t, uint16_t> kBlockedDevices[] = {
{0x045e, 0x0922}, // Microsoft keyboard
{0x05ac, 0x3232}, // Apple(?) bluetooth mouse
{0x17ef, 0x6099}, // Lenovo keyboard
};
constexpr size_t kBlockedDevicesLength = base::size(kBlockedDevices);
// Known devices from blocked vendors, taken from usb.ids.
// http://www.linux-usb.org/usb.ids
constexpr std::pair<uint16_t, uint16_t> kBlockedVendorDevices[] = {
{0x056a, 0x50b8}, // Wacom touchpad
{0x06cb, 0x000f}, // Synaptics touchpad
{0x2833, 0x0001}, // Oculus Rift DK1 head tracker
{0x2833, 0x0021}, // Oculus Rift DK2 USB hub
{0x2833, 0x0031}, // Oculus Rift CV1 subdevice
{0x2833, 0x0101}, // Oculus latency tester
{0x2833, 0x0201}, // Oculus Rift DK2 camera
{0x2833, 0x0211}, // Oculus Rift CV1 sensor
{0x2833, 0x0330}, // Oculus Rift CV1 audio port
{0x2833, 0x1031}, // Oculus Rift CV1 subdevice
{0x2833, 0x2021}, // Oculus Rift DK2 main unit
{0x2833, 0x2031}, // Oculus Rift CV1
{0x2833, 0x3031}, // Oculus Rift CV1 subdevice
{0xb58e, 0x9e84}, // Blue Yeti Stereo Microphone
};
constexpr size_t kBlockedVendorDevicesLength =
base::size(kBlockedVendorDevices);
} // namespace
TEST(GamepadBlocklistTest, KnownGamepadsNotBlocked) {
// Known gamepads should not be excluded.
const auto& gamepads = GamepadIdList::Get().GetGamepadListForTesting();
for (const auto& item : gamepads) {
uint16_t vendor = std::get<0>(item);
uint16_t product = std::get<1>(item);
EXPECT_FALSE(GamepadIsExcluded(vendor, product));
}
}
TEST(GamepadBlocklistTest, BlockedDevices) {
for (size_t i = 0; i < kBlockedDevicesLength; ++i) {
const uint16_t vendor = kBlockedDevices[i].first;
const uint16_t product = kBlockedDevices[i].second;
// Blocked devices should be excluded.
EXPECT_TRUE(GamepadIsExcluded(vendor, product));
// Devices with product IDs close to a blocked device should not be
// excluded.
EXPECT_FALSE(GamepadIsExcluded(vendor, product - 1));
EXPECT_FALSE(GamepadIsExcluded(vendor, product + 1));
}
}
TEST(GamepadBlocklistTest, BlockedVendors) {
for (size_t i = 0; i < kBlockedVendorDevicesLength; ++i) {
const uint16_t vendor = kBlockedVendorDevices[i].first;
const uint16_t product = kBlockedVendorDevices[i].second;
// Known devices with a blocked vendor ID should be excluded.
EXPECT_TRUE(GamepadIsExcluded(vendor, product));
// Devices with nearby product IDs should also be excluded.
EXPECT_TRUE(GamepadIsExcluded(vendor, product - 1));
EXPECT_TRUE(GamepadIsExcluded(vendor, product + 1));
}
}
} // namespace device