Source file test_promote.ml

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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
open! Core
open! Import
module Runqueue = Parallel.For_testing.Runqueue

let%expect_test "max promotions" =
  let q = Runqueue.create () in
  let job (_ : Parallel.t) = () in
  Runqueue.with_jobs q [ job; job; job; job; job ] ~f:(fun q ->
    Runqueue.with_jobs q [ job; job ] ~f:(fun q ->
      Runqueue.with_jobs q [ job ] ~f:(fun q ->
        Runqueue.with_jobs q [ job ] ~f:(fun q ->
          Runqueue.with_jobs q [ job ] ~f:(fun q ->
            let promote ~tokens:_ = print_endline "promoted" in
            (* One batch of five jobs. *)
            Runqueue.promote q ~n:1 ~f:promote;
            [%expect
              {|
              promoted
              promoted
              promoted
              promoted
              promoted
              |}];
            (* One batch of two jobs. *)
            Runqueue.promote q ~n:2 ~f:promote;
            [%expect
              {|
              promoted
              promoted
              |}];
            (* Two batches of one job. *)
            Runqueue.promote q ~n:2 ~f:promote;
            [%expect
              {|
              promoted
              promoted
              |}];
            (* One batch of one job. *)
            Runqueue.promote q ~n:1 ~f:promote;
            [%expect {| promoted |}];
            (* Empty queue. *)
            Runqueue.promote q ~n:3 ~f:promote;
            [%expect {| |}])))))
  [@nontail]
;;

let%expect_test "token distribution" =
  let q = Runqueue.create () in
  let job (_ : Parallel.t) = () in
  let test jobs =
    Runqueue.with_jobs q jobs ~f:(fun q ->
      let promote ~tokens = printf "tokens: %d\n" tokens in
      Runqueue.promote q ~n:19 ~f:promote;
      printf "remaining: %d\n" (Runqueue.tokens q))
  in
  test [ job ];
  [%expect
    {|
    tokens: 9
    remaining: 9
    |}];
  test [ job; job ];
  [%expect
    {|
    tokens: 5
    tokens: 5
    remaining: 7
    |}];
  test [ job; job; job ];
  [%expect
    {|
    tokens: 4
    tokens: 4
    tokens: 4
    remaining: 4
    |}];
  test [ job; job; job; job ];
  [%expect
    {|
    tokens: 3
    tokens: 3
    tokens: 3
    tokens: 3
    remaining: 3
    |}];
  test [ job; job; job; job; job ];
  [%expect
    {|
    tokens: 2
    tokens: 2
    tokens: 2
    tokens: 2
    tokens: 2
    remaining: 4
    |}];
  test [ job; job; job; job; job; job ];
  [%expect
    {|
    tokens: 1
    tokens: 1
    tokens: 1
    tokens: 1
    tokens: 1
    tokens: 1
    remaining: 7
    |}]
;;

let%expect_test "negative tokens" =
  let q = Runqueue.create () in
  let job (_ : Parallel.t) = () in
  Runqueue.with_jobs q [ job; job; job ] ~f:(fun q ->
    let promote ~tokens = printf "tokens: %d\n" tokens in
    Runqueue.promote q ~n:1 ~f:promote;
    printf "remaining: %d\n" (Runqueue.tokens q));
  [%expect
    {|
    tokens: 0
    tokens: 0
    tokens: 0
    remaining: -2
    |}]
;;