-
Notifications
You must be signed in to change notification settings - Fork 45
/
Copy pathsemaphores_test.rb
97 lines (87 loc) · 3.28 KB
/
semaphores_test.rb
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
# frozen_string_literal: true
require_relative 'test_helper'
module Dynflow
module SemaphoresTest
describe ::Dynflow::Semaphores::Stateful do
let(:semaphore_class) { ::Dynflow::Semaphores::Stateful }
let(:tickets_count) { 5 }
it 'can be used as counter' do
expected_state = { :tickets => tickets_count, :free => 4, :meta => {} }
semaphore = semaphore_class.new(tickets_count)
_(semaphore.tickets).must_equal tickets_count
_(semaphore.free).must_equal tickets_count
_(semaphore.waiting).must_be_empty
_(semaphore.get).must_equal 1
_(semaphore.free).must_equal tickets_count - 1
_(semaphore.get(3)).must_equal 3
_(semaphore.free).must_equal tickets_count - (3 + 1)
_(semaphore.drain).must_equal 1
_(semaphore.free).must_equal tickets_count - (3 + 1 + 1)
semaphore.release
_(semaphore.free).must_equal tickets_count - (3 + 1)
semaphore.release 3
_(semaphore.free).must_equal tickets_count - 1
_(semaphore.to_hash).must_equal expected_state
end
it 'can have things waiting on it' do
semaphore = semaphore_class.new 1
allowed = semaphore.wait(1)
_(allowed).must_equal true
_(semaphore.free).must_equal 0
allowed = semaphore.wait(2)
_(allowed).must_equal false
allowed = semaphore.wait(3)
_(allowed).must_equal false
waiting = semaphore.get_waiting
_(waiting).must_equal 2
waiting = semaphore.get_waiting
_(waiting).must_equal 3
end
end
describe ::Dynflow::Semaphores::Dummy do
let(:semaphore_class) { ::Dynflow::Semaphores::Dummy }
it 'always has free' do
semaphore = semaphore_class.new
_(semaphore.free).must_equal 1
_(semaphore.get(5)).must_equal 5
_(semaphore.free).must_equal 1
end
it 'cannot have things waiting on it' do
semaphore = semaphore_class.new
_(semaphore.wait(1)).must_equal true
_(semaphore.has_waiting?).must_equal false
end
end
describe ::Dynflow::Semaphores::Aggregating do
let(:semaphore_class) { ::Dynflow::Semaphores::Aggregating }
let(:child_class) { ::Dynflow::Semaphores::Stateful }
let(:children) do
{
:child_A => child_class.new(3),
:child_B => child_class.new(2)
}
end
def assert_semaphore_state(semaphore, state_a, state_b)
_(semaphore.children[:child_A].free).must_equal state_a
_(semaphore.children[:child_B].free).must_equal state_b
_(semaphore.free).must_equal [state_a, state_b].min
end
it 'can be used as counter' do
semaphore = semaphore_class.new(children)
assert_semaphore_state semaphore, 3, 2
_(semaphore.get).must_equal 1
assert_semaphore_state semaphore, 2, 1
_(semaphore.get).must_equal 1
assert_semaphore_state semaphore, 1, 0
_(semaphore.get).must_equal 0
assert_semaphore_state semaphore, 1, 0
semaphore.release
assert_semaphore_state semaphore, 2, 1
semaphore.release(1, :child_B)
assert_semaphore_state semaphore, 2, 2
_(semaphore.drain).must_equal 2
assert_semaphore_state semaphore, 0, 0
end
end
end
end