Skip to content

Commit

Permalink
test sigAborts
Browse files Browse the repository at this point in the history
Jadeite doesn't handle multiple sessions cleanly so the test does it's best to clean up after itself.

Other sundry cleanups done, too.
  • Loading branch information
Eric Winger authored and Eric Winger committed Oct 12, 2021
1 parent 645320b commit d80ded2
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 14 deletions.
68 changes: 65 additions & 3 deletions sources/JadeiteProjectBrowserTestCase.cls
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ executeStringInOtherSession: string
| executionString |
executionString := '(UserGlobals at: #otherSession) '.
executionString := executionString , string.
session executeString: executionString!
^session executeString: executionString!

family: family ofNodesIn: presenter
| nodeFamily services |
Expand Down Expand Up @@ -122,11 +122,11 @@ loginOtherSession
session
executeString: 'UserGlobals at: #otherSession put: (GsExternalSession gemNRS: ''' , session gemNRS
, ''' stoneNRS: ''' , session stoneName
, ''' username: ''SystemUser'' password: ''swordfish'') login'!
, ''' username: ''SystemUser'' password: ''swordfish'') login'.!

logoutOtherSession
^session executeString: '
(UserGlobals at: #otherSession) logout.'!
(UserGlobals at: #otherSession) ifNotNil: [:sess | sess logout]'!

modifySampleMethodFoo

Expand All @@ -142,6 +142,14 @@ modifySampleMethodFoo
nextTabView
self projectsPresenter topShell cardsPresenter view cardLayout cycleNextCard!

nonSystemSessionCount
^session
executeString: '
(System currentSessions select:[:i |
| username |
username := ((System descriptionOfSession: i) at: 1) userId.
((username ~= ''GcUser'') and:[username ~=''SymbolUser''])]) size'!

packageNamed: aString
^self packageListPresenter list
detect: [:projectService | projectService name = aString]
Expand Down Expand Up @@ -213,6 +221,17 @@ selectVariableListEntryForcingEvent: variable
event value
ifTrue: [self variableListPresenter selection: (self variableListPresenter list at: index)]!

stopOtherSessions
session
executeString: '
| sessionsToStop |
sessionsToStop := System currentSessions select:[:i |
| username |
username := ((System descriptionOfSession: i) at: 1) userId.
((username ~= ''GcUser'') and:[(username ~=''SymbolUser'' and:[System session ~= i])])].
sessionsToStop do:[:i | System stopSession: i]'!

test_abortOnVariablesTab
self unloadSampleProject.
self commitTransaction. "if sample project was loaded and committed outside test, test will fail"
Expand Down Expand Up @@ -4628,6 +4647,46 @@ test_tabNames_projectsBrowserNotLost
index := 1.
self assert: (projectTabs at: index) arrangement equals: index printString , ' RowanSample1' "not affected by other tab"!

test_transactionModeSigAbortsListener
| previousTransactionMode previousSigAbortProcessInterval count secondSession |
self testsIssue: #issue889 withTitle: 'Support transaction modes & SIGABORT handling'.
[self nonSystemSessionCount = 1] whileFalse:
[self stopOtherSessions.
(Delay forMilliseconds: 10) wait].
self assert: self nonSystemSessionCount equals: 1.
previousTransactionMode := transcript transactionMode.
previousSigAbortProcessInterval := JadePresenter sigAbortProcessInterval.
JadePresenter sigAbortProcessInterval: 1.

[secondSession := JadeLogin allInstances first login. "should always be only one ... I hope"
self assert: secondSession ~~ session.
transcript basicTransactionMode: #manualBegin. "this will abort the current session and turn on the listener process"
self deny: JadePresenter inTransaction.
self deny: (session executeString: 'System inTransaction').
session executeString: 'UserGlobals at: #willBeRemovedOnAbort put: 1'.
count := 0.
[count < 750] whileTrue:
[secondSession
executeString: 'UserGlobals at: #ulp put: ((1 to: 50) collect:[:ea | Object new]). System commit'.
(Delay forMilliseconds: 20) wait.
count := count + 1].
count := 0.
[count > 2000] whileFalse:
[count := count + 1.
(Delay forMilliseconds: 10) wait].
self assertIsNil: (session executeString: 'UserGlobals at: #willBeRemovedOnAbort ifAbsent:[]')]
ensure:
[secondSession _library ifNotNil: [:lib | lib logoutSession: secondSession gciSessionId].
secondSession
gciSessionId: nil;
library: nil. "logout without triggering events"
GciSession current: session. "Jadeite isn't really setup for two sessions. Make sure our global session is the right one"
transcript basicTransactionMode: previousTransactionMode.
JadePresenter sigAbortProcessInterval: previousSigAbortProcessInterval.
self assert: (session executeString: 'System transactionMode') equals: previousTransactionMode.
self cloneRowanSample1.
self ensureRowanSample1Loaded]!

test_twoBrowsersAddedClassAppears
"if the same package is selected, a new class appears but the existing
class selection doesn't change"
Expand Down Expand Up @@ -5359,6 +5418,7 @@ waitForPresenter: presenter
!JadeiteProjectBrowserTestCase categoriesFor: #logoutOtherSession!public!support! !
!JadeiteProjectBrowserTestCase categoriesFor: #modifySampleMethodFoo!dirty project!private! !
!JadeiteProjectBrowserTestCase categoriesFor: #nextTabView!public!views! !
!JadeiteProjectBrowserTestCase categoriesFor: #nonSystemSessionCount!public!support! !
!JadeiteProjectBrowserTestCase categoriesFor: #packageNamed:!private!project support! !
!JadeiteProjectBrowserTestCase categoriesFor: #previousTabView!public!views! !
!JadeiteProjectBrowserTestCase categoriesFor: #projectList!private!project support! !
Expand All @@ -5370,6 +5430,7 @@ waitForPresenter: presenter
!JadeiteProjectBrowserTestCase categoriesFor: #saveTestClass!private! !
!JadeiteProjectBrowserTestCase categoriesFor: #selectCommentTab!private!selection! !
!JadeiteProjectBrowserTestCase categoriesFor: #selectVariableListEntryForcingEvent:!private! !
!JadeiteProjectBrowserTestCase categoriesFor: #stopOtherSessions!public!support! !
!JadeiteProjectBrowserTestCase categoriesFor: #test_abortOnVariablesTab!public!test variable tab!tests! !
!JadeiteProjectBrowserTestCase categoriesFor: #test_abortRemovesClassAndMethod!public!test class list! !
!JadeiteProjectBrowserTestCase categoriesFor: #test_abortRemovesProjectAndPackage!public!test class list! !
Expand Down Expand Up @@ -5583,6 +5644,7 @@ waitForPresenter: presenter
!JadeiteProjectBrowserTestCase categoriesFor: #test_tabNames!public!tests! !
!JadeiteProjectBrowserTestCase categoriesFor: #test_tabNames_projectsBrowser!public!tests! !
!JadeiteProjectBrowserTestCase categoriesFor: #test_tabNames_projectsBrowserNotLost!public!tests! !
!JadeiteProjectBrowserTestCase categoriesFor: #test_transactionModeSigAbortsListener!public!test transaction mode! !
!JadeiteProjectBrowserTestCase categoriesFor: #test_twoBrowsersAddedClassAppears!public!test two browsers!tests! !
!JadeiteProjectBrowserTestCase categoriesFor: #test_twoBrowsersAddedClassAppearsInHierarchy1!public!test two browsers!tests! !
!JadeiteProjectBrowserTestCase categoriesFor: #test_twoBrowsersAddedClassAppearsInHierarchy2!public!test two browsers!tests! !
Expand Down
2 changes: 1 addition & 1 deletion sources/JadeiteTestResource.cls
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ setUp
ifNil:
[MessageBox notify: 'GciSession current is nil. Login again.'.
Processor activeProcess terminate "There's not a good way to safely return without many subsequent errors. Just kill the test process."].
transcript := JadeiteTranscript allInstances detect: [:tran | tran gciSession == session] ifNone: [].
transcript := JadeiteTranscript allInstances detect: [:tran | tran gciSession == session] ifNone: [self halt].
self unloadSampleProject.
self cloneRowanSample1.
self ensureRowanSample1Loaded!
Expand Down
10 changes: 7 additions & 3 deletions sources/JadeiteTranscriptTestCase.cls
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ allTranscriptPresenters
browseMenu
^transcript view menuBar items detect: [:menu | '*Browse*' match: menu text] ifNone: []!

jadeitePrefsFilePath
^SessionManager current imageBase , 'Jadeite.prefs'!

menuItemIsEnabledInAllPresenters: aSymbol
| commandQuery |
self allTranscriptPresenters do:
Expand All @@ -37,7 +40,7 @@ menuItemIsEnabledInAllPresenters: aSymbol

removePreferencesFile
| path prefsExist |
path := SessionManager current imageBase , 'Jadeite.prefs'.
path := self jadeitePrefsFilePath.
prefsExist := File exists: path.
prefsExist
ifTrue:
Expand Down Expand Up @@ -571,12 +574,12 @@ test_openPreferencesFileCreatePrefsFile
TestMessageBox enableJadeiteTestMessageBox.
TestMessageBox plannedResult: #yes.
prefsWorkspace := prefsItem commandDescription performAgainst: transcript.
self assert: (File exists: path)]
self assert: (File exists: self jadeitePrefsFilePath)]
ensure:
[TestMessageBox disableJadeiteTestMessageBox.
prefsWorkspace view close.
self restoreBackupPrefsFile: prefsExist.
self assert: (File exists: path) equals: prefsExist]!
self assert: (File exists: self jadeitePrefsFilePath) equals: prefsExist]!

test_popupMenuHasBrowseClass
| browseClassItem |
Expand Down Expand Up @@ -786,6 +789,7 @@ writeToPrefsFile: string
[fileStream nextPutAll: string] ensure: [fileStream close]! !
!JadeiteTranscriptTestCase categoriesFor: #allTranscriptPresenters!private!support! !
!JadeiteTranscriptTestCase categoriesFor: #browseMenu!private!support!tests! !
!JadeiteTranscriptTestCase categoriesFor: #jadeitePrefsFilePath!private!support! !
!JadeiteTranscriptTestCase categoriesFor: #menuItemIsEnabledInAllPresenters:!private!support! !
!JadeiteTranscriptTestCase categoriesFor: #removePreferencesFile!private!support! !
!JadeiteTranscriptTestCase categoriesFor: #restoreBackupPrefsFile:!private!support!tests! !
Expand Down
18 changes: 11 additions & 7 deletions sources/Rowan UI Base.pax
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ package methodNames
add: #JadeNavigationInspector -> #setNewInspectedObject;
add: #JadePresenter -> #abortTransaction;
add: #JadePresenter -> #autoCommitExecutionString;
add: #JadePresenter -> #basicBeginTransaction;
add: #JadePresenter -> #basicCloneProject:root:;
add: #JadePresenter -> #beginTransaction;
add: #JadePresenter -> #browseBreakpoints;
Expand Down Expand Up @@ -2108,6 +2109,12 @@ abortTransaction
autoCommitExecutionString
^'RowanService autoCommit ifTrue:[System commitTransaction].'!

basicBeginTransaction
| answeringService |
answeringService := RowanAnsweringService new.
answeringService exec: 'System beginTransaction' session: gciSession.
self setInTransaction: answeringService session: gciSession!

basicCloneProject: path root: root
| service |
service := RowanProjectService new.
Expand All @@ -2124,11 +2131,7 @@ beginTransaction
all begin transaction in Jadeite pass through here"

(MessageBox confirm: 'Abort the current transaction and begin a new transaction?')
ifTrue:
[| answeringService |
answeringService := RowanAnsweringService new.
answeringService exec: 'System beginTransaction' session: gciSession.
self setInTransaction: answeringService session: gciSession]!
ifTrue: [self basicBeginTransaction]!

browseBreakpoints
^self class browseBreakpointsIn: self gciSession!
Expand Down Expand Up @@ -2308,7 +2311,7 @@ issueCommand: service
^self class issueCommand: service session: self gciSession!

listenForSigAborts: session
self sigAbortsProcessEnabled ifFalse:[^self].
self sigAbortsProcessEnabled ifFalse: [^self].
self
sigAbortsProcess: (
[
Expand All @@ -2318,7 +2321,7 @@ listenForSigAborts: session
session isValidSession
ifTrue:
[self abortTransaction.
self class setInTransaction: RowanAnsweringService new session: self]].
self class setInTransaction: RowanAnsweringService new session: session]].
(Delay forSeconds: self sigAbortProcessInterval) wait]
repeat]
forkAt: Processor userBackgroundPriority).
Expand Down Expand Up @@ -2440,6 +2443,7 @@ updateServices: services
BrowserUpdate current updateServices: services asSet asArray session: gciSession! !
!JadePresenter categoriesFor: #abortTransaction!public!transaction management! !
!JadePresenter categoriesFor: #autoCommitExecutionString!menu handlers support!public! !
!JadePresenter categoriesFor: #basicBeginTransaction!public!transaction management! !
!JadePresenter categoriesFor: #basicCloneProject:root:!menu handlers!private! !
!JadePresenter categoriesFor: #beginTransaction!public!transaction management! !
!JadePresenter categoriesFor: #browseBreakpoints!menu handlers!public! !
Expand Down

0 comments on commit d80ded2

Please sign in to comment.