Home | History | Annotate | Download | only in activity_log
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/basictypes.h"
      6 #include "base/macros.h"
      7 #include "base/memory/scoped_ptr.h"
      8 #include "base/stl_util.h"
      9 #include "base/strings/string_number_conversions.h"
     10 #include "chrome/browser/extensions/activity_log/hashed_ad_network_database.h"
     11 #include "crypto/sha2.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 #include "url/gurl.h"
     14 
     15 namespace extensions {
     16 
     17 namespace {
     18 
     19 // A list of fake ad networks.
     20 const char* kAdNetworkHosts[] = {
     21   "alpha.adnetwork",
     22   "bravo.adnetwork",
     23   "charlie.delta.adnetwork"
     24 };
     25 
     26 // The number of ad networks for these tests.
     27 const size_t kNumAdNetworkHosts = arraysize(kAdNetworkHosts);
     28 
     29 }  // namespace
     30 
     31 class HashedAdNetworkDatabaseUnitTest : public testing::Test {
     32  protected:
     33   virtual void SetUp() OVERRIDE;
     34 
     35   AdNetworkDatabase* database() { return database_.get(); }
     36 
     37  private:
     38   void GenerateHashes();
     39 
     40   // The fake hashes for the ad networks.
     41   const char* ad_networks_[kNumAdNetworkHosts];
     42 
     43   // The backing data for the ad networks. Since everything expects a const
     44   // char, we need this little hack in order to generate the data.
     45   std::vector<std::string> ad_networks_data_;
     46 
     47   // The database used in testing.
     48   scoped_ptr<HashedAdNetworkDatabase> database_;
     49 };
     50 
     51 void HashedAdNetworkDatabaseUnitTest::SetUp() {
     52   GenerateHashes();
     53   database_.reset(new HashedAdNetworkDatabase());
     54   database_->set_entries_for_testing(ad_networks_, kNumAdNetworkHosts);
     55 }
     56 
     57 void HashedAdNetworkDatabaseUnitTest::GenerateHashes() {
     58   for (size_t i = 0; i < kNumAdNetworkHosts; ++i) {
     59     char hash[8u];
     60     crypto::SHA256HashString(kAdNetworkHosts[i], hash, 8u);
     61     ad_networks_data_.push_back(base::HexEncode(hash, 8u));
     62   }
     63 
     64   // HashedAdNetworkDatabase assumes the list is sorted.
     65   std::sort(ad_networks_data_.begin(), ad_networks_data_.end());
     66   for (size_t i = 0u; i < ad_networks_data_.size(); ++i)
     67     ad_networks_[i] = ad_networks_data_[i].c_str();
     68 }
     69 
     70 // Test that the logic for the Ad Network Database works. That is, the hashing
     71 // scheme works, correctly reports when URLs are present in the database,
     72 // treats hosts and sumdomains correctly, etc.
     73 TEST_F(HashedAdNetworkDatabaseUnitTest, HashedAdNetworkDatabaseTest) {
     74   // First, just check the basic urls in the list of ad networks.
     75   EXPECT_TRUE(database()->IsAdNetwork(GURL("http://alpha.adnetwork")));
     76   EXPECT_TRUE(database()->IsAdNetwork(GURL("http://bravo.adnetwork")));
     77   EXPECT_TRUE(database()->IsAdNetwork(GURL("http://charlie.delta.adnetwork")));
     78 
     79   // Next, try adding some paths. These should still register.
     80   EXPECT_TRUE(database()->IsAdNetwork(GURL("http://alpha.adnetwork/foo")));
     81   EXPECT_TRUE(database()->IsAdNetwork(GURL("http://bravo.adnetwork/foo/bar")));
     82   EXPECT_TRUE(
     83       database()->IsAdNetwork(GURL("http://charlie.delta.adnetwork/foo.html")));
     84 
     85   // Then, try subdomains. These should not register, as they are treated as
     86   // different hosts.
     87   EXPECT_FALSE(database()->IsAdNetwork(GURL("http://foo.alpha.adnetwork")));
     88   EXPECT_FALSE(database()->IsAdNetwork(GURL("http://foo.bar.bravo.adnetwork")));
     89   EXPECT_FALSE(
     90       database()->IsAdNetwork(GURL("http://foo.charlie.delta.adnetwork")));
     91 
     92   // Check to make sure that removing a subdomain (from charlie.delta.adnetwork)
     93   // is considered different, and doesn't register.
     94   EXPECT_FALSE(database()->IsAdNetwork(GURL("http://delta.adnetwork")));
     95 
     96   // And, of course, try some random sites and make sure we don't miscategorize.
     97   EXPECT_FALSE(database()->IsAdNetwork(GURL("http://www.google.com")));
     98   EXPECT_FALSE(database()->IsAdNetwork(GURL("http://drive.google.com")));
     99   EXPECT_FALSE(database()->IsAdNetwork(GURL("https://www.google.com")));
    100   EXPECT_FALSE(
    101       database()->IsAdNetwork(GURL("file:///usr/someone/files/file.html")));
    102   EXPECT_FALSE(database()->IsAdNetwork(
    103       GURL("chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")));
    104 }
    105 
    106 // Test that the HashAdNetworkDatabse test works with the real file. We have
    107 // inserted a fake URL in the used dataset for testing purposes.
    108 TEST(HashedAdNetworkDatabaseUnitTest2, RealFile) {
    109   HashedAdNetworkDatabase database;
    110   AdNetworkDatabase* db = static_cast<AdNetworkDatabase*>(&database);
    111   EXPECT_TRUE(db->IsAdNetwork(
    112       GURL("http://definitely.surely.always.an.adnetwork")));
    113   EXPECT_FALSE(db->IsAdNetwork(GURL("http://definitely.not.one")));
    114 }
    115 
    116 }  // namespace extensions
    117