// 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 "ppapi/tests/test_url_util.h"

#include "ppapi/c/dev/ppb_url_util_dev.h"
#include "ppapi/cpp/dev/url_util_dev.h"
#include "ppapi/tests/testing_instance.h"

REGISTER_TEST_CASE(URLUtil);

static bool ComponentEquals(const PP_URLComponent_Dev& component,
                            int begin, int len) {
  return component.begin == begin && component.len == len;
}

bool TestURLUtil::Init() {
  util_ = pp::URLUtil_Dev::Get();
  return !!util_;
}

void TestURLUtil::RunTests(const std::string& filter) {
  RUN_TEST(Canonicalize, filter);
  RUN_TEST(ResolveRelative, filter);
  RUN_TEST(IsSameSecurityOrigin, filter);
  RUN_TEST(DocumentCanRequest, filter);
  RUN_TEST(DocumentCanAccessDocument, filter);
  RUN_TEST(GetDocumentURL, filter);
  RUN_TEST(GetPluginInstanceURL, filter);
  RUN_TEST(GetPluginReferrerURL, filter);
}

std::string TestURLUtil::TestCanonicalize() {
  // Test no canonicalize output.
  pp::Var result = util_->Canonicalize("http://Google.com");
  ASSERT_TRUE(result.AsString() == "http://google.com/");

  // Test all the components
  PP_URLComponents_Dev c;
  result = util_->Canonicalize(
      "http://me:pw@Google.com:1234/path?query#ref ",
      &c);
  ASSERT_TRUE(result.AsString() ==
  //          0         1         2         3         4
  //          0123456789012345678901234567890123456789012
              "http://me:pw@google.com:1234/path?query#ref");
  ASSERT_TRUE(ComponentEquals(c.scheme, 0, 4));
  ASSERT_TRUE(ComponentEquals(c.username, 7, 2));
  ASSERT_TRUE(ComponentEquals(c.password, 10, 2));
  ASSERT_TRUE(ComponentEquals(c.host, 13, 10));
  ASSERT_TRUE(ComponentEquals(c.port, 24, 4));
  ASSERT_TRUE(ComponentEquals(c.path, 28, 5));
  ASSERT_TRUE(ComponentEquals(c.query, 34, 5));
  ASSERT_TRUE(ComponentEquals(c.ref, 40, 3));

  // Test minimal components.
  result = util_->Canonicalize("http://google.com/", &c);
  //                                0         1
  //                                0123456789012345678
  ASSERT_TRUE(result.AsString() == "http://google.com/");
  ASSERT_TRUE(ComponentEquals(c.scheme, 0, 4));
  ASSERT_TRUE(ComponentEquals(c.username, 0, -1));
  ASSERT_TRUE(ComponentEquals(c.password, 0, -1));
  ASSERT_TRUE(ComponentEquals(c.host, 7, 10));
  ASSERT_TRUE(ComponentEquals(c.port, 0, -1));
  ASSERT_TRUE(ComponentEquals(c.path, 17, 1));
  ASSERT_TRUE(ComponentEquals(c.query, 0, -1));
  ASSERT_TRUE(ComponentEquals(c.ref, 0, -1));

  PASS();
}

std::string TestURLUtil::TestResolveRelative() {
  const int kTestCount = 6;
  struct TestCase {
    const char* base;
    const char* relative;
    const char* expected;  // NULL if
  } test_cases[kTestCount] = {
    {"http://google.com/", "foo", "http://google.com/foo"},
    {"http://google.com/foo", "/bar", "http://google.com/bar"},
    {"http://foo/", "http://bar", "http://bar/"},
    {"data:foo", "/bar", NULL},
    {"data:foo", "http://foo/", "http://foo/"},
    {"http://foo/", "", "http://foo/"},
  };

  for (int i = 0; i < kTestCount; i++) {
    pp::Var result = util_->ResolveRelativeToURL(test_cases[i].base,
                                                 test_cases[i].relative);
    if (test_cases[i].expected == NULL) {
      ASSERT_TRUE(result.is_null());
    } else {
      ASSERT_TRUE(result.AsString() == test_cases[i].expected);
    }
  }
  PASS();
}

std::string TestURLUtil::TestIsSameSecurityOrigin() {
  ASSERT_FALSE(util_->IsSameSecurityOrigin("http://google.com/",
                                           "http://example.com/"));
  ASSERT_TRUE(util_->IsSameSecurityOrigin("http://google.com/foo",
                                          "http://google.com/bar"));
  PASS();
}

std::string TestURLUtil::TestDocumentCanRequest() {
  // This is hard to test, but we can at least verify we can't request
  // some random domain.
  ASSERT_FALSE(util_->DocumentCanRequest(instance_, "http://evil.com/"));
  PASS();
}

std::string TestURLUtil::TestDocumentCanAccessDocument() {
  // This is hard to test, but we can at least verify we can access ourselves.
  ASSERT_TRUE(util_->DocumentCanAccessDocument(instance_, instance_));
  PASS();
}

std::string TestURLUtil::TestGetDocumentURL() {
  pp::Var url = util_->GetDocumentURL(instance_);
  ASSERT_TRUE(url.is_string());
  pp::VarPrivate window = instance_->GetWindowObject();
  pp::Var href = window.GetProperty("location").GetProperty("href");
  ASSERT_TRUE(href.is_string());
  // In the test framework, they should be the same.
  ASSERT_EQ(url.AsString(), href.AsString());
  PASS();
}

std::string TestURLUtil::TestGetPluginInstanceURL() {
  pp::Var url = util_->GetPluginInstanceURL(instance_);
  ASSERT_TRUE(url.is_string());
  // see test_case.html
  ASSERT_EQ(url.AsString(), "http://a.b.c/test");
  PASS();
}

std::string TestURLUtil::TestGetPluginReferrerURL() {
  pp::Var url = util_->GetPluginReferrerURL(instance_);
  ASSERT_TRUE(url.is_string());
  pp::VarPrivate window = instance_->GetWindowObject();
  pp::Var href = window.GetProperty("location").GetProperty("href");
  ASSERT_TRUE(href.is_string());
  ASSERT_EQ(url.AsString(), href.AsString());
  PASS();
}

