From e84f6e7efe85a6e74889b606ed56a78ba7fceaad Mon Sep 17 00:00:00 2001 From: Emil Lerch Date: Wed, 25 Oct 2023 09:46:52 -0700 Subject: [PATCH] get standalone server under (failing) test --- src/universal_lambda.zig | 55 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/universal_lambda.zig b/src/universal_lambda.zig index b42af31..f9d8ee5 100644 --- a/src/universal_lambda.zig +++ b/src/universal_lambda.zig @@ -116,3 +116,58 @@ test { // TODO: Do we want build files here too? } + +fn testRequest(request_bytes: []const u8, event_handler: interface.HandlerFn) !void { + const allocator = std.testing.allocator; + var arena = std.heap.ArenaAllocator.init(allocator); + defer arena.deinit(); + + var server = std.http.Server.init(allocator, .{ .reuse_address = true }); + defer server.deinit(); + + const address = try std.net.Address.parseIp("127.0.0.1", 0); + try server.listen(address); + const server_port = server.socket.listen_address.in.getPort(); + + var al = std.ArrayList(u8).init(allocator); + defer al.deinit(); + var writer = al.writer(); + _ = writer; + var aa = arena.allocator(); + var bytes_allocated: usize = 0; + // pre-warm + const server_thread = try std.Thread.spawn( + .{}, + processRequest, + .{ aa, &server, event_handler }, + ); + + const stream = try std.net.tcpConnectToHost(allocator, "127.0.0.1", server_port); + defer stream.close(); + _ = try stream.writeAll(request_bytes[0..]); + + server_thread.join(); + log.debug("Bytes allocated during request: {d}", .{arena.queryCapacity() - bytes_allocated}); + log.debug("Stdout: {s}", .{al.items}); +} + +fn testGet(comptime path: []const u8, event_handler: interface.HandlerFn) !void { + try testRequest("GET " ++ path ++ " HTTP/1.1\r\n" ++ + "Accept: */*\r\n" ++ + "\r\n", event_handler); +} +test "can make a request" { + if (@import("builtin").os.tag == .wasi) return error.SkipZigTest; + const HandlerClosure = struct { + var data_received: []const u8 = undefined; + var context_received: interface.Context = undefined; + const Self = @This(); + pub fn handler(allocator: std.mem.Allocator, event_data: []const u8, context: interface.Context) ![]const u8 { + _ = allocator; + data_received = event_data; + context_received = context; + return "success"; + } + }; + try testGet("/", HandlerClosure.handler); +}