hashed_ad_network_database_unittest.cc revision 010d83a9304c5a91596085d917d248abff47903a
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/files/file_path.h" 7#include "base/logging.h" 8#include "base/macros.h" 9#include "base/memory/ref_counted.h" 10#include "base/memory/ref_counted_memory.h" 11#include "base/memory/scoped_ptr.h" 12#include "chrome/browser/extensions/activity_log/ad_network_database.h" 13#include "chrome/browser/extensions/activity_log/hashed_ad_network_database.h" 14#include "crypto/secure_hash.h" 15#include "crypto/sha2.h" 16#include "testing/gtest/include/gtest/gtest.h" 17#include "url/gurl.h" 18 19namespace extensions { 20 21namespace { 22 23// A list of fake ad networks. 24const char* kAdNetworkHosts[] = { 25 "alpha.adnetwork", 26 "bravo.adnetwork", 27 "charlie.delta.adnetwork" 28}; 29 30// The number of ad networks for these tests. 31const size_t kNumAdNetworkHosts = arraysize(kAdNetworkHosts); 32 33// Each hash of an ad network is stored in an int64. 34const size_t kAdNetworkHostHashSize = sizeof(int64); 35 36// The total size for storing all ad network host hashes. 37const size_t kAdNetworkHostHashesTotalSize = 38 kAdNetworkHostHashSize * kNumAdNetworkHosts; 39 40// The size of the checksum we use in the data resource. 41const size_t kChecksumSize = 32u; 42 43// The total size of the data resource, including the checksum and all host 44// hashes. 45const size_t kDataResourceSize = kChecksumSize + kAdNetworkHostHashesTotalSize; 46 47} // namespace 48 49class HashedAdNetworkDatabaseUnitTest : public testing::Test { 50 protected: 51 virtual void SetUp() OVERRIDE; 52 53 private: 54 // Generate a piece of memory with a hash structure identical to the real one, 55 // but with only mock data. 56 void GenerateMockMemory(); 57 58 // The raw bits of the mocked-up data resource. 59 char raw_data_[kDataResourceSize]; 60 61 // The RefCountedStaticMemory wrapper around |raw_data_|. 62 scoped_refptr<base::RefCountedStaticMemory> memory_; 63}; 64 65void HashedAdNetworkDatabaseUnitTest::SetUp() { 66 GenerateMockMemory(); 67 AdNetworkDatabase::SetForTesting( 68 scoped_ptr<AdNetworkDatabase>(new HashedAdNetworkDatabase(memory_))); 69} 70 71void HashedAdNetworkDatabaseUnitTest::GenerateMockMemory() { 72 int64 host_hashes[kNumAdNetworkHosts]; 73 74 for (size_t i = 0; i < kNumAdNetworkHosts; ++i) { 75 int64 hash = 0; 76 crypto::SHA256HashString(kAdNetworkHosts[i], &hash, sizeof(hash)); 77 host_hashes[i] = hash; 78 } 79 80 // Create the Checksum. 81 scoped_ptr<crypto::SecureHash> hash( 82 crypto::SecureHash::Create(crypto::SecureHash::SHA256)); 83 hash->Update(host_hashes, kNumAdNetworkHosts * kAdNetworkHostHashSize); 84 85 char checksum[kChecksumSize]; 86 hash->Finish(checksum, kChecksumSize); 87 88 // Copy the checksum to our data. 89 memcpy(raw_data_, &checksum, kChecksumSize); 90 91 // Copy the hashes. 92 memcpy(raw_data_ + kChecksumSize, host_hashes, kAdNetworkHostHashesTotalSize); 93 94 memory_ = new base::RefCountedStaticMemory(raw_data_, kDataResourceSize); 95}; 96 97TEST_F(HashedAdNetworkDatabaseUnitTest, HashedAdNetworkDatabaseTest) { 98 const AdNetworkDatabase* database = AdNetworkDatabase::Get(); 99 ASSERT_TRUE(database); 100 101 // First, just check the basic urls in the list of ad networks. 102 EXPECT_TRUE(database->IsAdNetwork(GURL("http://alpha.adnetwork"))); 103 EXPECT_TRUE(database->IsAdNetwork(GURL("http://bravo.adnetwork"))); 104 EXPECT_TRUE(database->IsAdNetwork(GURL("http://charlie.delta.adnetwork"))); 105 106 // Next, try adding some paths. These should still register. 107 EXPECT_TRUE(database->IsAdNetwork(GURL("http://alpha.adnetwork/foo"))); 108 EXPECT_TRUE(database->IsAdNetwork(GURL("http://bravo.adnetwork/foo/bar"))); 109 EXPECT_TRUE( 110 database->IsAdNetwork(GURL("http://charlie.delta.adnetwork/foo.html"))); 111 112 // Then, try subdomains. These should not register, as they are treated as 113 // different hosts. 114 EXPECT_FALSE(database->IsAdNetwork(GURL("http://foo.alpha.adnetwork"))); 115 EXPECT_FALSE(database->IsAdNetwork(GURL("http://foo.bar.bravo.adnetwork"))); 116 EXPECT_FALSE( 117 database->IsAdNetwork(GURL("http://foo.charlie.delta.adnetwork"))); 118 119 // Check to make sure that removing a subdomain (from charlie.delta.adnetwork) 120 // is considered different, and doesn't register. 121 EXPECT_FALSE(database->IsAdNetwork(GURL("http://delta.adnetwork"))); 122 123 // And, of course, try some random sites and make sure we don't miscategorize. 124 EXPECT_FALSE(database->IsAdNetwork(GURL("http://www.google.com"))); 125 EXPECT_FALSE(database->IsAdNetwork(GURL("http://drive.google.com"))); 126 EXPECT_FALSE(database->IsAdNetwork(GURL("https://www.google.com"))); 127 EXPECT_FALSE( 128 database->IsAdNetwork(GURL("file:///usr/someone/files/file.html"))); 129 EXPECT_FALSE(database->IsAdNetwork( 130 GURL("chrome-extension://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"))); 131} 132 133} // namespace extensions 134