1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/basictypes.h" 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/macros.h" 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/stl_util.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/hashed_ad_network_database.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "crypto/sha2.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "url/gurl.h" 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace extensions { 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// A list of fake ad networks. 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char* kAdNetworkHosts[] = { 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "alpha.adnetwork", 22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "bravo.adnetwork", 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "charlie.delta.adnetwork" 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// The number of ad networks for these tests. 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const size_t kNumAdNetworkHosts = arraysize(kAdNetworkHosts); 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class HashedAdNetworkDatabaseUnitTest : public testing::Test { 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected: 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void SetUp() OVERRIDE; 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AdNetworkDatabase* database() { return database_.get(); } 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private: 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void GenerateHashes(); 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The fake hashes for the ad networks. 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char* ad_networks_[kNumAdNetworkHosts]; 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The backing data for the ad networks. Since everything expects a const 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // char, we need this little hack in order to generate the data. 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string> ad_networks_data_; 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The database used in testing. 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<HashedAdNetworkDatabase> database_; 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HashedAdNetworkDatabaseUnitTest::SetUp() { 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GenerateHashes(); 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) database_.reset(new HashedAdNetworkDatabase()); 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) database_->set_entries_for_testing(ad_networks_, kNumAdNetworkHosts); 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void HashedAdNetworkDatabaseUnitTest::GenerateHashes() { 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t i = 0; i < kNumAdNetworkHosts; ++i) { 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) char hash[8u]; 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) crypto::SHA256HashString(kAdNetworkHosts[i], hash, 8u); 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ad_networks_data_.push_back(base::HexEncode(hash, 8u)); 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // HashedAdNetworkDatabase assumes the list is sorted. 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::sort(ad_networks_data_.begin(), ad_networks_data_.end()); 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0u; i < ad_networks_data_.size(); ++i) 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ad_networks_[i] = ad_networks_data_[i].c_str(); 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that the logic for the Ad Network Database works. That is, the hashing 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// scheme works, correctly reports when URLs are present in the database, 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// treats hosts and sumdomains correctly, etc. 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(HashedAdNetworkDatabaseUnitTest, HashedAdNetworkDatabaseTest) { 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // First, just check the basic urls in the list of ad networks. 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(database()->IsAdNetwork(GURL("http://alpha.adnetwork"))); 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(database()->IsAdNetwork(GURL("http://bravo.adnetwork"))); 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(database()->IsAdNetwork(GURL("http://charlie.delta.adnetwork"))); 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Next, try adding some paths. These should still register. 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(database()->IsAdNetwork(GURL("http://alpha.adnetwork/foo"))); 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(database()->IsAdNetwork(GURL("http://bravo.adnetwork/foo/bar"))); 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_TRUE( 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) database()->IsAdNetwork(GURL("http://charlie.delta.adnetwork/foo.html"))); 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Then, try subdomains. These should not register, as they are treated as 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // different hosts. 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(database()->IsAdNetwork(GURL("http://foo.alpha.adnetwork"))); 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(database()->IsAdNetwork(GURL("http://foo.bar.bravo.adnetwork"))); 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE( 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) database()->IsAdNetwork(GURL("http://foo.charlie.delta.adnetwork"))); 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check to make sure that removing a subdomain (from charlie.delta.adnetwork) 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // is considered different, and doesn't register. 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(database()->IsAdNetwork(GURL("http://delta.adnetwork"))); 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // And, of course, try some random sites and make sure we don't miscategorize. 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(database()->IsAdNetwork(GURL("http://www.google.com"))); 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(database()->IsAdNetwork(GURL("http://drive.google.com"))); 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(database()->IsAdNetwork(GURL("https://www.google.com"))); 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EXPECT_FALSE( 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) database()->IsAdNetwork(GURL("file:///usr/someone/files/file.html"))); 102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(database()->IsAdNetwork( 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GURL("chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"))); 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that the HashAdNetworkDatabse test works with the real file. We have 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// inserted a fake URL in the used dataset for testing purposes. 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST(HashedAdNetworkDatabaseUnitTest2, RealFile) { 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HashedAdNetworkDatabase database; 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AdNetworkDatabase* db = static_cast<AdNetworkDatabase*>(&database); 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(db->IsAdNetwork( 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GURL("http://definitely.surely.always.an.adnetwork"))); 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(db->IsAdNetwork(GURL("http://definitely.not.one"))); 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace extensions 117