may be I'm wrong but should:notTakeMoreThan: does not tell me that it is
forking a process.
So I would prefer it does not.
On Jul 26, 2011, at 7:06 PM, Igor Stasenko wrote:
> It forks a process for evaluating a block you passing.
> And it works quite well if there's no exception during block evaluation..
> but if there is, then it signals the TestFailure exception, not in a
> process who waits test to be finished,
> but in a process which forked.
> And then since there is no exception handler, it using default action,
> which just to open a debugger.
> In headless mode it leads to immediate quit from image and logging
> error report.
>
> Like following:
>
> THERE_BE_DRAGONS_HERE
> MessageNotUnderstood:
> NonInteractiveUIManager>>openDebuggerOn:context:label:contents:fullView:
> 26 July 2011 6:35:08 pm
>
> VM: unix - i686 - linux-gnu - Croquet Closure Cog VM [CoInterpreter
> VMMaker-oscog-IgorStasenko.108]
> Image: Pharo1.4a [Latest update: #14025]
>
> NonInteractiveUIManager(Object)>>doesNotUnderstand:
> #openDebuggerOn:context:label:contents:fullView:
> Receiver: a NonInteractiveUIManager
> Arguments and temporary variables:
> aMessage: openDebuggerOn: a Process in nil context:
> MethodContextTest(TestCase)...etc...
> exception: MessageNotUnderstood:
> NonInteractiveUIManager>>openDebuggerOn:contex...etc...
> resumeValue: nil
> Receiver's instance variables:
> uiManager: a MorphicUIManager
> doNotQuitOnRestart: false
>
>
> Debugger class>>openOn:context:label:contents:fullView:
> Receiver: Debugger
> Arguments and temporary variables:
> process: a Process in nil
> context: MethodContextTest(TestCase)>>signalFailure:
> title: 'TestFailure: Assertion failed'
> contentsStringOrNil: nil
> bool: false
> fullView: false
> Receiver's instance variables:
> superclass: CodeHolder
> methodDict: a
> MethodDictionary(#addOptionalButtonsTo:at:plus:->(Debugger>>#addO...etc...
> format: 168
> instanceVariables: #('interruptedProcess'
> 'interruptedController'
> 'contextStack...etc...
> organization: ('*Polymorph-Widgets'
> addOptionalButtonsTo:at:plus:
> buildMorphicN...etc...
> subclasses: nil
> name: #Debugger
> classPool: a Dictionary(#AlwaysOpenFullDebugger->false
> #ContextStackKeystrokes-...etc...
> sharedPools: nil
> environment: a SystemDictionary(lots of globals)
> category: #'Tools-Debugger'
> traitComposition: {}
> localSelectors: nil
>
>
> [:tool | ^ tool
> openOn: aProcess
> context: aContext
> label: aString
> contents: contents
> fullView: aBool] in
> ToolRegistry>>debug:context:label:contents:fullView:
> Receiver: a ToolRegistry
> Arguments and temporary variables:
> aProcess: Debugger
> aContext: a Process in nil
> aString: MethodContextTest(TestCase)>>signalFailure:
> contents: 'TestFailure: Assertion failed'
> aBool: nil
> tool: false
> Receiver's instance variables:
> tools: an IdentityDictionary(#basicInspector->BasicInspector
> #browser->[self de...etc...
> inspectorsMap: an
> IdentityDictionary(#CompiledMethod->#CompiledMethodInspector ...etc...
>
>
> ToolRegistry>>using:do:
> Receiver: a ToolRegistry
> Arguments and temporary variables:
> aToolName: #debugger
> aBlock: [:tool | ^ tool
> openOn: aProcess
> context: aContext
> label: aString...etc...
> tool: Debugger
> Receiver's instance variables:
> tools: an IdentityDictionary(#basicInspector->BasicInspector
> #browser->[self de...etc...
> inspectorsMap: an
> IdentityDictionary(#CompiledMethod->#CompiledMethodInspector ...etc...
>
>
> ToolRegistry>>debug:context:label:contents:fullView:
> Receiver: a ToolRegistry
> Arguments and temporary variables:
> aProcess: a Process in nil
> aContext: MethodContextTest(TestCase)>>signalFailure:
> aString: 'TestFailure: Assertion failed'
> contents: nil
> aBool: false
> Receiver's instance variables:
> tools: an IdentityDictionary(#basicInspector->BasicInspector
> #browser->[self de...etc...
> inspectorsMap: an
> IdentityDictionary(#CompiledMethod->#CompiledMethodInspector ...etc...
>
>
> Process>>debug:title:full:
> Receiver: a Process in nil
> Arguments and temporary variables:
> context: MethodContextTest(TestCase)>>signalFailure:
> title: 'TestFailure: Assertion failed'
> bool: false
> topCtxt: Process>>debug:title:full:
> Receiver's instance variables:
> nextLink: nil
> suspendedContext: nil
> priority: 40
> myList: nil
> threadId: nil
> errorHandler: nil
> name: 'Process to evaluate should:
> notTakeMoreThanMilliseconds:'
> env: nil
>
>
> Process>>debug:title:
> Receiver: a Process in nil
> Arguments and temporary variables:
> context: MethodContextTest(TestCase)>>signalFailure:
> title: 'TestFailure: Assertion failed'
> Receiver's instance variables:
> nextLink: nil
> suspendedContext: nil
> priority: 40
> myList: nil
> threadId: nil
> errorHandler: nil
> name: 'Process to evaluate should:
> notTakeMoreThanMilliseconds:'
> env: nil
>
>
> TestFailure>>defaultAction
> Receiver: TestFailure: Assertion failed
> Arguments and temporary variables:
>
> Receiver's instance variables:
> messageText: 'Assertion failed'
> tag: nil
> signaler: MethodContextTest>>#testClosureRestart
> signalContext: TestFailure(Exception)>>signal
> handlerContext: nil
> outerContext: nil
>
> ....
>
>
> This happens when you run a
> MethodContextTest>>#testClosureRestart
> on Cog VM.
>
> Why it fails is another story :)
> But we need to fix the tester somehow, in order to continue running
> rest of tests instead of quitting to OS.
>
> The problem is that "aBlock value" which signals the exception should
> be wrapped by exception handler.
> And then #should:notTakeMoreThan: should report that exception to the
> main process which runs the test.
> So, a failure would be either due to timeout or due to failing running
> the code without exceptions.
>
> Any suggestions?
>
> --
> Best regards,
> Igor Stasenko AKA sig.
>