Christoph Thiede uploaded a new version of SUnit to project The Inbox: http://source.squeak.org/inbox/SUnit-ct.129.mcz
==================== Summary ====================
Name: SUnit-ct.129 Author: ct Time: 24 September 2020, 10:42:52.868426 am UUID: 92e68d23-8472-5d48-96d3-8435bd56ac14 Ancestors: SUnit-pre.122
Proposal: Catch warnings and halts in test case execution as well as Errors.
Catching (Error, Warning, Halt) is a common pattern to be (relatively) sure that no debugger will occur during an operation. For related usages, see Morph >> #fullBounds, WorldState >> #displayWorldSafely:, and many other places. IMO it is no desired behavior that the whole test execution, i.e. in a TestRunner, is interrupted because any method under test contains a halt or raises a DeprecationWarning, for example. Instead, the test should be listed as red.
For a similar discussion, see https://github.com/hpi-swa/smalltalkCI/issues/470. I believe we already had talked about this on squeak-dev, but if I remember correctly, I cannot find the thread again.
=============== Diff against SUnit-pre.122 ===============
Item was changed: ----- Method: TestCase>>timeout:after: (in category 'private') ----- timeout: aBlock after: seconds "Evaluate the argument block. Time out if the evaluation is not complete after the given number of seconds. Handle the situation that a timeout may occur after a failure (during debug)"
| theProcess delay watchdog |
"the block will be executed in the current process" theProcess := Processor activeProcess. delay := Delay forSeconds: seconds.
"make a watchdog process" watchdog := [ delay wait. "wait for timeout or completion" theProcess ifNotNil:[ theProcess signalException: (TestFailure new messageText: 'Test timed out') ] ] newProcess.
"Watchdog needs to run at high priority to do its job (but not at timing priority)" watchdog priority: Processor timingPriority-1.
"catch the timeout signal" watchdog resume. "start up the watchdog" + ^[aBlock on: TestFailure, (Error, Warning, Halt) do: [:ex| - ^[aBlock on: TestFailure, Error, Halt do:[:ex| theProcess := nil. ex pass. ]] ensure:[ "evaluate the receiver" theProcess := nil. "it has completed, so ..." delay delaySemaphore signal. "arrange for the watchdog to exit" ]!
Item was added: + ----- Method: TestResult class>>exAllErrors (in category 'exceptions') ----- + exAllErrors + ^ self exError, Warning, Halt + !
Item was changed: ----- Method: TestResult>>runCase: (in category 'running') ----- runCase: aTestCase | testCasePassed timeToRun | testCasePassed := true.
[timeToRun := [aTestCase runCase] timeToRunWithoutGC] on: self class failure do: [:signal | failures add: aTestCase. testCasePassed := false. signal return: false] + on: self class exAllErrors - on: self class error do: [:signal | errors add: aTestCase. testCasePassed := false. signal return: false]. testCasePassed ifTrue: [passed add: aTestCase]. self durations at: aTestCase put: timeToRun.!