// Copyright (c) 2012 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 "content/renderer/render_thread_impl.h"
#include "testing/gtest/include/gtest/gtest.h"

#include <string>

namespace content {

class RenderThreadImplUnittest : public testing::Test {
 public:
  RenderThreadImplUnittest()
      : kCustomizableHistogram_("Histogram1"),
        kNormalHistogram_("Histogram2") {}
  ~RenderThreadImplUnittest() override {}

 protected:
  void SetUp() override {
    histogram_customizer_.custom_histograms_.clear();
    histogram_customizer_.custom_histograms_.insert(kCustomizableHistogram_);
  }
  RenderThreadImpl::HistogramCustomizer histogram_customizer_;
  const char* kCustomizableHistogram_;
  const char* kNormalHistogram_;
};

TEST_F(RenderThreadImplUnittest, CustomHistogramsWithNoNavigations) {
  // First there is no page -> no custom histograms.
  EXPECT_EQ(kCustomizableHistogram_,
            histogram_customizer_.ConvertToCustomHistogramName(
                kCustomizableHistogram_));
  EXPECT_EQ(kNormalHistogram_,
            histogram_customizer_.ConvertToCustomHistogramName(
                kNormalHistogram_));
}

TEST_F(RenderThreadImplUnittest, CustomHistogramsForOneRenderView) {
  histogram_customizer_.RenderViewNavigatedToHost("mail.google.com", 1);
  EXPECT_EQ(std::string(kCustomizableHistogram_) + ".gmail",
            histogram_customizer_.ConvertToCustomHistogramName(
                kCustomizableHistogram_));
  EXPECT_EQ(kNormalHistogram_,
            histogram_customizer_.ConvertToCustomHistogramName(
                kNormalHistogram_));
  histogram_customizer_.RenderViewNavigatedToHost("docs.google.com", 1);
  EXPECT_EQ(std::string(kCustomizableHistogram_) + ".docs",
            histogram_customizer_.ConvertToCustomHistogramName(
                kCustomizableHistogram_));
  histogram_customizer_.RenderViewNavigatedToHost("nottracked.com", 1);
  EXPECT_EQ(kCustomizableHistogram_,
            histogram_customizer_.ConvertToCustomHistogramName(
                kCustomizableHistogram_));
}

TEST_F(RenderThreadImplUnittest, CustomHistogramsForTwoRenderViews) {
  // First there is only one view.
  histogram_customizer_.RenderViewNavigatedToHost("mail.google.com", 1);
  // Second view created and it navigates to the same host -> we can have a
  // custom diagram.
  histogram_customizer_.RenderViewNavigatedToHost("mail.google.com", 2);
  EXPECT_EQ(std::string(kCustomizableHistogram_) + ".gmail",
            histogram_customizer_.ConvertToCustomHistogramName(
                kCustomizableHistogram_));
  EXPECT_EQ(kNormalHistogram_,
            histogram_customizer_.ConvertToCustomHistogramName(
                kNormalHistogram_));
  // Now the views diverge (one of them navigates to a different host) -> no
  // custom diagram.
  histogram_customizer_.RenderViewNavigatedToHost("docs.google.com", 2);
  EXPECT_EQ(kCustomizableHistogram_,
            histogram_customizer_.ConvertToCustomHistogramName(
                kCustomizableHistogram_));
  // After this point, there will never be a custom diagram again, even if the
  // view navigated back to the common host.
  histogram_customizer_.RenderViewNavigatedToHost("mail.google.com", 2);
  EXPECT_EQ(kCustomizableHistogram_,
            histogram_customizer_.ConvertToCustomHistogramName(
                kCustomizableHistogram_));
}

TEST_F(RenderThreadImplUnittest, IdentifyAlexaTop10NonGoogleSite) {
  EXPECT_TRUE(histogram_customizer_.IsAlexaTop10NonGoogleSite("www.amazon.de"));
  EXPECT_TRUE(histogram_customizer_.IsAlexaTop10NonGoogleSite("amazon.de"));
  EXPECT_TRUE(histogram_customizer_.IsAlexaTop10NonGoogleSite("amazon.co.uk"));
  EXPECT_TRUE(
      histogram_customizer_.IsAlexaTop10NonGoogleSite("jp.wikipedia.org"));
  EXPECT_TRUE(
      histogram_customizer_.IsAlexaTop10NonGoogleSite("www.facebook.com"));
  EXPECT_FALSE(histogram_customizer_.IsAlexaTop10NonGoogleSite(""));
  EXPECT_FALSE(
      histogram_customizer_.IsAlexaTop10NonGoogleSite("www.google.com"));
  EXPECT_FALSE(histogram_customizer_.IsAlexaTop10NonGoogleSite("madeup"));
}

}  // namespace content
