/*
 * libjingle
 * Copyright 2004--2011, Google Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright notice,
 *     this list of conditions and the following disclaimer in the documentation
 *     and/or other materials provided with the distribution.
 *  3. The name of the author may not be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "talk/base/gunit.h"
#include "talk/base/httpcommon-inl.h"
#include "talk/base/httpcommon.h"

namespace talk_base {

#define TEST_PROTOCOL "http://"
#define TEST_HOST "www.google.com"
#define TEST_PATH "/folder/file.html"
#define TEST_QUERY "?query=x&attr=y"
#define TEST_URL TEST_PROTOCOL TEST_HOST TEST_PATH TEST_QUERY

TEST(Url, DecomposesUrls) {
  Url<char> url(TEST_URL);
  EXPECT_TRUE(url.valid());
  EXPECT_FALSE(url.secure());
  EXPECT_STREQ(TEST_HOST, url.host().c_str());
  EXPECT_EQ(80, url.port());
  EXPECT_STREQ(TEST_PATH, url.path().c_str());
  EXPECT_STREQ(TEST_QUERY, url.query().c_str());
  EXPECT_STREQ(TEST_HOST, url.address().c_str());
  EXPECT_STREQ(TEST_PATH TEST_QUERY, url.full_path().c_str());
  EXPECT_STREQ(TEST_URL, url.url().c_str());
}

TEST(Url, ComposesUrls) {
  // Set in constructor
  Url<char> url(TEST_PATH TEST_QUERY, TEST_HOST, 80);
  EXPECT_TRUE(url.valid());
  EXPECT_FALSE(url.secure());
  EXPECT_STREQ(TEST_HOST, url.host().c_str());
  EXPECT_EQ(80, url.port());
  EXPECT_STREQ(TEST_PATH, url.path().c_str());
  EXPECT_STREQ(TEST_QUERY, url.query().c_str());
  EXPECT_STREQ(TEST_HOST, url.address().c_str());
  EXPECT_STREQ(TEST_PATH TEST_QUERY, url.full_path().c_str());
  EXPECT_STREQ(TEST_URL, url.url().c_str());

  url.clear();
  EXPECT_FALSE(url.valid());
  EXPECT_FALSE(url.secure());
  EXPECT_STREQ("", url.host().c_str());
  EXPECT_EQ(80, url.port());
  EXPECT_STREQ("/", url.path().c_str());
  EXPECT_STREQ("", url.query().c_str());

  // Set component-wise
  url.set_host(TEST_HOST);
  url.set_port(80);
  url.set_path(TEST_PATH);
  url.set_query(TEST_QUERY);
  EXPECT_TRUE(url.valid());
  EXPECT_FALSE(url.secure());
  EXPECT_STREQ(TEST_HOST, url.host().c_str());
  EXPECT_EQ(80, url.port());
  EXPECT_STREQ(TEST_PATH, url.path().c_str());
  EXPECT_STREQ(TEST_QUERY, url.query().c_str());
  EXPECT_STREQ(TEST_HOST, url.address().c_str());
  EXPECT_STREQ(TEST_PATH TEST_QUERY, url.full_path().c_str());
  EXPECT_STREQ(TEST_URL, url.url().c_str());
}

TEST(Url, EnsuresNonEmptyPath) {
  Url<char> url(TEST_PROTOCOL TEST_HOST);
  EXPECT_TRUE(url.valid());
  EXPECT_STREQ("/", url.path().c_str());
  
  url.clear();
  EXPECT_STREQ("/", url.path().c_str());
  url.set_path("");
  EXPECT_STREQ("/", url.path().c_str());

  url.clear();
  EXPECT_STREQ("/", url.path().c_str());
  url.set_full_path("");
  EXPECT_STREQ("/", url.path().c_str());
}

TEST(Url, GetQueryAttributes) {
  Url<char> url(TEST_URL);
  std::string value;
  EXPECT_TRUE(url.get_attribute("query", &value));
  EXPECT_STREQ("x", value.c_str());
  value.clear();
  EXPECT_TRUE(url.get_attribute("attr", &value));
  EXPECT_STREQ("y", value.c_str());
  value.clear();
  EXPECT_FALSE(url.get_attribute("Query", &value));
  EXPECT_TRUE(value.empty());
}

TEST(HttpResponseData, parseLeaderHttp1_0) {
  static const char kResponseString[] = "HTTP/1.0 200 OK";
  HttpResponseData response;
  EXPECT_EQ(HE_NONE, response.parseLeader(kResponseString,
                                          sizeof(kResponseString) - 1));
  EXPECT_EQ(HVER_1_0, response.version);
  EXPECT_EQ(200U, response.scode);
}

TEST(HttpResponseData, parseLeaderHttp1_1) {
  static const char kResponseString[] = "HTTP/1.1 200 OK";
  HttpResponseData response;
  EXPECT_EQ(HE_NONE, response.parseLeader(kResponseString,
                                          sizeof(kResponseString) - 1));
  EXPECT_EQ(HVER_1_1, response.version);
  EXPECT_EQ(200U, response.scode);
}

TEST(HttpResponseData, parseLeaderHttpUnknown) {
  static const char kResponseString[] = "HTTP 200 OK";
  HttpResponseData response;
  EXPECT_EQ(HE_NONE, response.parseLeader(kResponseString,
                                          sizeof(kResponseString) - 1));
  EXPECT_EQ(HVER_UNKNOWN, response.version);
  EXPECT_EQ(200U, response.scode);
}

TEST(HttpResponseData, parseLeaderHttpFailure) {
  static const char kResponseString[] = "HTTP/1.1 503 Service Unavailable";
  HttpResponseData response;
  EXPECT_EQ(HE_NONE, response.parseLeader(kResponseString,
                                          sizeof(kResponseString) - 1));
  EXPECT_EQ(HVER_1_1, response.version);
  EXPECT_EQ(503U, response.scode);
}

TEST(HttpResponseData, parseLeaderHttpInvalid) {
  static const char kResponseString[] = "Durrrrr, what's HTTP?";
  HttpResponseData response;
  EXPECT_EQ(HE_PROTOCOL, response.parseLeader(kResponseString,
                                              sizeof(kResponseString) - 1));
}

} // namespace talk_base
