72 lines
2.2 KiB
Zig
72 lines
2.2 KiB
Zig
const std = @import("../std.zig");
|
|
const net = std.net;
|
|
const mem = std.mem;
|
|
const testing = std.testing;
|
|
|
|
test "std.net.parseIp4" {
|
|
assert((try parseIp4("127.0.0.1")) == mem.bigToNative(u32, 0x7f000001));
|
|
|
|
testParseIp4Fail("256.0.0.1", error.Overflow);
|
|
testParseIp4Fail("x.0.0.1", error.InvalidCharacter);
|
|
testParseIp4Fail("127.0.0.1.1", error.InvalidEnd);
|
|
testParseIp4Fail("127.0.0.", error.Incomplete);
|
|
testParseIp4Fail("100..0.1", error.InvalidCharacter);
|
|
}
|
|
|
|
fn testParseIp4Fail(buf: []const u8, expected_err: anyerror) void {
|
|
if (parseIp4(buf)) |_| {
|
|
@panic("expected error");
|
|
} else |e| {
|
|
assert(e == expected_err);
|
|
}
|
|
}
|
|
|
|
test "std.net.parseIp6" {
|
|
const ip6 = try parseIp6("FF01:0:0:0:0:0:0:FB");
|
|
const addr = Address.initIp6(ip6, 80);
|
|
var buf: [100]u8 = undefined;
|
|
const printed = try std.fmt.bufPrint(&buf, "{}", addr);
|
|
std.testing.expect(mem.eql(u8, "[ff01::fb]:80", printed));
|
|
}
|
|
|
|
test "listen on a port, send bytes, receive bytes" {
|
|
if (std.builtin.os != .linux) {
|
|
// TODO build abstractions for other operating systems
|
|
return error.SkipZigTest;
|
|
}
|
|
if (std.io.mode != .evented) {
|
|
// TODO add ability to run tests in non-blocking I/O mode
|
|
return error.SkipZigTest;
|
|
}
|
|
|
|
// TODO doing this at comptime crashed the compiler
|
|
const localhost = net.Address.initIp4(net.parseIp4("127.0.0.1") catch unreachable, 0);
|
|
|
|
var server = net.TcpServer.init(net.TcpServer.Options{});
|
|
defer server.deinit();
|
|
try server.listen(localhost);
|
|
|
|
var server_frame = async testServer(&server);
|
|
var client_frame = async testClient(server.listen_address);
|
|
|
|
try await server_frame;
|
|
try await client_frame;
|
|
}
|
|
|
|
fn testClient(addr: net.Address) anyerror!void {
|
|
const socket_file = try net.tcpConnectToAddress(addr);
|
|
defer socket_file.close();
|
|
|
|
var buf: [100]u8 = undefined;
|
|
const len = try socket_file.read(&buf);
|
|
const msg = buf[0..len];
|
|
testing.expect(mem.eql(u8, msg, "hello from server\n"));
|
|
}
|
|
|
|
fn testServer(server: *net.TcpServer) anyerror!void {
|
|
var client_file = try server.accept();
|
|
|
|
const stream = &client_file.outStream().stream;
|
|
try stream.print("hello from server\n");
|
|
}
|