@@ -59,6 +59,79 @@ def null_logger
5959 expect ( no_more_items ) . to be true
6060 end
6161
62+ it "stops promptly when stopped during a long start delay" do
63+ ran = Concurrent ::Event . new
64+ task = RepeatingTask . new ( 10 , 10 , -> { ran . set } , null_logger , "test" )
65+ task . start
66+ started_at = Time . now
67+ task . stop
68+ elapsed = Time . now - started_at
69+
70+ expect ( elapsed ) . to be < 1
71+ expect ( ran . set? ) . to be false
72+ end
73+
74+ it "stops promptly when stopped while waiting between runs" do
75+ ran = Concurrent ::Event . new
76+ task = RepeatingTask . new ( 10 , 0 , -> { ran . set } , null_logger , "test" )
77+ begin
78+ task . start
79+ expect ( ran . wait ( 1 ) ) . to be true
80+ started_at = Time . now
81+ task . stop
82+ elapsed = Time . now - started_at
83+
84+ expect ( elapsed ) . to be < 1
85+ ensure
86+ task . stop
87+ end
88+ end
89+
90+ it "can be stopped before it is started" do
91+ task = RepeatingTask . new ( 0.01 , 0 , -> { } , null_logger , "test" )
92+
93+ expect { task . stop } . not_to raise_error
94+ end
95+
96+ it "does not run the task if stopped before it is started" do
97+ ran = Concurrent ::Event . new
98+ task = RepeatingTask . new ( 0.01 , 0 , -> { ran . set } , null_logger , "test" )
99+ task . stop
100+ task . start
101+ begin
102+ expect ( ran . wait ( 0.1 ) ) . to be false
103+ ensure
104+ task . stop
105+ end
106+ end
107+
108+ it "can be stopped more than once" do
109+ task = RepeatingTask . new ( 10 , 0 , -> { } , null_logger , "test" )
110+ task . start
111+ task . stop
112+
113+ expect { task . stop } . not_to raise_error
114+ end
115+
116+ it "keeps running after the task raises an exception" do
117+ queue = Queue . new
118+ calls = 0
119+ task = RepeatingTask . new ( 0.01 , 0 ,
120+ -> {
121+ calls += 1
122+ queue << calls
123+ raise "boom" if calls == 1
124+ } ,
125+ null_logger , "test" )
126+ begin
127+ task . start
128+ expect ( queue . pop ) . to eq ( 1 )
129+ expect ( queue . pop ) . to eq ( 2 )
130+ ensure
131+ task . stop
132+ end
133+ end
134+
62135 it "can be stopped from within the task" do
63136 counter = 0
64137 stopped = Concurrent ::Event . new
0 commit comments