1/*
2 *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "webrtc/base/gunit.h"
12#include "webrtc/base/httpcommon-inl.h"
13#include "webrtc/base/httpcommon.h"
14
15namespace rtc {
16
17#define TEST_PROTOCOL "http://"
18#define TEST_HOST "www.google.com"
19#define TEST_PATH "/folder/file.html"
20#define TEST_QUERY "?query=x&attr=y"
21#define TEST_URL TEST_PROTOCOL TEST_HOST TEST_PATH TEST_QUERY
22
23TEST(Url, DecomposesUrls) {
24  Url<char> url(TEST_URL);
25  EXPECT_TRUE(url.valid());
26  EXPECT_FALSE(url.secure());
27  EXPECT_STREQ(TEST_HOST, url.host().c_str());
28  EXPECT_EQ(80, url.port());
29  EXPECT_STREQ(TEST_PATH, url.path().c_str());
30  EXPECT_STREQ(TEST_QUERY, url.query().c_str());
31  EXPECT_STREQ(TEST_HOST, url.address().c_str());
32  EXPECT_STREQ(TEST_PATH TEST_QUERY, url.full_path().c_str());
33  EXPECT_STREQ(TEST_URL, url.url().c_str());
34}
35
36TEST(Url, ComposesUrls) {
37  // Set in constructor
38  Url<char> url(TEST_PATH TEST_QUERY, TEST_HOST, 80);
39  EXPECT_TRUE(url.valid());
40  EXPECT_FALSE(url.secure());
41  EXPECT_STREQ(TEST_HOST, url.host().c_str());
42  EXPECT_EQ(80, url.port());
43  EXPECT_STREQ(TEST_PATH, url.path().c_str());
44  EXPECT_STREQ(TEST_QUERY, url.query().c_str());
45  EXPECT_STREQ(TEST_HOST, url.address().c_str());
46  EXPECT_STREQ(TEST_PATH TEST_QUERY, url.full_path().c_str());
47  EXPECT_STREQ(TEST_URL, url.url().c_str());
48
49  url.clear();
50  EXPECT_FALSE(url.valid());
51  EXPECT_FALSE(url.secure());
52  EXPECT_STREQ("", url.host().c_str());
53  EXPECT_EQ(80, url.port());
54  EXPECT_STREQ("/", url.path().c_str());
55  EXPECT_STREQ("", url.query().c_str());
56
57  // Set component-wise
58  url.set_host(TEST_HOST);
59  url.set_port(80);
60  url.set_path(TEST_PATH);
61  url.set_query(TEST_QUERY);
62  EXPECT_TRUE(url.valid());
63  EXPECT_FALSE(url.secure());
64  EXPECT_STREQ(TEST_HOST, url.host().c_str());
65  EXPECT_EQ(80, url.port());
66  EXPECT_STREQ(TEST_PATH, url.path().c_str());
67  EXPECT_STREQ(TEST_QUERY, url.query().c_str());
68  EXPECT_STREQ(TEST_HOST, url.address().c_str());
69  EXPECT_STREQ(TEST_PATH TEST_QUERY, url.full_path().c_str());
70  EXPECT_STREQ(TEST_URL, url.url().c_str());
71}
72
73TEST(Url, EnsuresNonEmptyPath) {
74  Url<char> url(TEST_PROTOCOL TEST_HOST);
75  EXPECT_TRUE(url.valid());
76  EXPECT_STREQ("/", url.path().c_str());
77
78  url.clear();
79  EXPECT_STREQ("/", url.path().c_str());
80  url.set_path("");
81  EXPECT_STREQ("/", url.path().c_str());
82
83  url.clear();
84  EXPECT_STREQ("/", url.path().c_str());
85  url.set_full_path("");
86  EXPECT_STREQ("/", url.path().c_str());
87}
88
89TEST(Url, GetQueryAttributes) {
90  Url<char> url(TEST_URL);
91  std::string value;
92  EXPECT_TRUE(url.get_attribute("query", &value));
93  EXPECT_STREQ("x", value.c_str());
94  value.clear();
95  EXPECT_TRUE(url.get_attribute("attr", &value));
96  EXPECT_STREQ("y", value.c_str());
97  value.clear();
98  EXPECT_FALSE(url.get_attribute("Query", &value));
99  EXPECT_TRUE(value.empty());
100}
101
102TEST(Url, SkipsUserAndPassword) {
103  Url<char> url("https://mail.google.com:pwd@badsite.com:12345/asdf");
104  EXPECT_TRUE(url.valid());
105  EXPECT_TRUE(url.secure());
106  EXPECT_STREQ("badsite.com", url.host().c_str());
107  EXPECT_EQ(12345, url.port());
108  EXPECT_STREQ("/asdf", url.path().c_str());
109  EXPECT_STREQ("badsite.com:12345", url.address().c_str());
110}
111
112TEST(Url, SkipsUser) {
113  Url<char> url("https://mail.google.com@badsite.com:12345/asdf");
114  EXPECT_TRUE(url.valid());
115  EXPECT_TRUE(url.secure());
116  EXPECT_STREQ("badsite.com", url.host().c_str());
117  EXPECT_EQ(12345, url.port());
118  EXPECT_STREQ("/asdf", url.path().c_str());
119  EXPECT_STREQ("badsite.com:12345", url.address().c_str());
120}
121
122TEST(HttpResponseData, parseLeaderHttp1_0) {
123  static const char kResponseString[] = "HTTP/1.0 200 OK";
124  HttpResponseData response;
125  EXPECT_EQ(HE_NONE, response.parseLeader(kResponseString,
126                                          sizeof(kResponseString) - 1));
127  EXPECT_EQ(HVER_1_0, response.version);
128  EXPECT_EQ(200U, response.scode);
129}
130
131TEST(HttpResponseData, parseLeaderHttp1_1) {
132  static const char kResponseString[] = "HTTP/1.1 200 OK";
133  HttpResponseData response;
134  EXPECT_EQ(HE_NONE, response.parseLeader(kResponseString,
135                                          sizeof(kResponseString) - 1));
136  EXPECT_EQ(HVER_1_1, response.version);
137  EXPECT_EQ(200U, response.scode);
138}
139
140TEST(HttpResponseData, parseLeaderHttpUnknown) {
141  static const char kResponseString[] = "HTTP 200 OK";
142  HttpResponseData response;
143  EXPECT_EQ(HE_NONE, response.parseLeader(kResponseString,
144                                          sizeof(kResponseString) - 1));
145  EXPECT_EQ(HVER_UNKNOWN, response.version);
146  EXPECT_EQ(200U, response.scode);
147}
148
149TEST(HttpResponseData, parseLeaderHttpFailure) {
150  static const char kResponseString[] = "HTTP/1.1 503 Service Unavailable";
151  HttpResponseData response;
152  EXPECT_EQ(HE_NONE, response.parseLeader(kResponseString,
153                                          sizeof(kResponseString) - 1));
154  EXPECT_EQ(HVER_1_1, response.version);
155  EXPECT_EQ(503U, response.scode);
156}
157
158TEST(HttpResponseData, parseLeaderHttpInvalid) {
159  static const char kResponseString[] = "Durrrrr, what's HTTP?";
160  HttpResponseData response;
161  EXPECT_EQ(HE_PROTOCOL, response.parseLeader(kResponseString,
162                                              sizeof(kResponseString) - 1));
163}
164
165} // namespace rtc
166