blob: 5bf67d39740084b34385170717b994d7625b151e [file] [log] [blame]
// Copyright 2017 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/page_load_metrics/page_load_metrics_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
class PageLoadMetricsUtilTest : public testing::Test {};
TEST_F(PageLoadMetricsUtilTest, IsGoogleHostname) {
struct {
bool expected_result;
const char* url;
} test_cases[] = {
{true, "https://google.com/"},
{true, "https://google.com/index.html"},
{true, "https://www.google.com/"},
{true, "https://www.google.com/search"},
{true, "https://www.google.com/a/b/c/d"},
{true, "https://www.google.co.uk/"},
{true, "https://www.google.co.in/"},
{true, "https://other.google.com/"},
{true, "https://other.www.google.com/"},
{true, "https://www.other.google.com/"},
{true, "https://www.www.google.com/"},
{false, ""},
{false, "a"},
{false, "*"},
{false, "com"},
{false, "co.uk"},
{false, "google"},
{false, "google.com"},
{false, "www.google.com"},
{false, "https:///"},
{false, "https://a/"},
{false, "https://*/"},
{false, "https://com/"},
{false, "https://co.uk/"},
{false, "https://google/"},
{false, "https://*.com/"},
{false, "https://www.*.com/"},
{false, "https://www.google.appspot.com/"},
{false, "https://www.google.example.com/"},
};
for (const auto& test : test_cases) {
EXPECT_EQ(test.expected_result,
page_load_metrics::IsGoogleHostname(GURL(test.url)))
<< "For URL: " << test.url;
}
}
TEST_F(PageLoadMetricsUtilTest, GetGoogleHostnamePrefix) {
struct {
bool expected_result;
const char* expected_prefix;
const char* url;
} test_cases[] = {
{false, "", "https://example.com/"},
{true, "", "https://google.com/"},
{true, "www", "https://www.google.com/"},
{true, "news", "https://news.google.com/"},
{true, "www", "https://www.google.co.uk/"},
{true, "other", "https://other.google.com/"},
{true, "other.www", "https://other.www.google.com/"},
{true, "www.other", "https://www.other.google.com/"},
{true, "www.www", "https://www.www.google.com/"},
};
for (const auto& test : test_cases) {
base::Optional<std::string> result =
page_load_metrics::GetGoogleHostnamePrefix(GURL(test.url));
EXPECT_EQ(test.expected_result, result.has_value())
<< "For URL: " << test.url;
if (result) {
EXPECT_EQ(test.expected_prefix, result.value())
<< "Prefix for URL: " << test.url;
}
}
}
TEST_F(PageLoadMetricsUtilTest, IsGoogleSearchHostname) {
struct {
bool expected_result;
const char* url;
} test_cases[] = {
{true, "https://www.google.com/"},
{true, "https://www.google.co.uk/"},
{true, "https://www.google.co.in/"},
{false, "https://other.google.com/"},
{false, "https://other.www.google.com/"},
{false, "https://www.other.google.com/"},
{false, "https://www.www.google.com/"},
{false, "https://www.google.appspot.com/"},
{false, "https://www.google.example.com/"},
// Search results are not served from the bare google.com domain.
{false, "https://google.com/"},
};
for (const auto& test : test_cases) {
EXPECT_EQ(test.expected_result,
page_load_metrics::IsGoogleSearchHostname(GURL(test.url)))
<< "for URL: " << test.url;
}
}
TEST_F(PageLoadMetricsUtilTest, IsGoogleSearchResultUrl) {
struct {
bool expected_result;
const char* url;
} test_cases[] = {
{true, "https://www.google.com/#q=test"},
{true, "https://www.google.com/search#q=test"},
{true, "https://www.google.com/search?q=test"},
{true, "https://www.google.com/webhp#q=test"},
{true, "https://www.google.com/webhp?q=test"},
{true, "https://www.google.com/webhp?a=b&q=test"},
{true, "https://www.google.com/webhp?a=b&q=test&c=d"},
{true, "https://www.google.com/webhp#a=b&q=test&c=d"},
{true, "https://www.google.com/webhp?#a=b&q=test&c=d"},
{false, "https://www.google.com/"},
{false, "https://www.google.com/about/"},
{false, "https://other.google.com/"},
{false, "https://other.google.com/webhp?q=test"},
{false, "http://www.example.com/"},
{false, "https://www.example.com/webhp?q=test"},
{false, "https://google.com/#q=test"},
};
for (const auto& test : test_cases) {
EXPECT_EQ(test.expected_result,
page_load_metrics::IsGoogleSearchResultUrl(GURL(test.url)))
<< "for URL: " << test.url;
}
}
TEST_F(PageLoadMetricsUtilTest, IsGoogleSearchRedirectorUrl) {
struct {
bool expected_result;
const char* url;
} test_cases[] = {
{true, "https://www.google.com/url?source=web"},
{true, "https://www.google.com/url?source=web#foo"},
{true, "https://www.google.com/searchurl/r.html#foo"},
{true, "https://www.google.com/url?a=b&source=web&c=d"},
{false, "https://www.google.com/?"},
{false, "https://www.google.com/?url"},
{false, "https://www.example.com/url?source=web"},
{false, "https://google.com/url?"},
{false, "https://www.google.com/?source=web"},
{false, "https://www.google.com/source=web"},
{false, "https://www.example.com/url?source=web"},
{false, "https://www.google.com/url?"},
{false, "https://www.google.com/url?a=b"},
};
for (const auto& test : test_cases) {
EXPECT_EQ(test.expected_result,
page_load_metrics::IsGoogleSearchRedirectorUrl(GURL(test.url)))
<< "for URL: " << test.url;
}
}
TEST_F(PageLoadMetricsUtilTest, QueryContainsComponent) {
struct {
bool expected_result;
const char* query;
const char* component;
} test_cases[] = {
{true, "a=b", "a=b"},
{true, "a=b&c=d", "a=b"},
{true, "a=b&c=d", "c=d"},
{true, "a=b&c=d&e=f", "c=d"},
{true, "za=b&a=b", "a=b"},
{true, "a=bz&a=b", "a=b"},
{true, "a=ba=b&a=b", "a=b"},
{true, "a=a=a&a=a", "a=a"},
{true, "source=web", "source=web"},
{true, "a=b&source=web", "source=web"},
{true, "a=b&source=web&c=d", "source=web"},
{false, "a=a=a", "a=a"},
{false, "", ""},
{false, "a=b", ""},
{false, "", "a=b"},
{false, "za=b", "a=b"},
{false, "za=bz", "a=b"},
{false, "a=bz", "a=b"},
{false, "za=b&c=d", "a=b"},
{false, "a=b&c=dz", "c=d"},
{false, "a=b&zc=d&e=f", "c=d"},
{false, "a=b&c=dz&e=f", "c=d"},
{false, "a=b&zc=dz&e=f", "c=d"},
{false, "a=b&foosource=web&c=d", "source=web"},
{false, "a=b&source=webbar&c=d", "source=web"},
{false, "a=b&foosource=webbar&c=d", "source=web"},
};
for (const auto& test : test_cases) {
EXPECT_EQ(test.expected_result, page_load_metrics::QueryContainsComponent(
test.query, test.component))
<< "For query: " << test.query << " with component: " << test.component;
}
}
TEST_F(PageLoadMetricsUtilTest, QueryContainsComponentPrefix) {
struct {
bool expected_result;
const char* query;
const char* component;
} test_cases[] = {
{true, "a=b", "a="},
{true, "a=b&c=d", "a="},
{true, "a=b&c=d", "c="},
{true, "a=b&c=d&e=f", "c="},
{true, "za=b&a=b", "a="},
{true, "ba=a=b&a=b", "a="},
{true, "q=test", "q="},
{true, "a=b&q=test", "q="},
{true, "q=test&c=d", "q="},
{true, "a=b&q=test&c=d", "q="},
{false, "", ""},
{false, "za=b", "a="},
{false, "za=b&c=d", "a="},
{false, "a=b&zc=d", "c="},
{false, "a=b&zc=d&e=f", "c="},
{false, "a=b&zq=test&c=d", "q="},
{false, "ba=a=b", "a="},
};
for (const auto& test : test_cases) {
EXPECT_EQ(test.expected_result,
page_load_metrics::QueryContainsComponentPrefix(test.query,
test.component))
<< "For query: " << test.query << " with component: " << test.component;
}
}