RegressionTests::PipeStreamTest>>testPipeWriteRead refactored.
Name the threads so they can be identified when debugging.
"{ Package: 'exept:regression' }"
"{ NameSpace: RegressionTests }"
TestCase subclass:#PipeStreamTest
instanceVariableNames:''
classVariableNames:''
poolDictionaries:''
category:'tests-Regression-Streams'
!
!PipeStreamTest methodsFor:'tests'!
testPipeWriteRead
| makeReader makeWriter count threads ok blocker |
count := 1000.
threads := 200.
"/ There's limit to 50 open files in BCC5.5 libc, sigh.
(OperatingSystem getCCDefine = '__BORLANDC__') ifTrue:[
threads := 20.
].
ok := true.
blocker := Semaphore new: 2 - threads.
makeReader := [ :stream |
[
| c |
c := 0.
[ stream atEnd ] whileFalse:[
stream next.
c := c + 1.
].
ok := ok and:[ count == c ].
blocker signal.
].
].
makeWriter := [ :stream |
[
[ count timesRepeat:[stream nextPut: $P] ] on: Error do:[ :ex |
Transcript showCR: 'ERROR in writer: ', ex description.
ex suspendedContext fullPrintOn: Transcript.
ok := false
] ensure:[
stream close.
]
]
].
2 to: threads do:[:i |
| pipe rs rp ws wp |
pipe := NonPositionableExternalStream makePipe.
rs := pipe at:1.
ws := pipe at:2.
rp := (makeReader value: rs) newProcess.
rp name: i printString , ' R ' , testSelector.
wp := (makeWriter value: ws) newProcess.
wp name: i printString , ' W ' , testSelector.
rp resume.
wp resume.
].
blocker wait.
self assert: ok.
"Created: / 27-03-2014 / 16:21:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 28-12-2015 / 13:17:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
testReadCheckPipe4
"readCheck a pipe.
Do this and interrupt the reading thread heavily"
| s p count nLoop|
nLoop := 1000.
"/ self createTestFile.
s := PipeStream readingFrom:'sleep 5'.
p := [
s readWait.
'readWait finished' printCR.
] forkAt:7.
count := 0.
[p isDead] whileFalse:[
Delay waitForMilliseconds:5.
p interruptWith:[count := count + 1].
].
('readWait interrupted <1p> times' expandMacrosWith:count) printCR.
s close.
"
self new testReadCheckPipe4
"
"Modified: / 12.8.1998 / 13:42:13 / cg"
!
testReadCheckPipe5
"readCheck a pipe.
Do this and interrupt the reading thread heavily"
| s p count nLoop|
nLoop := 1000.
"/ self createTestFile.
s := PipeStream readingFrom:'sleep 5; echo hello'.
p := [
s readWait.
'readWait finished' printCR.
] forkAt:7.
count := 0.
[p isDead] whileFalse:[
Delay waitForMilliseconds:5.
p interruptWith:[count := count + 1].
].
('readWait interrupted <1p> times' expandMacrosWith:count) printCR.
s close.
"
self new testReadCheckPipe5
"
"Modified: / 12.8.1998 / 13:42:13 / cg"
!
testReadPipe6
"read a pipe.
Do this and interrupt the reading thread heavily"
| s p count nLoop error |
error := nil.
nLoop := 1000.
"/ self createTestFile.
s := PipeStream readingFrom:'sleep 5'.
p := [
[
'read: ' print. s nextLine printCR.
] on: Error do:[:ex|
error := ex.
]
] forkAt:7.
count := 0.
[p isDead] whileFalse:[
Delay waitForMilliseconds:5.
p interruptWith:[count := count + 1].
].
('read interrupted <1p> times' expandMacrosWith:count) printCR.
s close.
self assert: error isNil
"
self new testReadPipe6
"
"Modified: / 12.8.1998 / 13:42:13 / cg"
!
testReadPipe7
"read a pipe.
Do this and interrupt the reading thread heavily"
|s p count nLoop error |
nLoop := 1000.
"/ self createTestFile.
s := PipeStream readingFrom:'sleep 5; echo hello'.
p := [
[
'read: ' print. s nextLine printCR.
] on: Error do:[:ex|
error := ex.
]
] forkAt:7.
count := 0.
[p isDead] whileFalse:[
Delay waitForMilliseconds:5.
p interruptWith:[count := count + 1].
].
('read interrupted <1p> times' expandMacrosWith:count) printCR.
s close.
self assert: error isNil
"
self test7
"
"Modified: / 12.8.1998 / 13:42:13 / cg"
! !
!PipeStreamTest class methodsFor:'documentation'!
version
^ '$Header$'
!
version_HG
^ '$Changeset: <not expanded> $'
! !