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.
> 


Reply via email to