@@ -182,27 +182,6 @@ defmodule GenEventTest do
182
182
refute_received { :terminate , _ }
183
183
end
184
184
185
- defp hibernating? ( pid ) do
186
- Process . info ( pid , :current_function ) ==
187
- { :current_function , { :erlang , :hibernate , 3 } }
188
- end
189
-
190
- defp wait_until ( fun , counter \\ 0 ) do
191
- cond do
192
- counter > 100 ->
193
- flunk "Waited for 1s, but #{ inspect fun } never returned true"
194
- fun . ( ) ->
195
- true
196
- true ->
197
- receive after: ( 10 -> wait_until ( fun , counter + 1 ) )
198
- end
199
- end
200
-
201
- defp wake_up ( pid ) do
202
- send pid , :wake
203
- assert_receive { :info , :wake }
204
- end
205
-
206
185
test "hibernates" do
207
186
{ :ok , pid } = GenEvent . start ( )
208
187
:ok = GenEvent . add_handler ( pid , ReplyHandler , { self ( ) , :hibernate } )
@@ -483,4 +462,68 @@ defmodule GenEventTest do
483
462
after
484
463
Logger . add_backend ( :console , flush: true )
485
464
end
465
+
466
+ test ":sys.get_status/2" do
467
+ { :ok , pid } = GenEvent . start ( name: :my_gen_event_name )
468
+ :ok = GenEvent . add_handler ( pid , { ReplyHandler , :ok } , { self ( ) , true } )
469
+
470
+ self = self ( )
471
+ status = :sys . get_status ( pid )
472
+ GenEvent . stop ( pid )
473
+
474
+ assert { :status , ^ pid , { :module , GenEvent } ,
475
+ [ pdict , _ , ^ pid , [ ] , data ] } = status
476
+ assert pdict [ :"$ancestors" ] == [ self ( ) ]
477
+ assert pdict [ :"$initial_call" ] == { GenEvent , :init_it , 6 }
478
+ assert { 'Installed handlers' , [
479
+ { :handler , ReplyHandler , { ReplyHandler , :ok } , ^ self , nil , nil } ] } = data [ :items ]
480
+ end
481
+
482
+ test ":sys.get_state/1 and :sys.replace_state/2" do
483
+ { :ok , pid } = GenEvent . start_link ( name: :my_gen_event_name )
484
+ self = self ( )
485
+
486
+ assert [ ] = :sys . get_state ( pid )
487
+
488
+ :ok = GenEvent . add_handler ( pid , ReplyHandler , { self , true } )
489
+ assert [ { ReplyHandler , ReplyHandler , ^ self } ] = :sys . get_state ( pid )
490
+
491
+ replacer = fn { ReplyHandler , ReplyHandler , _ } -> { ReplyHandler , ReplyHandler , :unknown } end
492
+ :sys . replace_state ( pid , replacer )
493
+ assert [ { ReplyHandler , ReplyHandler , :unknown } ] = :sys . get_state ( pid )
494
+
495
+ # Fail while replacing does not cause a crash
496
+ :sys . replace_state ( pid , fn _ -> exit ( :fail ) end )
497
+ assert [ { ReplyHandler , ReplyHandler , :unknown } ] = :sys . get_state ( pid )
498
+
499
+ :ok = GenEvent . add_handler ( pid , { ReplyHandler , :ok } , { self , true } )
500
+ assert [ { ReplyHandler , { ReplyHandler , :ok } , ^ self } ,
501
+ { ReplyHandler , ReplyHandler , :unknown } ] = :sys . get_state ( pid )
502
+
503
+ :ok = :sys . suspend ( pid )
504
+ assert [ { ReplyHandler , { ReplyHandler , :ok } , ^ self } ,
505
+ { ReplyHandler , ReplyHandler , :unknown } ] = :sys . get_state ( pid )
506
+ :ok = :sys . resume ( pid )
507
+ end
508
+
509
+ defp hibernating? ( pid ) do
510
+ Process . info ( pid , :current_function ) ==
511
+ { :current_function , { :erlang , :hibernate , 3 } }
512
+ end
513
+
514
+ defp wait_until ( fun , counter \\ 0 ) do
515
+ cond do
516
+ counter > 100 ->
517
+ flunk "Waited for 1s, but #{ inspect fun } never returned true"
518
+ fun . ( ) ->
519
+ true
520
+ true ->
521
+ receive after: ( 10 -> wait_until ( fun , counter + 1 ) )
522
+ end
523
+ end
524
+
525
+ defp wake_up ( pid ) do
526
+ send pid , :wake
527
+ assert_receive { :info , :wake }
528
+ end
486
529
end
0 commit comments