authorgravatar for vincent@rischmann.frVincent Rischmann <vincent@rischmann.fr> 2022-05-16 21:45:56+02:00
committergravatar for vincent@rischmann.frVincent Rischmann <vincent@rischmann.fr> 2022-05-25 13:53:09+02:00
logd8798ef0cd22532d26157aa1939b96aabc02223c
treee37ea85f401d5b7cbd3eea809480f0f825004b28
parent456716b30dffc343df0bed9a69cbce54d10787aa

io_uring: use the socket test harness


1 files changed, 10 insertions(+), 124 deletions(-)

lib/std/os/linux/io_uring.zig+10-124
...@@ -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();
19921992
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);
20001995
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 };
20031998
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());
20412003
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();
22632225
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);
22712228
2272 var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 };2229 var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 };
22732230
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;
23092233
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();
24502374
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);
24582377
2459 var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 };2378 var buffer_recv = [_]u8{ 0, 1, 0, 1, 0 };
24602379
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());
24962382
2497 const sqe_cancel = try ring.cancel(0x99999999, 0xffffffff, 0);2383 const sqe_cancel = try ring.cancel(0x99999999, 0xffffffff, 0);