linol/thirdparty/lsp/submodules/lev/lev-fiber/test/util/channel_tests.ml

62 lines
1.5 KiB
OCaml

module Channel = Lev_fiber_util.Channel
let%expect_test "send/recv 0, 1 in concurrent threads; then close the channel" =
let ch = Channel.create () in
let th0 =
Thread.create
(fun () ->
for _ = 0 to 1 do
match Channel.get ch with
| Ok i -> Printf.printf "%d\n" i
| Error `Closed -> assert false
done;
match Channel.get ch with
| Ok _ -> assert false
| Error `Closed -> print_endline "closed")
()
in
let send_or_fail v =
match Channel.send ch v with Ok () -> () | Error `Closed -> assert false
in
let th1 =
Thread.create
(fun () ->
send_or_fail 0;
send_or_fail 1;
Channel.close ch)
()
in
Thread.join th0;
Thread.join th1;
[%expect {|
0
1
closed |}]
let%expect_test "send 0, 1, 2, but remove 1" =
let ch = Channel.create () in
let print_int i = Printf.printf "%d\n" i in
let th0 =
Thread.create
(fun () ->
let v0 = Channel.get ch in
print_int @@ Result.get_ok v0;
Unix.sleepf 0.01;
let v1 = Channel.get ch in
print_int @@ Result.get_ok v1)
()
in
let th1 =
Thread.create
(fun () ->
ignore @@ Channel.send ch 0;
let removable = Channel.send_removable ch 1 in
Channel.remove_if_not_consumed @@ Result.get_ok removable;
Channel.send ch 2)
()
in
Thread.join th0;
Thread.join th1;
[%expect {|
0
2 |}]