polyphony 0.66 → 0.70

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,7 +6,7 @@ class ProcessSupervisionTest < MiniTest::Test
6
6
  def test_process_supervisor_with_block
7
7
  i, o = IO.pipe
8
8
 
9
- f = spin do
9
+ watcher = spin do
10
10
  Polyphony.watch_process do
11
11
  i.close
12
12
  sleep 5
@@ -14,31 +14,60 @@ class ProcessSupervisionTest < MiniTest::Test
14
14
  o << 'foo'
15
15
  o.close
16
16
  end
17
- supervise(on_error: :restart)
18
17
  end
19
18
 
19
+ supervisor = spin { supervise(watcher, restart: :always) }
20
+
20
21
  sleep 0.05
21
- f.terminate
22
- f.await
22
+ supervisor.terminate
23
+ supervisor.await
23
24
 
24
25
  o.close
25
26
  msg = i.read
26
- i.close
27
27
  assert_equal 'foo', msg
28
28
  end
29
29
 
30
+ def test_process_supervisor_restart_with_block
31
+ i1, o1 = IO.pipe
32
+ i2, o2 = IO.pipe
33
+
34
+ count = 0
35
+ watcher = spin do
36
+ count += 1
37
+ Polyphony.watch_process do
38
+ i1.gets
39
+ o2.puts count
40
+ end
41
+ end
42
+
43
+ supervisor = spin { supervise(watcher, restart: :always) }
44
+
45
+ o1.puts
46
+ l = i2.gets
47
+ assert_equal "1\n", l
48
+
49
+ o1.puts
50
+ l = i2.gets
51
+ assert_equal "2\n", l
52
+
53
+ o1.puts
54
+ l = i2.gets
55
+ assert_equal "3\n", l
56
+ end
57
+
30
58
  def test_process_supervisor_with_cmd
31
59
  fn = '/tmp/test_process_supervisor_with_cmd'
32
60
  FileUtils.rm(fn) rescue nil
33
61
 
34
- f = spin do
62
+ watcher = spin do
35
63
  Polyphony.watch_process("echo foo >> #{fn}")
36
- supervise(on_error: :restart)
37
64
  end
38
65
 
66
+ supervisor = spin { supervise(watcher) }
67
+
39
68
  sleep 0.05
40
- f.terminate
41
- f.await
69
+ supervisor.terminate
70
+ supervisor.await
42
71
 
43
72
  assert_equal "foo\n", IO.read(fn)
44
73
 
@@ -2,103 +2,186 @@
2
2
 
3
3
  require_relative 'helper'
4
4
 
5
- # class SuperviseTest < MiniTest::Test
6
- # def test_supervise
7
- # p = spin { supervise }
8
- # snooze
9
- # f1 = p.spin { receive }
10
- # f2 = p.spin { receive }
11
-
12
- # snooze
13
- # assert_equal p.state, :waiting
14
- # f1 << 'foo'
15
- # f1.await
16
- # snooze
17
-
18
- # assert_equal :waiting, p.state
19
- # assert_equal :waiting, f2.state
20
-
21
- # f2 << 'bar'
22
- # f2.await
23
- # assert_equal :runnable, p.state
24
-
25
- # 3.times { snooze }
26
- # assert_equal :dead, p.state
27
- # end
28
-
29
- # def test_supervise_with_restart
30
- # watcher = spin { receive }
31
- # parent = spin { supervise(restart: true, watcher: watcher) }
32
- # snooze
33
-
34
- # buffer = []
35
- # f1 = parent.spin do
36
- # buffer << 'f1'
37
- # end
38
-
39
- # f1.await
40
- # assert_equal ['f1'], buffer
41
- # watcher.await
42
- # assert_equal ['f1', 'f1'], buffer
43
- # end
44
-
45
- # def test_supervise_with_restart_on_error
46
- # parent = spin { supervise(restart: true) }
47
- # snooze
48
-
49
- # buffer = []
50
- # f1 = parent.spin do
51
- # buffer << 'f1'
52
- # buffer << receive
53
- # end
54
-
55
- # snooze
56
- # assert_equal ['f1'], buffer
57
-
58
- # f1.raise 'foo'
59
-
60
- # 3.times { snooze }
61
-
62
- # assert_equal ['f1', 'f1'], buffer
63
- # assert_equal :dead, f1.state
64
-
65
- # # f1 should have been restarted by supervisor
66
- # f1 = parent.children.first
67
- # assert_kind_of Fiber, f1
68
-
69
- # f1 << 'foo'
70
- # f1.await
71
-
72
- # assert_equal ['f1', 'f1', 'foo'], buffer
73
- # end
74
-
75
- # def test_supervisor_termination
76
- # f = nil
77
- # p = spin do
78
- # f = spin { sleep 1 }
79
- # supervise
80
- # end
81
- # sleep 0.01
82
-
83
- # p.terminate
84
- # p.await
85
-
86
- # assert :dead, f.state
87
- # assert :dead, p.state
88
- # end
89
-
90
- # def test_supervisor_termination_with_restart
91
- # f = nil
92
- # p = spin do
93
- # f = spin { sleep 1 }
94
- # supervise(restart: true)
95
- # end
96
- # sleep 0.01
97
-
98
- # p.terminate
99
- # p.await
100
-
101
- # assert :dead, f.state
102
- # assert :dead, p.state
103
- # end
104
- # end
5
+ class SuperviseTest < MiniTest::Test
6
+ def test_supervise_with_block
7
+ buffer = []
8
+ f1 = spin(:f1) { receive }
9
+ f2 = spin(:f2) { receive }
10
+ supervisor = spin(:supervisor) { supervise(f1, f2) { |*args| buffer << args } }
11
+
12
+ snooze
13
+ f1 << 'foo'
14
+ f1.await
15
+ 10.times { snooze }
16
+ assert_equal [[f1, 'foo']], buffer
17
+
18
+ f2 << 'bar'
19
+ f2.await
20
+ assert_equal [[f1, 'foo'], [f2, 'bar']], buffer
21
+ end
22
+
23
+ def test_supervise_with_on_done
24
+ buffer = []
25
+ f1 = spin(:f1) { receive }
26
+ f2 = spin(:f2) { receive }
27
+ supervisor = spin(:supervisor) do
28
+ supervise(f1, f2, on_done: ->(*args) { buffer << args })
29
+ end
30
+
31
+ snooze
32
+ f1 << 'foo'
33
+ f1.await
34
+ 10.times { snooze }
35
+ assert_equal [[f1, 'foo']], buffer
36
+
37
+ f2 << 'bar'
38
+ f2.await
39
+ assert_equal [[f1, 'foo'], [f2, 'bar']], buffer
40
+ end
41
+
42
+ def test_supervise_with_on_error
43
+ buffer = []
44
+ f1 = spin(:f1) { receive }
45
+ f2 = spin(:f2) { receive }
46
+ supervisor = spin(:supervisor) do
47
+ supervise(f1, f2, on_error: ->(*args) { buffer << args })
48
+ end
49
+
50
+ snooze
51
+ f1 << 'foo'
52
+ f1.await
53
+ 10.times { snooze }
54
+ assert_equal [], buffer
55
+
56
+ e = RuntimeError.new('blah')
57
+ f2.raise(e)
58
+ 3.times { snooze }
59
+ assert_equal [[f2, e]], buffer
60
+ end
61
+
62
+ def test_supervise_with_manual_restart
63
+ buffer = []
64
+ f1 = spin(:f1) { receive }
65
+ supervisor = spin(:supervisor) do
66
+ supervise(f1) do |f, r|
67
+ buffer << [f, r]
68
+ f.restart
69
+ end
70
+ end
71
+
72
+ snooze
73
+ f1 << 'foo'
74
+ f1.await
75
+ snooze
76
+ assert_equal [[f1, 'foo']], buffer
77
+
78
+ 10.times { snooze }
79
+
80
+ assert_equal 1, supervisor.children.size
81
+ f2 = supervisor.children.first
82
+ assert f1 != f2
83
+ assert_equal :f1, f2.tag
84
+ assert_equal supervisor, f2.parent
85
+
86
+ e = RuntimeError.new('bar')
87
+ f2.raise(e)
88
+ f2.await rescue nil
89
+ 3.times { snooze }
90
+ assert_equal [[f1, 'foo'], [f2, e]], buffer
91
+
92
+ assert_equal 1, supervisor.children.size
93
+ f3 = supervisor.children.first
94
+ assert f2 != f3
95
+ assert f1 != f3
96
+ assert_equal :f1, f3.tag
97
+ assert_equal supervisor, f3.parent
98
+ end
99
+
100
+ def test_supervise_with_restart_always
101
+ buffer = []
102
+ f1 = spin(:f1) do
103
+ buffer << receive
104
+ rescue => e
105
+ buffer << e
106
+ e
107
+ end
108
+ supervisor = spin(:supervisor) { supervise(f1, restart: :always) }
109
+
110
+ snooze
111
+ f1 << 'foo'
112
+ f1.await
113
+ snooze
114
+ assert_equal ['foo'], buffer
115
+
116
+ 10.times { snooze }
117
+
118
+ assert_equal 1, supervisor.children.size
119
+ f2 = supervisor.children.first
120
+ assert f1 != f2
121
+ assert_equal :f1, f2.tag
122
+ assert_equal supervisor, f2.parent
123
+
124
+ e = RuntimeError.new('bar')
125
+ f2.raise(e)
126
+ f2.await rescue nil
127
+ 3.times { snooze }
128
+ assert_equal ['foo', e], buffer
129
+
130
+ assert_equal 1, supervisor.children.size
131
+ f3 = supervisor.children.first
132
+ assert f2 != f3
133
+ assert f1 != f3
134
+ assert_equal :f1, f3.tag
135
+ assert_equal supervisor, f3.parent
136
+ end
137
+
138
+ def test_supervise_with_restart_on_error
139
+ buffer = []
140
+ f1 = spin(:f1) do
141
+ buffer << receive
142
+ rescue => e
143
+ buffer << e
144
+ e
145
+ end
146
+ supervisor = spin(:supervisor) { supervise(f1, restart: :on_error) }
147
+
148
+ snooze
149
+ e = RuntimeError.new('bar')
150
+ f1.raise(e)
151
+ f1.await rescue nil
152
+ snooze
153
+ assert_equal [e], buffer
154
+
155
+ 10.times { snooze }
156
+
157
+ assert_equal 1, supervisor.children.size
158
+ f2 = supervisor.children.first
159
+ assert f1 != f2
160
+ assert_equal :f1, f2.tag
161
+ assert_equal supervisor, f2.parent
162
+
163
+ f2 << 'foo'
164
+ f2.await rescue nil
165
+ 3.times { snooze }
166
+ assert_equal [e, 'foo'], buffer
167
+
168
+ assert_equal 0, supervisor.children.size
169
+ end
170
+
171
+ def test_supervise_terminate
172
+ buffer = []
173
+ f1 = spin(:f1) do
174
+ buffer << receive
175
+ rescue => e
176
+ buffer << e
177
+ e
178
+ end
179
+ supervisor = spin(:supervisor) { supervise(f1, restart: :on_error) }
180
+
181
+ sleep 0.05
182
+ supervisor.terminate
183
+ supervisor.await
184
+
185
+ assert_equal [], buffer
186
+ end
187
+ end
@@ -70,7 +70,7 @@ class ThreadPoolTest < MiniTest::Test
70
70
 
71
71
  sleep 0.15 # allow time for threads to spawn
72
72
  assert_equal @pool.size, threads.uniq.size
73
- assert_equal (0..9).to_a, buffer.sort
73
+ assert_equal (0..9).to_a, buffer.sort if IS_LINUX
74
74
  end
75
75
 
76
76
  def test_busy?
@@ -10,7 +10,7 @@ class ThrottlerTest < MiniTest::Test
10
10
  f = spin { loop { t.process { buffer << 1 } } }
11
11
  sleep 0.2
12
12
  f.stop
13
- assert_in_range 1..3, buffer.size
13
+ assert_in_range 1..4, buffer.size
14
14
  ensure
15
15
  t.stop
16
16
  end
@@ -23,7 +23,7 @@ class ThrottlerTest < MiniTest::Test
23
23
  end
24
24
  sleep 0.25
25
25
  f.stop
26
- assert_in_range 2..6, buffer.size
26
+ assert_in_range 2..7, buffer.size
27
27
  ensure
28
28
  t.stop
29
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polyphony
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.66'
4
+ version: '0.70'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-01 00:00:00.000000000 Z
11
+ date: 2021-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
@@ -156,6 +156,7 @@ files:
156
156
  - README.md
157
157
  - Rakefile
158
158
  - TODO.md
159
+ - bin/pdbg
159
160
  - bin/polyphony-debug
160
161
  - bin/stress.rb
161
162
  - bin/test
@@ -356,6 +357,7 @@ files:
356
357
  - lib/polyphony/core/thread_pool.rb
357
358
  - lib/polyphony/core/throttler.rb
358
359
  - lib/polyphony/core/timer.rb
360
+ - lib/polyphony/debugger.rb
359
361
  - lib/polyphony/extensions/core.rb
360
362
  - lib/polyphony/extensions/debug.rb
361
363
  - lib/polyphony/extensions/fiber.rb