iogt.test
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:21k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # -*- tcl -*-
  2. # Commands covered:  transform, and stacking in general
  3. #
  4. # This file contains a collection of tests for Giot
  5. #
  6. # See the file "license.terms" for information on usage and redistribution
  7. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  8. # Copyright (c) 2000 Ajuba Solutions.
  9. # Copyright (c) 2000 Andreas Kupries.
  10. # All rights reserved.
  11. # RCS: @(#) $Id: iogt.test,v 1.7.2.1 2005/04/14 07:10:57 davygrvy Exp $
  12. if {[catch {package require tcltest 2.1}]} {
  13.     puts stderr "Skipping tests in [info script].  tcltest 2.1 required."
  14.     return
  15. }
  16. namespace eval ::tcl::test::iogt {
  17.     namespace import ::tcltest::cleanupTests
  18.     namespace import ::tcltest::makeFile
  19.     namespace import ::tcltest::removeFile
  20.     namespace import ::tcltest::test
  21.     namespace import ::tcltest::testConstraint
  22.     testConstraint testchannel [llength [info commands testchannel]]
  23. set path(dummy) [makeFile {abcdefghijklmnopqrstuvwxyz0123456789,./?><;'|":[]}{`~!@#$%^&*()_+-=
  24. } dummy]
  25. # " capture coloring of quotes
  26. set path(dummyout) [makeFile {} dummyout]
  27. set path(__echo_srv__.tcl) [makeFile {
  28. #!/usr/local/bin/tclsh
  29. # -*- tcl -*-
  30. # echo server
  31. #
  32. # arguments, options: port to listen on for connections.
  33. #                     delay till echo of first block
  34. #                     delay between blocks
  35. #                     blocksize ...
  36. set port   [lindex $argv 0]
  37. set fdelay [lindex $argv 1]
  38. set idelay [lindex $argv 2]
  39. set bsizes [lrange $argv 3 end]
  40. set c      0
  41. proc newconn {sock rhost rport} {
  42.     variable fdelay
  43.     variable c
  44.     incr   c
  45.     variable c$c
  46.     #puts stdout "C $sock $rhost $rport / $fdelay" ; flush stdout
  47.     upvar 0 c$c conn
  48.     set conn(after) {}
  49.     set conn(state) 0
  50.     set conn(size)  0
  51.     set conn(data)  ""
  52.     set conn(delay) $fdelay
  53.     fileevent  $sock readable [list echoGet $c $sock]
  54.     fconfigure $sock -translation binary -buffering none -blocking 0
  55. }
  56. proc echoGet {c sock} {
  57.     variable fdelay
  58.     variable c$c
  59.     upvar 0 c$c conn
  60.     if {[eof $sock]} {
  61. # one-shot echo
  62. exit
  63.     }
  64.     append conn(data) [read $sock]
  65.     #puts stdout "G $c $sock $conn(data) <<$conn(data)>>" ; flush stdout
  66.     if {$conn(after) == {}} {
  67. set conn(after) [after $conn(delay) [list echoPut $c $sock]]
  68.     }
  69. }
  70. proc echoPut {c sock} {
  71.     variable idelay
  72.     variable fdelay
  73.     variable bsizes
  74.     variable c$c
  75.     upvar 0 c$c conn
  76.     if {[string length $conn(data)] == 0} {
  77. #puts stdout "C $c $sock" ; flush stdout
  78. # auto terminate
  79. close $sock
  80. exit
  81. #set conn(delay) $fdelay
  82. return
  83.     }
  84.     set conn(delay) $idelay
  85.     set n [lindex $bsizes $conn(size)]
  86.     #puts stdout "P $c $sock $n >>" ; flush stdout
  87.     #puts __________________________________________
  88.     #parray conn
  89.     #puts n=<$n>
  90.     if {[string length $conn(data)] >= $n} {
  91. puts -nonewline $sock [string range $conn(data) 0 $n]
  92. set conn(data) [string range $conn(data) [incr n] end]
  93.     }
  94.     incr conn(size)
  95.     if {$conn(size) >= [llength $bsizes]} {
  96. set conn(size) [expr {[llength $bsizes]-1}]
  97.     }
  98.     set conn(after) [after $conn(delay) [list echoPut $c $sock]]
  99. }
  100. #fileevent stdin readable {exit ;#cut}
  101. # main
  102. socket -server newconn $port
  103. vwait forever
  104. } __echo_srv__.tcl]
  105. ########################################################################
  106. proc fevent {fdelay idelay blocks script data} {
  107.     # start and initialize an echo server, prepare data
  108.     # transmission, then hand over to the test script.
  109.     # this has to start real transmission via 'flush'.
  110.     # The server is stopped after completion of the test.
  111.     # fixed port, not so good. lets hope for the best, for now.
  112.     set port 4000
  113.     eval exec tclsh __echo_srv__.tcl 
  114.     $port $fdelay $idelay $blocks >@stdout &
  115.     after 500
  116.     #puts stdout "> $port" ; flush stdout
  117.     set         sk [socket localhost $port]
  118.     fconfigure $sk           
  119.     -blocking   0    
  120.     -buffering  full 
  121.     -buffersize [expr {10+[llength $data]}]
  122.     puts -nonewline $sk $data
  123.     # The channel is prepared to go off.
  124.     #puts stdout ">>>>>" ; flush stdout
  125.     uplevel #0 set sock $sk
  126.     set res [uplevel #0 $script]
  127.     catch {close $sk}
  128.     return $res
  129. }
  130. # --------------------------------------------------------------
  131. # utility transformations ...
  132. proc id {op data} {
  133.     switch -- $op {
  134. create/write -
  135. create/read  -
  136. delete/write -
  137. delete/read  -
  138. clear_read   {;#ignore}
  139. flush/write -
  140. flush/read  -
  141. write       -
  142. read        {
  143.     return $data
  144. }
  145. query/maxRead {return -1}
  146.     }
  147. }
  148. proc id_optrail {var op data} {
  149.     variable $var
  150.     upvar 0 $var trail
  151.     lappend trail $op
  152.     switch -- $op {
  153. create/write - create/read -
  154. delete/write - delete/read -
  155. flush/read -
  156. clear/read { #ignore }
  157. flush/write -
  158. write -
  159. read {
  160.     return $data
  161. }
  162. query/maxRead {
  163.     return -1
  164. }
  165. default {
  166.     lappend trail "error $op"
  167.     error $op
  168. }
  169.     }
  170. }
  171. proc id_fulltrail {var op data} {
  172.     variable $var
  173.     upvar 0 $var trail
  174.     #puts stdout ">> $var $op $data" ; flush stdout
  175.     switch -- $op {
  176. create/write - create/read  -
  177. delete/write - delete/read  -
  178. clear_read   {
  179.     set res *ignored*
  180. }
  181. flush/write - flush/read  -
  182. write       -
  183. read        {
  184.     set res $data
  185. }
  186. query/maxRead {
  187.     set res -1
  188. }
  189.     }
  190.     #catch {puts stdout "t>* $res" ; flush stdout}
  191.     #catch {puts stdout "x$res"} msg
  192.     lappend trail [list $op $data $res]
  193.     return $res
  194. }
  195. proc counter {var op data} {
  196.     variable $var
  197.     upvar 0 $var n
  198.     switch -- $op {
  199. create/write - create/read  -
  200. delete/write - delete/read  -
  201. clear_read   {;#ignore}
  202. flush/write  - flush/read   {return {}}
  203. write {
  204.     return $data
  205. }
  206. read  {
  207.     if {$n > 0} {
  208. incr n -[string length $data]
  209. if {$n < 0} {
  210.     set n 0
  211. }
  212.     }
  213.     return $data
  214. }
  215. query/maxRead {
  216.     return $n
  217. }
  218.     }
  219. }
  220. proc counter_audit {var vtrail op data} {
  221.     variable $var
  222.     variable $vtrail
  223.     upvar 0 $var n $vtrail trail
  224.     switch -- $op {
  225. create/write - create/read  -
  226. delete/write - delete/read  -
  227. clear_read   {
  228.     set res {}
  229. }
  230. flush/write  - flush/read   {
  231.     set res {}
  232. }
  233. write {
  234.     set res $data
  235. }
  236. read  {
  237.     if {$n > 0} {
  238. incr n -[string length $data]
  239. if {$n < 0} {
  240.     set n 0
  241. }
  242.     }
  243.     set res $data
  244. }
  245. query/maxRead {
  246.     set res $n
  247. }
  248.     }
  249.     lappend trail [list counter:$op $data $res]
  250.     return $res
  251. }
  252. proc rblocks {var vtrail n op data} {
  253.     variable $var
  254.     variable $vtrail
  255.     upvar 0 $var buf $vtrail trail
  256.     set res {}
  257.     switch -- $op {
  258. create/write - create/read  -
  259. delete/write - delete/read  -
  260. clear_read   {
  261.     set buf {}
  262. }
  263. flush/write {
  264. }
  265. flush/read  {
  266.     set res $buf
  267.     set buf {}
  268. }
  269. write       {
  270.     set data
  271. }
  272. read        {
  273.     append buf $data
  274.     set b [expr {$n * ([string length $buf] / $n)}]
  275.     append op " $n [string length $buf] :- $b"
  276.     set res [string range $buf 0 [incr b -1]]
  277.     set buf [string range $buf [incr b] end]
  278.     #return $res
  279. }
  280. query/maxRead {
  281.     set res -1
  282. }
  283.     }
  284.     lappend trail [list rblock | $op $data $res | $buf]
  285.     return $res
  286. }
  287. # --------------------------------------------------------------
  288. # ... and convenience procedures to stack them
  289. proc identity {-attach channel} {
  290.     testchannel transform $channel -command [namespace code id]
  291. }
  292. proc audit_ops {var -attach channel} {
  293.     testchannel transform $channel -command [namespace code [list id_optrail $var]]
  294. }
  295. proc audit_flow {var -attach channel} {
  296.     testchannel transform $channel -command [namespace code [list id_fulltrail $var]]
  297. }
  298. proc stopafter {var n -attach channel} {
  299.     variable $var
  300.     upvar 0 $var vn
  301.     set vn $n
  302.     testchannel transform $channel -command [namespace code [list counter $var]]
  303. }
  304. proc stopafter_audit {var trail n -attach channel} {
  305.     variable $var
  306.     upvar 0 $var vn
  307.     set vn $n
  308.     testchannel transform $channel -command [namespace code [list counter_audit $var $trail]]
  309. }
  310. proc rblocks_t {var trail n -attach channel} {
  311.     testchannel transform $channel -command [namespace code [list rblocks $var $trail $n]]
  312. }
  313. # --------------------------------------------------------------
  314. # serialize an array, with keys in sorted order.
  315. proc array_sget {v} {
  316.     upvar $v a
  317.     set res [list]
  318.     foreach n [lsort [array names a]] {
  319. lappend res $n $a($n)
  320.     }
  321.     set res
  322. }
  323. proc asort {alist} {
  324.     # sort a list of key/value pairs by key, removes duplicates too.
  325.     array set  a $alist
  326.     array_sget a
  327. }
  328. ########################################################################
  329. test iogt-1.1 {stack/unstack} testchannel {
  330.     set fh [open $path(dummy) r]
  331.     identity -attach $fh
  332.     testchannel unstack $fh
  333.     close   $fh
  334. } {}
  335. test iogt-1.2 {stack/close} testchannel {
  336.     set fh [open $path(dummy) r]
  337.     identity -attach $fh
  338.     close   $fh
  339. } {}
  340. test iogt-1.3 {stack/unstack, configuration, options} testchannel {
  341.     set fh [open $path(dummy) r]
  342.     set ca [asort [fconfigure $fh]]
  343.     identity -attach $fh
  344.     set cb [asort [fconfigure $fh]]
  345.     testchannel unstack $fh
  346.     set cc [asort [fconfigure $fh]]
  347.     close $fh
  348.     # With this system none of the buffering, translation and
  349.     # encoding option may change their values with channels
  350.     # stacked upon each other or not.
  351.     # cb == ca == cc
  352.     list [string equal $ca $cb] [string equal $cb $cc] [string equal $ca $cc]
  353. } {1 1 1}
  354. test iogt-1.4 {stack/unstack, configuration} testchannel {
  355.     set fh [open $path(dummy) r]
  356.     set ca [asort [fconfigure $fh]]
  357.     identity -attach $fh
  358.     fconfigure $fh 
  359.     -buffering   line 
  360.     -translation cr   
  361.     -encoding    shiftjis
  362.     testchannel unstack $fh
  363.     set cc [asort [fconfigure $fh]]
  364.     set res [list 
  365.     [string equal $ca $cc]   
  366.     [fconfigure $fh -buffering]  
  367.     [fconfigure $fh -translation] 
  368.     [fconfigure $fh -encoding]    
  369.     ]
  370.     close $fh
  371.     set res
  372. } {0 line cr shiftjis}
  373. test iogt-2.0 {basic I/O going through transform} testchannel {
  374.     set fin  [open $path(dummy)    r]
  375.     set fout [open $path(dummyout) w]
  376.     identity -attach $fin
  377.     identity -attach $fout
  378.     fcopy $fin $fout
  379.     close $fin
  380.     close $fout
  381.     set fin  [open $path(dummy)    r]
  382.     set fout [open $path(dummyout) r]
  383.     set res     [string equal [set in [read $fin]] [set out [read $fout]]]
  384.     lappend res [string length $in] [string length $out]
  385.     close $fin
  386.     close $fout
  387.     set res
  388. } {1 71 71}
  389. test iogt-2.1 {basic I/O, operation trail} {testchannel unixOnly} {
  390.     set fin  [open $path(dummy)    r]
  391.     set fout [open $path(dummyout) w]
  392.     set ain [list] ; set aout [list]
  393.     audit_ops ain  -attach $fin
  394.     audit_ops aout -attach $fout
  395.     fconfigure $fin  -buffersize 10
  396.     fconfigure $fout -buffersize 10
  397.     fcopy $fin $fout
  398.     close $fin
  399.     close $fout
  400.     set res "[join $ain n]n--------n[join $aout n]"
  401. } {create/read
  402. query/maxRead
  403. read
  404. query/maxRead
  405. read
  406. query/maxRead
  407. read
  408. query/maxRead
  409. read
  410. query/maxRead
  411. read
  412. query/maxRead
  413. read
  414. query/maxRead
  415. read
  416. query/maxRead
  417. read
  418. query/maxRead
  419. flush/read
  420. delete/read
  421. --------
  422. create/write
  423. write
  424. write
  425. write
  426. write
  427. write
  428. write
  429. write
  430. write
  431. flush/write
  432. delete/write}
  433. test iogt-2.2 {basic I/O, data trail} {testchannel unixOnly} {
  434.     set fin  [open $path(dummy)    r]
  435.     set fout [open $path(dummyout) w]
  436.     set ain [list] ; set aout [list]
  437.     audit_flow ain  -attach $fin
  438.     audit_flow aout -attach $fout
  439.     fconfigure $fin  -buffersize 10
  440.     fconfigure $fout -buffersize 10
  441.     fcopy $fin $fout
  442.     close $fin
  443.     close $fout
  444.     set res "[join $ain n]n--------n[join $aout n]"
  445. } {create/read {} *ignored*
  446. query/maxRead {} -1
  447. read abcdefghij abcdefghij
  448. query/maxRead {} -1
  449. read klmnopqrst klmnopqrst
  450. query/maxRead {} -1
  451. read uvwxyz0123 uvwxyz0123
  452. query/maxRead {} -1
  453. read 456789,./? 456789,./?
  454. query/maxRead {} -1
  455. read {><;'|":[]} {><;'|":[]}
  456. query/maxRead {} -1
  457. read {}{`~!@#$} {}{`~!@#$}
  458. query/maxRead {} -1
  459. read %^&*()_+-= %^&*()_+-=
  460. query/maxRead {} -1
  461. read {
  462. } {
  463. }
  464. query/maxRead {} -1
  465. flush/read {} {}
  466. delete/read {} *ignored*
  467. --------
  468. create/write {} *ignored*
  469. write abcdefghij abcdefghij
  470. write klmnopqrst klmnopqrst
  471. write uvwxyz0123 uvwxyz0123
  472. write 456789,./? 456789,./?
  473. write {><;'|":[]} {><;'|":[]}
  474. write {}{`~!@#$} {}{`~!@#$}
  475. write %^&*()_+-= %^&*()_+-=
  476. write {
  477. } {
  478. }
  479. flush/write {} {}
  480. delete/write {} *ignored*}
  481. test iogt-2.3 {basic I/O, mixed trail} {testchannel unixOnly} {
  482.     set fin  [open $path(dummy)    r]
  483.     set fout [open $path(dummyout) w]
  484.     set trail [list]
  485.     audit_flow trail -attach $fin
  486.     audit_flow trail -attach $fout
  487.     fconfigure $fin  -buffersize 20
  488.     fconfigure $fout -buffersize 10
  489.     fcopy $fin $fout
  490.     close $fin
  491.     close $fout
  492.     join $trail n
  493. } {create/read {} *ignored*
  494. create/write {} *ignored*
  495. query/maxRead {} -1
  496. read abcdefghijklmnopqrst abcdefghijklmnopqrst
  497. write abcdefghij abcdefghij
  498. write klmnopqrst klmnopqrst
  499. query/maxRead {} -1
  500. read uvwxyz0123456789,./? uvwxyz0123456789,./?
  501. write uvwxyz0123 uvwxyz0123
  502. write 456789,./? 456789,./?
  503. query/maxRead {} -1
  504. read {><;'|":[]}{`~!@#$} {><;'|":[]}{`~!@#$}
  505. write {><;'|":[]} {><;'|":[]}
  506. write {}{`~!@#$} {}{`~!@#$}
  507. query/maxRead {} -1
  508. read {%^&*()_+-=
  509. } {%^&*()_+-=
  510. }
  511. query/maxRead {} -1
  512. flush/read {} {}
  513. write %^&*()_+-= %^&*()_+-=
  514. write {
  515. } {
  516. }
  517. delete/read {} *ignored*
  518. flush/write {} {}
  519. delete/write {} *ignored*}
  520. test iogt-3.0 {Tcl_Channel valid after stack/unstack, fevent handling} 
  521. {testchannel unknownFailure} {
  522.     # This test to check the validity of aquired Tcl_Channel references is
  523.     # not possible because even a backgrounded fcopy will immediately start
  524.     # to copy data, without waiting for the event loop. This is done only in
  525.     # case of an underflow on the read size!. So stacking transforms after the
  526.     # fcopy will miss information, or are not used at all.
  527.     #
  528.     # I was able to circumvent this by using the echo.tcl server with a big
  529.     # delay, causing the fcopy to underflow immediately.
  530.     proc DoneCopy {n {err {}}} {
  531. variable copy ; set copy 1
  532.     }
  533.     set fin  [open $path(dummy) r]
  534.     fevent 1000 500 {20 20 20 10 1 1} {
  535. close $fin
  536. set          fout [open dummyout w]
  537. flush $sock ; # now, or fcopy will error us out
  538. # But the 1 second delay should be enough to
  539. # initialize everything else here.
  540. fcopy $sock $fout -command [namespace code DoneCopy]
  541. # transform after fcopy got its handles !
  542. # They should be still valid for fcopy.
  543. set trail [list]
  544. audit_ops trail -attach $fout
  545. vwait [namespace which -variable copy]
  546.     } [read $fin] ; # {}
  547.     close $fout
  548.     rename DoneCopy {}
  549.     # Check result of copy.
  550.     set fin  [open $path(dummy)    r]
  551.     set fout [open $path(dummyout) r]
  552.     set res [string equal [read $fin] [read $fout]]
  553.     close $fin
  554.     close $fout
  555.     list $res $trail
  556. } {1 {create/write create/read write flush/write flush/read delete/write delete/read}}
  557. test iogt-4.0 {fileevent readable, after transform} {testchannel unknownFailure} {
  558.     set fin  [open $path(dummy) r]
  559.     set data [read $fin]
  560.     close $fin
  561.     set trail [list]
  562.     set got   [list]
  563.     proc Done {args} {
  564. variable stop
  565. set    stop 1
  566.     }
  567.     proc Get {sock} {
  568. variable trail
  569. variable got
  570. if {[eof $sock]} {
  571.     Done
  572.     lappend trail "xxxxxxxxxxxxx"
  573.     close $sock
  574.     return
  575. }
  576. lappend trail "vvvvvvvvvvvvv"
  577. lappend trail "tgot: [lappend got "[[[read $sock]]]"]"
  578. lappend trail "============="
  579. #puts stdout $__ ; flush stdout
  580. #read $sock
  581.     }
  582.     fevent 1000 500 {20 20 20 10 1} {
  583. audit_flow trail   -attach $sock
  584. rblocks_t  rbuf trail 23 -attach $sock
  585. fileevent $sock readable [list Get $sock]
  586. flush $sock ; # now, or fcopy will error us out
  587. # But the 1 second delay should be enough to
  588. # initialize everything else here.
  589. vwait [namespace which -variable stop]
  590.     } $data
  591.     rename Done {}
  592.     rename Get {}
  593.     join [list [join $got n] ~~~~~~~~ [join $trail n]] n
  594. } {[[]]
  595. [[abcdefghijklmnopqrstuvw]]
  596. [[xyz0123456789,./?><;'|]]
  597. [[]]
  598. [[]]
  599. [[":[]}{`~!@#$%^&*()]]
  600. [[]]
  601. ~~~~~~~~
  602. create/write {} *ignored*
  603. create/read {} *ignored*
  604. rblock | create/write {} {} | {}
  605. rblock | create/read {} {} | {}
  606. vvvvvvvvvvvvv
  607. rblock | query/maxRead {} -1 | {}
  608. query/maxRead {} -1
  609. read abcdefghijklmnopqrstu abcdefghijklmnopqrstu
  610. query/maxRead {} -1
  611. rblock | {read 23 21 :- 0} abcdefghijklmnopqrstu {} | abcdefghijklmnopqrstu
  612. rblock | query/maxRead {} -1 | abcdefghijklmnopqrstu
  613. query/maxRead {} -1
  614. got: {[[]]}
  615. =============
  616. vvvvvvvvvvvvv
  617. rblock | query/maxRead {} -1 | abcdefghijklmnopqrstu
  618. query/maxRead {} -1
  619. read vwxyz0123456789,./?>< vwxyz0123456789,./?><
  620. query/maxRead {} -1
  621. rblock | {read 23 42 :- 23} vwxyz0123456789,./?>< abcdefghijklmnopqrstuvw | xyz0123456789,./?><
  622. rblock | query/maxRead {} -1 | xyz0123456789,./?><
  623. query/maxRead {} -1
  624. got: {[[]]} {[[abcdefghijklmnopqrstuvw]]}
  625. =============
  626. vvvvvvvvvvvvv
  627. rblock | query/maxRead {} -1 | xyz0123456789,./?><
  628. query/maxRead {} -1
  629. read {;'|":[]}{`~!@#$%^&} {;'|":[]}{`~!@#$%^&}
  630. query/maxRead {} -1
  631. rblock | {read 23 40 :- 23} {;'|":[]}{`~!@#$%^&} {xyz0123456789,./?><;'|} | {":[]}{`~!@#$%^&}
  632. rblock | query/maxRead {} -1 | {":[]}{`~!@#$%^&}
  633. query/maxRead {} -1
  634. got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'|]]}
  635. =============
  636. vvvvvvvvvvvvv
  637. rblock | query/maxRead {} -1 | {":[]}{`~!@#$%^&}
  638. query/maxRead {} -1
  639. read *( *(
  640. query/maxRead {} -1
  641. rblock | {read 23 19 :- 0} *( {} | {":[]}{`~!@#$%^&*(}
  642. rblock | query/maxRead {} -1 | {":[]}{`~!@#$%^&*(}
  643. query/maxRead {} -1
  644. got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'|]]} {[[]]}
  645. =============
  646. vvvvvvvvvvvvv
  647. rblock | query/maxRead {} -1 | {":[]}{`~!@#$%^&*(}
  648. query/maxRead {} -1
  649. read ) )
  650. query/maxRead {} -1
  651. rblock | {read 23 20 :- 0} ) {} | {":[]}{`~!@#$%^&*()}
  652. rblock | query/maxRead {} -1 | {":[]}{`~!@#$%^&*()}
  653. query/maxRead {} -1
  654. got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'|]]} {[[]]} {[[]]}
  655. =============
  656. vvvvvvvvvvvvv
  657. rblock | query/maxRead {} -1 | {":[]}{`~!@#$%^&*()}
  658. query/maxRead {} -1
  659. flush/read {} {}
  660. rblock | flush/read {} {":[]}{`~!@#$%^&*()} | {}
  661. rblock | query/maxRead {} -1 | {}
  662. query/maxRead {} -1
  663. got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'|]]} {[[]]} {[[]]} {[[":[]}{`~!@#$%^&*()]]}
  664. =============
  665. vvvvvvvvvvvvv
  666. rblock | query/maxRead {} -1 | {}
  667. query/maxRead {} -1
  668. got: {[[]]} {[[abcdefghijklmnopqrstuvw]]} {[[xyz0123456789,./?><;'|]]} {[[]]} {[[]]} {[[":[]}{`~!@#$%^&*()]]} {[[]]}
  669. xxxxxxxxxxxxx
  670. rblock | flush/write {} {} | {}
  671. rblock | delete/write {} {} | {}
  672. rblock | delete/read {} {} | {}
  673. flush/write {} {}
  674. delete/write {} *ignored*
  675. delete/read {} *ignored*}  ; # catch unescaped quote "
  676. test iogt-5.0 {EOF simulation} {testchannel unknownFailure} {
  677.     set fin  [open $path(dummy)    r]
  678.     set fout [open $path(dummyout) w]
  679.     set trail [list]
  680.     audit_flow trail -attach $fin
  681.     stopafter_audit d trail 20 -attach   $fin
  682.     audit_flow trail -attach $fout
  683.     fconfigure $fin  -buffersize 20
  684.     fconfigure $fout -buffersize 10
  685.     fcopy   $fin $fout
  686.     testchannel unstack $fin
  687.     # now copy the rest in the channel
  688.     lappend trail {**after unstack**}
  689.     fcopy $fin $fout
  690.     close $fin
  691.     close $fout
  692.     join $trail n
  693. } {create/read {} *ignored*
  694. counter:create/read {} {}
  695. create/write {} *ignored*
  696. counter:query/maxRead {} 20
  697. query/maxRead {} -1
  698. read {abcdefghijklmnopqrstuvwxyz0123456789,./?><;'|":[]}{`~!@#$%^&*()_+-=
  699. } {abcdefghijklmnopqrstuvwxyz0123456789,./?><;'|":[]}{`~!@#$%^&*()_+-=
  700. }
  701. query/maxRead {} -1
  702. flush/read {} {}
  703. counter:read abcdefghijklmnopqrst abcdefghijklmnopqrst
  704. write abcdefghij abcdefghij
  705. write klmnopqrst klmnopqrst
  706. counter:query/maxRead {} 0
  707. counter:flush/read {} {}
  708. counter:delete/read {} {}
  709. **after unstack**
  710. query/maxRead {} -1
  711. write uvwxyz0123 uvwxyz0123
  712. write 456789,./? 456789,./?
  713. write {><;'|":[]} {><;'|":[]}
  714. write {}{`~!@#$} {}{`~!@#$}
  715. write %^&*()_+-= %^&*()_+-=
  716. write {
  717. } {
  718. }
  719. query/maxRead {} -1
  720. delete/read {} *ignored*
  721. flush/write {} {}
  722. delete/write {} *ignored*}
  723. proc constX {op data} {
  724.     # replace anything coming in with a same-length string of x'es.
  725.     switch -- $op {
  726. create/write - create/read  -
  727. delete/write - delete/read  -
  728. clear_read   {;#ignore}
  729. flush/write - flush/read  -
  730. write       -
  731. read        {
  732.     return [string repeat x [string length $data]]
  733. }
  734. query/maxRead {return -1}
  735.     }
  736. }
  737. proc constx {-attach channel} {
  738.     testchannel transform $channel -command [namespace code constX]
  739. }
  740. test iogt-6.0 {Push back} testchannel {
  741.     set f [open $path(dummy) r]
  742.     # contents of dummy = "abcdefghi..."
  743.     read $f 3 ; # skip behind "abc"
  744.     constx -attach $f
  745.     # expect to get "xxx" from the transform because
  746.     # of unread "def" input to transform which returns "xxx".
  747.     #
  748.     # Actually the IO layer pre-read the whole file and will
  749.     # read "def" directly from the buffer without bothering
  750.     # to consult the newly stacked transformation. This is
  751.     # wrong.
  752.     set res [read $f 3]
  753.     close $f
  754.     set res
  755. } {xxx}
  756. test iogt-6.1 {Push back and up} {testchannel knownBug} {
  757.     set f [open $path(dummy) r]
  758.     # contents of dummy = "abcdefghi..."
  759.     read $f 3 ; # skip behind "abc"
  760.     constx -attach $f
  761.     set res [read $f 3]
  762.     testchannel unstack $f
  763.     append res [read $f 3]
  764.     close $f
  765.     set res
  766. } {xxxghi}
  767. # cleanup
  768. foreach file [list dummy dummyout __echo_srv__.tcl] {
  769.     removeFile $file
  770. }
  771. cleanupTests
  772. }
  773. namespace delete ::tcl::test::iogt
  774. return