vxx2 / vlib / x / executor / owner_test.v
64 lines · 55 sloc · 1.48 KB · e80386b6af8a071a2e13fd654ebcdb2105fb9202
Raw
1module executor
2
3import time
4
5fn test_owner_checks_are_true_only_while_pumping() {
6 mut ex := new(queue_size: 2)!
7 observed := chan bool{cap: 1}
8
9 assert !ex.is_owner_thread()
10 mut rejected_before_pump := false
11 ex.assert_owner_thread() or {
12 assert err.msg() == 'executor: current thread is not the executor owner'
13 rejected_before_pump = true
14 }
15 assert rejected_before_pump
16
17 ex.try_post(fn [mut ex, observed] () ! {
18 observed <- ex.is_owner_thread()
19 ex.assert_owner_thread()!
20 })!
21
22 assert ex.run_one()!
23 assert wait_for_bool(observed, 'owner check was false inside owner callback')
24 assert !ex.is_owner_thread()
25 ex.assert_owner_thread() or {
26 assert err.msg() == 'executor: current thread is not the executor owner'
27 ex.stop()
28 assert !ex.run_one()!
29 ex.wait()!
30 return
31 }
32 assert false, 'assert_owner_thread succeeded after owner pump returned'
33}
34
35fn test_owner_identity_is_cleared_after_job_error() {
36 mut ex := new(queue_size: 1)!
37 observed := chan bool{cap: 1}
38
39 ex.try_post(fn [mut ex, observed] () ! {
40 observed <- ex.is_owner_thread()
41 return error('owner error')
42 })!
43
44 mut saw_job_error := false
45 ex.run_one() or {
46 assert err.msg() == 'owner error'
47 saw_job_error = true
48 }
49 assert saw_job_error
50 assert wait_for_bool(observed, 'owner identity was not set during erroring job')
51 assert !ex.is_owner_thread()
52}
53
54fn wait_for_bool(signal chan bool, message string) bool {
55 select {
56 value := <-signal {
57 return value
58 }
59 1 * time.second {
60 assert false, message
61 }
62 }
63 return false
64}
65