Home | History | Annotate | Download | only in activity_log
      1 // Copyright 2013 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/metrics/histogram.h"
      6 #include "base/strings/stringprintf.h"
      7 #include "chrome/browser/extensions/activity_log/uma_policy.h"
      8 #include "chrome/browser/extensions/extension_apitest.h"
      9 #include "chrome/browser/extensions/extension_browsertest.h"
     10 #include "chrome/browser/extensions/extension_service.h"
     11 #include "chrome/browser/extensions/test_extension_dir.h"
     12 #include "chrome/browser/ui/browser_window.h"
     13 #include "chrome/test/base/ui_test_utils.h"
     14 #include "extensions/common/manifest_constants.h"
     15 #include "net/dns/mock_host_resolver.h"
     16 
     17 using extensions::UmaPolicy;
     18 
     19 const char* kGooglePrefix = "ExtensionActivity.Google";
     20 const char* kNonGooglePrefix = "ExtensionActivity";
     21 
     22 // These tests need to ensure that all of the extension JavaScript completes
     23 // before the histograms are checked. To accomplish this, the test relies on
     24 // some JavaScript in chrome/test/data/extensions/api_test/uma_policy/:
     25 // * When the test navigates to opener.com, opener.js will use window.open() to
     26 //   pop open a new window with the appropriate URL for the test case. This
     27 //   ensures that the testing framework never reuses a window that's still
     28 //   running a previous test case.
     29 // * The test extension code in content_script.js tells background.js when it's
     30 //   done. When it's finished, background.js closes the blocker.com window. So
     31 //   blocker.com will remain open (and block) until the tests complete.
     32 class ActivityLogUmaPolicyTest : public ExtensionApiTest {
     33 };
     34 
     35 std::string ConcatNames(const char* prefix, int status_num) {
     36   return base::StringPrintf(
     37       "%s.%s",
     38       prefix,
     39       extensions::UmaPolicy::GetHistogramName(
     40           static_cast<extensions::UmaPolicy::PageStatus>(status_num)));
     41 }
     42 
     43 // TODO(felt): These are disabled due to crbug.com/294500, since they fail
     44 // due to a blink bug. The fix went in to Blink on Thursday and should roll
     45 // on Monday 9/23.
     46 // These are all sequential navigations, so they should each be logged
     47 // independently.
     48 IN_PROC_BROWSER_TEST_F(ActivityLogUmaPolicyTest, DISABLED_SequentialNavs) {
     49   host_resolver()->AddRule("*", "127.0.0.1");
     50   StartEmbeddedTestServer();
     51 
     52   const extensions::Extension* ext =
     53       LoadExtension(test_data_dir_.AppendASCII("uma_policy"));
     54   ASSERT_TRUE(ext);
     55 
     56   ui_test_utils::NavigateToURLWithDisposition(
     57         browser(), GURL("http://www.opener.com/#google"), NEW_WINDOW,
     58         ui_test_utils::BROWSER_TEST_NONE);
     59   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
     60       browser(), GURL("http://www.blocker.com"), 2);
     61   ui_test_utils::NavigateToURLWithDisposition(
     62         browser(), GURL("http://www.opener.com/#google?q=a"), NEW_WINDOW,
     63         ui_test_utils::BROWSER_TEST_NONE);
     64   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
     65       browser(), GURL("http://www.blocker.com"), 2);
     66   ui_test_utils::NavigateToURLWithDisposition(
     67         browser(), GURL("http://www.opener.com/#google?q=b"), NEW_WINDOW,
     68         ui_test_utils::BROWSER_TEST_NONE);
     69   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
     70       browser(), GURL("http://www.blocker.com"), 2);
     71   ui_test_utils::NavigateToURLWithDisposition(
     72         browser(), GURL("http://www.opener.com/#cnn?q=a"), NEW_WINDOW,
     73         ui_test_utils::BROWSER_TEST_NONE);
     74   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
     75       browser(), GURL("http://www.blocker.com"), 2);
     76   ui_test_utils::NavigateToURLWithDisposition(
     77         browser(), GURL("http://www.opener.com/#cnn?q=b"), NEW_WINDOW,
     78         ui_test_utils::BROWSER_TEST_NONE);
     79   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
     80       browser(), GURL("http://www.blocker.com"), 2);
     81 
     82   for (int i = UmaPolicy::NONE + 1; i < UmaPolicy::MAX_STATUS - 2; ++i) {
     83     base::HistogramBase* google_histogram = base::Histogram::FactoryGet(
     84         ConcatNames(kGooglePrefix, i),
     85         1, 100, 50, base::HistogramBase::kNoFlags);
     86     scoped_ptr<base::HistogramSamples> google_samples =
     87         google_histogram->SnapshotSamples();
     88     EXPECT_EQ(3, google_samples->TotalCount());
     89     EXPECT_EQ(3, google_samples->GetCount(1));
     90 
     91     base::HistogramBase* cnn_histogram = base::Histogram::FactoryGet(
     92         ConcatNames(kNonGooglePrefix, i),
     93         1, 100, 50, base::HistogramBase::kNoFlags);
     94     scoped_ptr<base::HistogramSamples> cnn_samples =
     95         cnn_histogram->SnapshotSamples();
     96     if (ConcatNames(kNonGooglePrefix, i) != "ExtensionActivity.ContentScript" &&
     97         ConcatNames(kNonGooglePrefix, i) != "ExtensionActivity.ReadDom") {
     98       // There's a content script on opener.com that checks the location.
     99       // The test is not set up to accurately record opener.com histograms due
    100       // to the possibility of race conditions in the testing framework, so we
    101       // can't check those values.
    102       EXPECT_EQ(2, cnn_samples->GetCount(1));
    103     }
    104   }
    105 }
    106 
    107 // Two windows are open at once with the same google.com TLD.
    108 // However, they should be treated separately because they have different URLs.
    109 IN_PROC_BROWSER_TEST_F(
    110     ActivityLogUmaPolicyTest, DISABLED_ParallelDistinctNavs) {
    111   host_resolver()->AddRule("*", "127.0.0.1");
    112   StartEmbeddedTestServer();
    113 
    114   const extensions::Extension* ext =
    115       LoadExtension(test_data_dir_.AppendASCII("uma_policy"));
    116   ASSERT_TRUE(ext);
    117 
    118   ui_test_utils::NavigateToURLWithDisposition(
    119         browser(), GURL("http://www.opener.com/#google?p=a"), NEW_WINDOW,
    120         ui_test_utils::BROWSER_TEST_NONE);
    121   ui_test_utils::NavigateToURLWithDisposition(
    122         browser(), GURL("http://www.opener.com/#google?p=b"), NEW_WINDOW,
    123         ui_test_utils::BROWSER_TEST_NONE);
    124   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
    125       browser(), GURL("http://www.blocker.com"), 2);
    126 
    127   for (int i = UmaPolicy::NONE + 1; i < UmaPolicy::MAX_STATUS - 2; ++i) {
    128     base::HistogramBase* google_histogram = base::Histogram::FactoryGet(
    129         ConcatNames(kGooglePrefix, i),
    130         1, 100, 50, base::HistogramBase::kNoFlags);
    131     scoped_ptr<base::HistogramSamples> google_samples =
    132         google_histogram->SnapshotSamples();
    133     EXPECT_EQ(2, google_samples->GetCount(1));
    134   }
    135 }
    136 
    137 // Two windows are open at once with the same Google URLs.
    138 // They should be treated the same.
    139 IN_PROC_BROWSER_TEST_F(ActivityLogUmaPolicyTest, DISABLED_Google_ParallelSame) {
    140   host_resolver()->AddRule("*", "127.0.0.1");
    141   StartEmbeddedTestServer();
    142 
    143   const extensions::Extension* ext =
    144       LoadExtension(test_data_dir_.AppendASCII("uma_policy"));
    145   ASSERT_TRUE(ext);
    146 
    147   ui_test_utils::NavigateToURLWithDisposition(
    148         browser(), GURL("http://www.opener.com/#googlea"), NEW_WINDOW,
    149         ui_test_utils::BROWSER_TEST_NONE);
    150   ui_test_utils::NavigateToURLWithDisposition(
    151         browser(), GURL("http://www.opener.com/#googleb"), NEW_WINDOW,
    152         ui_test_utils::BROWSER_TEST_NONE);
    153   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
    154       browser(), GURL("http://www.blocker.com"), 2);
    155 
    156   for (int i = UmaPolicy::NONE + 1; i < UmaPolicy::MAX_STATUS - 2; ++i) {
    157     base::HistogramBase* google_histogram = base::Histogram::FactoryGet(
    158         ConcatNames(kGooglePrefix, i),
    159         1, 100, 50, base::HistogramBase::kNoFlags);
    160     scoped_ptr<base::HistogramSamples> google_samples =
    161         google_histogram->SnapshotSamples();
    162     EXPECT_EQ(1, google_samples->GetCount(1));
    163   }
    164 }
    165 
    166 // Two windows are open at once with the same non-Google URLs.
    167 // They should be treated the same.
    168 IN_PROC_BROWSER_TEST_F(ActivityLogUmaPolicyTest,
    169     DISABLED_NonGoogle_ParallelSame) {
    170   host_resolver()->AddRule("*", "127.0.0.1");
    171   StartEmbeddedTestServer();
    172 
    173   const extensions::Extension* ext =
    174       LoadExtension(test_data_dir_.AppendASCII("uma_policy"));
    175   ASSERT_TRUE(ext);
    176 
    177   ui_test_utils::NavigateToURLWithDisposition(
    178         browser(), GURL("http://www.opener.com/#cnna"), NEW_WINDOW,
    179         ui_test_utils::BROWSER_TEST_NONE);
    180   ui_test_utils::NavigateToURLWithDisposition(
    181         browser(), GURL("http://www.opener.com/#cnnb"), NEW_WINDOW,
    182         ui_test_utils::BROWSER_TEST_NONE);
    183   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
    184       browser(), GURL("http://www.blocker.com"), 2);
    185 
    186   for (int i = UmaPolicy::NONE + 1; i < UmaPolicy::MAX_STATUS - 2; ++i) {
    187     base::HistogramBase* cnn_histogram = base::Histogram::FactoryGet(
    188         ConcatNames(kNonGooglePrefix, i),
    189         1, 100, 50, base::HistogramBase::kNoFlags);
    190     scoped_ptr<base::HistogramSamples> cnn_samples =
    191         cnn_histogram->SnapshotSamples();
    192     if (ConcatNames(kNonGooglePrefix, i) != "ExtensionActivity.ContentScript" &&
    193         ConcatNames(kNonGooglePrefix, i) != "ExtensionActivity.ReadDom") {
    194       // There's a content script on opener.com that checks the location.
    195       // The test is not set up to accurately record opener.com histograms due
    196       // to the possibility of race conditions in the testing framework, so we
    197       // can't check those values.
    198       EXPECT_EQ(1, cnn_samples->GetCount(1));
    199     }
    200   }
    201 }
    202 
    203 // This runs with multiple extensions installed.
    204 IN_PROC_BROWSER_TEST_F(ActivityLogUmaPolicyTest, DISABLED_MultipleExtensions) {
    205   host_resolver()->AddRule("*", "127.0.0.1");
    206   StartEmbeddedTestServer();
    207 
    208   const extensions::Extension* ext =
    209       LoadExtension(test_data_dir_.AppendASCII("uma_policy"));
    210   ASSERT_TRUE(ext);
    211 
    212   const char* script2 =
    213       "document.createElement('script');"
    214       "document.createElement('iframe');"
    215       "document.createElement('div');"
    216       "document.createElement('embed');"
    217       "document.createElement('object');";
    218 
    219   const char* manifest =
    220       "{"
    221       "  \"name\": \"Activity Log UMA Policy Test Extension\","
    222       "  \"version\": \"0.%s\","
    223       "  \"description\": \"Testing the histogramming\","
    224       "  \"content_scripts\": ["
    225       "      {"
    226       "        \"matches\": "
    227       "            [\"http://www.google.com/*\","
    228       "             \"http://www.cnn.com/*\"],"
    229       "        \"js\": [\"content_script.js\"]"
    230       "      }"
    231       "    ],"
    232       "  \"manifest_version\": 2"
    233       "}";
    234 
    235   extensions::TestExtensionDir dir2;
    236   dir2.WriteManifest(base::StringPrintf(manifest, "2"));
    237   dir2.WriteFile(FILE_PATH_LITERAL("content_script.js"), script2);
    238   LoadExtension(dir2.unpacked_path());
    239 
    240   ui_test_utils::NavigateToURLWithDisposition(
    241         browser(), GURL("http://www.opener.com/#google"), NEW_WINDOW,
    242         ui_test_utils::BROWSER_TEST_NONE);
    243   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
    244       browser(), GURL("http://www.blocker.com"), 2);
    245   ui_test_utils::NavigateToURLWithDisposition(
    246         browser(), GURL("http://www.opener.com/#cnn?q=b"), NEW_WINDOW,
    247         ui_test_utils::BROWSER_TEST_NONE);
    248   ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(
    249       browser(), GURL("http://www.blocker.com"), 2);
    250 
    251   const char* subset_one[] = {
    252       "CreatedLink",
    253       "InnerHtml",
    254       "DocumentWrite"
    255   };
    256 
    257   const char* subset_two[] = {
    258       "ContentScript",
    259       "CreatedScript",
    260       "CreatedIframe",
    261       "CreatedDiv",
    262       "CreatedEmbed",
    263       "CreatedObject",
    264       "InvokedDomMethod"
    265   };
    266 
    267   // These were only touched by one of the scripts.
    268   for (size_t i = 0; i < arraysize(subset_one); ++i) {
    269     base::HistogramBase* google_histogram = base::Histogram::FactoryGet(
    270         std::string(kGooglePrefix) + "." + std::string(subset_one[i]),
    271         1, 100, 50, base::HistogramBase::kNoFlags);
    272     scoped_ptr<base::HistogramSamples> google_samples =
    273         google_histogram->SnapshotSamples();
    274     EXPECT_EQ(1, google_samples->GetCount(1));
    275 
    276     base::HistogramBase* cnn_histogram = base::Histogram::FactoryGet(
    277         std::string(kNonGooglePrefix) + "." + std::string(subset_one[i]),
    278         1, 100, 50, base::HistogramBase::kNoFlags);
    279     scoped_ptr<base::HistogramSamples> cnn_samples =
    280         cnn_histogram->SnapshotSamples();
    281     EXPECT_EQ(1, cnn_samples->GetCount(1));
    282   }
    283 
    284   // These were touched by both scripts.
    285   for (size_t i = 0; i < arraysize(subset_two); ++i) {
    286     base::HistogramBase* google_histogram = base::Histogram::FactoryGet(
    287         std::string(kGooglePrefix) + "." + std::string(subset_two[i]),
    288         1, 100, 50, base::HistogramBase::kNoFlags);
    289     scoped_ptr<base::HistogramSamples> google_samples =
    290         google_histogram->SnapshotSamples();
    291     EXPECT_EQ(1, google_samples->GetCount(2));
    292 
    293     base::HistogramBase* cnn_histogram = base::Histogram::FactoryGet(
    294         std::string(kNonGooglePrefix) + "." + std::string(subset_two[i]),
    295         1, 100, 50, base::HistogramBase::kNoFlags);
    296     scoped_ptr<base::HistogramSamples> cnn_samples =
    297         cnn_histogram->SnapshotSamples();
    298     EXPECT_EQ(1, cnn_samples->GetCount(2));
    299   }
    300 
    301 }
    302