// Copyright 2015 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 "net/base/stale_while_revalidate_experiment_domains.h"

#include <iosfwd>

#include "testing/gtest/include/gtest/gtest.h"

namespace net {

namespace {

using ::testing::TestWithParam;
using ::testing::ValuesIn;

const struct Expectation {
  const char* host;
  bool result;
} kExpectations[] = {
    {"wordpress.com", true},
    {"issuu.com", true},
    {"wordpress.com.", true},
    {"www.wordpress.com", true},
    {"www.wordpress.com.", true},
    {"a.b.wordpress.com", true},
    {"a.b.c.d.wordpress.com", true},
    {"www..wordpress.com", true},
    {"www.wordpress..com", false},
    {"a-b-wordpress.com", false},
    {"com", false},
    {".", false},
    {"", false},
    {"..", false},
    {"ordpress.com", false},
    {"wordpress.co", false},
    {"a", false},
    {"a.b", false},
    {"a.b.c", false},
    {"a.b.c.d.e", false},
};

void PrintTo(const Expectation& expectation, std::ostream* os) {
  *os << "{\"" << expectation.host << "\" ," << std::boolalpha
      << expectation.result << "}";
}

class MatchTest : public TestWithParam<Expectation> {};

TEST_P(MatchTest, CheckExpectation) {
  const Expectation& expectation = GetParam();
  EXPECT_EQ(expectation.result,
            IsHostInStaleWhileRevalidateExperimentDomain(expectation.host));
}

INSTANTIATE_TEST_CASE_P(StaleWhileRevalidateExperimentDomainsTest,
                        MatchTest,
                        ValuesIn(kExpectations));

}  // namespace

}  // namespace net
