| ... | @@ -1990,53 +1990,15 @@ test "accept/connect/send/recv" { | ... | @@ -1990,53 +1990,15 @@ test "accept/connect/send/recv" { |
| 1990 | }; | 1990 | }; |
| 1991 | defer ring.deinit(); | 1991 | defer ring.deinit(); |
| 1992 | | 1992 | |
| 1993 | const address = try net.Address.parseIp4("127.0.0.1", 3131); | 1993 | const socket_test_harness = try createSocketTestHarness(&ring); |
| 1994 | const kernel_backlog = 1; | 1994 | defer socket_test_harness.close(); |
| 1995 | const server = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); | | |
| 1996 | defer os.close(server); | | |
| 1997 | try os.setsockopt(server, os.SOL.SOCKET, os.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1))); | | |
| 1998 | try os.bind(server, &address.any, address.getOsSockLen()); | | |
| 1999 | try os.listen(server, kernel_backlog); | | |
| 2000 | | 1995 | |
| 2001 | const buffer_send = [_]u8{ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }; | 1996 | const buffer_send = [_]u8{ 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 }; |
| 2002 | var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 }; | 1997 | var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 }; |
| 2003 | | 1998 | |
| 2004 | var accept_addr: os.sockaddr = undefined; | 1999 | const send = try ring.send(0xeeeeeeee, socket_test_harness.client, buffer_send[0..], 0); |
| 2005 | var accept_addr_len: os.socklen_t = @sizeOf(@TypeOf(accept_addr)); | | |
| 2006 | _ = try ring.accept(0xaaaaaaaa, server, &accept_addr, &accept_addr_len, 0); | | |
| 2007 | try testing.expectEqual(@as(u32, 1), try ring.submit()); | | |
| 2008 | | | |
| 2009 | const client = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); | | |
| 2010 | defer os.close(client); | | |
| 2011 | _ = try ring.connect(0xcccccccc, client, &address.any, address.getOsSockLen()); | | |
| 2012 | try testing.expectEqual(@as(u32, 1), try ring.submit()); | | |
| 2013 | | | |
| 2014 | var cqe_accept = try ring.copy_cqe(); | | |
| 2015 | if (cqe_accept.err() == .INVAL) return error.SkipZigTest; | | |
| 2016 | var cqe_connect = try ring.copy_cqe(); | | |
| 2017 | if (cqe_connect.err() == .INVAL) return error.SkipZigTest; | | |
| 2018 | | | |
| 2019 | // The accept/connect CQEs may arrive in any order, the connect CQE will sometimes come first: | | |
| 2020 | if (cqe_accept.user_data == 0xcccccccc and cqe_connect.user_data == 0xaaaaaaaa) { | | |
| 2021 | const a = cqe_accept; | | |
| 2022 | const b = cqe_connect; | | |
| 2023 | cqe_accept = b; | | |
| 2024 | cqe_connect = a; | | |
| 2025 | } | | |
| 2026 | | | |
| 2027 | try testing.expectEqual(@as(u64, 0xaaaaaaaa), cqe_accept.user_data); | | |
| 2028 | if (cqe_accept.res <= 0) std.debug.print("\ncqe_accept.res={}\n", .{cqe_accept.res}); | | |
| 2029 | try testing.expect(cqe_accept.res > 0); | | |
| 2030 | try testing.expectEqual(@as(u32, 0), cqe_accept.flags); | | |
| 2031 | try testing.expectEqual(linux.io_uring_cqe{ | | |
| 2032 | .user_data = 0xcccccccc, | | |
| 2033 | .res = 0, | | |
| 2034 | .flags = 0, | | |
| 2035 | }, cqe_connect); | | |
| 2036 | | | |
| 2037 | const send = try ring.send(0xeeeeeeee, client, buffer_send[0..], 0); | | |
| 2038 | send.flags |= linux.IOSQE_IO_LINK; | 2000 | send.flags |= linux.IOSQE_IO_LINK; |
| 2039 | _ = try ring.recv(0xffffffff, cqe_accept.res, .{ .buffer = buffer_recv[0..] }, 0); | 2001 | _ = try ring.recv(0xffffffff, socket_test_harness.server, .{ .buffer = buffer_recv[0..] }, 0); |
| 2040 | try testing.expectEqual(@as(u32, 2), try ring.submit()); | 2002 | try testing.expectEqual(@as(u32, 2), try ring.submit()); |
| 2041 | | 2003 | |
| 2042 | const cqe_send = try ring.copy_cqe(); | 2004 | const cqe_send = try ring.copy_cqe(); |
| ... | @@ -2261,50 +2223,12 @@ test "accept/connect/recv/link_timeout" { | ... | @@ -2261,50 +2223,12 @@ test "accept/connect/recv/link_timeout" { |
| 2261 | }; | 2223 | }; |
| 2262 | defer ring.deinit(); | 2224 | defer ring.deinit(); |
| 2263 | | 2225 | |
| 2264 | const address = try net.Address.parseIp4("127.0.0.1", 3131); | 2226 | const socket_test_harness = try createSocketTestHarness(&ring); |
| 2265 | const kernel_backlog = 1; | 2227 | defer socket_test_harness.close(); |
| 2266 | const server = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); | | |
| 2267 | defer os.close(server); | | |
| 2268 | try os.setsockopt(server, os.SOL.SOCKET, os.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1))); | | |
| 2269 | try os.bind(server, &address.any, address.getOsSockLen()); | | |
| 2270 | try os.listen(server, kernel_backlog); | | |
| 2271 | | 2228 | |
| 2272 | var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 }; | 2229 | var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 }; |
| 2273 | | 2230 | |
| 2274 | var accept_addr: os.sockaddr = undefined; | 2231 | const sqe_recv = try ring.recv(0xffffffff, socket_test_harness.server, .{ .buffer = buffer_recv[0..] }, 0); |
| 2275 | var accept_addr_len: os.socklen_t = @sizeOf(@TypeOf(accept_addr)); | | |
| 2276 | _ = try ring.accept(0xaaaaaaaa, server, &accept_addr, &accept_addr_len, 0); | | |
| 2277 | try testing.expectEqual(@as(u32, 1), try ring.submit()); | | |
| 2278 | | | |
| 2279 | const client = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); | | |
| 2280 | defer os.close(client); | | |
| 2281 | _ = try ring.connect(0xcccccccc, client, &address.any, address.getOsSockLen()); | | |
| 2282 | try testing.expectEqual(@as(u32, 1), try ring.submit()); | | |
| 2283 | | | |
| 2284 | var cqe_accept = try ring.copy_cqe(); | | |
| 2285 | if (cqe_accept.err() == .INVAL) return error.SkipZigTest; | | |
| 2286 | var cqe_connect = try ring.copy_cqe(); | | |
| 2287 | if (cqe_connect.err() == .INVAL) return error.SkipZigTest; | | |
| 2288 | | | |
| 2289 | // The accept/connect CQEs may arrive in any order, the connect CQE will sometimes come first: | | |
| 2290 | if (cqe_accept.user_data == 0xcccccccc and cqe_connect.user_data == 0xaaaaaaaa) { | | |
| 2291 | const a = cqe_accept; | | |
| 2292 | const b = cqe_connect; | | |
| 2293 | cqe_accept = b; | | |
| 2294 | cqe_connect = a; | | |
| 2295 | } | | |
| 2296 | | | |
| 2297 | try testing.expectEqual(@as(u64, 0xaaaaaaaa), cqe_accept.user_data); | | |
| 2298 | if (cqe_accept.res <= 0) std.debug.print("\ncqe_accept.res={}\n", .{cqe_accept.res}); | | |
| 2299 | try testing.expect(cqe_accept.res > 0); | | |
| 2300 | try testing.expectEqual(@as(u32, 0), cqe_accept.flags); | | |
| 2301 | try testing.expectEqual(linux.io_uring_cqe{ | | |
| 2302 | .user_data = 0xcccccccc, | | |
| 2303 | .res = 0, | | |
| 2304 | .flags = 0, | | |
| 2305 | }, cqe_connect); | | |
| 2306 | | | |
| 2307 | const sqe_recv = try ring.recv(0xffffffff, cqe_accept.res, .{ .buffer = buffer_recv[0..] }, 0); | | |
| 2308 | sqe_recv.flags |= linux.IOSQE_IO_LINK; | 2232 | sqe_recv.flags |= linux.IOSQE_IO_LINK; |
| 2309 | | 2233 | |
| 2310 | const ts = os.linux.kernel_timespec{ .tv_sec = 0, .tv_nsec = 1000000 }; | 2234 | const ts = os.linux.kernel_timespec{ .tv_sec = 0, .tv_nsec = 1000000 }; |
| ... | @@ -2448,50 +2372,12 @@ test "accept/connect/recv/cancel" { | ... | @@ -2448,50 +2372,12 @@ test "accept/connect/recv/cancel" { |
| 2448 | }; | 2372 | }; |
| 2449 | defer ring.deinit(); | 2373 | defer ring.deinit(); |
| 2450 | | 2374 | |
| 2451 | const address = try net.Address.parseIp4("127.0.0.1", 3131); | 2375 | const socket_test_harness = try createSocketTestHarness(&ring); |
| 2452 | const kernel_backlog = 1; | 2376 | defer socket_test_harness.close(); |
| 2453 | const server = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); | | |
| 2454 | defer os.close(server); | | |
| 2455 | try os.setsockopt(server, os.SOL.SOCKET, os.SO.REUSEADDR, &mem.toBytes(@as(c_int, 1))); | | |
| 2456 | try os.bind(server, &address.any, address.getOsSockLen()); | | |
| 2457 | try os.listen(server, kernel_backlog); | | |
| 2458 | | 2377 | |
| 2459 | var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 }; | 2378 | var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 }; |
| 2460 | | 2379 | |
| 2461 | var accept_addr: os.sockaddr = undefined; | 2380 | _ = try ring.recv(0xffffffff, socket_test_harness.server, .{ .buffer = buffer_recv[0..] }, 0); |
| 2462 | var accept_addr_len: os.socklen_t = @sizeOf(@TypeOf(accept_addr)); | | |
| 2463 | _ = try ring.accept(0xaaaaaaaa, server, &accept_addr, &accept_addr_len, 0); | | |
| 2464 | try testing.expectEqual(@as(u32, 1), try ring.submit()); | | |
| 2465 | | | |
| 2466 | const client = try os.socket(address.any.family, os.SOCK.STREAM | os.SOCK.CLOEXEC, 0); | | |
| 2467 | defer os.close(client); | | |
| 2468 | _ = try ring.connect(0xcccccccc, client, &address.any, address.getOsSockLen()); | | |
| 2469 | try testing.expectEqual(@as(u32, 1), try ring.submit()); | | |
| 2470 | | | |
| 2471 | var cqe_accept = try ring.copy_cqe(); | | |
| 2472 | if (cqe_accept.err() == .INVAL) return error.SkipZigTest; | | |
| 2473 | var cqe_connect = try ring.copy_cqe(); | | |
| 2474 | if (cqe_connect.err() == .INVAL) return error.SkipZigTest; | | |
| 2475 | | | |
| 2476 | // The accept/connect CQEs may arrive in any order, the connect CQE will sometimes come first: | | |
| 2477 | if (cqe_accept.user_data == 0xcccccccc and cqe_connect.user_data == 0xaaaaaaaa) { | | |
| 2478 | const a = cqe_accept; | | |
| 2479 | const b = cqe_connect; | | |
| 2480 | cqe_accept = b; | | |
| 2481 | cqe_connect = a; | | |
| 2482 | } | | |
| 2483 | | | |
| 2484 | try testing.expectEqual(@as(u64, 0xaaaaaaaa), cqe_accept.user_data); | | |
| 2485 | if (cqe_accept.res <= 0) std.debug.print("\ncqe_accept.res={}\n", .{cqe_accept.res}); | | |
| 2486 | try testing.expect(cqe_accept.res > 0); | | |
| 2487 | try testing.expectEqual(@as(u32, 0), cqe_accept.flags); | | |
| 2488 | try testing.expectEqual(linux.io_uring_cqe{ | | |
| 2489 | .user_data = 0xcccccccc, | | |
| 2490 | .res = 0, | | |
| 2491 | .flags = 0, | | |
| 2492 | }, cqe_connect); | | |
| 2493 | | | |
| 2494 | _ = try ring.recv(0xffffffff, cqe_accept.res, .{ .buffer = buffer_recv[0..] }, 0); | | |
| 2495 | try testing.expectEqual(@as(u32, 1), try ring.submit()); | 2381 | try testing.expectEqual(@as(u32, 1), try ring.submit()); |
| 2496 | | 2382 | |
| 2497 | const sqe_cancel = try ring.cancel(0x99999999, 0xffffffff, 0); | 2383 | const sqe_cancel = try ring.cancel(0x99999999, 0xffffffff, 0); |