This commit is contained in:
parent
aa2ff7b2f0
commit
2f3113f55d
11742 changed files with 1223940 additions and 0 deletions
73
unikernel/duniverse/lwt/test/react/test_lwt_signal.ml
Normal file
73
unikernel/duniverse/lwt/test/react/test_lwt_signal.ml
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
(* This file is part of Lwt, released under the MIT license. See LICENSE.md for
|
||||
details, or visit https://github.com/ocsigen/lwt/blob/master/LICENSE.md. *)
|
||||
|
||||
|
||||
|
||||
open Test
|
||||
open Lwt
|
||||
|
||||
let suite = suite "lwt_signal" [
|
||||
test "limit"
|
||||
(fun () ->
|
||||
let s, push = React.S.create 0 in
|
||||
let cond = Lwt_condition.create () in
|
||||
let s' = Lwt_react.S.limit (fun () -> Lwt_condition.wait cond) s in
|
||||
let l = ref [] in
|
||||
let e = React.E.map (fun x -> l := x :: !l) (React.S.changes s') in
|
||||
ignore e;
|
||||
Lwt_condition.signal cond ();
|
||||
Lwt.pause () >>= fun () ->
|
||||
push 1;
|
||||
push 0;
|
||||
push 2; (* overwrites previous 0 *)
|
||||
Lwt_condition.signal cond ();
|
||||
Lwt.pause () >>= fun () ->
|
||||
push 3;
|
||||
Lwt_condition.signal cond ();
|
||||
Lwt.pause () >>= fun () ->
|
||||
push 4;
|
||||
Lwt_condition.signal cond ();
|
||||
Lwt.pause () >>= fun () ->
|
||||
return (!l = [4; 3; 2; 1]));
|
||||
|
||||
test "limit race condition" begin fun () ->
|
||||
let change_count = ref 0 in
|
||||
|
||||
let underlying_signal, set = React.S.create 0 in
|
||||
|
||||
underlying_signal
|
||||
|> Lwt_react.S.limit (fun () ->
|
||||
let p = Lwt_unix.sleep 1. in
|
||||
Lwt.async (fun () ->
|
||||
Lwt_unix.sleep 0.1 >|= fun () ->
|
||||
Lwt.on_success p (fun () ->
|
||||
set 2));
|
||||
p)
|
||||
|> React.S.changes
|
||||
|> React.E.map (fun _ -> incr change_count)
|
||||
|> ignore;
|
||||
|
||||
set 1;
|
||||
|
||||
Lwt_unix.sleep 2. >|= fun () ->
|
||||
!change_count = 1
|
||||
end;
|
||||
|
||||
test "with_finaliser lifetime" begin fun () ->
|
||||
let s, set = React.S.create 0 in
|
||||
let finalizer_ran = ref false in
|
||||
let s' = Lwt_react.S.with_finaliser (fun () -> finalizer_ran := true) s in
|
||||
|
||||
Gc.full_major ();
|
||||
let check1 = !finalizer_ran = false in
|
||||
|
||||
let p = Lwt_react.E.next (React.S.changes s') in
|
||||
set 1;
|
||||
p >>= fun _ ->
|
||||
|
||||
Gc.full_major ();
|
||||
let check2 = !finalizer_ran = true in
|
||||
|
||||
Lwt.return (check1 && check2)
|
||||
end;
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue