// Copyright 2013 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_basic_state.h"

#include "base/memory/ptr_util.h"
#include "net/base/request_priority.h"
#include "net/http/http_request_info.h"
#include "net/log/net_log_with_source.h"
#include "net/socket/client_socket_handle.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace net {
namespace {

TEST(HttpBasicStateTest, ConstructsProperly) {
  ClientSocketHandle* const handle = new ClientSocketHandle;
  // Ownership of |handle| is passed to |state|.
  const HttpBasicState state(base::WrapUnique(handle), true /* using_proxy */,
                             false /* http_09_on_non_default_ports_enabled */);
  EXPECT_EQ(handle, state.connection());
  EXPECT_TRUE(state.using_proxy());
  EXPECT_FALSE(state.http_09_on_non_default_ports_enabled());
}

TEST(HttpBasicStateTest, ConstructsProperlyWithDifferentOptions) {
  const HttpBasicState state(std::make_unique<ClientSocketHandle>(),
                             false /* using_proxy */,
                             true /* http_09_on_non_default_ports_enabled */);
  EXPECT_FALSE(state.using_proxy());
  EXPECT_TRUE(state.http_09_on_non_default_ports_enabled());
}

TEST(HttpBasicStateTest, ReleaseConnectionWorks) {
  ClientSocketHandle* const handle = new ClientSocketHandle;
  // Ownership of |handle| is passed to |state|.
  HttpBasicState state(base::WrapUnique(handle), false, false);
  const std::unique_ptr<ClientSocketHandle> released_connection(
      state.ReleaseConnection());
  EXPECT_EQ(NULL, state.connection());
  EXPECT_EQ(handle, released_connection.get());
}

TEST(HttpBasicStateTest, InitializeWorks) {
  HttpBasicState state(std::make_unique<ClientSocketHandle>(), false, false);
  const HttpRequestInfo request_info;
  state.Initialize(&request_info, LOW, NetLogWithSource());
  EXPECT_TRUE(state.parser());
}

TEST(HttpBasicStateTest, TrafficAnnotationStored) {
  HttpBasicState state(std::make_unique<ClientSocketHandle>(), false, false);
  HttpRequestInfo request_info;
  request_info.traffic_annotation =
      MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS);
  state.Initialize(&request_info, LOW, NetLogWithSource());
  EXPECT_EQ(TRAFFIC_ANNOTATION_FOR_TESTS,
            NetworkTrafficAnnotationTag(state.traffic_annotation()));
}

TEST(HttpBasicStateTest, DeleteParser) {
  HttpBasicState state(std::make_unique<ClientSocketHandle>(), false, false);
  const HttpRequestInfo request_info;
  state.Initialize(&request_info, LOW, NetLogWithSource());
  EXPECT_TRUE(state.parser());
  state.DeleteParser();
  EXPECT_EQ(NULL, state.parser());
}

TEST(HttpBasicStateTest, GenerateRequestLineNoProxy) {
  const bool use_proxy = false;
  HttpBasicState state(std::make_unique<ClientSocketHandle>(), use_proxy,
                       false);
  HttpRequestInfo request_info;
  request_info.url = GURL("http://www.example.com/path?foo=bar#hoge");
  request_info.method = "PUT";
  state.Initialize(&request_info, LOW, NetLogWithSource());
  EXPECT_EQ("PUT /path?foo=bar HTTP/1.1\r\n", state.GenerateRequestLine());
}

TEST(HttpBasicStateTest, GenerateRequestLineWithProxy) {
  const bool use_proxy = true;
  HttpBasicState state(std::make_unique<ClientSocketHandle>(), use_proxy,
                       false);
  HttpRequestInfo request_info;
  request_info.url = GURL("http://www.example.com/path?foo=bar#hoge");
  request_info.method = "PUT";
  state.Initialize(&request_info, LOW, NetLogWithSource());
  EXPECT_EQ("PUT http://www.example.com/path?foo=bar HTTP/1.1\r\n",
            state.GenerateRequestLine());
}

}  // namespace
}  // namespace net
