|  | // Copyright 2016 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/usb/usb_blocklist.h" | 
|  | #include "components/variations/variations_params_manager.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | class UsbBlocklistTest : public testing::Test { | 
|  | public: | 
|  | UsbBlocklistTest() : blocklist_(UsbBlocklist::Get()) {} | 
|  |  | 
|  | const UsbBlocklist& list() { return blocklist_; } | 
|  |  | 
|  | void SetDynamicBlocklist(base::StringPiece list) { | 
|  | params_manager_.ClearAllVariationParams(); | 
|  |  | 
|  | std::map<std::string, std::string> params; | 
|  | params["blocklist_additions"] = list.as_string(); | 
|  | params_manager_.SetVariationParams("WebUSBBlocklist", params); | 
|  |  | 
|  | blocklist_.ResetToDefaultValuesForTest(); | 
|  | } | 
|  |  | 
|  | private: | 
|  | void TearDown() override { | 
|  | // Because UsbBlocklist is a singleton it must be cleared after tests run | 
|  | // to prevent leakage between tests. | 
|  | params_manager_.ClearAllVariationParams(); | 
|  | blocklist_.ResetToDefaultValuesForTest(); | 
|  | } | 
|  |  | 
|  | variations::testing::VariationParamsManager params_manager_; | 
|  | UsbBlocklist& blocklist_; | 
|  | }; | 
|  |  | 
|  | TEST_F(UsbBlocklistTest, BasicExclusions) { | 
|  | SetDynamicBlocklist("18D1:58F0:0100"); | 
|  | EXPECT_TRUE(list().IsExcluded({0x18D1, 0x58F0, 0x0100})); | 
|  | // An older device version is also blocked. | 
|  | EXPECT_TRUE(list().IsExcluded({0x18D1, 0x58F0, 0x0090})); | 
|  | // A newer device version is not blocked. | 
|  | EXPECT_FALSE(list().IsExcluded({0x18D1, 0x58F0, 0x0200})); | 
|  | // Other devices with nearby vendor and product IDs are not blocked. | 
|  | EXPECT_FALSE(list().IsExcluded({0x18D1, 0x58F1, 0x0100})); | 
|  | EXPECT_FALSE(list().IsExcluded({0x18D1, 0x58EF, 0x0100})); | 
|  | EXPECT_FALSE(list().IsExcluded({0x18D0, 0x58F0, 0x0100})); | 
|  | EXPECT_FALSE(list().IsExcluded({0x18D2, 0x58F0, 0x0100})); | 
|  | } | 
|  |  | 
|  | TEST_F(UsbBlocklistTest, StringsWithNoValidEntries) { | 
|  | SetDynamicBlocklist(""); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  |  | 
|  | SetDynamicBlocklist("~!@#$%^&*()-_=+[]{}/*-"); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  |  | 
|  | SetDynamicBlocklist(":"); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  |  | 
|  | SetDynamicBlocklist("::"); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  |  | 
|  | SetDynamicBlocklist(","); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  |  | 
|  | SetDynamicBlocklist(",,"); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  |  | 
|  | SetDynamicBlocklist(",::,"); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  |  | 
|  | SetDynamicBlocklist("1:2:3"); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  |  | 
|  | SetDynamicBlocklist("18D1:2:3000"); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  |  | 
|  | SetDynamicBlocklist("0000:0x00:0000"); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  |  | 
|  | SetDynamicBlocklist("0000:   0:0000"); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  |  | 
|  | SetDynamicBlocklist("000g:0000:0000"); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  |  | 
|  | SetDynamicBlocklist("☯"); | 
|  | EXPECT_EQ(0u, list().GetDynamicEntryCountForTest()); | 
|  | } | 
|  |  | 
|  | TEST_F(UsbBlocklistTest, StringsWithOneValidEntry) { | 
|  | SetDynamicBlocklist("18D1:58F0:0101"); | 
|  | EXPECT_EQ(1u, list().GetDynamicEntryCountForTest()); | 
|  | EXPECT_TRUE(list().IsExcluded({0x18D1, 0x58F0, 0x0101})); | 
|  |  | 
|  | SetDynamicBlocklist(" 18D1:58F0:0200  "); | 
|  | EXPECT_EQ(1u, list().GetDynamicEntryCountForTest()); | 
|  | EXPECT_TRUE(list().IsExcluded({0x18D1, 0x58F0, 0x0200})); | 
|  |  | 
|  | SetDynamicBlocklist(", 18D1:58F0:0201,  "); | 
|  | EXPECT_EQ(1u, list().GetDynamicEntryCountForTest()); | 
|  | EXPECT_TRUE(list().IsExcluded({0x18D1, 0x58F0, 0x0201})); | 
|  |  | 
|  | SetDynamicBlocklist("18D1:58F0:0202, 0000:1:0000"); | 
|  | EXPECT_EQ(1u, list().GetDynamicEntryCountForTest()); | 
|  | EXPECT_TRUE(list().IsExcluded({0x18D1, 0x58F0, 0x0202})); | 
|  | } | 
|  |  | 
|  | TEST_F(UsbBlocklistTest, StaticEntries) { | 
|  | // Yubikey devices. https://crbug.com/818807 | 
|  | // | 
|  | // The specific versions of these devices that we want to block are unknown. | 
|  | // The device versions listed here are abitrary chosen to test that any device | 
|  | // will be matched. | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0010, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0018, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0030, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0110, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0111, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0112, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0113, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0114, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0115, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0116, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0120, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0200, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0211, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0401, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0402, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0403, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0404, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0405, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0406, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0407, 0x0100})); | 
|  | EXPECT_TRUE(list().IsExcluded({0x1050, 0x0410, 0x0100})); | 
|  |  | 
|  | // Check that various devices around the Yubikey range are not blocked. | 
|  | EXPECT_FALSE(list().IsExcluded({0x104F, 0x0200, 0x0100})); | 
|  | EXPECT_FALSE(list().IsExcluded({0x1051, 0x0200, 0x0100})); | 
|  | } |