authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-07-30 12:49:53-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-07-30 12:49:53-04:00
logc91c781952bd9750c029a48d0dd7a5a24ec089cf
treed9d1aa34700c28f0311ea810c50414bf4dcde75c
parent6fd6bc94f57b815774f9717d52bacbf304a496be

add behavior tests for cancel semantics


2 files changed, 93 insertions(+), 0 deletions(-)

test/behavior.zig+1
...@@ -16,6 +16,7 @@ comptime {...@@ -16,6 +16,7 @@ comptime {
16 _ = @import("cases/bugs/828.zig");16 _ = @import("cases/bugs/828.zig");
17 _ = @import("cases/bugs/920.zig");17 _ = @import("cases/bugs/920.zig");
18 _ = @import("cases/byval_arg_var.zig");18 _ = @import("cases/byval_arg_var.zig");
19 _ = @import("cases/cancel.zig");
19 _ = @import("cases/cast.zig");20 _ = @import("cases/cast.zig");
20 _ = @import("cases/const_slice_child.zig");21 _ = @import("cases/const_slice_child.zig");
21 _ = @import("cases/coroutine_await_struct.zig");22 _ = @import("cases/coroutine_await_struct.zig");
test/cases/cancel.zig created+92
...@@ -0,0 +1,92 @@
1const std = @import("std");
2
3var defer_f1: bool = false;
4var defer_f2: bool = false;
5var defer_f3: bool = false;
6
7test "cancel forwards" {
8 var da = std.heap.DirectAllocator.init();
9 defer da.deinit();
10
11 const p = async<&da.allocator> f1() catch unreachable;
12 cancel p;
13 std.debug.assert(defer_f1);
14 std.debug.assert(defer_f2);
15 std.debug.assert(defer_f3);
16}
17
18async fn f1() void {
19 defer {
20 defer_f1 = true;
21 }
22 await (async f2() catch unreachable);
23}
24
25async fn f2() void {
26 defer {
27 defer_f2 = true;
28 }
29 await (async f3() catch unreachable);
30}
31
32async fn f3() void {
33 defer {
34 defer_f3 = true;
35 }
36 suspend;
37}
38
39var defer_b1: bool = false;
40var defer_b2: bool = false;
41var defer_b3: bool = false;
42var defer_b4: bool = false;
43
44test "cancel backwards" {
45 var da = std.heap.DirectAllocator.init();
46 defer da.deinit();
47
48 const p = async<&da.allocator> b1() catch unreachable;
49 cancel p;
50 std.debug.assert(defer_b1);
51 std.debug.assert(defer_b2);
52 std.debug.assert(defer_b3);
53 std.debug.assert(defer_b4);
54}
55
56async fn b1() void {
57 defer {
58 defer_b1 = true;
59 }
60 await (async b2() catch unreachable);
61}
62
63var b4_handle: promise = undefined;
64
65async fn b2() void {
66 const b3_handle = async b3() catch unreachable;
67 resume b4_handle;
68 cancel b4_handle;
69 defer {
70 defer_b2 = true;
71 }
72 const value = await b3_handle;
73 @panic("unreachable");
74}
75
76async fn b3() i32 {
77 defer {
78 defer_b3 = true;
79 }
80 await (async b4() catch unreachable);
81 return 1234;
82}
83
84async fn b4() void {
85 defer {
86 defer_b4 = true;
87 }
88 suspend |p| {
89 b4_handle = p;
90 }
91 suspend;
92}