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

#include "net/http/webfonts_histogram.h"

#include "base/strings/strcat.h"
#include "base/test/metrics/histogram_tester.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace net::web_fonts_histogram {

namespace {

const char kRobotoHistogramName[] = "WebFont.HttpCacheStatus_roboto";
const char kOpenSansHistogramName[] = "WebFont.HttpCacheStatus_opensans";
const char kOthersHistogramName[] = "WebFont.HttpCacheStatus_others";

const char kHttps[] = "https://";
const char kHttp[] = "http://";

const char kPattern1[] = "themes.googleusercontent.com/static/fonts/";
const char kPattern2[] = "ssl.gstatic.com/fonts/";
const char kPattern3[] = "fonts.gstatic.com/s/";

const char kRoboto[] = "roboto";
const char kOpenSans[] = "opensans";

}  // namespace

TEST(WebfontsHistogramTest, EmptyKey_NoRecord) {
  base::HistogramTester histograms;
  MaybeRecordCacheStatus(HttpResponseInfo::ENTRY_USED, "");
  histograms.ExpectTotalCount(kRobotoHistogramName, 0);
  histograms.ExpectTotalCount(kOpenSansHistogramName, 0);
  histograms.ExpectTotalCount(kOthersHistogramName, 0);
}

TEST(WebfontsHistogramTest, RecordRoboto) {
  base::HistogramTester histograms;
  MaybeRecordCacheStatus(HttpResponseInfo::ENTRY_USED,
                         base::StrCat({kHttps, kPattern1, kRoboto}));
  histograms.ExpectUniqueSample(kRobotoHistogramName, 3 /* ENTRY_USED */, 1);
  histograms.ExpectTotalCount(kOpenSansHistogramName, 0);
  histograms.ExpectTotalCount(kOthersHistogramName, 0);
}

TEST(WebfontsHistogramTest, RecordOpenSans) {
  base::HistogramTester histograms;
  MaybeRecordCacheStatus(HttpResponseInfo::ENTRY_NOT_IN_CACHE,
                         base::StrCat({kHttp, kPattern2, kOpenSans}));
  histograms.ExpectTotalCount(kRobotoHistogramName, 0);
  histograms.ExpectUniqueSample(kOpenSansHistogramName,
                                2 /* ENTRY_NOT_IN_CACHE */, 1);
  histograms.ExpectTotalCount(kOthersHistogramName, 0);
}

TEST(WebfontsHistogramTest, EmptyFont_RecordOthers) {
  base::HistogramTester histograms;
  MaybeRecordCacheStatus(HttpResponseInfo::ENTRY_CANT_CONDITIONALIZE,
                         base::StrCat({kHttps, kPattern3}));
  histograms.ExpectTotalCount(kRobotoHistogramName, 0);
  histograms.ExpectTotalCount(kOpenSansHistogramName, 0);
  histograms.ExpectUniqueSample(kOthersHistogramName,
                                6 /* ENTRY_CANT_CONDITIONALIZE */, 1);
}

TEST(WebfontsHistogramTest, ArbitraryFont_RecordOthers) {
  base::HistogramTester histograms;
  MaybeRecordCacheStatus(HttpResponseInfo::ENTRY_OTHER,
                         base::StrCat({kHttps, kPattern2, "abc"}));
  histograms.ExpectTotalCount(kRobotoHistogramName, 0);
  histograms.ExpectTotalCount(kOpenSansHistogramName, 0);
  histograms.ExpectUniqueSample(kOthersHistogramName, 1 /* ENTRY_OTHER */, 1);
}

TEST(WebfontsHistogramTest, WithSuffix_Record) {
  base::HistogramTester histograms;
  MaybeRecordCacheStatus(HttpResponseInfo::ENTRY_USED,
                         base::StrCat({kHttps, kPattern1, kRoboto, "abc"}));
  histograms.ExpectUniqueSample(kRobotoHistogramName, 3 /* ENTRY_USED */, 1);
  histograms.ExpectTotalCount(kOpenSansHistogramName, 0);
  histograms.ExpectTotalCount(kOthersHistogramName, 0);
}

TEST(WebfontsHistogramTest, WithPrefix_NoRecord) {
  base::HistogramTester histograms;
  MaybeRecordCacheStatus(HttpResponseInfo::ENTRY_USED,
                         base::StrCat({"abc", kHttps, kPattern1, kRoboto}));
  histograms.ExpectTotalCount(kRobotoHistogramName, 0);
  histograms.ExpectTotalCount(kOpenSansHistogramName, 0);
  histograms.ExpectTotalCount(kOthersHistogramName, 0);
}

TEST(WebfontsHistogramTest, OtherProtocol_NoRecord) {
  base::HistogramTester histograms;
  MaybeRecordCacheStatus(HttpResponseInfo::ENTRY_OTHER,
                         base::StrCat({"ftp://", kPattern1, kRoboto}));
  histograms.ExpectTotalCount(kRobotoHistogramName, 0);
  histograms.ExpectTotalCount(kOpenSansHistogramName, 0);
  histograms.ExpectTotalCount(kOthersHistogramName, 0);
}

TEST(WebfontsHistogramTest, OtherPattern_NoRecord) {
  base::HistogramTester histograms;
  MaybeRecordCacheStatus(
      HttpResponseInfo::ENTRY_USED,
      base::StrCat({kHttps, "fonts.gstatic.com//s/", kRoboto}));
  histograms.ExpectTotalCount(kRobotoHistogramName, 0);
  histograms.ExpectTotalCount(kOpenSansHistogramName, 0);
  histograms.ExpectTotalCount(kOthersHistogramName, 0);
}

TEST(WebfontsHistogramTest, TwoRobotoSameBucket_TwoOpenSansDifferentBucket) {
  base::HistogramTester histograms;

  MaybeRecordCacheStatus(HttpResponseInfo::ENTRY_USED,
                         base::StrCat({kHttps, kPattern2, kRoboto}));
  MaybeRecordCacheStatus(HttpResponseInfo::ENTRY_USED,
                         base::StrCat({kHttp, kPattern3, kRoboto}));
  MaybeRecordCacheStatus(HttpResponseInfo::ENTRY_USED,
                         base::StrCat({kHttps, kPattern2, kOpenSans}));
  MaybeRecordCacheStatus(HttpResponseInfo::ENTRY_OTHER,
                         base::StrCat({kHttp, kPattern3, kOpenSans}));

  histograms.ExpectUniqueSample(kRobotoHistogramName, 3 /* ENTRY_USED */, 2);
  histograms.ExpectTotalCount(kRobotoHistogramName, 2);

  histograms.ExpectBucketCount(kOpenSansHistogramName, 3 /* ENTRY_USED */, 1);
  histograms.ExpectBucketCount(kOpenSansHistogramName, 1 /* ENTRY_OTHER */, 1);
  histograms.ExpectTotalCount(kOpenSansHistogramName, 2);

  histograms.ExpectTotalCount(kOthersHistogramName, 0);
}

}  // namespace net::web_fonts_histogram