@@ -143,7 +143,7 @@ defmodule ExUnit.Runner do
143
143
{ case_pid , case_ref } =
144
144
spawn_monitor ( fn ->
145
145
case exec_case_setup ( test_case ) do
146
- { :ok , { test_case , context } } ->
146
+ { :ok , test_case , context } ->
147
147
Enum . each ( tests , & run_test ( config , & 1 , context ) )
148
148
test_case = exec_case_teardown ( test_case , context )
149
149
send self_pid , { self , :case_finished , test_case , [ ] }
@@ -164,7 +164,7 @@ defmodule ExUnit.Runner do
164
164
165
165
defp exec_case_setup ( % ExUnit.TestCase { name: case_name } = test_case ) do
166
166
{ :ok , context } = case_name . __ex_unit__ ( :setup_all , % { case: case_name } )
167
- { :ok , { test_case , context } }
167
+ { :ok , test_case , context }
168
168
catch
169
169
kind , error ->
170
170
failed = { :failed , { kind , Exception . normalize ( kind , error ) , pruned_stacktrace } }
@@ -195,14 +195,13 @@ defmodule ExUnit.Runner do
195
195
196
196
{ test_pid , test_ref } =
197
197
spawn_monitor ( fn ->
198
- Process . put ( ExUnit.Runner.Pid , self_pid )
198
+ ExUnit.OnExitHandler . register ( self )
199
+
199
200
{ us , test } =
200
201
:timer . tc ( fn ->
201
202
case exec_test_setup ( test , context ) do
202
- { :ok , { test , context } } ->
203
- if nil? ( test . state ) do
204
- test = exec_test ( test , context )
205
- end
203
+ { :ok , test , context } ->
204
+ test = exec_test ( test , context )
206
205
exec_test_teardown ( test , context )
207
206
{ :error , test } ->
208
207
test
@@ -212,34 +211,23 @@ defmodule ExUnit.Runner do
212
211
send self_pid , { self , :test_finished , % { test | time: us } }
213
212
end )
214
213
215
- loop_test ( test , test_pid , test_ref , HashDict . new )
216
- end
217
-
218
- defp loop_test ( test , test_pid , test_ref , on_exit_callbacks ) do
219
- receive do
220
- { ^ test_pid , :register_on_exit_callback , ref , callback } ->
221
- on_exit_callbacks = Dict . put ( on_exit_callbacks , ref , callback )
222
- send ( test_pid , { :registered_on_exit_callback , ref } )
223
- loop_test ( test , test_pid , test_ref , on_exit_callbacks )
224
- { ^ test_pid , :test_finished , test } ->
225
- on_exit_state = exec_on_exit_callbacks ( on_exit_callbacks )
226
- if nil? ( test . state ) do
227
- % { test | state: on_exit_state }
228
- else
214
+ test =
215
+ receive do
216
+ { ^ test_pid , :test_finished , test } ->
229
217
test
230
- end
231
- { :DOWN , ^ test_ref , :process , ^ test_pid , error } ->
232
- exec_on_exit_callbacks ( on_exit_callbacks )
233
- % { test | state: { :failed , { { :EXIT , test_pid } , error , [ ] } } }
234
- end
218
+ { :DOWN , ^ test_ref , :process , ^ test_pid , error } ->
219
+ % { test | state: { :failed , { { :EXIT , test_pid } , error , [ ] } } }
220
+ end
221
+
222
+ exec_on_exit ( test , test_pid )
235
223
end
236
224
237
225
defp exec_test_setup ( % ExUnit.Test { case: case } = test , context ) do
238
226
{ :ok , context } = case . __ex_unit__ ( :setup , context )
239
- { :ok , { test , context } }
227
+ { :ok , test , context }
240
228
catch
241
229
kind2 , error2 ->
242
- failed = { :failed , { kind2 , Exception . normalize ( kind2 , error2 ) , pruned_stacktrace } }
230
+ failed = { :failed , { kind2 , Exception . normalize ( kind2 , error2 ) , pruned_stacktrace ( ) } }
243
231
{ :error , % { test | state: failed } }
244
232
end
245
233
@@ -248,7 +236,7 @@ defmodule ExUnit.Runner do
248
236
test
249
237
catch
250
238
kind , error ->
251
- failed = { :failed , { kind , Exception . normalize ( kind , error ) , pruned_stacktrace } }
239
+ failed = { :failed , { kind , Exception . normalize ( kind , error ) , pruned_stacktrace ( ) } }
252
240
% { test | state: failed }
253
241
end
254
242
@@ -257,66 +245,20 @@ defmodule ExUnit.Runner do
257
245
test
258
246
catch
259
247
kind , error ->
260
- if nil? ( test . state ) do
261
- % { test | state: { :failed , { kind , Exception . normalize ( kind , error ) , pruned_stacktrace } } }
262
- else
263
- test
264
- end
248
+ state = test . state || { :failed , { kind , Exception . normalize ( kind , error ) , pruned_stacktrace ( ) } }
249
+ % { test | state: state }
265
250
end
266
251
267
- defp exec_on_exit_callbacks ( callbacks ) do
268
- { runner_pid , runner_monitor , callback_state } = Enum . reduce Dict . values ( callbacks ) , { nil , nil , nil } , fn ( callback , { runner_pid , runner_monitor , callback_state } ) ->
269
- { runner_pid , runner_monitor } = ensure_alive_callback_runner ( runner_pid , runner_monitor )
270
- send ( runner_pid , { :run , self ( ) , callback } )
271
- receive do
272
- { ^ runner_pid , nil } -> { runner_pid , runner_monitor , callback_state }
273
- { ^ runner_pid , error } ->
274
- if nil? ( callback_state ) do
275
- { runner_pid , runner_monitor , error }
276
- else
277
- { runner_pid , runner_monitor , callback_state }
278
- end
279
- { :DOWN , ^ runner_monitor , :process , ^ runner_pid , error } ->
280
- if nil? ( callback_state ) do
281
- { nil , nil , { :failed , { { :EXIT , runner_pid } , error , [ ] } } }
282
- else
283
- { nil , nil , callback_state }
284
- end
285
- end
286
- end
287
-
288
- if is_pid ( runner_pid ) and Process . alive? ( runner_pid ) do
289
- send ( runner_pid , :shutdown )
290
- receive do
291
- { :DOWN , ^ runner_monitor , :process , ^ runner_pid , _error } -> :ok
292
- end
293
- end
294
-
295
- callback_state
296
- end
297
-
298
- defp ensure_alive_callback_runner ( nil , nil ) , do: spawn_monitor ( __MODULE__ , :on_exit_runner_loop , [ ] )
299
- defp ensure_alive_callback_runner ( runner_pid , runner_monitor ) , do: { runner_pid , runner_monitor }
300
-
301
- def on_exit_runner_loop do
302
- receive do
303
- { :run , from , fun } ->
304
- result = exec_on_exit_callback ( fun )
305
- send ( from , { self ( ) , result } )
306
- on_exit_runner_loop ( )
307
- :shutdown -> :ok
252
+ defp exec_on_exit ( test , test_pid ) do
253
+ case ExUnit.OnExitHandler . run ( test_pid ) do
254
+ :ok ->
255
+ test
256
+ { kind , reason , stack } ->
257
+ state = test . state || { :failed , { kind , reason , prune_stacktrace ( stack ) } }
258
+ % { test | state: state }
308
259
end
309
260
end
310
261
311
- defp exec_on_exit_callback ( callback ) do
312
- callback . ( )
313
- nil
314
- catch
315
- kind , error ->
316
- { :failed , { kind , Exception . normalize ( kind , error ) , pruned_stacktrace } }
317
- end
318
-
319
-
320
262
## Helpers
321
263
322
264
defp shuffle ( % { seed: 0 } , list ) do
0 commit comments