File: test_user_event.ml

package info (click to toggle)
ocaml 5.4.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 44,372 kB
  • sloc: ml: 370,196; ansic: 52,820; sh: 27,396; asm: 5,462; makefile: 3,679; python: 974; awk: 278; javascript: 273; perl: 59; fortran: 21; cs: 9
file content (87 lines) | stat: -rw-r--r-- 2,206 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
(* TEST
 include runtime_events;
*)
open Runtime_events

(* let's register some custom events *)
type User.tag += Libname | Counters of int

let event = User.register "libname.event" Libname Type.unit

let span = User.register "libname.phase" Libname Type.span

let counter = User.register "libname.counter" (Counters 1) Type.int

let counter2 = User.register "libname.counter2" (Counters 2) Type.int

let custom_type =
  let encode buf value =
    let l = String.length value in
    Bytes.blit_string value 0 buf 0 l;
    l
  in
  let decode buf size =
    let target = Bytes.create size in
    Bytes.blit buf 0 target 0 size;
    Bytes.unsafe_to_string target
  in
  Type.register ~encode ~decode

let custom = User.register "libname.custom" Libname custom_type

let () =
  start ();
  (* registering custom events after runtime event started *)
  User.write span Begin;
  User.write event ();
  User.write counter 17;
  User.write counter2 18;
  User.write custom "hello";
  User.write span End

(* consumer *)

let got_event = ref false
let got_span_begin = ref false
let got_span_end = ref false
let counter_value = ref 0
let custom_value = ref ""

let event_handler domain_id ts e () =
  match User.tag e with
  | Libname -> got_event := true
  | _ -> ()

let counter_handler domain_id ts e v =
  match User.tag e with
  | Counters 2 -> counter_value := v
  | _ -> ()

let span_handler domain_id ts e v =
  match User.tag e with
  | Libname when v = Type.Begin -> got_span_begin := true
  | Libname when v = Type.End -> got_span_end := true
  | _ -> ()

let custom_handler domain_id ts e v =
  match User.tag e with
  | Libname -> custom_value := v
  | _ -> ()

let () =
  let cursor = create_cursor None in
  let callbacks =
    Callbacks.create ()
    |> Callbacks.add_user_event Type.unit event_handler
    |> Callbacks.add_user_event Type.int counter_handler
    |> Callbacks.add_user_event Type.span span_handler
    |> Callbacks.add_user_event custom_type custom_handler
  in
  for _ = 0 to 100 do
    ignore(read_poll cursor callbacks None)
  done;
  assert (!got_event);
  assert (!counter_value = 18);
  assert (!got_span_begin);
  assert (!got_span_end);
  assert (!custom_value = "hello")