most_visited_iframe_source_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Copyright 2013 The Chromium Authors. All rights reserved.
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Use of this source code is governed by a BSD-style license that can be
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// found in the LICENSE file.
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/bind.h"
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/metrics/histogram.h"
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/metrics/statistics_recorder.h"
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "base/strings/stringprintf.h"
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "chrome/browser/search/most_visited_iframe_source.h"
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "testing/gtest/include/gtest/gtest.h"
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass MostVisitedIframeSourceTest : public testing::Test {
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public:
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void ExpectNullData(base::RefCountedMemory* data) {
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    EXPECT_EQ(NULL, data);
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org protected:
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  MostVisitedIframeSource* source() { return source_.get(); }
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual void SetUp() { source_.reset(new MostVisitedIframeSource()); }
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_ptr<MostVisitedIframeSource> source_;
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTEST_F(MostVisitedIframeSourceTest, LogEndpointIsValidNoProvider) {
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  content::URLDataSource::GotDataCallback callback = base::Bind(
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      &MostVisitedIframeSourceTest::ExpectNullData, base::Unretained(this));
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  base::StatisticsRecorder::Initialize();
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Making sure the histogram is created.
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UMA_HISTOGRAM_ENUMERATION(MostVisitedIframeSource::kMostVisitedHistogramName,
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            0, MostVisitedIframeSource::kNumMostVisited);
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  base::HistogramBase* histogram = base::StatisticsRecorder::FindHistogram(
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      MostVisitedIframeSource::kMostVisitedHistogramName);
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_ptr<base::HistogramSamples> samples1(histogram->SnapshotSamples());
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // The dummy value got logged.
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(1, samples1->TotalCount());
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(1, samples1->GetCount(0));
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Test the method.
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  source()->StartDataRequest("log.html?pos=1", 0, 0, callback);
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_ptr<base::HistogramSamples> samples2(histogram->SnapshotSamples());
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(samples1->TotalCount() + 1, samples2->TotalCount());
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(1, samples2->GetCount(1));
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Counts accumulate and behave as expected.
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  source()->StartDataRequest("log.html?pos=5", 0, 0, callback);
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  source()->StartDataRequest("log.html?pos=1", 0, 0, callback);
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_ptr<base::HistogramSamples> samples3(histogram->SnapshotSamples());
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(samples2->TotalCount() + 2, samples3->TotalCount());
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(1, samples3->GetCount(5));
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(2, samples3->GetCount(1));
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // If 'pos' is unspecified or invalid, callback still gets called but values
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // are not incremented.
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  source()->StartDataRequest("log.html?pos=", 0, 0, callback);
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  source()->StartDataRequest("log.html", 0, 0, callback);
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Total count hasn't changed.
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(samples2->TotalCount() + 2, samples3->TotalCount());
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgTEST_F(MostVisitedIframeSourceTest, LogEndpointIsValidWithProvider) {
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  content::URLDataSource::GotDataCallback callback = base::Bind(
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      &MostVisitedIframeSourceTest::ExpectNullData, base::Unretained(this));
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  base::StatisticsRecorder::Initialize();
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Making sure a test histogram with provider is created by logging a dummy
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // value.
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const std::string histogram_name =
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      MostVisitedIframeSource::GetHistogramNameForProvider("foobar");
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UMA_HISTOGRAM_ENUMERATION(histogram_name, 0,
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            MostVisitedIframeSource::kNumMostVisited);
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  base::HistogramBase* histogram = base::StatisticsRecorder::FindHistogram(
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      histogram_name);
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_ptr<base::HistogramSamples> samples1(histogram->SnapshotSamples());
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // The dummy value got logged.
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(1, samples1->TotalCount());
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(1, samples1->GetCount(0));
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Test the method.
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  source()->StartDataRequest("log.html?pos=1&pr=foobar", 0, 0, callback);
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_ptr<base::HistogramSamples> samples2(histogram->SnapshotSamples());
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(samples1->TotalCount() + 1, samples2->TotalCount());
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(1, samples2->GetCount(1));
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Counts accumulate and behave as expected.
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  source()->StartDataRequest("log.html?pos=5&pr=foobar", 0, 0, callback);
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  source()->StartDataRequest("log.html?pos=1&pr=foobar", 0, 0, callback);
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // This should have no effect for the "foobar" histogram.
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  source()->StartDataRequest("log.html?pos=1&pr=nofoo", 0, 0, callback);
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  scoped_ptr<base::HistogramSamples> samples3(histogram->SnapshotSamples());
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(samples2->TotalCount() + 2, samples3->TotalCount());
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(1, samples3->GetCount(5));
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  EXPECT_EQ(2, samples3->GetCount(1));
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org