RegressionTests__FileStreamTest.st
branchjv
changeset 1500 d406a10b2965
parent 1499 26a16a04219b
parent 1447 2351db93aa5b
child 1604 550ad2d68e2a
equal deleted inserted replaced
1499:26a16a04219b 1500:d406a10b2965
    11 
    11 
    12 
    12 
    13 !FileStreamTest methodsFor:'cleanup'!
    13 !FileStreamTest methodsFor:'cleanup'!
    14 
    14 
    15 tearDown
    15 tearDown
    16     self testFilename remove   
    16     self testFilename remove
    17 ! !
    17 ! !
    18 
    18 
    19 !FileStreamTest methodsFor:'helpers'!
    19 !FileStreamTest methodsFor:'helpers'!
    20 
    20 
    21 createBigDirectoryWithManyFiles
    21 createBigDirectoryWithManyFiles
    22     "create a directory with 20000 files"
    22     "create a directory with 20000 files"
    23 
    23 
    24     'c:\tmp' asFilename exists ifFalse:[
    24     'c:\tmp' asFilename exists ifFalse:[
    25         'c:\tmp' asFilename makeDirectory
    25 	'c:\tmp' asFilename makeDirectory
    26     ].
    26     ].
    27     'c:\tmp\BigDirectory' asFilename exists ifFalse:[
    27     'c:\tmp\BigDirectory' asFilename exists ifFalse:[
    28         'c:\tmp\BigDirectory' asFilename makeDirectory
    28 	'c:\tmp\BigDirectory' asFilename makeDirectory
    29     ].
    29     ].
    30 
    30 
    31     1 to:20000 do:[:i|
    31     1 to:20000 do:[:i|
    32        |f s buffer|
    32        |f s buffer|
    33        f :='c:\tmp\BigDirectory' asFilename 
    33        f :='c:\tmp\BigDirectory' asFilename
    34                     construct:(i printString leftPaddedTo:5 with:$0).
    34 		    construct:(i printString leftPaddedTo:5 with:$0).
    35        s := f writeStream binary.
    35        s := f writeStream binary.
    36        buffer := ByteArray new:1024. 
    36        buffer := ByteArray new:1024.
    37        32 timesRepeat:[ s nextPutAll:buffer ].
    37        32 timesRepeat:[ s nextPutAll:buffer ].
    38        s close.
    38        s close.
    39     ].
    39     ].
    40 
    40 
    41     "
    41     "
    51     |f bytes|
    51     |f bytes|
    52 
    52 
    53     f := self testFilename writeStream binary.
    53     f := self testFilename writeStream binary.
    54     bytes := ByteArray new:1024.
    54     bytes := ByteArray new:1024.
    55     1 to:bytes size do:[:i |
    55     1 to:bytes size do:[:i |
    56         bytes at:i put:(i \\ 256).
    56 	bytes at:i put:(i \\ 256).
    57     ].
    57     ].
    58 
    58 
    59     100 timesRepeat:[
    59     100 timesRepeat:[
    60         f nextPutAll:bytes.
    60 	f nextPutAll:bytes.
    61     ].
    61     ].
    62 
    62 
    63     f close.
    63     f close.
    64 
    64 
    65     "
    65     "
    75 
    75 
    76     |file s sz buffer byte|
    76     |file s sz buffer byte|
    77 
    77 
    78     buffer := ByteArray new:size.
    78     buffer := ByteArray new:size.
    79     1 to:buffer size do:[:idx |
    79     1 to:buffer size do:[:idx |
    80         buffer at:idx put:(idx \\ 256)
    80 	buffer at:idx put:(idx \\ 256)
    81     ].
    81     ].
    82 
    82 
    83     file := Filename newTemporary.
    83     file := Filename newTemporary.
    84     s := file writeStream.
    84     s := file writeStream.
    85 
    85 
    91     sz ~= size ifTrue:[self error:'size mismatch'].
    91     sz ~= size ifTrue:[self error:'size mismatch'].
    92 
    92 
    93     s := file readStream.
    93     s := file readStream.
    94     s binary.
    94     s binary.
    95     1 to:size do:[:idx |
    95     1 to:size do:[:idx |
    96         byte := s next.
    96 	byte := s next.
    97         byte ~~ (idx \\ 256) ifTrue:[self error:'read data mismatch'].
    97 	byte ~~ (idx \\ 256) ifTrue:[self error:'read data mismatch'].
    98     ].
    98     ].
    99     s close.
    99     s close.
   100 
   100 
   101     (file binaryContentsOfEntireFile ~= buffer) ifTrue:[
   101     (file binaryContentsOfEntireFile ~= buffer) ifTrue:[
   102         self error:'read data mismatch2'
   102 	self error:'read data mismatch2'
   103     ].
   103     ].
   104     file delete.
   104     file delete.
   105 
   105 
   106     "
   106     "
   107      self testWrite:1024
   107      self testWrite:1024
   116     f := self testFilename readStream binary.
   116     f := self testFilename readStream binary.
   117     buffer := ByteArray new:128.
   117     buffer := ByteArray new:128.
   118 
   118 
   119     n := 0.
   119     n := 0.
   120     [f atEnd] whileFalse:[
   120     [f atEnd] whileFalse:[
   121         nRead := f nextBytes:128 into:buffer.
   121 	nRead := f nextBytes:128 into:buffer.
   122         n := n + nRead.
   122 	n := n + nRead.
   123     ].
   123     ].
   124     f close.
   124     f close.
   125     self assert:(expect = n) description:('got <1p>; expected:<2p>' expandMacrosWith:n with:expect)
   125     self assert:(expect = n) description:('got <1p>; expected:<2p>' expandMacrosWith:n with:expect)
   126 
   126 
   127     "Created: / 12.8.1998 / 13:29:41 / cg"
   127     "Created: / 12.8.1998 / 13:29:41 / cg"
   213     self assert:(self testFilename exists).
   213     self assert:(self testFilename exists).
   214 
   214 
   215     sz := self testFilename fileSize.
   215     sz := self testFilename fileSize.
   216     sema := Semaphore new:1-20.
   216     sema := Semaphore new:1-20.
   217     20 timesRepeat:[
   217     20 timesRepeat:[
   218         [
   218 	[
   219             [
   219 	    [
   220                 self readFileExpecting:sz. 
   220 		self readFileExpecting:sz.
   221                 verbose ifTrue:[ 'done' printCR ].
   221 		verbose ifTrue:[ 'done' printCR ].
   222             ] on:Error do:[:ex|
   222 	    ] on:Error do:[:ex|
   223                 errorOccured := ex.
   223 		errorOccured := ex.
   224             ].
   224 	    ].
   225             sema signal.
   225 	    sema signal.
   226         ] fork.
   226 	] fork.
   227     ].
   227     ].
   228     self assert:(sema waitWithTimeout:20) notNil.
   228     self assert:(sema waitWithTimeout:20) notNil.
   229     self assert:errorOccured isNil.
   229     self assert:errorOccured isNil.
   230 
   230 
   231     "
   231     "
   246     self createTestFile.
   246     self createTestFile.
   247 
   247 
   248     sz := self testFilename fileSize.
   248     sz := self testFilename fileSize.
   249 
   249 
   250     p := [
   250     p := [
   251         [
   251 	[
   252             nLoop timesRepeat:[
   252 	    nLoop timesRepeat:[
   253                 self readFileExpecting:sz.
   253 		self readFileExpecting:sz.
   254             ].
   254 	    ].
   255         ] on:Error do:[:ex|
   255 	] on:Error do:[:ex|
   256             errorOccured := ex.
   256 	    errorOccured := ex.
   257         ].
   257 	].
   258     ] forkAt:7.
   258     ] forkAt:7.
   259 
   259 
   260     count := 0.
   260     count := 0.
   261     [p isDead] whileFalse:[
   261     [p isDead] whileFalse:[
   262         Delay waitForMilliseconds:5.
   262 	Delay waitForMilliseconds:5.
   263         p interruptWith:[count := count + 1].
   263 	p interruptWith:[count := count + 1].
   264     ].
   264     ].
   265     self assert:errorOccured isNil.
   265     self assert:errorOccured isNil.
   266     self assert:count > 50. "/ at least 50 times interrupted...
   266     self assert:count > 50. "/ at least 50 times interrupted...
   267     "/ Transcript printf:'read file %d times; interrupted %d times\n' with:nLoop with:count.
   267     "/ Transcript printf:'read file %d times; interrupted %d times\n' with:nLoop with:count.
   268 
   268 
   294 
   294 
   295     sz := file fileSize.
   295     sz := file fileSize.
   296     sz ~= 100 ifTrue:[self error:'size mismatch'].
   296     sz ~= 100 ifTrue:[self error:'size mismatch'].
   297 
   297 
   298     (file binaryContentsOfEntireFile ~= (101 to:200) asByteArray) ifTrue:[
   298     (file binaryContentsOfEntireFile ~= (101 to:200) asByteArray) ifTrue:[
   299         self error:'contents mismatch'
   299 	self error:'contents mismatch'
   300     ].
   300     ].
   301 
   301 
   302     file delete.
   302     file delete.
   303 
   303 
   304     "
   304     "
   326     s close.
   326     s close.
   327 
   327 
   328     sz := file fileSize.
   328     sz := file fileSize.
   329     sz ~= 200 ifTrue:[self error:'size mismatch'].
   329     sz ~= 200 ifTrue:[self error:'size mismatch'].
   330 
   330 
   331     (file binaryContentsOfEntireFile ~= 
   331     (file binaryContentsOfEntireFile ~=
   332         ((101 to:200) asByteArray , (101 to:200) asByteArray)) ifTrue:[
   332 	((101 to:200) asByteArray , (101 to:200) asByteArray)) ifTrue:[
   333         self error:'contents mismatch'
   333 	self error:'contents mismatch'
   334     ].
   334     ].
   335 
   335 
   336     file delete.
   336     file delete.
   337 
   337 
   338     "
   338     "
   364 
   364 
   365 testWrite2
   365 testWrite2
   366     "basic writing"
   366     "basic writing"
   367 
   367 
   368     10 timesRepeat:[
   368     10 timesRepeat:[
   369         self testWrite1.
   369 	self testWrite1.
   370     ].
   370     ].
   371 
   371 
   372     "
   372     "
   373      self new testWrite2
   373      self new testWrite2
   374     "
   374     "
   380     <timeout: 300>"5 mins"
   380     <timeout: 300>"5 mins"
   381 
   381 
   382     |interruptor|
   382     |interruptor|
   383 
   383 
   384     interruptor := [
   384     interruptor := [
   385         [true] whileTrue:[
   385 	[true] whileTrue:[
   386             Delay waitForMilliseconds:10.
   386 	    Delay waitForMilliseconds:10.
   387         ].
   387 	].
   388     ] forkAt:9.
   388     ] forkAt:9.
   389 
   389 
   390     [
   390     [
   391         50 timesRepeat:[
   391 	50 timesRepeat:[
   392             self testWrite1.
   392 	    self testWrite1.
   393         ].
   393 	].
   394     ] valueNowOrOnUnwindDo:[
   394     ] valueNowOrOnUnwindDo:[
   395         interruptor terminate
   395 	interruptor terminate
   396     ].
   396     ].
   397 
   397 
   398     "
   398     "
   399      self new testWrite3
   399      self new testWrite3
   400     "
   400     "
   404 !
   404 !
   405 
   405 
   406 testWriteEOLModes
   406 testWriteEOLModes
   407 
   407 
   408     'xxx' asFilename writingFileDo:[:s |
   408     'xxx' asFilename writingFileDo:[:s |
   409         s eolMode:#crlf.
   409 	s eolMode:#crlf.
   410         s nextPutLine:'hello'
   410 	s nextPutLine:'hello'
   411     ].
   411     ].
   412     self assert:('xxx' asFilename fileSize == 7).
   412     self assert:('xxx' asFilename fileSize == 7).
   413     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0D 16r0A]).
   413     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0D 16r0A]).
   414 
   414 
   415     'xxx' asFilename writingFileDo:[:s |
   415     'xxx' asFilename writingFileDo:[:s |
   416         s eolMode:#nl.
   416 	s eolMode:#nl.
   417         s nextPutLine:'hello'
   417 	s nextPutLine:'hello'
   418     ].
   418     ].
   419     self assert:('xxx' asFilename fileSize == 6).
   419     self assert:('xxx' asFilename fileSize == 6).
   420     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0A]).
   420     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0A]).
   421 
   421 
   422     'xxx' asFilename writingFileDo:[:s |
   422     'xxx' asFilename writingFileDo:[:s |
   423         s eolMode:#cr.
   423 	s eolMode:#cr.
   424         s nextPutLine:'hello'
   424 	s nextPutLine:'hello'
   425     ].
   425     ].
   426     self assert:('xxx' asFilename fileSize == 6).
   426     self assert:('xxx' asFilename fileSize == 6).
   427     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0D]).
   427     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0D]).
   428 
   428 
   429     "/ ------------------------
   429     "/ ------------------------
   430 
   430 
   431     'xxx' asFilename writingFileDo:[:s |
   431     'xxx' asFilename writingFileDo:[:s |
   432         s eolMode:#crlf.
   432 	s eolMode:#crlf.
   433         s nextPutAll:'hello' , Character cr
   433 	s nextPutAll:'hello' , Character cr
   434     ].
   434     ].
   435     self assert:('xxx' asFilename fileSize == 7).
   435     self assert:('xxx' asFilename fileSize == 7).
   436     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0D 16r0A]).
   436     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0D 16r0A]).
   437 
   437 
   438     'xxx' asFilename writingFileDo:[:s |
   438     'xxx' asFilename writingFileDo:[:s |
   439         s eolMode:#nl.
   439 	s eolMode:#nl.
   440         s nextPutAll:'hello' , Character cr
   440 	s nextPutAll:'hello' , Character cr
   441     ].
   441     ].
   442     self assert:('xxx' asFilename fileSize == 6).
   442     self assert:('xxx' asFilename fileSize == 6).
   443     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0A]).
   443     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0A]).
   444 
   444 
   445     'xxx' asFilename writingFileDo:[:s |
   445     'xxx' asFilename writingFileDo:[:s |
   446         s eolMode:#cr.
   446 	s eolMode:#cr.
   447         s nextPutAll:'hello' , Character cr
   447 	s nextPutAll:'hello' , Character cr
   448     ].
   448     ].
   449     self assert:('xxx' asFilename fileSize == 6).
   449     self assert:('xxx' asFilename fileSize == 6).
   450     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0D]).
   450     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0D]).
   451 
   451 
   452     "/ in binary mode, this should be ignored
   452     "/ in binary mode, this should be ignored
   453     'xxx' asFilename writingFileDo:[:s |
   453     'xxx' asFilename writingFileDo:[:s |
   454         s binary.
   454 	s binary.
   455         s eolMode:#crlf.
   455 	s eolMode:#crlf.
   456         s nextPutAll:'hello' , Character cr
   456 	s nextPutAll:'hello' , Character cr
   457     ].
   457     ].
   458     self assert:('xxx' asFilename fileSize == 6).
   458     self assert:('xxx' asFilename fileSize == 6).
   459     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0A]).
   459     self assert:('xxx' asFilename binaryContentsOfEntireFile = #[16r68 16r65 16r6C 16r6C 16r6F 16r0A]).
   460 
   460 
   461 
   461