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

通讯编程

开发平台:

Visual C++

  1. # The file tests the functions in the tclUnixInit.c file.
  2. #
  3. # This file contains a collection of tests for one or more of the Tcl
  4. # built-in commands.  Sourcing this file into Tcl runs the tests and
  5. # generates output for errors.  No output means no errors were found.
  6. #
  7. # Copyright (c) 1997 by Sun Microsystems, Inc.
  8. # Copyright (c) 1998-1999 by Scriptics Corporation.
  9. #
  10. # See the file "license.terms" for information on usage and redistribution
  11. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  12. #
  13. # RCS: @(#) $Id: unixInit.test,v 1.30.2.12 2005/04/27 21:07:52 dgp Exp $
  14. package require tcltest 2
  15. namespace import -force ::tcltest::*
  16. unset -nocomplain path
  17. if {[info exists env(TCL_LIBRARY)]} {
  18.     set oldlibrary $env(TCL_LIBRARY)
  19.     unset env(TCL_LIBRARY)
  20. }
  21. catch {set oldlang $env(LANG)}
  22. set env(LANG) C
  23. test unixInit-1.1 {TclpInitPlatform: ignore SIGPIPE} {unixOnly stdio} {
  24.     set x {}
  25.     # Watch out for a race condition here.  If tcltest is too slow to start
  26.     # then we'll kill it before it has a chance to set up its signal handler.
  27.     
  28.     set f [open "|[list [interpreter]]" w+]
  29.     puts $f "puts hi"
  30.     flush $f
  31.     gets $f
  32.     exec kill -PIPE [pid $f]
  33.     lappend x [catch {close $f}]
  34.     set f [open "|[list [interpreter]]" w+]
  35.     puts $f "puts hi"
  36.     flush $f
  37.     gets $f
  38.     exec kill [pid $f]
  39.     lappend x [catch {close $f}]
  40.     set x
  41. } {0 1}
  42. # This test is really a test of code in tclUnixChan.c, but the
  43. # channels are set up as part of initialisation of the interpreter so
  44. # the test seems to me to fit here as well as anywhere else.
  45. test unixInit-1.2 {initialisation: standard channel type deduction} {unixOnly stdio} {
  46.     # pipe1 is a connection to a server that reports what port it
  47.     # starts on, and delivers a constant string to the first client to
  48.     # connect to that port before exiting.
  49.     set pipe1 [open "|[list [interpreter]]" r+]
  50.     puts $pipe1 {
  51. proc accept {channel host port} {
  52.     puts $channel {puts [fconfigure stdin -peername]; exit}
  53.     close $channel
  54.     exit
  55. }
  56. puts [fconfigure [socket -server accept 0] -sockname]
  57. vwait forever 
  58.     }
  59.     # Note the backslash above; this is important to make sure that the
  60.     # whole string is read before an [exit] can happen...
  61.     flush $pipe1
  62.     set port [lindex [gets $pipe1] 2]
  63.     set sock [socket localhost $port]
  64.     # pipe2 is a connection to a Tcl interpreter that takes its orders
  65.     # from the socket we hand it (i.e. the server we create above.)
  66.     # These orders will tell it to print out the details about the
  67.     # socket it is taking instructions from, hopefully identifying it
  68.     # as a socket.  Which is what this test is all about.
  69.     set pipe2 [open "|[list [interpreter] <@$sock]" r]
  70.     set result [gets $pipe2]
  71.     # Clear any pending data; stops certain kinds of (non-important) errors
  72.     fconfigure $pipe1 -blocking 0; gets $pipe1
  73.     fconfigure $pipe2 -blocking 0; gets $pipe2
  74.     # Close the pipes and the socket.
  75.     close $pipe2
  76.     close $pipe1
  77.     catch {close $sock}
  78.     # Can't use normal comparison, as hostname varies due to some
  79.     # installations having a messed up /etc/hosts file.
  80.     if {
  81. [string equal 127.0.0.1 [lindex $result 0]] &&
  82. [string equal $port     [lindex $result 2]]
  83.     } then {
  84. subst "OK"
  85.     } else {
  86. subst "Expected: `[list 127.0.0.1 localhost $port]', Got `$result'"
  87.     }
  88. } {OK}
  89. proc getlibpath [list [list program [interpreter]]] {
  90.     set f [open "|[list $program]" w+]
  91.     fconfigure $f -buffering none
  92.     puts $f {puts $tcl_libPath; exit}
  93.     set path [gets $f]
  94.     close $f
  95.     return $path
  96. }
  97. # Some tests require the testgetdefenc command
  98. testConstraint testgetdefenc [llength [info commands testgetdefenc]]
  99. test unixInit-2.0 {TclpInitLibraryPath: setting tclDefaultEncodingDir} 
  100. {unixOnly testgetdefenc} {
  101.     set origDir [testgetdefenc]
  102.     testsetdefenc slappy
  103.     set path [testgetdefenc]
  104.     testsetdefenc $origDir
  105.     set path
  106. } {slappy}
  107. test unixInit-2.1 {TclpInitLibraryPath: value of installLib, developLib} 
  108. {unixOnly stdio} {
  109.     set path [getlibpath]
  110.     set installLib lib/tcl[info tclversion]
  111.     set developLib tcl[info patchlevel]/library
  112.     set prefix [file dirname [file dirname [interpreter]]]
  113.     set x {}
  114.     lappend x [string compare [lindex $path 0] $prefix/$installLib]
  115.     lappend x [string compare [lindex $path 4] [file dirname $prefix]/$developLib]
  116.     set x
  117. } {0 0}
  118. test unixInit-2.2 {TclpInitLibraryPath: TCL_LIBRARY} {unixOnly stdio} {
  119.     # ((str != NULL) && (str[0] != '')) 
  120.     set env(TCL_LIBRARY) sparkly
  121.     set path [getlibpath]
  122.     unset env(TCL_LIBRARY)
  123.     lindex $path 0
  124. } "sparkly"
  125. test unixInit-2.3 {TclpInitLibraryPath: TCL_LIBRARY wrong version} 
  126. {unixOnly stdio} {
  127.     # ((pathc > 0) && (strcasecmp(installLib + 4, pathv[pathc - 1]) != 0))
  128.     set env(TCL_LIBRARY) /a/b/tcl1.7
  129.     set path [getlibpath]
  130.     unset env(TCL_LIBRARY)
  131.     lrange $path 0 1
  132. } [list /a/b/tcl1.7 /a/b/tcl[info tclversion]]
  133. test unixInit-2.4 {TclpInitLibraryPath: TCL_LIBRARY: INTL} 
  134. {unixOnly stdio} {
  135.     # Child process translates env variable from native encoding.
  136.     set env(TCL_LIBRARY) "xa7"
  137.     set x [lindex [getlibpath] 0]
  138.     unset env(TCL_LIBRARY)
  139.     unset env(LANG)
  140.     set x
  141. } "xa7"
  142. test unixInit-2.5 {TclpInitLibraryPath: compiled-in library path} 
  143. {emptyTest unixOnly} {
  144.     # cannot test
  145. } {}
  146. test unixInit-2.6 {TclpInitLibraryPath: executable relative} 
  147. {unixOnly stdio} {
  148.     makeDirectory tmp
  149.     makeDirectory [file join tmp sparkly]
  150.     makeDirectory [file join tmp sparkly bin]
  151.     file copy [interpreter] [file join [temporaryDirectory] tmp sparkly 
  152.     bin tcltest]
  153.     makeDirectory [file join tmp sparkly lib]
  154.     makeDirectory [file join tmp sparkly lib tcl[info tclversion]]
  155.     makeFile {} [file join tmp sparkly lib tcl[info tclversion] init.tcl]
  156.     set x [lrange [getlibpath [file join [temporaryDirectory] tmp sparkly 
  157.     bin tcltest]] 0 1]
  158.     removeFile [file join tmp sparkly lib tcl[info tclversion] init.tcl]
  159.     removeDirectory [file join tmp sparkly lib tcl[info tclversion]]
  160.     removeDirectory [file join tmp sparkly lib]
  161.     removeDirectory [file join tmp sparkly bin]
  162.     removeDirectory [file join tmp sparkly]
  163.     removeDirectory tmp
  164.     set x
  165. } [list [temporaryDirectory]/tmp/sparkly/lib/tcl[info tclversion] [temporaryDirectory]/tmp/lib/tcl[info tclversion]]
  166. test unixInit-2.7 {TclpInitLibraryPath: compiled-in library path} 
  167. {emptyTest unixOnly} {
  168.     # would need test command to get defaultLibDir and compare it to
  169.     # [lindex $auto_path end]
  170. } {}
  171. #
  172. # The following two tests write to the directory /tmp/sparkly instead
  173. # of to [temporaryDirectory].  This is because the failures tested by
  174. # these tests need paths near the "root" of the file system to present
  175. # themselves.
  176. #
  177. testConstraint noSparkly [expr {![file exists [file join /tmp sparkly]]}]
  178. testConstraint noTmpInstall [expr {![file exists 
  179. [file join /tmp lib tcl[info tclversion]]]}]
  180. test unixInit-2.8 {TclpInitLibraryPath: all absolute pathtype} {unix noSparkly noTmpInstall} {
  181.     # Checking for Bug 219416
  182.     # When a program that embeds the Tcl library, like tcltest, is
  183.     # installed near the "root" of the file system, there was a problem
  184.     # constructing directories relative to the executable.  When a 
  185.     # relative ".." went past the root, relative path names were created
  186.     # rather than absolute pathnames.  In some cases, accessing past the
  187.     # root caused memory access violations too.
  188.     #
  189.     # The bug is now fixed, but here we check for it by making sure that
  190.     # the directories constructed relative to the executable are all
  191.     # absolute pathnames, even when the executable is installed near
  192.     # the root of the filesystem.
  193.     #
  194.     # The only directory near the root we are likely to have write access
  195.     # to is /tmp.
  196.     file delete -force /tmp/sparkly
  197.     file delete -force /tmp/lib/tcl[info tclversion]
  198.     file mkdir /tmp/sparkly
  199.     file copy [interpreter] /tmp/sparkly/tcltest
  200.     # Keep any existing /tmp/lib directory
  201.     set deletelib 1
  202.     if {[file exists /tmp/lib]} {
  203. if {[file isdirectory /tmp/lib]} {
  204.     set deletelib 0
  205. } else {
  206.     file delete -force /tmp/lib
  207. }
  208.     }
  209.     # For a successful Tcl_Init, we need a [source]-able init.tcl in
  210.     # ../lib/tcl$version relative to the executable.
  211.     file mkdir /tmp/lib/tcl[info tclversion]
  212.     close [open /tmp/lib/tcl[info tclversion]/init.tcl w]
  213.     # Check that all directories in the library path are absolute pathnames
  214.     set allAbsolute 1
  215.     foreach dir [getlibpath /tmp/sparkly/tcltest] {
  216. set allAbsolute [expr {$allAbsolute 
  217. && [string equal absolute [file pathtype $dir]]}]
  218.     }
  219.     # Clean up temporary installation
  220.     file delete -force /tmp/sparkly
  221.     file delete -force /tmp/lib/tcl[info tclversion]
  222.     if {$deletelib} {file delete -force /tmp/lib}
  223.     set allAbsolute
  224. } 1
  225. testConstraint noTmpBuild [expr {![file exists [file join /tmp library]]}]
  226. test unixInit-2.9 {TclpInitLibraryPath: paths relative to executable} {unix noSparkly noTmpBuild} {
  227.     # Checking for Bug 438014
  228.     file delete -force /tmp/sparkly
  229.     file delete -force /tmp/library
  230.     file mkdir /tmp/sparkly
  231.     file copy [interpreter] /tmp/sparkly/tcltest
  232.     file mkdir /tmp/library/
  233.     close [open /tmp/library/init.tcl w]
  234.     set x [lrange [getlibpath /tmp/sparkly/tcltest] 0 4]
  235.     file delete -force /tmp/sparkly
  236.     file delete -force /tmp/library
  237.     set x
  238. } [list /tmp/lib/tcl[info tclversion] /lib/tcl[info tclversion] 
  239.         /tmp/library /library /tcl[info patchlevel]/library]
  240. test unixInit-2.10 {TclpInitLibraryPath: executable relative} -constraints {
  241. unixOnly stdio
  242. } -setup {
  243.     set tmpDir [makeDirectory tmp]
  244.     set sparklyDir [makeDirectory sparkly $tmpDir]
  245.     set execPath [file join [makeDirectory bin $sparklyDir] tcltest]
  246.     file copy [interpreter] $execPath
  247.     set libDir [makeDirectory lib $sparklyDir]
  248.     set scriptDir [makeDirectory tcl[info tclversion] $libDir]
  249.     makeFile {} init.tcl $scriptDir
  250.     set saveDir [pwd]
  251.     cd $libDir
  252. } -body {
  253.     # Checking for Bug 832657
  254.     set x [lrange [getlibpath [file join .. bin tcltest]] 2 3]
  255.     foreach p $x {
  256.       lappend y [file normalize $p]
  257.     }
  258.     set y
  259. } -cleanup {
  260.     cd $saveDir
  261.     unset saveDir
  262.     removeFile init.tcl $scriptDir
  263.     unset scriptDir
  264.     removeDirectory tcl[info tclversion] $libDir
  265.     unset libDir
  266.     file delete $execPath
  267.     unset execPath
  268.     removeDirectory bin $sparklyDir
  269.     removeDirectory lib $sparklyDir
  270.     unset sparklyDir
  271.     removeDirectory sparkly $tmpDir
  272.     unset tmpDir
  273.     removeDirectory tmp
  274.     unset x p y
  275. } -result [list [file join [temporaryDirectory] tmp sparkly library] 
  276. [file join [temporaryDirectory] tmp library] ]
  277. test unixInit-3.1 {TclpSetInitialEncodings} -constraints {
  278. unixOnly stdio
  279. } -body {
  280.     set env(LANG) C
  281.     set f [open "|[list [interpreter]]" w+]
  282.     fconfigure $f -buffering none
  283.     puts $f {puts [encoding system]; exit}
  284.     set enc [gets $f]
  285.     close $f
  286.     unset env(LANG)
  287.     set enc
  288. } -match regexp -result [expr {
  289. ($tcl_platform(os) eq "Darwin") ? "^utf-8$" : "^iso8859-15?$"}]
  290. test unixInit-3.2 {TclpSetInitialEncodings} {unixOnly stdio} {
  291.     set env(LANG) japanese
  292.     catch {set oldlc_all $env(LC_ALL)}
  293.     set env(LC_ALL) japanese
  294.     set f [open "|[list [interpreter]]" w+]
  295.     fconfigure $f -buffering none
  296.     puts $f {puts [encoding system]; exit}
  297.     set enc [gets $f]
  298.     close $f
  299.     unset env(LANG)
  300.     unset env(LC_ALL)
  301.     catch {set env(LC_ALL) $oldlc_all}
  302.     set validEncodings [list euc-jp]
  303.     if {[string match HP-UX $tcl_platform(os)]} {
  304. # Some older HP-UX systems need us to accept this as valid
  305. # Bug 453883 reports that newer HP-UX systems report euc-jp
  306. # like everybody else.
  307. lappend validEncodings shiftjis
  308.     }
  309.     expr {[lsearch -exact $validEncodings $enc] < 0}
  310. } 0
  311. test unixInit-4.1 {TclpSetVariables} {unixOnly} {
  312.     # just make sure they exist
  313.     set a [list $tcl_library $tcl_pkgPath $tcl_platform(os)]
  314.     set a [list $tcl_platform(osVersion) $tcl_platform(machine)]
  315.     set tcl_platform(platform)
  316. } "unix"
  317. test unixInit-5.1 {Tcl_Init} {emptyTest unixOnly} {
  318.     # test initScript
  319. } {}
  320. test unixInit-6.1 {Tcl_SourceRCFile} {emptyTest unixOnly} {
  321. } {}
  322. test unixInit-7.1 {closed standard channel: Bug 772288} -constraints {
  323. unixOnly stdio
  324. } -body {
  325.     set tclsh [interpreter]
  326.     set crash [makeFile {puts [open /dev/null]} crash.tcl]
  327.     set crashtest [makeFile "
  328. close stdin
  329. [list exec $tclsh $crash]
  330.     " crashtest.tcl]
  331.     exec $tclsh $crashtest
  332. } -cleanup {
  333.     removeFile crash.tcl
  334.     removeFile crashtest.tcl
  335. } -returnCodes 0
  336. # cleanup
  337. if {[info exists oldlibrary]} {
  338.     set env(TCL_LIBRARY) $oldlibrary
  339. }
  340. catch {unset env(LANG)}
  341. catch {set env(LANG) $oldlang}
  342. unset -nocomplain path
  343. ::tcltest::cleanupTests
  344. return