// Copyright (c) 2011 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/http/http_auth_filter.h"

#include <memory>
#include <ostream>

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

namespace net {

namespace {

static const char* const server_whitelist_array[] = {
  "google.com",
  "linkedin.com",
  "book.com",
  ".chromium.org",
  ".gag",
  "gog"
};

enum {
  ALL_SERVERS_MATCH = (1 << arraysize(server_whitelist_array)) - 1
};

struct UrlData {
  GURL url;
  HttpAuth::Target target;
  bool matches;
  int match_bits;
};

static const UrlData urls[] = {
  { GURL(std::string()), HttpAuth::AUTH_NONE, false, 0 },
  { GURL("http://foo.cn"), HttpAuth::AUTH_PROXY, true, ALL_SERVERS_MATCH },
  { GURL("http://foo.cn"), HttpAuth::AUTH_SERVER, false, 0 },
  { GURL("http://slashdot.org"), HttpAuth::AUTH_NONE, false, 0 },
  { GURL("http://www.google.com"), HttpAuth::AUTH_SERVER, true, 1 << 0 },
  { GURL("http://www.google.com"), HttpAuth::AUTH_PROXY, true,
    ALL_SERVERS_MATCH },
  { GURL("https://login.facebook.com/login.php?login_attempt=1"),
    HttpAuth::AUTH_NONE, false, 0 },
  { GURL("http://codereview.chromium.org/634002/show"), HttpAuth::AUTH_SERVER,
    true, 1 << 3 },
  { GURL("http://code.google.com/p/chromium/issues/detail?id=34505"),
    HttpAuth::AUTH_SERVER, true, 1 << 0 },
  { GURL("http://code.google.com/p/chromium/issues/list?can=2&q=label:"
         "spdy&sort=owner&colspec=ID%20Stars%20Pri%20Area%20Type%20Status%20"
         "Summary%20Modified%20Owner%20Mstone%20OS"),
    HttpAuth::AUTH_SERVER, true, 1 << 3 },
  { GURL("https://www.linkedin.com/secure/login?trk=hb_signin"),
    HttpAuth::AUTH_SERVER, true, 1 << 1 },
  { GURL("http://www.linkedin.com/mbox?displayMBoxItem=&"
         "itemID=I1717980652_2&trk=COMM_HP_MSGVW_MEBC_MEBC&goback=.hom"),
    HttpAuth::AUTH_SERVER, true, 1 << 1 },
  { GURL("http://news.slashdot.org/story/10/02/18/190236/"
         "New-Plan-Lets-Top-HS-Students-Graduate-2-Years-Early"),
    HttpAuth::AUTH_PROXY, true, ALL_SERVERS_MATCH },
  { GURL("http://codereview.chromium.org/646068/diff/4001/5003"),
    HttpAuth::AUTH_SERVER, true, 1 << 3 },
  { GURL("http://codereview.chromium.gag/646068/diff/4001/5003"),
    HttpAuth::AUTH_SERVER, true, 1 << 4 },
  { GURL("http://codereview.chromium.gog/646068/diff/4001/5003"),
    HttpAuth::AUTH_SERVER, true, 1 << 5 },
};

}   // namespace

TEST(HttpAuthFilterTest, EmptyFilter) {
  // Create an empty filter
  HttpAuthFilterWhitelist filter((std::string()));
  for (size_t i = 0; i < arraysize(urls); i++) {
    EXPECT_EQ(urls[i].target == HttpAuth::AUTH_PROXY,
              filter.IsValid(urls[i].url, urls[i].target))
        << " " << i << ": " << urls[i].url;
  }
}

TEST(HttpAuthFilterTest, NonEmptyFilter) {
  // Create an non-empty filter
  std::string server_whitelist_filter_string;
  for (size_t i = 0; i < arraysize(server_whitelist_array); ++i) {
    if (!server_whitelist_filter_string.empty())
      server_whitelist_filter_string += ",";
    server_whitelist_filter_string += "*";
    server_whitelist_filter_string += server_whitelist_array[i];
  }
  HttpAuthFilterWhitelist filter(server_whitelist_filter_string);
  for (size_t i = 0; i < arraysize(urls); i++) {
    EXPECT_EQ(urls[i].matches, filter.IsValid(urls[i].url, urls[i].target))
        << " " << i << ": " << urls[i].url;
  }
}

}   // namespace net
