uringmachine 0.23.1 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,6 +18,7 @@ class MethodCallAuditor
18
18
  def respond_to?(sym, include_all = false) = @target.respond_to?(sym, include_all)
19
19
 
20
20
  def method_missing(sym, *args, &block)
21
+ # UM.debug({sym:}.inspect)
21
22
  res = @target.send(sym, *args, &block)
22
23
  @calls << ({ sym:, args:, res:})
23
24
  res
@@ -105,7 +106,7 @@ class FiberSchedulerTest < UMBaseTest
105
106
  io_read: 3,
106
107
  io_close: 1,
107
108
  join: 1
108
- }, @scheduler.calls.map { it[:sym] }.tally)
109
+ }, scheduler_calls_tally)
109
110
  ensure
110
111
  i.close rescue nil
111
112
  o.close rescue nil
@@ -128,7 +129,7 @@ class FiberSchedulerTest < UMBaseTest
128
129
  fiber: 1,
129
130
  io_read: 1,
130
131
  join: 1
131
- }, @scheduler.calls.map { it[:sym] }.tally)
132
+ }, scheduler_calls_tally)
132
133
  ensure
133
134
  i.close rescue nil
134
135
  o.close rescue nil
@@ -153,7 +154,7 @@ class FiberSchedulerTest < UMBaseTest
153
154
  fiber: 1,
154
155
  io_write: 1,
155
156
  join: 1
156
- }, @scheduler.calls.map { it[:sym] }.tally)
157
+ }, scheduler_calls_tally)
157
158
  ensure
158
159
  i.close rescue nil
159
160
  o.close rescue nil
@@ -174,7 +175,7 @@ class FiberSchedulerTest < UMBaseTest
174
175
  assert_equal({
175
176
  fiber: 1,
176
177
  join: 1
177
- }, @scheduler.calls.map { it[:sym] }.tally)
178
+ }, scheduler_calls_tally)
178
179
  ensure
179
180
  i.close rescue nil
180
181
  o.close rescue nil
@@ -201,7 +202,7 @@ class FiberSchedulerTest < UMBaseTest
201
202
  io_pread: 1,
202
203
  io_close: 1,
203
204
  join: 1
204
- }, @scheduler.calls.map { it[:sym] }.tally)
205
+ }, scheduler_calls_tally)
205
206
  ensure
206
207
  FileUtils.rm(fn) rescue nil
207
208
  end
@@ -227,7 +228,7 @@ class FiberSchedulerTest < UMBaseTest
227
228
  io_pwrite: 1,
228
229
  io_close: 1,
229
230
  join: 1
230
- }, @scheduler.calls.map { it[:sym] }.tally)
231
+ }, scheduler_calls_tally)
231
232
  ensure
232
233
  FileUtils.rm(fn) rescue nil
233
234
  end
@@ -250,7 +251,7 @@ class FiberSchedulerTest < UMBaseTest
250
251
  fiber: 2,
251
252
  kernel_sleep: 2,
252
253
  join: 1
253
- }, @scheduler.calls.map { it[:sym] }.tally)
254
+ }, scheduler_calls_tally)
254
255
  end
255
256
 
256
257
  def test_fiber_scheduler_block
@@ -275,7 +276,7 @@ class FiberSchedulerTest < UMBaseTest
275
276
  block: 1,
276
277
  unblock: 1,
277
278
  join: 1
278
- }, @scheduler.calls.map { it[:sym] }.tally)
279
+ }, scheduler_calls_tally)
279
280
  end
280
281
 
281
282
  def test_fiber_scheduler_process_wait
@@ -303,7 +304,7 @@ class FiberSchedulerTest < UMBaseTest
303
304
  fiber: 1,
304
305
  process_wait: 1,
305
306
  join: 1
306
- }, @scheduler.calls.map { it[:sym] }.tally)
307
+ }, scheduler_calls_tally)
307
308
  ensure
308
309
  if child_pid
309
310
  Process.wait(child_pid) rescue nil
@@ -337,7 +338,7 @@ class FiberSchedulerTest < UMBaseTest
337
338
  fiber: 2,
338
339
  io_wait: 1,
339
340
  join: 1
340
- }, @scheduler.calls.map { it[:sym] }.tally)
341
+ }, scheduler_calls_tally)
341
342
  ensure
342
343
  s1.close rescue nil
343
344
  s2.close rescue nil
@@ -362,11 +363,12 @@ class FiberSchedulerTest < UMBaseTest
362
363
  assert_equal({
363
364
  fiber: 2,
364
365
  blocking_operation_wait: 2,
366
+ io_write: 1,
365
367
  io_read: 2,
366
368
  io_close: 2,
367
369
  kernel_sleep: 1,
368
370
  join: 1
369
- }, @scheduler.calls.map { it[:sym] }.tally)
371
+ }, scheduler_calls_tally)
370
372
  ensure
371
373
  FileUtils.rm(fn) rescue nil
372
374
  end
@@ -381,7 +383,7 @@ class FiberSchedulerTest < UMBaseTest
381
383
  buf = nil
382
384
  Fiber.schedule do
383
385
  sleep 0.001
384
- File.open(fn, 'r') { buf = it.read }
386
+ File.open(fn, 'r') { buf = it.read }
385
387
  end
386
388
  assert_equal 2, machine.metrics[:total_ops]
387
389
  @scheduler.join
@@ -389,15 +391,74 @@ class FiberSchedulerTest < UMBaseTest
389
391
  assert_equal({
390
392
  fiber: 2,
391
393
  blocking_operation_wait: 2,
394
+ io_write: 1,
392
395
  io_read: 2,
393
396
  io_close: 2,
394
397
  kernel_sleep: 1,
395
398
  join: 1
396
- }, @scheduler.calls.map { it[:sym] }.tally)
399
+ }, scheduler_calls_tally)
397
400
  ensure
398
401
  FileUtils.rm(fn) rescue nil
399
402
  end
400
403
 
404
+ def test_fiber_scheduler_file_write_buffered
405
+ fn = "/tmp/um_#{SecureRandom.hex}"
406
+ Fiber.schedule do
407
+ File.open(fn, 'w') {
408
+ it << 'foo'
409
+ }
410
+ end
411
+ @scheduler.join
412
+ assert_equal 'foo', IO.read(fn)
413
+ assert_equal({
414
+ fiber: 1,
415
+ blocking_operation_wait: 1,
416
+ io_write: 1,
417
+ io_close: 1,
418
+ join: 1
419
+ }, scheduler_calls_tally)
420
+ end
421
+
422
+ def test_fiber_scheduler_file_write_buffered_flush
423
+ fn = "/tmp/um_#{SecureRandom.hex}"
424
+ Fiber.schedule do
425
+ File.open(fn, 'w') {
426
+ it << 'foo'
427
+ it.flush
428
+ it << 'bar'
429
+ }
430
+ end
431
+ @scheduler.join
432
+ assert_equal 'foobar', IO.read(fn)
433
+ assert_equal({
434
+ fiber: 1,
435
+ blocking_operation_wait: 1,
436
+ io_write: 2,
437
+ io_close: 1,
438
+ join: 1
439
+ }, scheduler_calls_tally)
440
+ end
441
+
442
+ def test_fiber_scheduler_file_write_unbuffered
443
+ # fn = "/tmp/um_#{SecureRandom.hex}"
444
+ fn = '/dev/null'
445
+ Fiber.schedule do
446
+ File.open(fn, 'w') {
447
+ it.sync = true
448
+ it << 'foo'
449
+ }
450
+ end
451
+ @scheduler.join
452
+ # assert_equal 'foo', IO.read(fn)
453
+ assert_equal({
454
+ fiber: 1,
455
+ blocking_operation_wait: 1, # open
456
+ io_write: 1,
457
+ io_close: 1,
458
+ join: 1
459
+ }, scheduler_calls_tally)
460
+ end
461
+
401
462
  def test_fiber_scheduler_mutex
402
463
  mutex = Mutex.new
403
464
 
@@ -432,7 +493,7 @@ class FiberSchedulerTest < UMBaseTest
432
493
  block: 1,
433
494
  unblock: 1,
434
495
  join: 1
435
- }, @scheduler.calls.map { it[:sym] }.tally)
496
+ }, scheduler_calls_tally)
436
497
  end
437
498
 
438
499
  def test_fiber_scheduler_queue_shift
@@ -458,7 +519,7 @@ class FiberSchedulerTest < UMBaseTest
458
519
  block: 1,
459
520
  unblock: 1,
460
521
  join: 1
461
- }, @scheduler.calls.map { it[:sym] }.tally)
522
+ }, scheduler_calls_tally)
462
523
  end
463
524
 
464
525
  def test_fiber_scheduler_queue_shift_with_timeout
@@ -481,7 +542,7 @@ class FiberSchedulerTest < UMBaseTest
481
542
  fiber: 2,
482
543
  block: 1,
483
544
  join: 1
484
- }, @scheduler.calls.map { it[:sym] }.tally)
545
+ }, scheduler_calls_tally)
485
546
  end
486
547
 
487
548
  def test_fiber_scheduler_thread_join
@@ -502,7 +563,7 @@ class FiberSchedulerTest < UMBaseTest
502
563
  block: 1,
503
564
  unblock: 1,
504
565
  join: 1
505
- }, @scheduler.calls.map { it[:sym] }.tally)
566
+ }, scheduler_calls_tally)
506
567
  end
507
568
 
508
569
  def test_fiber_scheduler_system
@@ -519,7 +580,7 @@ class FiberSchedulerTest < UMBaseTest
519
580
  fiber: 1,
520
581
  process_wait: 1,
521
582
  join: 1
522
- }, @scheduler.calls.map { it[:sym] }.tally)
583
+ }, scheduler_calls_tally)
523
584
  ensure
524
585
  Process.wait(0, Process::WNOHANG) rescue nil
525
586
  end
@@ -540,7 +601,7 @@ class FiberSchedulerTest < UMBaseTest
540
601
  io_read: 2,
541
602
  process_wait: 1,
542
603
  join: 1
543
- }, @scheduler.calls.map { it[:sym] }.tally)
604
+ }, scheduler_calls_tally)
544
605
  ensure
545
606
  Process.wait(0, Process::WNOHANG) rescue nil
546
607
  end
@@ -569,7 +630,7 @@ class FiberSchedulerTest < UMBaseTest
569
630
  blocking_operation_wait: 1,
570
631
  process_wait: 1,
571
632
  join: 1
572
- }, @scheduler.calls.map { it[:sym] }.tally)
633
+ }, scheduler_calls_tally)
573
634
  ensure
574
635
  Process.wait(0, Process::WNOHANG) rescue nil
575
636
  end
@@ -596,7 +657,7 @@ class FiberSchedulerTest < UMBaseTest
596
657
  io_read: 2,
597
658
  fiber_interrupt: 1,
598
659
  join: 1
599
- }, @scheduler.calls.map { it[:sym] }.tally)
660
+ }, scheduler_calls_tally)
600
661
  ensure
601
662
  r.close rescue nil
602
663
  w.close rescue nil
@@ -620,7 +681,7 @@ class FiberSchedulerTest < UMBaseTest
620
681
  blocking_operation_wait: 1,
621
682
  address_resolve: 1,
622
683
  join: 1
623
- }, @scheduler.calls.map { it[:sym] }.tally)
684
+ }, scheduler_calls_tally)
624
685
  end
625
686
 
626
687
  def test_fiber_scheduler_timeout_after
@@ -641,7 +702,7 @@ class FiberSchedulerTest < UMBaseTest
641
702
  timeout_after: 1,
642
703
  kernel_sleep: 1,
643
704
  join: 1
644
- }, @scheduler.calls.map { it[:sym] }.tally)
705
+ }, scheduler_calls_tally)
645
706
  end
646
707
 
647
708
  def test_fiber_scheduler_io_select
@@ -654,7 +715,7 @@ class FiberSchedulerTest < UMBaseTest
654
715
  end
655
716
  @machine.snooze
656
717
  w << 'foo'
657
- @machine.snooze
718
+ 2.times { @machine.snooze }
658
719
  assert_equal [[[r], [], []]], buf
659
720
  @machine.snooze
660
721
  @scheduler.join
@@ -718,7 +779,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
718
779
  blocking_operation_wait: 1,
719
780
  io_close: 1,
720
781
  join: 1
721
- }, @scheduler.calls.map { it[:sym] }.tally)
782
+ }, scheduler_calls_tally)
722
783
  end
723
784
 
724
785
  def test_IO_s_binwrite
@@ -732,9 +793,10 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
732
793
  assert_equal({
733
794
  fiber: 1,
734
795
  blocking_operation_wait: 1,
796
+ io_write: 1,
735
797
  io_close: 1,
736
798
  join: 1
737
- }, @scheduler.calls.map { it[:sym] }.tally)
799
+ }, scheduler_calls_tally)
738
800
  end
739
801
 
740
802
  def test_IO_s_copy_stream
@@ -751,7 +813,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
751
813
  blocking_operation_wait: 3,
752
814
  io_close: 2,
753
815
  join: 1
754
- }, @scheduler.calls.map { it[:sym] }.tally)
816
+ }, scheduler_calls_tally)
755
817
  ensure
756
818
  FileUtils.rm(fn2) rescue nil
757
819
  end
@@ -769,7 +831,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
769
831
  blocking_operation_wait: 1,
770
832
  io_close: 1,
771
833
  join: 1
772
- }, @scheduler.calls.map { it[:sym] }.tally)
834
+ }, scheduler_calls_tally)
773
835
  end
774
836
 
775
837
  def test_IO_s_popen
@@ -784,7 +846,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
784
846
  io_read: 2,
785
847
  io_close: 1,
786
848
  join: 1
787
- }, @scheduler.calls.map { it[:sym] }.tally)
849
+ }, scheduler_calls_tally)
788
850
  end
789
851
 
790
852
  def test_IO_s_read
@@ -800,7 +862,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
800
862
  blocking_operation_wait: 1,
801
863
  io_close: 1,
802
864
  join: 1
803
- }, @scheduler.calls.map { it[:sym] }.tally)
865
+ }, scheduler_calls_tally)
804
866
  end
805
867
 
806
868
  def test_IO_s_readlines
@@ -816,7 +878,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
816
878
  blocking_operation_wait: 1,
817
879
  io_close: 1,
818
880
  join: 1
819
- }, @scheduler.calls.map { it[:sym] }.tally)
881
+ }, scheduler_calls_tally)
820
882
  end
821
883
 
822
884
  def test_IO_s_select
@@ -831,7 +893,7 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
831
893
  fiber: 1,
832
894
  io_select: 1,
833
895
  join: 1
834
- }, @scheduler.calls.map { it[:sym] }.tally)
896
+ }, scheduler_calls_tally)
835
897
  ensure
836
898
  io.close rescue nil
837
899
  end
@@ -847,9 +909,10 @@ class FiberSchedulerIOClassMethodsTest < UMBaseTest
847
909
  assert_equal({
848
910
  fiber: 1,
849
911
  blocking_operation_wait: 1,
912
+ io_write: 1,
850
913
  io_close: 1,
851
914
  join: 1
852
- }, @scheduler.calls.map { it[:sym] }.tally)
915
+ }, scheduler_calls_tally)
853
916
  end
854
917
  end
855
918
 
@@ -883,7 +946,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
883
946
  fiber: 1,
884
947
  io_write: 1,
885
948
  join: 1
886
- }, @scheduler.calls.map { it[:sym] }.tally)
949
+ }, scheduler_calls_tally)
887
950
  end
888
951
 
889
952
  def test_IO_i_close
@@ -897,7 +960,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
897
960
  fiber: 1,
898
961
  io_close: 1,
899
962
  join: 1
900
- }, @scheduler.calls.map { it[:sym] }.tally)
963
+ }, scheduler_calls_tally)
901
964
  end
902
965
 
903
966
  def test_IO_i_close_read
@@ -910,7 +973,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
910
973
  assert_equal({
911
974
  fiber: 1,
912
975
  join: 1
913
- }, @scheduler.calls.map { it[:sym] }.tally)
976
+ }, scheduler_calls_tally)
914
977
  end
915
978
 
916
979
  def test_IO_i_close_write
@@ -923,7 +986,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
923
986
  assert_equal({
924
987
  fiber: 1,
925
988
  join: 1
926
- }, @scheduler.calls.map { it[:sym] }.tally)
989
+ }, scheduler_calls_tally)
927
990
  end
928
991
 
929
992
  def test_IO_i_each_byte
@@ -937,7 +1000,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
937
1000
  fiber: 1,
938
1001
  io_read: 2,
939
1002
  join: 1
940
- }, @scheduler.calls.map { it[:sym] }.tally)
1003
+ }, scheduler_calls_tally)
941
1004
  end
942
1005
 
943
1006
  def test_IO_i_each_char
@@ -951,7 +1014,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
951
1014
  fiber: 1,
952
1015
  io_read: 2,
953
1016
  join: 1
954
- }, @scheduler.calls.map { it[:sym] }.tally)
1017
+ }, scheduler_calls_tally)
955
1018
  end
956
1019
 
957
1020
  def test_IO_i_each_line
@@ -965,7 +1028,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
965
1028
  fiber: 1,
966
1029
  io_read: 3,
967
1030
  join: 1
968
- }, @scheduler.calls.map { it[:sym] }.tally)
1031
+ }, scheduler_calls_tally)
969
1032
  end
970
1033
 
971
1034
  def test_IO_i_getbyte
@@ -979,7 +1042,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
979
1042
  fiber: 1,
980
1043
  io_read: 1,
981
1044
  join: 1
982
- }, @scheduler.calls.map { it[:sym] }.tally)
1045
+ }, scheduler_calls_tally)
983
1046
  end
984
1047
 
985
1048
  def test_IO_i_getc
@@ -993,7 +1056,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
993
1056
  fiber: 1,
994
1057
  io_read: 1,
995
1058
  join: 1
996
- }, @scheduler.calls.map { it[:sym] }.tally)
1059
+ }, scheduler_calls_tally)
997
1060
  end
998
1061
 
999
1062
  def test_IO_i_gets
@@ -1007,7 +1070,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1007
1070
  fiber: 1,
1008
1071
  io_read: 2,
1009
1072
  join: 1
1010
- }, @scheduler.calls.map { it[:sym] }.tally)
1073
+ }, scheduler_calls_tally)
1011
1074
  end
1012
1075
 
1013
1076
  def test_IO_i_pread
@@ -1021,7 +1084,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1021
1084
  fiber: 1,
1022
1085
  io_pread: 1,
1023
1086
  join: 1
1024
- }, @scheduler.calls.map { it[:sym] }.tally)
1087
+ }, scheduler_calls_tally)
1025
1088
  end
1026
1089
 
1027
1090
  def test_IO_i_print
@@ -1036,7 +1099,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1036
1099
  fiber: 1,
1037
1100
  io_write: 3,
1038
1101
  join: 1
1039
- }, @scheduler.calls.map { it[:sym] }.tally)
1102
+ }, scheduler_calls_tally)
1040
1103
  end
1041
1104
 
1042
1105
  def test_IO_i_printf
@@ -1051,7 +1114,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1051
1114
  fiber: 1,
1052
1115
  io_write: 1,
1053
1116
  join: 1
1054
- }, @scheduler.calls.map { it[:sym] }.tally)
1117
+ }, scheduler_calls_tally)
1055
1118
  end
1056
1119
 
1057
1120
  def test_IO_i_putc
@@ -1066,7 +1129,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1066
1129
  fiber: 1,
1067
1130
  io_write: 1,
1068
1131
  join: 1
1069
- }, @scheduler.calls.map { it[:sym] }.tally)
1132
+ }, scheduler_calls_tally)
1070
1133
  end
1071
1134
 
1072
1135
  def test_IO_i_puts
@@ -1081,7 +1144,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1081
1144
  fiber: 1,
1082
1145
  io_write: 2,
1083
1146
  join: 1
1084
- }, @scheduler.calls.map { it[:sym] }.tally)
1147
+ }, scheduler_calls_tally)
1085
1148
  end
1086
1149
 
1087
1150
  def test_IO_i_pwrite
@@ -1096,7 +1159,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1096
1159
  fiber: 1,
1097
1160
  io_pwrite: 1,
1098
1161
  join: 1
1099
- }, @scheduler.calls.map { it[:sym] }.tally)
1162
+ }, scheduler_calls_tally)
1100
1163
  end
1101
1164
 
1102
1165
  def test_IO_i_read
@@ -1110,7 +1173,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1110
1173
  fiber: 1,
1111
1174
  io_read: 2,
1112
1175
  join: 1
1113
- }, @scheduler.calls.map { it[:sym] }.tally)
1176
+ }, scheduler_calls_tally)
1114
1177
  end
1115
1178
 
1116
1179
  def test_IO_i_readbyte
@@ -1124,7 +1187,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1124
1187
  fiber: 1,
1125
1188
  io_read: 1,
1126
1189
  join: 1
1127
- }, @scheduler.calls.map { it[:sym] }.tally)
1190
+ }, scheduler_calls_tally)
1128
1191
  end
1129
1192
 
1130
1193
  def test_IO_i_readchar
@@ -1138,7 +1201,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1138
1201
  fiber: 1,
1139
1202
  io_read: 1,
1140
1203
  join: 1
1141
- }, @scheduler.calls.map { it[:sym] }.tally)
1204
+ }, scheduler_calls_tally)
1142
1205
  end
1143
1206
 
1144
1207
  def test_IO_i_readline
@@ -1152,7 +1215,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1152
1215
  fiber: 1,
1153
1216
  io_read: 2,
1154
1217
  join: 1
1155
- }, @scheduler.calls.map { it[:sym] }.tally)
1218
+ }, scheduler_calls_tally)
1156
1219
  end
1157
1220
 
1158
1221
  def test_IO_i_readlines
@@ -1166,7 +1229,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1166
1229
  fiber: 1,
1167
1230
  io_read: 3,
1168
1231
  join: 1
1169
- }, @scheduler.calls.map { it[:sym] }.tally)
1232
+ }, scheduler_calls_tally)
1170
1233
  end
1171
1234
 
1172
1235
  def test_IO_i_readpartial
@@ -1180,7 +1243,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1180
1243
  fiber: 1,
1181
1244
  io_read: 1,
1182
1245
  join: 1
1183
- }, @scheduler.calls.map { it[:sym] }.tally)
1246
+ }, scheduler_calls_tally)
1184
1247
  end
1185
1248
 
1186
1249
  def test_IO_i_sysread
@@ -1194,7 +1257,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1194
1257
  fiber: 1,
1195
1258
  io_read: 1,
1196
1259
  join: 1
1197
- }, @scheduler.calls.map { it[:sym] }.tally)
1260
+ }, scheduler_calls_tally)
1198
1261
  end
1199
1262
 
1200
1263
  def test_IO_i_syswrite
@@ -1209,7 +1272,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1209
1272
  fiber: 1,
1210
1273
  io_write: 1,
1211
1274
  join: 1
1212
- }, @scheduler.calls.map { it[:sym] }.tally)
1275
+ }, scheduler_calls_tally)
1213
1276
  end
1214
1277
 
1215
1278
  def test_IO_i_wait
@@ -1223,7 +1286,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1223
1286
  fiber: 1,
1224
1287
  io_wait: 1,
1225
1288
  join: 1
1226
- }, @scheduler.calls.map { it[:sym] }.tally)
1289
+ }, scheduler_calls_tally)
1227
1290
  end
1228
1291
 
1229
1292
  def test_IO_i_wait_pipe_read_timeout
@@ -1238,7 +1301,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1238
1301
  fiber: 1,
1239
1302
  io_wait: 1,
1240
1303
  join: 1
1241
- }, @scheduler.calls.map { it[:sym] }.tally)
1304
+ }, scheduler_calls_tally)
1242
1305
  ensure
1243
1306
  r.close rescue nil
1244
1307
  w.close rescue nil
@@ -1255,7 +1318,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1255
1318
  fiber: 1,
1256
1319
  io_wait: 1,
1257
1320
  join: 1
1258
- }, @scheduler.calls.map { it[:sym] }.tally)
1321
+ }, scheduler_calls_tally)
1259
1322
  end
1260
1323
 
1261
1324
  def test_IO_i_wait_writable
@@ -1269,7 +1332,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1269
1332
  fiber: 1,
1270
1333
  io_wait: 1,
1271
1334
  join: 1
1272
- }, @scheduler.calls.map { it[:sym] }.tally)
1335
+ }, scheduler_calls_tally)
1273
1336
  end
1274
1337
 
1275
1338
  def test_IO_i_write
@@ -1284,7 +1347,7 @@ class FiberSchedulerIOInstanceMethodsTest < UMBaseTest
1284
1347
  fiber: 1,
1285
1348
  io_write: 1,
1286
1349
  join: 1
1287
- }, @scheduler.calls.map { it[:sym] }.tally)
1350
+ }, scheduler_calls_tally)
1288
1351
  end
1289
1352
  end
1290
1353
 
@@ -1317,14 +1380,12 @@ class FiberSchedulerQueueTest < UMBaseTest
1317
1380
  end
1318
1381
  }
1319
1382
  @scheduler.join
1320
- assert_equal({
1321
- fiber: 10,
1322
- kernel_sleep: 25,
1323
- yield: 25,
1324
- block: 25,
1325
- unblock: 25,
1326
- join: 1
1327
- }, @scheduler.calls.map { it[:sym] }.tally)
1383
+
1384
+ calls = scheduler_calls_tally
1385
+ assert_equal 10, calls[:fiber]
1386
+ assert_equal 25, calls[:kernel_sleep]
1387
+ assert_equal 25, calls[:yield]
1388
+ assert_equal 1, calls[:join]
1328
1389
  end
1329
1390
  end
1330
1391
 
@@ -1405,13 +1466,14 @@ class FiberSchedulerMultiPipeTest < UMBaseTest
1405
1466
  io_write: 1000,
1406
1467
  io_close: 10,
1407
1468
  join: 1
1408
- }, @scheduler.calls.map { it[:sym] }.tally)
1469
+ }, scheduler_calls_tally)
1409
1470
  ensure
1410
1471
  ios.each { it.close rescue nil }
1411
1472
  end
1412
1473
  end
1413
1474
 
1414
1475
  class FiberSchedulerMultiTCPTest < UMBaseTest
1476
+
1415
1477
  C = 10
1416
1478
  W = 10
1417
1479
  I = 10
@@ -1497,7 +1559,7 @@ class FiberSchedulerMultiTCPTest < UMBaseTest
1497
1559
  end
1498
1560
  end
1499
1561
  @machine.await_fibers(fibers)
1500
- @calls = @scheduler.calls.map { it[:sym] }.tally
1562
+ @calls = scheduler_calls_tally
1501
1563
  ensure
1502
1564
  # p ensure: ios
1503
1565
  ios.each { it.close rescue nil }
@@ -1525,3 +1587,53 @@ class FiberSchedulerMultiTCPTest < UMBaseTest
1525
1587
  }, @calls)
1526
1588
  end
1527
1589
  end
1590
+
1591
+ class FiberSchedulerErrorTest < UMBaseTest
1592
+ def setup
1593
+ super
1594
+ @raw_scheduler = UM::FiberScheduler.new(@machine)
1595
+ @scheduler = MethodCallAuditor.new(@raw_scheduler)
1596
+ Fiber.set_scheduler(@scheduler)
1597
+ end
1598
+
1599
+ def teardown
1600
+ Fiber.set_scheduler(nil)
1601
+ super
1602
+ end
1603
+
1604
+ def test_fiber_scheduler_io_read_error
1605
+ ret = nil
1606
+ Fiber.schedule do
1607
+ File.open(Dir.tmpdir, 'r') { it.read(42) }
1608
+ rescue => e
1609
+ ret = e
1610
+ end
1611
+ @scheduler.join
1612
+ assert_kind_of Errno::EISDIR, ret
1613
+ assert_equal({
1614
+ fiber: 1,
1615
+ io_read: 1,
1616
+ blocking_operation_wait: 3,
1617
+ io_close: 1,
1618
+ join: 1
1619
+ }, scheduler_calls_tally)
1620
+ end
1621
+
1622
+ def test_fiber_scheduler_io_write_error
1623
+ ret = nil
1624
+ r, w = IO.pipe
1625
+ r.close
1626
+ Fiber.schedule do
1627
+ w << 'foo'
1628
+ rescue => e
1629
+ ret = e
1630
+ end
1631
+ @scheduler.join
1632
+ assert_kind_of Errno::EPIPE, ret
1633
+ assert_equal({
1634
+ fiber: 1,
1635
+ io_write: 1,
1636
+ join: 1
1637
+ }, scheduler_calls_tally)
1638
+ end
1639
+ end