RegressionTests__PipeStreamTest.st
author Claus Gittinger <cg@exept.de>
Thu, 14 Apr 2016 19:08:20 +0200
changeset 1393 50384f233a0f
parent 1289 e1b9697a5b5e
child 1447 2351db93aa5b
child 1476 cd772f7900fe
permissions -rw-r--r--
#DOCUMENTATION by cg class: RegressionTests::Win32OLETests changed: #test00_loadOLE

"{ Encoding: utf8 }"

"{ 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 isMSWINDOWSlike 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:[ 
                ok := false 
            ]
        ]
    ].

    threads timesRepeat:[
       | pipe rs ws|

        pipe := NonPositionableExternalStream makePipe.
        rs := pipe at:1.
        ws := pipe at:2.     

        (makeReader value: rs) fork.
        (makeWriter value: ws) fork.
    ].

    blocker wait.
    self assert: ok.

    "Created: / 27-03-2014 / 16:21:52 / 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$'
! !