Skip to content

Commit 61a2f8b

Browse files
authored
Merge pull request #72 from bgreni/integration-test-script
add integration tests
2 parents 32a5dfd + 41a6b95 commit 61a2f8b

File tree

9 files changed

+91
-17
lines changed

9 files changed

+91
-17
lines changed

integration_test_client.mojo

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from lightbug_http import *
2+
from lightbug_http.client import Client
3+
from testing import *
4+
5+
fn u(s: String) raises -> URI:
6+
return URI.parse_raises("http://127.0.0.1:8080/" + s)
7+
8+
struct IntegrationTest:
9+
var client: Client
10+
11+
fn __init__(inout self):
12+
self.client = Client()
13+
14+
fn test_redirect(inout self) raises:
15+
var h = Headers(Header(HeaderKey.CONNECTION, 'keep-alive'))
16+
var res = self.client.do(HTTPRequest(u("redirect"), headers=h))
17+
assert_equal(res.status_code, StatusCode.OK)
18+
assert_equal(to_string(res.body_raw), "yay you made it")
19+
assert_equal(res.headers[HeaderKey.CONNECTION], "keep-alive")
20+
21+
fn test_close_connection(inout self) raises:
22+
var h = Headers(Header(HeaderKey.CONNECTION, 'close'))
23+
var res = self.client.do(HTTPRequest(u("close-connection"), headers=h))
24+
assert_equal(res.status_code, StatusCode.OK)
25+
assert_equal(to_string(res.body_raw), "connection closed")
26+
assert_equal(res.headers[HeaderKey.CONNECTION], "close")
27+
28+
fn run_tests(inout self) raises:
29+
self.test_redirect()
30+
self.test_close_connection()
31+
32+
fn main() raises:
33+
var test = IntegrationTest()
34+
test.run_tests()

integration_test_server.mojo

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from lightbug_http import *
2+
3+
@value
4+
struct IntegerationTestService(HTTPService):
5+
fn func(self, req: HTTPRequest) raises -> HTTPResponse:
6+
var p = req.uri.path
7+
if p == "/redirect":
8+
return HTTPResponse(
9+
"get off my lawn".as_bytes_slice(),
10+
headers=Headers(
11+
Header(HeaderKey.LOCATION, "/rd-destination")
12+
),
13+
status_code=StatusCode.PERMANENT_REDIRECT
14+
)
15+
elif p == "/rd-destination":
16+
return OK("yay you made it")
17+
elif p == "/close-connection":
18+
return OK("connection closed")
19+
20+
return NotFound("wrong")
21+
22+
fn main() raises:
23+
var server = Server(tcp_keep_alive=True)
24+
server.listen_and_serve("127.0.0.1:8080", IntegerationTestService())
25+

lightbug_http/__init__.mojo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from lightbug_http.http import HTTPRequest, HTTPResponse, OK, NotFound
1+
from lightbug_http.http import HTTPRequest, HTTPResponse, OK, NotFound, StatusCode
22
from lightbug_http.uri import URI
33
from lightbug_http.header import Header, Headers, HeaderKey
44
from lightbug_http.cookie import Cookie, RequestCookieJar, ResponseCookieJar

lightbug_http/client.mojo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ struct Client:
2525

2626
var _connections: Dict[String, SysConnection]
2727

28-
fn __init__(inout self) raises:
28+
fn __init__(inout self):
2929
self.host = "127.0.0.1"
3030
self.port = 8888
3131
self.name = "lightbug_http_client"
3232
self._connections = Dict[String, SysConnection]()
3333

34-
fn __init__(inout self, host: StringLiteral, port: Int) raises:
34+
fn __init__(inout self, host: StringLiteral, port: Int):
3535
self.host = host
3636
self.port = port
3737
self.name = "lightbug_http_client"

lightbug_http/http/request.mojo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ struct HTTPRequest(Formattable, Stringable):
8585
self.timeout = timeout
8686
self.set_content_length(len(body))
8787
if HeaderKey.CONNECTION not in self.headers:
88-
self.set_connection_close()
88+
self.headers[HeaderKey.CONNECTION] = "keep-alive"
8989
if HeaderKey.HOST not in self.headers:
9090
self.headers[HeaderKey.HOST] = uri.host
9191

lightbug_http/net.mojo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ struct NoTLSListener:
134134
_ = shutdown(self.fd, SHUT_RDWR)
135135
var close_status = close(self.fd)
136136
if close_status == -1:
137-
print("Failed to close new_sockfd")
137+
print("Failed to close listener")
138138

139139
fn addr(self) -> TCPAddr:
140140
return self.__addr
@@ -260,7 +260,7 @@ struct SysConnection(Connection):
260260
_ = shutdown(self.fd, SHUT_RDWR)
261261
var close_status = close(self.fd)
262262
if close_status == -1:
263-
print("Failed to close new_sockfd")
263+
print("Failed to close connection")
264264

265265
fn local_addr(inout self) raises -> TCPAddr:
266266
return self.laddr

lightbug_http/server.mojo

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,6 @@ struct Server:
160160
Raises:
161161
If there is an error while serving the connection.
162162
"""
163-
# var b = Bytes(capacity=default_buffer_size)
164-
# var bytes_recv = conn.read(b)
165-
# if bytes_recv == 0:
166-
# conn.close()
167-
# return
168-
169163
var max_request_body_size = self.max_request_body_size()
170164
if max_request_body_size <= 0:
171165
max_request_body_size = default_max_request_body_size
@@ -185,11 +179,12 @@ struct Server:
185179

186180
var res = handler.func(request)
187181

188-
if not self.tcp_keep_alive:
189-
_ = res.set_connection_close()
182+
var close_connection = (not self.tcp_keep_alive) or request.connection_close()
183+
184+
if close_connection:
185+
res.set_connection_close()
190186

191-
_ = conn.write(encode(res^))
187+
var written = conn.write(encode(res^))
192188

193-
if not self.tcp_keep_alive:
189+
if close_connection or written == -1:
194190
conn.close()
195-
return

mojoproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ version = "0.1.5"
1010
build = { cmd = "rattler-build build --recipe recipes -c https://conda.modular.com/max -c conda-forge --skip-existing=all", env = {MODULAR_MOJO_IMPORT_PATH = "$CONDA_PREFIX/lib/mojo"} }
1111
publish = { cmd = "bash scripts/publish.sh", env = { PREFIX_API_KEY = "$PREFIX_API_KEY" } }
1212
test = { cmd = "magic run mojo test -I . tests" }
13+
integration_test = { cmd = "bash scripts/integration_test.sh" }
1314
bench = { cmd = "magic run mojo bench.mojo" }
1415
bench_server = { cmd = "bash scripts/bench_server.sh" }
1516
format = { cmd = "magic run mojo format -l 120 lightbug_http" }

scripts/integration_test.sh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/bin/bash
2+
3+
4+
(magic run mojo build integration_test_server.mojo) || exit 1
5+
(magic run mojo build integration_test_client.mojo) || exit 1
6+
7+
echo "starting server..."
8+
./integration_test_server &
9+
10+
sleep 5
11+
12+
echo "starting test suite"
13+
./integration_test_client
14+
15+
kill $!
16+
wait $! 2>/dev/null
17+
echo "cleaning up binaries"
18+
rm ./integration_test_server
19+
rm ./integration_test_client

0 commit comments

Comments
 (0)