// Copyright (c) 2012 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/third_party/quiche/src/quic/tools/quic_url.h"

#include <string>

#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"

namespace quic {
namespace test {
namespace {

class QuicUrlTest : public QuicTest {};

TEST_F(QuicUrlTest, Basic) {
  // No scheme specified.
  std::string url_str = "www.example.com";
  QuicUrl url(url_str);
  EXPECT_FALSE(url.IsValid());

  // scheme is HTTP.
  url_str = "http://www.example.com";
  url = QuicUrl(url_str);
  EXPECT_TRUE(url.IsValid());
  EXPECT_EQ("http://www.example.com/", url.ToString());
  EXPECT_EQ("http", url.scheme());
  EXPECT_EQ("www.example.com", url.HostPort());
  EXPECT_EQ("/", url.PathParamsQuery());
  EXPECT_EQ(80u, url.port());

  // scheme is HTTPS.
  url_str = "https://www.example.com:12345/path/to/resource?a=1&campaign=2";
  url = QuicUrl(url_str);
  EXPECT_TRUE(url.IsValid());
  EXPECT_EQ("https://www.example.com:12345/path/to/resource?a=1&campaign=2",
            url.ToString());
  EXPECT_EQ("https", url.scheme());
  EXPECT_EQ("www.example.com:12345", url.HostPort());
  EXPECT_EQ("/path/to/resource?a=1&campaign=2", url.PathParamsQuery());
  EXPECT_EQ(12345u, url.port());

  // scheme is FTP.
  url_str = "ftp://www.example.com";
  url = QuicUrl(url_str);
  EXPECT_TRUE(url.IsValid());
  EXPECT_EQ("ftp://www.example.com/", url.ToString());
  EXPECT_EQ("ftp", url.scheme());
  EXPECT_EQ("www.example.com", url.HostPort());
  EXPECT_EQ("/", url.PathParamsQuery());
  EXPECT_EQ(21u, url.port());
}

TEST_F(QuicUrlTest, DefaultScheme) {
  // Default scheme to HTTP.
  std::string url_str = "www.example.com";
  QuicUrl url(url_str, "http");
  EXPECT_EQ("http://www.example.com/", url.ToString());
  EXPECT_EQ("http", url.scheme());

  // URL already has a scheme specified.
  url_str = "http://www.example.com";
  url = QuicUrl(url_str, "https");
  EXPECT_EQ("http://www.example.com/", url.ToString());
  EXPECT_EQ("http", url.scheme());

  // Default scheme to FTP.
  url_str = "www.example.com";
  url = QuicUrl(url_str, "ftp");
  EXPECT_EQ("ftp://www.example.com/", url.ToString());
  EXPECT_EQ("ftp", url.scheme());
}

TEST_F(QuicUrlTest, IsValid) {
  std::string url_str =
      "ftp://www.example.com:12345/path/to/resource?a=1&campaign=2";
  EXPECT_TRUE(QuicUrl(url_str).IsValid());

  // Invalid characters in host name.
  url_str = "https://www%.example.com:12345/path/to/resource?a=1&campaign=2";
  EXPECT_FALSE(QuicUrl(url_str).IsValid());

  // Invalid characters in scheme.
  url_str = "%http://www.example.com:12345/path/to/resource?a=1&campaign=2";
  EXPECT_FALSE(QuicUrl(url_str).IsValid());

  // Host name too long.
  std::string host(1024, 'a');
  url_str = "https://" + host;
  EXPECT_FALSE(QuicUrl(url_str).IsValid());

  // Invalid port number.
  url_str = "https://www..example.com:123456/path/to/resource?a=1&campaign=2";
  EXPECT_FALSE(QuicUrl(url_str).IsValid());
}

TEST_F(QuicUrlTest, HostPort) {
  std::string url_str = "http://www.example.com/";
  QuicUrl url(url_str);
  EXPECT_EQ("www.example.com", url.HostPort());
  EXPECT_EQ("www.example.com", url.host());
  EXPECT_EQ(80u, url.port());

  url_str = "http://www.example.com:80/";
  url = QuicUrl(url_str);
  EXPECT_EQ("www.example.com", url.HostPort());
  EXPECT_EQ("www.example.com", url.host());
  EXPECT_EQ(80u, url.port());

  url_str = "http://www.example.com:81/";
  url = QuicUrl(url_str);
  EXPECT_EQ("www.example.com:81", url.HostPort());
  EXPECT_EQ("www.example.com", url.host());
  EXPECT_EQ(81u, url.port());

  url_str = "https://192.168.1.1:443/";
  url = QuicUrl(url_str);
  EXPECT_EQ("192.168.1.1", url.HostPort());
  EXPECT_EQ("192.168.1.1", url.host());
  EXPECT_EQ(443u, url.port());

  url_str = "http://[2001::1]:80/";
  url = QuicUrl(url_str);
  EXPECT_EQ("[2001::1]", url.HostPort());
  EXPECT_EQ("2001::1", url.host());
  EXPECT_EQ(80u, url.port());

  url_str = "http://[2001::1]:81/";
  url = QuicUrl(url_str);
  EXPECT_EQ("[2001::1]:81", url.HostPort());
  EXPECT_EQ("2001::1", url.host());
  EXPECT_EQ(81u, url.port());
}

TEST_F(QuicUrlTest, PathParamsQuery) {
  std::string url_str =
      "https://www.example.com:12345/path/to/resource?a=1&campaign=2";
  QuicUrl url(url_str);
  EXPECT_EQ("/path/to/resource?a=1&campaign=2", url.PathParamsQuery());
  EXPECT_EQ("/path/to/resource", url.path());

  url_str = "https://www.example.com/?";
  url = QuicUrl(url_str);
  EXPECT_EQ("/?", url.PathParamsQuery());
  EXPECT_EQ("/", url.path());

  url_str = "https://www.example.com/";
  url = QuicUrl(url_str);
  EXPECT_EQ("/", url.PathParamsQuery());
  EXPECT_EQ("/", url.path());
}

}  // namespace
}  // namespace test
}  // namespace quic
