/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "cobalt/csp/source.h"

#include "cobalt/csp/content_security_policy.h"
#include "googleurl/src/gurl.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace csp {

namespace {

class SourceTest : public ::testing::Test {
 public:
  SourceTest() : csp_(new ContentSecurityPolicy(GURL(), ViolationCallback())) {}

 protected:
  scoped_ptr<ContentSecurityPolicy> csp_;
};

TEST_F(SourceTest, BasicMatching) {
  SourceConfig config;
  config.scheme = "http";
  config.host = "example.com";
  config.path = "/foo/";
  config.port = 8000;

  Source source(csp_.get(), config);

  EXPECT_TRUE(source.Matches(GURL("http://example.com:8000/foo/")));
  EXPECT_TRUE(source.Matches(GURL("http://example.com:8000/foo/bar")));
  EXPECT_TRUE(source.Matches(GURL("HTTP://EXAMPLE.com:8000/foo/BAR")));

  EXPECT_FALSE(source.Matches(GURL("http://example.com:8000/")));
  EXPECT_FALSE(source.Matches(GURL("http://example.com:8000/bar/")));
  EXPECT_FALSE(source.Matches(GURL("https://example.com:8000/bar/")));
  EXPECT_FALSE(source.Matches(GURL("http://example.com:9000/bar/")));
  EXPECT_FALSE(source.Matches(GURL("http://example.com:9000/foo/")));
  EXPECT_FALSE(source.Matches(GURL("http://foo.example.com:8000/")));
}

TEST_F(SourceTest, SpecificPath) {
  SourceConfig config;
  config.scheme = "http";
  config.host = "example.com";
  // Match a specific path.
  config.path = "/foo";

  Source source(csp_.get(), config);

  EXPECT_TRUE(source.Matches(GURL("http://example.com/foo")));
  EXPECT_TRUE(source.Matches(GURL("http://example.com:80/foo")));

  EXPECT_FALSE(source.Matches(GURL("http://example.com/foo.jpg")));
  EXPECT_FALSE(source.Matches(GURL("HTTP://EXAMPLE.com/foo/BAR")));
  EXPECT_FALSE(source.Matches(GURL("http://example.com:8000/")));
}

TEST_F(SourceTest, WildcardMatching) {
  SourceConfig config;
  config.scheme = "http";
  config.host = "example.com";
  config.path = "/";
  config.host_wildcard = SourceConfig::kHasWildcard;
  config.port_wildcard = SourceConfig::kHasWildcard;

  Source source(csp_.get(), config);

  EXPECT_TRUE(source.Matches(GURL("http://foo.example.com:8000/")));
  EXPECT_TRUE(source.Matches(GURL("http://foo.example.com:8000/foo")));
  EXPECT_TRUE(source.Matches(GURL("http://foo.example.com:9000/foo/")));
  EXPECT_TRUE(source.Matches(GURL("http://foo.example.com:8000/")));
  EXPECT_TRUE(source.Matches(GURL("HTTP://FOO.EXAMPLE.com:8000/foo/BAR")));

  EXPECT_FALSE(source.Matches(GURL("http://example.com:8000/")));
  EXPECT_FALSE(source.Matches(GURL("http://example.com:8000/foo")));
  EXPECT_FALSE(source.Matches(GURL("http://example.com:9000/foo/")));
  EXPECT_FALSE(source.Matches(GURL("http://example.foo.com:8000/")));
  EXPECT_FALSE(source.Matches(GURL("https://example.foo.com:8000/")));
  EXPECT_FALSE(source.Matches(GURL("https://example.com:8000/bar/")));
}

TEST_F(SourceTest, RedirectMatching) {
  SourceConfig config;
  config.scheme = "http";
  config.host = "example.com";
  config.path = "/bar/";
  config.port = 8000;

  Source source(csp_.get(), config);

  EXPECT_TRUE(source.Matches(GURL("http://example.com:8000/"),
                             ContentSecurityPolicy::kDidRedirect));
  EXPECT_TRUE(source.Matches(GURL("http://example.com:8000/foo"),
                             ContentSecurityPolicy::kDidRedirect));
  EXPECT_TRUE(source.Matches(GURL("https://example.com:8000/foo"),
                             ContentSecurityPolicy::kDidRedirect));

  EXPECT_FALSE(source.Matches(GURL("http://not-example.com:8000/foo"),
                              ContentSecurityPolicy::kDidRedirect));
  EXPECT_FALSE(source.Matches(GURL("http://example.com:9000/foo/")));
}

TEST_F(SourceTest, InsecureSourceMatchesSecure) {
  SourceConfig config;
  config.scheme = "http";
  config.path = "/";
  config.port_wildcard = SourceConfig::kHasWildcard;
  Source source(csp_.get(), config);

  EXPECT_TRUE(source.Matches(GURL("http://example.com:8000/")));
  EXPECT_TRUE(source.Matches(GURL("https://example.com:8000/")));
  EXPECT_TRUE(source.Matches(GURL("http://not-example.com:8000/")));
  EXPECT_TRUE(source.Matches(GURL("https://not-example.com:8000/")));

  EXPECT_FALSE(source.Matches(GURL("ftp://example.com:8000/")));
}

TEST_F(SourceTest, SecureSourceDoesntMatchInsecure) {
  SourceConfig config;
  config.scheme = "https";
  config.path = "/";
  config.port_wildcard = SourceConfig::kHasWildcard;
  Source source(csp_.get(), config);

  EXPECT_TRUE(source.Matches(GURL("https://example.com:8000/")));
  EXPECT_TRUE(source.Matches(GURL("https://example.com:8000/")));
  EXPECT_TRUE(source.Matches(GURL("https://not-example.com:8000/")));

  EXPECT_FALSE(source.Matches(GURL("http://not-example.com:8000/")));
  EXPECT_FALSE(source.Matches(GURL("ftp://example.com:8000/")));
}

TEST_F(SourceTest, InsecureHostMatchesSecure) {
  SourceConfig config;
  config.scheme = "http";
  config.host = "example.com";
  config.path = "/";
  config.port_wildcard = SourceConfig::kHasWildcard;
  Source source(csp_.get(), config);

  EXPECT_TRUE(source.Matches(GURL("http://example.com:8000/")));
  EXPECT_TRUE(source.Matches(GURL("https://example.com:8000/")));

  EXPECT_FALSE(source.Matches(GURL("http://not-example.com:8000/")));
  EXPECT_FALSE(source.Matches(GURL("https://not-example.com:8000/")));
}

TEST_F(SourceTest, SecureHostDoesntMatchesInsecure) {
  SourceConfig config;
  config.scheme = "https";
  config.host = "example.com";
  config.path = "/";
  config.port_wildcard = SourceConfig::kHasWildcard;
  Source source(csp_.get(), config);

  EXPECT_TRUE(source.Matches(GURL("https://example.com:8000/")));

  EXPECT_FALSE(source.Matches(GURL("http://not-example.com:8000/")));
  EXPECT_FALSE(source.Matches(GURL("http://example.com:8000/")));
  EXPECT_FALSE(source.Matches(GURL("https://not-example.com:8000/")));
}
}  // namespace

}  // namespace csp
}  // namespace cobalt
