From 6e58b98b3df3b1852d01445237b1282d9808a79c Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Sun, 9 Feb 2025 10:38:54 +0800 Subject: [PATCH] Startup local HTTP server for testing Change loader tests to use local HTTP server. Add missing test scripts (i.e. storage) to unittest runs. --- src/browser/loader.zig | 12 ++++-- src/unit_tests.zig | 84 +++++++++++++++++++++++++++++------------- 2 files changed, 68 insertions(+), 28 deletions(-) diff --git a/src/browser/loader.zig b/src/browser/loader.zig index 480ec4c1..6df6d9ad 100644 --- a/src/browser/loader.zig +++ b/src/browser/loader.zig @@ -79,13 +79,19 @@ pub const Loader = struct { } }; -test "basic url get" { +test "loader: get" { const alloc = std.testing.allocator; var loader = Loader.init(alloc); defer loader.deinit(); - var result = try loader.get(alloc, "https://en.wikipedia.org/wiki/Main_Page"); + const uri = try std.Uri.parse("http://localhost:9582/loader"); + var result = try loader.get(alloc, uri); defer result.deinit(); - try std.testing.expect(result.req.response.status == std.http.Status.ok); + try std.testing.expectEqual(.ok, result.req.response.status); + + var res: [128]u8 = undefined; + const size = try result.req.readAll(&res); + try std.testing.expectEqual(6, size); + try std.testing.expectEqualStrings("Hello!", res[0..6]); } diff --git a/src/unit_tests.zig b/src/unit_tests.zig index d8c96c2c..52aee5f3 100644 --- a/src/unit_tests.zig +++ b/src/unit_tests.zig @@ -21,6 +21,10 @@ const builtin = @import("builtin"); const Allocator = std.mem.Allocator; +pub const std_options = std.Options{ + .http_disable_tls = true, +}; + const BORDER = "=" ** 80; // use in custom panic handler @@ -43,6 +47,12 @@ pub fn main() !void { var skip: usize = 0; var leak: usize = 0; + const address = try std.net.Address.parseIp("127.0.0.1", 9582); + var listener = try address.listen(.{.reuse_address = true}); + defer listener.deinit(); + const http_thread = try std.Thread.spawn(.{}, serverHTTP, .{&listener}); + defer http_thread.join(); + const printer = Printer.init(); printer.fmt("\r\x1b[0K", .{}); // beginning of line and clear to end of line @@ -314,31 +324,55 @@ fn isTeardown(t: std.builtin.TestFn) bool { return std.mem.endsWith(u8, t.name, "tests:afterAll"); } -test { - const msgTest = @import("msg.zig"); - std.testing.refAllDecls(msgTest); +fn serverHTTP(listener: *std.net.Server) !void { + var read_buffer: [1024]u8 = undefined; + ACCEPT: while (true) { + var conn = try listener.accept(); + defer conn.stream.close(); + var server = std.http.Server.init(conn, &read_buffer); - const dumpTest = @import("browser/dump.zig"); - std.testing.refAllDecls(dumpTest); + while (server.state == .ready) { + var request = server.receiveHead() catch |err| switch (err) { + error.HttpConnectionClosing => continue :ACCEPT, + else => { + std.debug.print("Test HTTP Server error: {}\n", .{err}); + return err; + } + }; - const mimeTest = @import("browser/mime.zig"); - std.testing.refAllDecls(mimeTest); - - const cssTest = @import("css/css.zig"); - std.testing.refAllDecls(cssTest); - - const cssParserTest = @import("css/parser.zig"); - std.testing.refAllDecls(cssParserTest); - - const cssMatchTest = @import("css/match_test.zig"); - std.testing.refAllDecls(cssMatchTest); - - const cssLibdomTest = @import("css/libdom_test.zig"); - std.testing.refAllDecls(cssLibdomTest); - - const queryTest = @import("url/query.zig"); - std.testing.refAllDecls(queryTest); - - std.testing.refAllDecls(@import("generate.zig")); - std.testing.refAllDecls(@import("cdp/msg.zig")); + const path = request.head.target; + if (std.mem.eql(u8, path, "/loader")) { + try writeResponse(&request, .{ + .body = "Hello!", + }); + } + } + } +} + +const Response = struct { + body: []const u8 = "", + status: std.http.Status = .ok, +}; + +fn writeResponse(req: *std.http.Server.Request, res: Response) !void { + try req.respond(res.body, .{ + .status = res.status + }); +} + +test { + std.testing.refAllDecls( @import("url/query.zig")); + std.testing.refAllDecls(@import("browser/dump.zig")); + std.testing.refAllDecls(@import("browser/loader.zig")); + std.testing.refAllDecls(@import("browser/mime.zig")); + std.testing.refAllDecls(@import("cdp/msg.zig")); + std.testing.refAllDecls(@import("css/css.zig")); + std.testing.refAllDecls(@import("css/libdom_test.zig")); + std.testing.refAllDecls(@import("css/match_test.zig")); + std.testing.refAllDecls(@import("css/parser.zig")); + std.testing.refAllDecls(@import("generate.zig")); + std.testing.refAllDecls(@import("http/Client.zig")); + std.testing.refAllDecls(@import("msg.zig")); + std.testing.refAllDecls(@import("storage/storage.zig")); }