// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ui/webui/ntp/ntp_user_data_logger.h"

#include "base/metrics/histogram.h"
#include "base/metrics/statistics_recorder.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/common/ntp_logging_events.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace {

class TestNTPUserDataLogger : public NTPUserDataLogger {
 public:
  TestNTPUserDataLogger() : NTPUserDataLogger(NULL) {}
  ~TestNTPUserDataLogger() override {}
};

base::HistogramBase::Count GetTotalCount(const std::string& histogram_name) {
  base::HistogramBase* histogram = base::StatisticsRecorder::FindHistogram(
      histogram_name);
  // Return 0 if history is uninitialized.
  return histogram ? histogram->SnapshotSamples()->TotalCount() : 0;
}

base::HistogramBase::Count GetBinCount(const std::string& histogram_name,
                                       base::HistogramBase::Sample value) {
  base::HistogramBase* histogram = base::StatisticsRecorder::FindHistogram(
      histogram_name);
  // Return 0 if history is uninitialized.
  return histogram ? histogram->SnapshotSamples()->GetCount(value) : 0;
}

}  // namespace

class NTPUserDataLoggerTest : public testing::Test {
  content::TestBrowserThreadBundle thread_bundle_;
};

TEST_F(NTPUserDataLoggerTest, TestLogging) {
  base::StatisticsRecorder::Initialize();

  // Ensure empty statistics.
  EXPECT_EQ(0, GetTotalCount("NewTabPage.NumberOfMouseOvers"));
  EXPECT_EQ(0, GetBinCount("NewTabPage.NumberOfMouseOvers", 0));

  // Enusure non-zero statistics.
  TestNTPUserDataLogger logger;

  base::TimeDelta delta = base::TimeDelta::FromMilliseconds(0);

  for (int i = 0; i < 20; ++i)
    logger.LogEvent(NTP_MOUSEOVER, delta);
  for (int i = 0; i < 8; ++i)
    logger.LogEvent(NTP_TILE, delta);
  for (int i = 0; i < 4; ++i)
    logger.LogEvent(NTP_THUMBNAIL_TILE, delta);
  for (int i = 0; i < 2; ++i)
    logger.LogEvent(NTP_THUMBNAIL_ERROR, delta);
  logger.LogEvent(NTP_GRAY_TILE_FALLBACK, delta);
  logger.LogEvent(NTP_EXTERNAL_TILE_FALLBACK, delta);
  for (int i = 0; i < 2; ++i)
    logger.LogEvent(NTP_EXTERNAL_TILE, delta);
  for (int i = 0; i < 2; ++i)
    logger.LogEvent(NTP_GRAY_TILE, delta);
  logger.LogEvent(NTP_SERVER_SIDE_SUGGESTION, delta);

  logger.EmitNtpStatistics();

  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfMouseOvers"));
  EXPECT_EQ(0, GetBinCount("NewTabPage.NumberOfMouseOvers", 0));
  EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfMouseOvers", 20));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfTiles"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfTiles", 8));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfThumbnailTiles"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfThumbnailTiles", 4));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfThumbnailErrors"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfThumbnailErrors", 2));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfGrayTileFallbacks"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfGrayTileFallbacks", 1));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfExternalTileFallbacks"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfExternalTileFallbacks", 1));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfExternalTiles"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfExternalTiles", 2));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfGrayTiles"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfGrayTiles", 2));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.SuggestionsType"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsType", 1));

  // Statistics should be reset to 0, so we should not log anything else.
  logger.EmitNtpStatistics();
  EXPECT_EQ(2, GetTotalCount("NewTabPage.NumberOfMouseOvers"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfMouseOvers", 0));
  EXPECT_EQ(1, GetBinCount("NewTabPage.NumberOfMouseOvers", 20));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfTiles"));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfThumbnailTiles"));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfThumbnailErrors"));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfGrayTileFallbacks"));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfExternalTileFallbacks"));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfExternalTiles"));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.NumberOfGrayTiles"));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.SuggestionsType"));
}

TEST_F(NTPUserDataLoggerTest, TestLogMostVisitedImpression) {
  base::StatisticsRecorder::Initialize();

  EXPECT_EQ(0, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 1));
  EXPECT_EQ(0, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 5));

  TestNTPUserDataLogger logger;

  logger.LogMostVisitedImpression(1, base::ASCIIToUTF16("foobar"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 1));
  EXPECT_EQ(0, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 5));

  logger.LogMostVisitedImpression(5, base::ASCIIToUTF16("foobar"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 1));
  EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 5));

  // Try without provider. Only total increases.
  logger.LogMostVisitedImpression(5, base::ASCIIToUTF16(""));
  EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 1));
  EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 5));

  logger.LogMostVisitedImpression(1, base::ASCIIToUTF16("foobar"));
  EXPECT_EQ(2, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 1));
  EXPECT_EQ(1, GetBinCount("NewTabPage.SuggestionsImpression.foobar", 5));
}

TEST_F(NTPUserDataLoggerTest, TestLogMostVisitedNavigation) {
  base::StatisticsRecorder::Initialize();

  EXPECT_EQ(0, GetTotalCount("NewTabPage.MostVisited"));
  EXPECT_EQ(0, GetBinCount("NewTabPage.MostVisited.foobar", 1));
  EXPECT_EQ(0, GetBinCount("NewTabPage.MostVisited.foobar", 5));

  TestNTPUserDataLogger logger;

  logger.LogMostVisitedNavigation(1, base::ASCIIToUTF16("foobar"));
  EXPECT_EQ(1, GetTotalCount("NewTabPage.MostVisited"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.MostVisited.foobar", 1));
  EXPECT_EQ(0, GetBinCount("NewTabPage.MostVisited.foobar", 5));

  logger.LogMostVisitedNavigation(5, base::ASCIIToUTF16("foobar"));
  EXPECT_EQ(2, GetTotalCount("NewTabPage.MostVisited"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.MostVisited.foobar", 1));
  EXPECT_EQ(1, GetBinCount("NewTabPage.MostVisited.foobar", 5));

  // Try without provider. Only total increases.
  logger.LogMostVisitedNavigation(5, base::ASCIIToUTF16(""));
  EXPECT_EQ(3, GetTotalCount("NewTabPage.MostVisited"));
  EXPECT_EQ(1, GetBinCount("NewTabPage.MostVisited.foobar", 1));
  EXPECT_EQ(1, GetBinCount("NewTabPage.MostVisited.foobar", 5));

  logger.LogMostVisitedNavigation(1, base::ASCIIToUTF16("foobar"));
  EXPECT_EQ(4, GetTotalCount("NewTabPage.MostVisited"));
  EXPECT_EQ(2, GetBinCount("NewTabPage.MostVisited.foobar", 1));
  EXPECT_EQ(1, GetBinCount("NewTabPage.MostVisited.foobar", 5));
}
