Skip to content

Commit 8cb9c2a

Browse files
committed
Simplify test error handler tracking
1 parent c336ee8 commit 8cb9c2a

File tree

6 files changed

+48
-333
lines changed

6 files changed

+48
-333
lines changed

testing/Project/Sources/Classes/TestRunner.4dm

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,6 @@ Function _prepareErrorHandlingStorage()
3737
Else
3838
Storage:C1525.testErrorHandlerProcesses.clear()
3939
End if
40-
41-
Storage:C1525.testErrorHandlerForwarding:=New shared object:C1526(\
42-
"local"; New shared object:C1526; \
43-
"global"; New shared object:C1526(\
44-
"handler"; ""; \
45-
"shouldForward"; False:C215; \
46-
"installedProcess"; 0\
47-
)\
48-
)
4940
End use
5041

5142
Function _runInternal()
@@ -93,15 +84,7 @@ Function _installErrorHandler() : Object
9384

9485
$currentProcess:=Current process:C322
9586

96-
var $registerOptions : Object
97-
$registerOptions:=New object:C1471(\
98-
"previousLocalHandler"; $previousErrorHandler; \
99-
"forwardLocal"; $shouldInstallLocal; \
100-
"previousGlobalHandler"; $previousGlobalHandler; \
101-
"forwardGlobal"; $shouldInstallGlobal\
102-
)
103-
104-
TestErrorHandlerRegisterProcess($currentProcess; $registerOptions)
87+
TestErrorHandlerRegisterProcess($currentProcess)
10588

10689
If ($shouldInstallGlobal)
10790
ON ERR CALL:C155("TestErrorHandler"; 1)
@@ -112,7 +95,6 @@ Function _installErrorHandler() : Object
11295
"installedLocalHandler"; $shouldInstallLocal; \
11396
"previousGlobalHandler"; $previousGlobalHandler; \
11497
"installedGlobalHandler"; $shouldInstallGlobal; \
115-
"installedNewHandler"; $shouldInstallLocal; \
11698
"processNumber"; $currentProcess\
11799
)
118100

@@ -124,17 +106,9 @@ Function _restoreErrorHandler($handlerState : Object)
124106
var $processNumber : Integer
125107
$processNumber:=$handlerState.processNumber || Current process:C322
126108

127-
var $unregisterOptions : Object
128-
$unregisterOptions:=New object:C1471(\
129-
"clearGlobal"; $handlerState.installedGlobalHandler\
130-
)
131-
132-
TestErrorHandlerUnregister($processNumber; $unregisterOptions)
133-
134-
var $restoreLocal : Boolean
135-
$restoreLocal:=($handlerState.installedLocalHandler#Null:C1517) ? $handlerState.installedLocalHandler : $handlerState.installedNewHandler
109+
TestErrorHandlerUnregister($processNumber)
136110

137-
If ($restoreLocal)
111+
If (Bool:C1537($handlerState.installedLocalHandler))
138112
var $previousErrorHandler : Text
139113
$previousErrorHandler:=$handlerState.previousHandler
140114

@@ -145,7 +119,7 @@ Function _restoreErrorHandler($handlerState : Object)
145119
End if
146120
End if
147121

148-
If ($handlerState.installedGlobalHandler)
122+
If (Bool:C1537($handlerState.installedGlobalHandler))
149123
var $previousGlobalHandler : Text
150124
$previousGlobalHandler:=$handlerState.previousGlobalHandler
151125

testing/Project/Sources/Classes/_ErrorHandlingTest.4dm

Lines changed: 18 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,9 @@ Function test_error_handler_initialization($t : cs:C1710.Testing)
1111
$t.assert.isNotNull($t; Storage:C1525.testErrors; "Error storage should be initialized")
1212
$t.assert.areEqual($t; Is collection:K8:32; Value type:C1509(Storage:C1525.testErrors); "Error storage should be a collection")
1313

14-
// Ensure forwarding state is set up
15-
$t.assert.isNotNull($t; Storage:C1525.testErrorHandlerForwarding; "Forwarding registry should be initialized")
16-
$t.assert.areEqual($t; Is object:K8:27; Value type:C1509(Storage:C1525.testErrorHandlerForwarding); "Forwarding registry should be an object")
17-
18-
Use (Storage:C1525.testErrorHandlerForwarding)
19-
$t.assert.isNotNull($t; Storage:C1525.testErrorHandlerForwarding.local; "Local forwarding map should exist")
20-
$t.assert.areEqual($t; Is object:K8:27; Value type:C1509(Storage:C1525.testErrorHandlerForwarding.local); "Local forwarding map should be an object")
21-
$t.assert.isNotNull($t; Storage:C1525.testErrorHandlerForwarding.global; "Global forwarding state should exist")
22-
$t.assert.areEqual($t; Is object:K8:27; Value type:C1509(Storage:C1525.testErrorHandlerForwarding.global); "Global forwarding state should be an object")
23-
End use
14+
// Ensure local process tracking is available
15+
$t.assert.isNotNull($t; Storage:C1525.testErrorHandlerProcesses; "Process tracking should be initialized")
16+
$t.assert.areEqual($t; Is collection:K8:32; Value type:C1509(Storage:C1525.testErrorHandlerProcesses); "Process tracking should be a collection")
2417

2518
Function test_error_information_structure($t : cs:C1710.Testing)
2619

@@ -110,66 +103,33 @@ Function test_register_process_tracking($t : cs:C1710.Testing)
110103
var $processNumber : Integer
111104
$processNumber:=98765
112105

113-
var $registerOptions : Object
114-
$registerOptions:=New object:C1471(\
115-
"previousLocalHandler"; "LegacyLocalHandler"; \
116-
"forwardLocal"; True:C214; \
117-
"previousGlobalHandler"; "LegacyGlobalHandler"; \
118-
"forwardGlobal"; True:C214\
119-
)
120-
121-
TestErrorHandlerRegisterProcess($processNumber; $registerOptions)
106+
TestErrorHandlerRegisterProcess($processNumber)
122107

123108
Use (Storage:C1525.testErrorHandlerProcesses)
124109
$t.assert.isTrue($t; Storage:C1525.testErrorHandlerProcesses.indexOf($processNumber)>=0; "Should register process for local error tracking")
125110
End use
126111

127-
Use (Storage:C1525.testErrorHandlerForwarding)
128-
var $localEntry : Object
129-
$localEntry:=Storage:C1525.testErrorHandlerForwarding.local[String:C10($processNumber)]
130-
$t.assert.isNotNull($t; $localEntry; "Should create local forwarding entry")
131-
If ($localEntry#Null:C1517)
132-
$t.assert.areEqual($t; "LegacyLocalHandler"; $localEntry.handler; "Should track previous local handler")
133-
$t.assert.isTrue($t; $localEntry.shouldForward; "Local forwarding should be enabled")
134-
End if
135-
136-
var $globalState : Object
137-
$globalState:=Storage:C1525.testErrorHandlerForwarding.global
138-
$t.assert.isNotNull($t; $globalState; "Should maintain global forwarding state")
139-
If ($globalState#Null:C1517)
140-
$t.assert.areEqual($t; "LegacyGlobalHandler"; $globalState.handler; "Should track previous global handler")
141-
$t.assert.isTrue($t; $globalState.shouldForward; "Global forwarding should be enabled")
142-
$t.assert.areEqual($t; $processNumber; $globalState.installedProcess; "Should record installing process")
143-
End if
144-
End use
112+
// Registering again should not duplicate entries
113+
TestErrorHandlerRegisterProcess($processNumber)
145114

146-
var $unregisterOptions : Object
147-
$unregisterOptions:=New object:C1471(\
148-
"clearGlobal"; True:C214\
149-
)
115+
Use (Storage:C1525.testErrorHandlerProcesses)
116+
var $occurrences : Integer
117+
$occurrences:=0
118+
var $index : Integer
119+
For ($index; 0; Storage:C1525.testErrorHandlerProcesses.length-1)
120+
If (Storage:C1525.testErrorHandlerProcesses[$index]=$processNumber)
121+
$occurrences+=1
122+
End if
123+
End for
124+
$t.assert.areEqual($t; 1; $occurrences; "Process should only be tracked once")
125+
End use
150126

151-
TestErrorHandlerUnregister($processNumber; $unregisterOptions)
127+
TestErrorHandlerUnregister($processNumber)
152128

153129
Use (Storage:C1525.testErrorHandlerProcesses)
154130
$t.assert.isFalse($t; Storage:C1525.testErrorHandlerProcesses.indexOf($processNumber)>=0; "Should remove process from tracking after unregister")
155131
End use
156132

157-
Use (Storage:C1525.testErrorHandlerForwarding)
158-
var $localEntryAfter : Object
159-
$localEntryAfter:=Storage:C1525.testErrorHandlerForwarding.local[String:C10($processNumber)]
160-
If ($localEntryAfter#Null:C1517)
161-
$t.assert.areEqual($t; ""; $localEntryAfter.handler; "Local handler reference should be cleared on unregister")
162-
$t.assert.isFalse($t; $localEntryAfter.shouldForward; "Local forwarding should be disabled on unregister")
163-
End if
164-
165-
var $globalStateAfter : Object
166-
$globalStateAfter:=Storage:C1525.testErrorHandlerForwarding.global
167-
If ($globalStateAfter#Null:C1517)
168-
$t.assert.isFalse($t; $globalStateAfter.shouldForward; "Global forwarding should be disabled after unregister")
169-
$t.assert.areEqual($t; 0; $globalStateAfter.installedProcess; "Global installer should reset after unregister")
170-
End if
171-
End use
172-
173133
Function test_testing_context_properties($t : cs:C1710.Testing)
174134

175135
// Verify the testing context has expected properties

testing/Project/Sources/Methods/ParallelTestWorker.4dm

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,6 @@ Case of
2424
$previousErrorHandler:=Method called on error:C704
2525
$shouldInstallHandler:=($previousErrorHandler#"TestErrorHandler")
2626

27-
var $registerOptions : Object
28-
$registerOptions:=New object:C1471(\
29-
"previousLocalHandler"; $previousErrorHandler; \
30-
"forwardLocal"; $shouldInstallHandler; \
31-
"previousGlobalHandler"; ""; \
32-
"forwardGlobal"; False:C215\
33-
)
34-
3527
var $handlerState : Object
3628
Use (Storage:C1525)
3729
If (Storage:C1525.parallelWorkerHandlerStates=Null:C1517)
@@ -44,22 +36,19 @@ Case of
4436
$handlerState:=New shared object:C1526(\
4537
"installed"; False:C215; \
4638
"changed"; False:C215; \
47-
"previousHandler"; ""; \
48-
"registered"; False:C215\
39+
"previousHandler"; ""\
4940
)
5041
Storage:C1525.parallelWorkerHandlerStates[$workerKey]:=$handlerState
5142
End if
5243
End use
5344

45+
TestErrorHandlerRegisterProcess(Current process:C322)
46+
5447
Use ($handlerState)
5548
If (Not:C34($handlerState.installed))
5649
$handlerState.previousHandler:=$previousErrorHandler
5750
$handlerState.changed:=$shouldInstallHandler
5851
$handlerState.installed:=True:C214
59-
If (Not:C34($handlerState.registered))
60-
TestErrorHandlerRegisterProcess(Current process:C322; $registerOptions)
61-
$handlerState.registered:=True:C214
62-
End if
6352
End if
6453
End use
6554

@@ -180,26 +169,19 @@ Case of
180169
End if
181170
End use
182171

172+
TestErrorHandlerUnregister(Current process:C322)
173+
183174
If ($handlerState#Null:C1517)
184175
var $shouldRestore : Boolean
185176
var $previousHandler : Text
186-
var $wasRegistered : Boolean
187177

188178
Use ($handlerState)
189179
$shouldRestore:=$handlerState.changed
190180
$previousHandler:=$handlerState.previousHandler
191181
$handlerState.installed:=False:C215
192182
$handlerState.changed:=False:C215
193-
$wasRegistered:=$handlerState.registered
194-
If ($handlerState.registered)
195-
$handlerState.registered:=False:C215
196-
End if
197183
End use
198184

199-
If ($wasRegistered)
200-
TestErrorHandlerUnregister(Current process:C322)
201-
End if
202-
203185
If ($shouldRestore)
204186
If ($previousHandler#"")
205187
ON ERR CALL:C155($previousHandler)
Lines changed: 5 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//%attributes = {}
22
// TestErrorHandler
33
// Global error handler for the testing framework
4-
// Captures runtime errors, stores metadata, and forwards to previous handlers when necessary
4+
// Captures runtime errors and records minimal metadata for later reporting
55

66
var $errorCode : Integer
77
var $errorText : Text
@@ -10,62 +10,21 @@ var $errorLine : Integer
1010
var $processNumber : Integer
1111
var $isLocalProcess : Boolean
1212
var $context : Text
13-
var $previousHandler : Text
14-
var $shouldForward : Boolean
1513

1614
$errorCode:=Error
1715
$errorText:=Error method
1816
$errorMethod:=Error formula
1917
$errorLine:=Error line
2018
$processNumber:=Current process:C322
2119
$isLocalProcess:=False:C215
22-
$previousHandler:=""
23-
$shouldForward:=False:C215
2420

2521
If (Storage:C1525.testErrorHandlerProcesses#Null:C1517)
2622
Use (Storage:C1525.testErrorHandlerProcesses)
27-
$isLocalProcess:=(Storage:C1525.testErrorHandlerProcesses.indexOf($processNumber)>=0)
28-
End use
29-
End if
30-
31-
var $forwardingState : Object
32-
Use (Storage:C1525)
33-
$forwardingState:=Storage:C1525.testErrorHandlerForwarding
34-
End use
35-
36-
If ($forwardingState#Null:C1517)
37-
If ($isLocalProcess)
38-
var $localMap : Object
39-
Use ($forwardingState)
40-
$localMap:=$forwardingState.local
41-
End use
42-
43-
If ($localMap#Null:C1517)
44-
var $localEntry : Object
45-
Use ($localMap)
46-
$localEntry:=$localMap[String:C10($processNumber)]
47-
End use
48-
49-
If ($localEntry#Null:C1517)
50-
Use ($localEntry)
51-
$previousHandler:=$localEntry.handler || ""
52-
$shouldForward:=Bool:C1537($localEntry.shouldForward)
53-
End use
54-
End if
55-
End if
56-
Else
57-
var $globalState : Object
58-
Use ($forwardingState)
59-
$globalState:=$forwardingState.global
60-
End use
61-
62-
If ($globalState#Null:C1517)
63-
Use ($globalState)
64-
$previousHandler:=$globalState.handler || ""
65-
$shouldForward:=Bool:C1537($globalState.shouldForward)
66-
End use
23+
If (Storage:C1525.testErrorHandlerProcesses.indexOf($processNumber)>=0)
24+
$isLocalProcess:=True:C214
25+
$context:="local"
6726
End if
68-
End if
27+
End use
6928
End if
7029

7130
$context:=Choose:C955($isLocalProcess; "local"; "global")
@@ -93,8 +52,4 @@ Use (Storage:C1525.testErrors)
9352
Storage:C1525.testErrors.push(OB Copy:C1225($errorInfo; ck shared:K85:29))
9453
End use
9554

96-
If ($shouldForward) && ($previousHandler#"") && ($previousHandler#"TestErrorHandler")
97-
EXECUTE METHOD:C1007($previousHandler)
98-
End if
99-
10055
// Continue execution - don't interrupt the test

0 commit comments

Comments
 (0)