| 1 | module executor |
| 2 | |
| 3 | import time |
| 4 | |
| 5 | fn 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 | |
| 35 | fn 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 | |
| 54 | fn 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 | |