blob: 8de2bc6474f4bf782e3c17a67f900796ec567ada [file] [log] [blame]
Brian Silverman8fce7482020-01-05 13:18:21 -08001/*----------------------------------------------------------------------------*/
2/* Copyright (c) 2018 FIRST. All Rights Reserved. */
3/* Open Source Software - may be modified and shared by FRC teams. The code */
4/* must be accompanied by the FIRST BSD license file in the root directory of */
5/* the project. */
6/*----------------------------------------------------------------------------*/
7
8#include "wpi/HttpParser.h" // NOLINT(build/include_order)
9
10#include "gtest/gtest.h"
11
12namespace wpi {
13
14TEST(HttpParserTest, UrlMethodHeadersComplete) {
15 HttpParser p{HttpParser::kRequest};
16 int callbacks = 0;
17 p.url.connect([&](StringRef path) {
18 ASSERT_EQ(path, "/foo/bar");
19 ASSERT_EQ(p.GetUrl(), "/foo/bar");
20 ++callbacks;
21 });
22 p.Execute("GET /foo");
23 p.Execute("/bar");
24 ASSERT_EQ(callbacks, 0);
25 p.Execute(" HTTP/1.1\r\n\r\n");
26 ASSERT_EQ(callbacks, 1);
27 ASSERT_EQ(p.GetUrl(), "/foo/bar");
28 ASSERT_EQ(p.GetMethod(), HTTP_GET);
29 ASSERT_FALSE(p.HasError());
30}
31
32TEST(HttpParserTest, UrlMethodHeader) {
33 HttpParser p{HttpParser::kRequest};
34 int callbacks = 0;
35 p.url.connect([&](StringRef path) {
36 ASSERT_EQ(path, "/foo/bar");
37 ASSERT_EQ(p.GetUrl(), "/foo/bar");
38 ++callbacks;
39 });
40 p.Execute("GET /foo");
41 p.Execute("/bar");
42 ASSERT_EQ(callbacks, 0);
43 p.Execute(" HTTP/1.1\r\n");
44 ASSERT_EQ(callbacks, 0);
45 p.Execute("F");
46 ASSERT_EQ(callbacks, 1);
47 ASSERT_EQ(p.GetUrl(), "/foo/bar");
48 ASSERT_EQ(p.GetMethod(), HTTP_GET);
49 ASSERT_FALSE(p.HasError());
50}
51
52TEST(HttpParserTest, StatusHeadersComplete) {
53 HttpParser p{HttpParser::kResponse};
54 int callbacks = 0;
55 p.status.connect([&](StringRef status) {
56 ASSERT_EQ(status, "OK");
57 ASSERT_EQ(p.GetStatusCode(), 200u);
58 ++callbacks;
59 });
60 p.Execute("HTTP/1.1 200");
61 p.Execute(" OK");
62 ASSERT_EQ(callbacks, 0);
63 p.Execute("\r\n\r\n");
64 ASSERT_EQ(callbacks, 1);
65 ASSERT_EQ(p.GetStatusCode(), 200u);
66 ASSERT_FALSE(p.HasError());
67}
68
69TEST(HttpParserTest, StatusHeader) {
70 HttpParser p{HttpParser::kResponse};
71 int callbacks = 0;
72 p.status.connect([&](StringRef status) {
73 ASSERT_EQ(status, "OK");
74 ASSERT_EQ(p.GetStatusCode(), 200u);
75 ++callbacks;
76 });
77 p.Execute("HTTP/1.1 200");
78 p.Execute(" OK\r\n");
79 ASSERT_EQ(callbacks, 0);
80 p.Execute("F");
81 ASSERT_EQ(callbacks, 1);
82 ASSERT_EQ(p.GetStatusCode(), 200u);
83 ASSERT_FALSE(p.HasError());
84}
85
86TEST(HttpParserTest, HeaderFieldComplete) {
87 HttpParser p{HttpParser::kRequest};
88 int callbacks = 0;
89 p.header.connect([&](StringRef name, StringRef value) {
90 ASSERT_EQ(name, "Foo");
91 ASSERT_EQ(value, "Bar");
92 ++callbacks;
93 });
94 p.Execute("GET / HTTP/1.1\r\n");
95 ASSERT_EQ(callbacks, 0);
96 p.Execute("Fo");
97 ASSERT_EQ(callbacks, 0);
98 p.Execute("o: ");
99 ASSERT_EQ(callbacks, 0);
100 p.Execute("Bar");
101 ASSERT_EQ(callbacks, 0);
102 p.Execute("\r\n");
103 ASSERT_EQ(callbacks, 0);
104 p.Execute("\r\n");
105 ASSERT_EQ(callbacks, 1);
106 ASSERT_FALSE(p.HasError());
107}
108
109TEST(HttpParserTest, HeaderFieldNext) {
110 HttpParser p{HttpParser::kRequest};
111 int callbacks = 0;
112 p.header.connect([&](StringRef name, StringRef value) {
113 ASSERT_EQ(name, "Foo");
114 ASSERT_EQ(value, "Bar");
115 ++callbacks;
116 });
117 p.Execute("GET / HTTP/1.1\r\n");
118 ASSERT_EQ(callbacks, 0);
119 p.Execute("Fo");
120 ASSERT_EQ(callbacks, 0);
121 p.Execute("o: ");
122 ASSERT_EQ(callbacks, 0);
123 p.Execute("Bar");
124 ASSERT_EQ(callbacks, 0);
125 p.Execute("\r\n");
126 ASSERT_EQ(callbacks, 0);
127 p.Execute("F");
128 ASSERT_EQ(callbacks, 1);
129 ASSERT_FALSE(p.HasError());
130}
131
132TEST(HttpParserTest, HeadersComplete) {
133 HttpParser p{HttpParser::kRequest};
134 int callbacks = 0;
135 p.headersComplete.connect([&](bool keepAlive) {
136 ASSERT_EQ(keepAlive, false);
137 ++callbacks;
138 });
139 p.Execute("GET / HTTP/1.0\r\n");
140 ASSERT_EQ(callbacks, 0);
141 p.Execute("\r\n");
142 ASSERT_EQ(callbacks, 1);
143 ASSERT_FALSE(p.HasError());
144}
145
146TEST(HttpParserTest, HeadersCompleteHTTP11) {
147 HttpParser p{HttpParser::kRequest};
148 int callbacks = 0;
149 p.headersComplete.connect([&](bool keepAlive) {
150 ASSERT_EQ(keepAlive, true);
151 ++callbacks;
152 });
153 p.Execute("GET / HTTP/1.1\r\n");
154 ASSERT_EQ(callbacks, 0);
155 p.Execute("\r\n");
156 ASSERT_EQ(callbacks, 1);
157 ASSERT_FALSE(p.HasError());
158}
159
160TEST(HttpParserTest, HeadersCompleteKeepAlive) {
161 HttpParser p{HttpParser::kRequest};
162 int callbacks = 0;
163 p.headersComplete.connect([&](bool keepAlive) {
164 ASSERT_EQ(keepAlive, true);
165 ++callbacks;
166 });
167 p.Execute("GET / HTTP/1.0\r\n");
168 ASSERT_EQ(callbacks, 0);
169 p.Execute("Connection: Keep-Alive\r\n");
170 ASSERT_EQ(callbacks, 0);
171 p.Execute("\r\n");
172 ASSERT_EQ(callbacks, 1);
173 ASSERT_FALSE(p.HasError());
174}
175
176TEST(HttpParserTest, HeadersCompleteUpgrade) {
177 HttpParser p{HttpParser::kRequest};
178 int callbacks = 0;
179 p.headersComplete.connect([&](bool) {
180 ASSERT_TRUE(p.IsUpgrade());
181 ++callbacks;
182 });
183 p.Execute("GET / HTTP/1.0\r\n");
184 ASSERT_EQ(callbacks, 0);
185 p.Execute("Connection: Upgrade\r\n");
186 p.Execute("Upgrade: websocket\r\n");
187 ASSERT_EQ(callbacks, 0);
188 p.Execute("\r\n");
189 ASSERT_EQ(callbacks, 1);
190 ASSERT_FALSE(p.HasError());
191}
192
193TEST(HttpParserTest, Reset) {
194 HttpParser p{HttpParser::kRequest};
195 int callbacks = 0;
196 p.headersComplete.connect([&](bool) { ++callbacks; });
197 p.Execute("GET / HTTP/1.1\r\n");
198 ASSERT_EQ(callbacks, 0);
199 p.Execute("\r\n");
200 ASSERT_EQ(callbacks, 1);
201 p.Reset(HttpParser::kRequest);
202 p.Execute("GET / HTTP/1.1\r\n");
203 ASSERT_EQ(callbacks, 1);
204 p.Execute("\r\n");
205 ASSERT_EQ(callbacks, 2);
206 ASSERT_FALSE(p.HasError());
207}
208
209} // namespace wpi