1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/http/http_request_headers.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "base/values.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11namespace net {
12
13namespace {
14
15TEST(HttpRequestHeaders, HasHeader) {
16  HttpRequestHeaders headers;
17  headers.SetHeader("Foo", "bar");
18  EXPECT_TRUE(headers.HasHeader("foo"));
19  EXPECT_TRUE(headers.HasHeader("Foo"));
20  EXPECT_FALSE(headers.HasHeader("Fo"));
21
22  const HttpRequestHeaders& headers_ref = headers;
23  EXPECT_TRUE(headers_ref.HasHeader("foo"));
24  EXPECT_TRUE(headers_ref.HasHeader("Foo"));
25  EXPECT_FALSE(headers_ref.HasHeader("Fo"));
26}
27
28TEST(HttpRequestHeaders, SetHeader) {
29  HttpRequestHeaders headers;
30  headers.SetHeader("Foo", "bar");
31  EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString());
32}
33
34TEST(HttpRequestHeaders, SetMultipleHeaders) {
35  HttpRequestHeaders headers;
36  headers.SetHeader("Cookie-Monster", "Nom nom nom");
37  headers.SetHeader("Domo-Kun", "Loves Chrome");
38  EXPECT_EQ("Cookie-Monster: Nom nom nom\r\nDomo-Kun: Loves Chrome\r\n\r\n",
39            headers.ToString());
40}
41
42TEST(HttpRequestHeaders, SetHeaderTwice) {
43  HttpRequestHeaders headers;
44  headers.SetHeader("Foo", "bar");
45  headers.SetHeader("Foo", "bar");
46  EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString());
47}
48
49TEST(HttpRequestHeaders, SetHeaderTwiceCaseInsensitive) {
50  HttpRequestHeaders headers;
51  headers.SetHeader("Foo", "bar");
52  headers.SetHeader("FoO", "Bar");
53  EXPECT_EQ("Foo: Bar\r\n\r\n", headers.ToString());
54}
55
56TEST(HttpRequestHeaders, SetHeaderTwiceSamePrefix) {
57  HttpRequestHeaders headers;
58  headers.SetHeader("FooBar", "smokes");
59  headers.SetHeader("Foo", "crack");
60  EXPECT_EQ("FooBar: smokes\r\nFoo: crack\r\n\r\n", headers.ToString());
61  const HttpRequestHeaders& headers_ref = headers;
62  EXPECT_EQ("FooBar: smokes\r\nFoo: crack\r\n\r\n", headers_ref.ToString());
63}
64
65TEST(HttpRequestHeaders, SetEmptyHeader) {
66  HttpRequestHeaders headers;
67  headers.SetHeader("Foo", "Bar");
68  headers.SetHeader("Bar", "");
69  EXPECT_EQ("Foo: Bar\r\nBar:\r\n\r\n", headers.ToString());
70}
71
72TEST(HttpRequestHeaders, SetHeaderIfMissing) {
73  HttpRequestHeaders headers;
74  headers.SetHeaderIfMissing("Foo", "Bar");
75  EXPECT_EQ("Foo: Bar\r\n\r\n", headers.ToString());
76  headers.SetHeaderIfMissing("Foo", "Baz");
77  EXPECT_EQ("Foo: Bar\r\n\r\n", headers.ToString());
78}
79
80TEST(HttpRequestHeaders, RemoveHeader) {
81  HttpRequestHeaders headers;
82  headers.SetHeader("Foo", "bar");
83  headers.RemoveHeader("Foo");
84  EXPECT_EQ("\r\n", headers.ToString());
85}
86
87TEST(HttpRequestHeaders, RemoveHeaderMissingHeader) {
88  HttpRequestHeaders headers;
89  headers.SetHeader("Foo", "bar");
90  headers.RemoveHeader("Bar");
91  EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString());
92}
93
94TEST(HttpRequestHeaders, RemoveHeaderCaseInsensitive) {
95  HttpRequestHeaders headers;
96  headers.SetHeader("Foo", "bar");
97  headers.SetHeader("All-Your-Base", "Belongs To Chrome");
98  headers.RemoveHeader("foo");
99  EXPECT_EQ("All-Your-Base: Belongs To Chrome\r\n\r\n", headers.ToString());
100}
101
102TEST(HttpRequestHeaders, AddHeaderFromString) {
103  HttpRequestHeaders headers;
104  headers.AddHeaderFromString("Foo: bar");
105  EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString());
106}
107
108TEST(HttpRequestHeaders, AddHeaderFromStringNoLeadingWhitespace) {
109  HttpRequestHeaders headers;
110  headers.AddHeaderFromString("Foo:bar");
111  EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString());
112}
113
114TEST(HttpRequestHeaders, AddHeaderFromStringMoreLeadingWhitespace) {
115  HttpRequestHeaders headers;
116  headers.AddHeaderFromString("Foo: \t  \t  bar");
117  EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString());
118}
119
120TEST(HttpRequestHeaders, AddHeaderFromStringTrailingWhitespace) {
121  HttpRequestHeaders headers;
122  headers.AddHeaderFromString("Foo: bar  \t  \t   ");
123  EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString());
124}
125
126TEST(HttpRequestHeaders, AddHeaderFromStringLeadingTrailingWhitespace) {
127  HttpRequestHeaders headers;
128  headers.AddHeaderFromString("Foo: \t    bar\t       ");
129  EXPECT_EQ("Foo: bar\r\n\r\n", headers.ToString());
130}
131
132TEST(HttpRequestHeaders, AddHeaderFromStringWithEmptyValue) {
133  HttpRequestHeaders headers;
134  headers.AddHeaderFromString("Foo:");
135  EXPECT_EQ("Foo:\r\n\r\n", headers.ToString());
136}
137
138TEST(HttpRequestHeaders, AddHeaderFromStringWithWhitespaceValue) {
139  HttpRequestHeaders headers;
140  headers.AddHeaderFromString("Foo: ");
141  EXPECT_EQ("Foo:\r\n\r\n", headers.ToString());
142}
143
144TEST(HttpRequestHeaders, MergeFrom) {
145  HttpRequestHeaders headers;
146  headers.SetHeader("A", "A");
147  headers.SetHeader("B", "B");
148
149  HttpRequestHeaders headers2;
150  headers2.SetHeader("B", "b");
151  headers2.SetHeader("C", "c");
152  headers.MergeFrom(headers2);
153  EXPECT_EQ("A: A\r\nB: b\r\nC: c\r\n\r\n", headers.ToString());
154}
155
156TEST(HttpRequestHeaders, CopyFrom) {
157  HttpRequestHeaders headers;
158  headers.SetHeader("A", "A");
159  headers.SetHeader("B", "B");
160
161  HttpRequestHeaders headers2;
162  headers2.SetHeader("B", "b");
163  headers2.SetHeader("C", "c");
164  headers.CopyFrom(headers2);
165  EXPECT_EQ("B: b\r\nC: c\r\n\r\n", headers.ToString());
166}
167
168TEST(HttpRequestHeaders, ToNetLogParamAndBackAgain) {
169  HttpRequestHeaders headers;
170  headers.SetHeader("B", "b");
171  headers.SetHeader("A", "a");
172  std::string request_line("GET /stuff");
173
174  scoped_ptr<base::Value> event_param(
175      headers.NetLogCallback(&request_line, NetLog::LOG_ALL_BUT_BYTES));
176  HttpRequestHeaders headers2;
177  std::string request_line2;
178
179  ASSERT_TRUE(HttpRequestHeaders::FromNetLogParam(event_param.get(),
180                                                  &headers2,
181                                                  &request_line2));
182  EXPECT_EQ(request_line, request_line2);
183  EXPECT_EQ("B: b\r\nA: a\r\n\r\n", headers2.ToString());
184}
185
186}  // namespace
187
188}  // namespace net
189