polyphony 0.32 → 0.33

Sign up to get free protection for your applications and to get access to all the features.
@@ -168,6 +168,7 @@ class FiberTest < MiniTest::Test
168
168
  end
169
169
  assert_kind_of Hash, result
170
170
  assert_kind_of RuntimeError, result[:error]
171
+ assert_equal f, result[:error].source_fiber
171
172
  ensure
172
173
  f&.stop
173
174
  end
@@ -180,7 +181,7 @@ class FiberTest < MiniTest::Test
180
181
  2.times { snooze }
181
182
  result << 2
182
183
  end
183
- spin { f.raise }
184
+ f2 = spin { f.raise }
184
185
  assert_equal 0, result.size
185
186
  begin
186
187
  f.await
@@ -190,6 +191,7 @@ class FiberTest < MiniTest::Test
190
191
  assert_equal 1, result.size
191
192
  assert_equal 1, result[0]
192
193
  assert_kind_of RuntimeError, error
194
+ assert_equal f, error.source_fiber
193
195
  ensure
194
196
  f&.stop
195
197
  end
@@ -250,7 +252,7 @@ class FiberTest < MiniTest::Test
250
252
  2.times { snooze }
251
253
  result << 2
252
254
  end
253
- spin { f.raise 'foo' }
255
+ f2 = spin { f.raise 'foo' }
254
256
  assert_equal 0, result.size
255
257
  begin
256
258
  f.await
@@ -261,6 +263,7 @@ class FiberTest < MiniTest::Test
261
263
  assert_equal 1, result[0]
262
264
  assert_kind_of RuntimeError, error
263
265
  assert_equal 'foo', error.message
266
+ assert_equal f, error.source_fiber
264
267
  ensure
265
268
  f&.stop
266
269
  end
@@ -663,7 +666,6 @@ class FiberTest < MiniTest::Test
663
666
  o.close
664
667
  end
665
668
  snooze
666
- ensure
667
669
  end
668
670
  o.close
669
671
  Gyro::Child.new(pid).await
@@ -827,6 +829,7 @@ class FiberControlTest < MiniTest::Test
827
829
  end
828
830
  assert_kind_of RuntimeError, error
829
831
  assert_equal 'foo', error.message
832
+ assert_equal f1, error.source_fiber
830
833
 
831
834
  assert_equal :dead, f1.state
832
835
  assert_equal :dead, f2.state
@@ -863,6 +866,7 @@ class FiberControlTest < MiniTest::Test
863
866
 
864
867
  assert_kind_of RuntimeError, result
865
868
  assert_equal 'foo', result.message
869
+ assert_equal f1, result.source_fiber
866
870
  assert_equal :dead, f1.state
867
871
  assert_equal :dead, f2.state
868
872
  end
@@ -874,4 +878,154 @@ class FiberControlTest < MiniTest::Test
874
878
  result = Fiber.select(f1, f2)
875
879
  assert_equal [f2, :baz], result
876
880
  end
877
- end
881
+ end
882
+
883
+ class SupervisionTest < MiniTest::Test
884
+ def test_exception_during_termination
885
+ f2 = nil
886
+ f = spin do
887
+ f2 = spin do
888
+ sleep
889
+ rescue Polyphony::Terminate
890
+ raise 'foo'
891
+ end
892
+ sleep
893
+ end
894
+
895
+ sleep 0.01
896
+ e = nil
897
+ begin
898
+ f.terminate
899
+ f.await
900
+ rescue => e
901
+ end
902
+
903
+ assert_kind_of RuntimeError, e
904
+ assert_equal 'foo', e.message
905
+ assert_equal f2, e.source_fiber
906
+ end
907
+ end
908
+
909
+ class RestartTest < MiniTest::Test
910
+ def test_restart
911
+ buffer = []
912
+ f = spin {
913
+ buffer << 1
914
+ receive
915
+ buffer << 2
916
+ }
917
+ snooze
918
+ assert_equal [1], buffer
919
+ f2 = f.restart
920
+ assert_equal f2, f
921
+ assert_equal [1], buffer
922
+ snooze
923
+ assert_equal [1, 1], buffer
924
+
925
+ f << 'foo'
926
+ sleep 0.1
927
+ assert_equal [1, 1, 2], buffer
928
+ end
929
+
930
+ def test_restart_after_finalization
931
+ buffer = []
932
+ parent = spin {
933
+ sleep
934
+ }
935
+
936
+ f = parent.spin { |v|
937
+ buffer << Fiber.current
938
+ buffer << v
939
+ buffer << receive
940
+ buffer << :done
941
+ }
942
+ f.schedule('foo')
943
+ f << 'bar'
944
+ snooze
945
+ f.await
946
+
947
+ assert_equal [f, 'foo', 'bar', :done], buffer
948
+ assert_equal parent, f.parent
949
+
950
+ f2 = f.restart('baz')
951
+ assert f2 != f
952
+ assert_equal parent, f2.parent
953
+
954
+ f2 << 42
955
+ f2.await
956
+ assert_equal [f, 'foo', 'bar', :done, f2, 'baz', 42, :done], buffer
957
+ end
958
+ end
959
+
960
+ class SuperviseTest < MiniTest::Test
961
+ def test_supervise
962
+ p = spin { supervise }
963
+ snooze
964
+ f1 = p.spin { receive }
965
+ f2 = p.spin { receive }
966
+
967
+ snooze
968
+ assert_equal p.state, :waiting
969
+ f1 << 'foo'
970
+ f1.await
971
+ snooze
972
+
973
+ assert_equal :waiting, p.state
974
+ assert_equal :waiting, f2.state
975
+
976
+ f2 << 'bar'
977
+ f2.await
978
+ snooze
979
+
980
+ assert_equal :waiting, p.state
981
+ end
982
+
983
+ def test_supervise_with_restart
984
+ parent = spin { supervise(on_error: :restart) }
985
+ snooze
986
+
987
+ buffer = []
988
+ f1 = parent.spin do
989
+ buffer << 'f1'
990
+ buffer << receive
991
+ end
992
+
993
+ snooze
994
+ assert_equal ['f1'], buffer
995
+
996
+ f1.raise 'foo'
997
+
998
+ 3.times { snooze }
999
+
1000
+ assert_equal ['f1', 'f1'], buffer
1001
+ assert_equal :dead, f1.state
1002
+
1003
+ # f1 should have been restarted by supervisor
1004
+ f1 = parent.children.first
1005
+ assert_kind_of Fiber, f1
1006
+ f1 << 'foo'
1007
+
1008
+ f1.await
1009
+ 3.times { snooze }
1010
+
1011
+ assert_equal ['f1', 'f1', 'foo'], buffer
1012
+ end
1013
+
1014
+ def test_supervise_with_block
1015
+ failed = []
1016
+ p = spin do
1017
+ supervise(on_error: :restart) { |f, e| failed << [f, e] }
1018
+ end
1019
+ snooze
1020
+ f1 = p.spin { receive }
1021
+ snooze
1022
+
1023
+ f1.raise 'foo'
1024
+ 3.times { snooze }
1025
+
1026
+ assert_equal 1, failed.size
1027
+ assert_equal f1, failed.first[0]
1028
+ assert_kind_of RuntimeError, failed.first[1]
1029
+ assert_equal 'foo', failed.first[1].message
1030
+ end
1031
+ end
@@ -40,6 +40,18 @@ class SpinTest < MiniTest::Test
40
40
  suspend
41
41
  assert_nil fiber.result
42
42
  end
43
+
44
+ def test_spin_without_tag
45
+ f = spin { }
46
+ assert_kind_of Fiber, f
47
+ assert_nil f.tag
48
+ end
49
+
50
+ def test_spin_with_tag
51
+ f = spin(:foo) { }
52
+ assert_kind_of Fiber, f
53
+ assert_equal :foo, f.tag
54
+ end
43
55
  end
44
56
 
45
57
  class ExceptionTest < MiniTest::Test
@@ -111,20 +123,6 @@ class MoveOnAfterTest < MiniTest::Test
111
123
  end
112
124
  end
113
125
 
114
- class SpinTest < MiniTest::Test
115
- def test_spin_without_tag
116
- f = spin { }
117
- assert_kind_of Fiber, f
118
- assert_nil f.tag
119
- end
120
-
121
- def test_spin_with_tag
122
- f = spin(:foo) { }
123
- assert_kind_of Fiber, f
124
- assert_equal :foo, f.tag
125
- end
126
- end
127
-
128
126
  class SpinLoopTest < MiniTest::Test
129
127
  def test_spin_loop
130
128
  buffer = []
@@ -195,6 +193,15 @@ class ThrottledLoopTest < MiniTest::Test
195
193
  end
196
194
 
197
195
  class GlobalAPIEtcTest < MiniTest::Test
196
+ def test_after
197
+ buffer = []
198
+ f = after(0.001) { buffer << 2 }
199
+ snooze
200
+ assert_equal [], buffer
201
+ sleep 0.001
202
+ assert_equal [2], buffer
203
+ end
204
+
198
205
  def test_every
199
206
  buffer = []
200
207
  f = spin do
@@ -21,6 +21,29 @@ class KernelTest < MiniTest::Test
21
21
  timer&.stop
22
22
  end
23
23
 
24
+ def patch_open3
25
+ class << Open3
26
+ alias_method :orig_popen2, :popen2
27
+ def popen2(*args)
28
+ raise SystemCallError, 'foo'
29
+ end
30
+ end
31
+ end
32
+
33
+ def unpatch_open3
34
+ class << Open3
35
+ alias_method :popen2, :orig_popen2
36
+ end
37
+ end
38
+
39
+ def test_system_method_with_system_call_error
40
+ patch_open3
41
+ result = system('foo')
42
+ assert_nil result
43
+ ensure
44
+ unpatch_open3
45
+ end
46
+
24
47
  def test_backtick_method
25
48
  counter = 0
26
49
  timer = spin { throttled_loop(200) { counter += 1 } }
@@ -85,7 +85,7 @@ class SignalTrapTest < Minitest::Test
85
85
  ensure
86
86
  o.close
87
87
  end
88
- sleep 0.01
88
+ sleep 0.02
89
89
  o.close
90
90
  watcher = Gyro::Child.new(pid)
91
91
  Process.kill('INT', pid)
@@ -50,7 +50,6 @@ class ThreadTest < MiniTest::Test
50
50
  buffer = []
51
51
  spin { (1..3).each { |i| snooze; buffer << i } }
52
52
  t = Thread.new { sleep 0.01; buffer << 4; :foo }
53
-
54
53
  r = t.await
55
54
 
56
55
  assert_equal [1, 2, 3, 4], buffer
@@ -92,16 +91,18 @@ class ThreadTest < MiniTest::Test
92
91
  lineno = __LINE__ + 1
93
92
  t = Thread.new { sleep 1 }
94
93
  str = format(
95
- "#<Thread:%d %s:%d (run)>",
94
+ "#<Thread:%d %s:%d",
96
95
  t.object_id,
97
96
  __FILE__,
98
97
  lineno,
99
98
  )
100
- assert_equal str, t.inspect
99
+ assert t.inspect =~ /#{str}/
101
100
  rescue => e
102
101
  p e
102
+ puts e.backtrace.join("\n")
103
103
  ensure
104
104
  t.kill
105
+ sleep 0.005
105
106
  t.join
106
107
  end
107
108
 
@@ -65,10 +65,10 @@ class ThreadPoolTest < MiniTest::Test
65
65
  end
66
66
  elapsed = Time.now - t0
67
67
 
68
- assert elapsed < 0.005
68
+ assert elapsed < 0.007
69
69
  assert buffer.size < 2
70
70
 
71
- sleep 0.05
71
+ sleep 0.08 # allow time for threads to spawn
72
72
  assert_equal @pool.size, threads.uniq.size
73
73
  assert_equal (0..9).to_a, buffer.sort
74
74
  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.32'
4
+ version: '0.33'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-29 00:00:00.000000000 Z
11
+ date: 2020-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: modulation
@@ -243,6 +243,7 @@ extra_rdoc_files:
243
243
  - README.md
244
244
  files:
245
245
  - ".gitbook.yaml"
246
+ - ".github/workflows/test.yml"
246
247
  - ".gitignore"
247
248
  - ".rubocop.yml"
248
249
  - ".vscode/launch.json"
@@ -402,6 +403,7 @@ files:
402
403
  - test/eg.rb
403
404
  - test/helper.rb
404
405
  - test/run.rb
406
+ - test/stress.rb
405
407
  - test/test_async.rb
406
408
  - test/test_ext.rb
407
409
  - test/test_fiber.rb
@@ -415,7 +417,7 @@ files:
415
417
  - test/test_throttler.rb
416
418
  - test/test_timer.rb
417
419
  - test/test_trace.rb
418
- homepage: https://dfab.gitbook.io/polyphony/
420
+ homepage: https://digital-fabric.github.io/polyphony
419
421
  licenses:
420
422
  - MIT
421
423
  metadata:
@@ -445,5 +447,5 @@ requirements: []
445
447
  rubygems_version: 3.0.6
446
448
  signing_key:
447
449
  specification_version: 4
448
- summary: 'Polyphony: Fiber-based Concurrency for Ruby'
450
+ summary: Fine grained concurrency for Ruby
449
451
  test_files: []