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