os/persistentdata/persistentstorage/sqlite3api/TEST/TCL/tcldistribution/tests/env.test
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
# Commands covered:  none (tests environment variable implementation)
sl@0
     2
#
sl@0
     3
# This file contains a collection of tests for one or more of the Tcl
sl@0
     4
# built-in commands.  Sourcing this file into Tcl runs the tests and
sl@0
     5
# generates output for errors.  No output means no errors were found.
sl@0
     6
#
sl@0
     7
# Copyright (c) 1991-1993 The Regents of the University of California.
sl@0
     8
# Copyright (c) 1994 Sun Microsystems, Inc.
sl@0
     9
# Copyright (c) 1998-1999 by Scriptics Corporation.
sl@0
    10
#
sl@0
    11
# See the file "license.terms" for information on usage and redistribution
sl@0
    12
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
sl@0
    13
#
sl@0
    14
# RCS: @(#) $Id: env.test,v 1.17.2.5 2007/01/19 01:05:50 das Exp $
sl@0
    15
sl@0
    16
package require tcltest 2
sl@0
    17
namespace import -force ::tcltest::*
sl@0
    18
sl@0
    19
#
sl@0
    20
# These tests will run on any platform (and indeed crashed
sl@0
    21
# on the Mac).  So put them before you test for the existance
sl@0
    22
# of exec.
sl@0
    23
#
sl@0
    24
test env-1.1 {propagation of env values to child interpreters} {
sl@0
    25
    catch {interp delete child}
sl@0
    26
    catch {unset env(test)}
sl@0
    27
    interp create child
sl@0
    28
    set env(test) garbage
sl@0
    29
    set return [child eval {set env(test)}]
sl@0
    30
    interp delete child
sl@0
    31
    unset env(test)
sl@0
    32
    set return
sl@0
    33
} {garbage}
sl@0
    34
#
sl@0
    35
# This one crashed on Solaris under Tcl8.0, so we only
sl@0
    36
# want to make sure it runs.
sl@0
    37
#
sl@0
    38
test env-1.2 {lappend to env value} {
sl@0
    39
    catch {unset env(test)}
sl@0
    40
    set env(test) aaaaaaaaaaaaaaaa
sl@0
    41
    append env(test) bbbbbbbbbbbbbb
sl@0
    42
    unset env(test)
sl@0
    43
} {}
sl@0
    44
test env-1.3 {reflection of env by "array names"} {
sl@0
    45
    catch {interp delete child}
sl@0
    46
    catch {unset env(test)}
sl@0
    47
    interp create child
sl@0
    48
    child eval {set env(test) garbage}
sl@0
    49
    set names [array names env]
sl@0
    50
    interp delete child
sl@0
    51
    set ix [lsearch $names test]
sl@0
    52
    catch {unset env(test)}
sl@0
    53
    expr {$ix >= 0}
sl@0
    54
} {1}
sl@0
    55
sl@0
    56
sl@0
    57
# Some tests require the "exec" command.
sl@0
    58
# Skip them if exec is not defined.
sl@0
    59
testConstraint exec [llength [info commands exec]]
sl@0
    60
sl@0
    61
set printenvScript [makeFile {
sl@0
    62
    proc lrem {listname name} {
sl@0
    63
	upvar $listname list
sl@0
    64
	set i [lsearch $list $name]
sl@0
    65
	if {$i >= 0} {
sl@0
    66
	    set list [lreplace $list $i $i]
sl@0
    67
	}
sl@0
    68
	return $list
sl@0
    69
    }
sl@0
    70
	
sl@0
    71
    set names [lsort [array names env]]
sl@0
    72
    if {$tcl_platform(platform) == "windows"} {
sl@0
    73
	lrem names HOME
sl@0
    74
        lrem names COMSPEC
sl@0
    75
	lrem names ComSpec
sl@0
    76
	lrem names ""
sl@0
    77
    }	
sl@0
    78
    foreach name {
sl@0
    79
	TCL_LIBRARY PATH LD_LIBRARY_PATH LIBPATH PURE_PROG_NAME DISPLAY
sl@0
    80
	SHLIB_PATH SYSTEMDRIVE SYSTEMROOT DYLD_LIBRARY_PATH DYLD_FRAMEWORK_PATH
sl@0
    81
	DYLD_NEW_LOCAL_SHARED_REGIONS DYLD_NO_FIX_PREBINDING
sl@0
    82
	__CF_USER_TEXT_ENCODING SECURITYSESSIONID
sl@0
    83
    } {
sl@0
    84
	lrem names $name
sl@0
    85
    }
sl@0
    86
    foreach p $names {
sl@0
    87
	puts "$p=$env($p)"
sl@0
    88
    }
sl@0
    89
    exit
sl@0
    90
} printenv]
sl@0
    91
	
sl@0
    92
# [exec] is required here to see the actual environment received
sl@0
    93
# by child processes.
sl@0
    94
proc getenv {} {
sl@0
    95
    global printenvScript tcltest
sl@0
    96
    catch {exec [interpreter] $printenvScript} out
sl@0
    97
    if {$out == "child process exited abnormally"} {
sl@0
    98
	set out {}
sl@0
    99
    }
sl@0
   100
    return $out
sl@0
   101
}
sl@0
   102
sl@0
   103
# Save the current environment variables at the start of the test.
sl@0
   104
sl@0
   105
foreach name [array names env] {
sl@0
   106
    set env2([string toupper $name]) $env($name)
sl@0
   107
    unset env($name)
sl@0
   108
}
sl@0
   109
sl@0
   110
# Added the following lines so that child tcltest can actually find its
sl@0
   111
# library if the initial tcltest is run from a non-standard place.
sl@0
   112
# ('saved' env vars)
sl@0
   113
foreach name {
sl@0
   114
	TCL_LIBRARY PATH LD_LIBRARY_PATH LIBPATH DISPLAY SHLIB_PATH
sl@0
   115
	SYSTEMDRIVE SYSTEMROOT DYLD_LIBRARY_PATH DYLD_FRAMEWORK_PATH
sl@0
   116
	DYLD_NEW_LOCAL_SHARED_REGIONS DYLD_NO_FIX_PREBINDING
sl@0
   117
	SECURITYSESSIONID} {
sl@0
   118
    if {[info exists env2($name)]} {
sl@0
   119
	set env($name) $env2($name);
sl@0
   120
    }
sl@0
   121
}
sl@0
   122
sl@0
   123
test env-2.1 {adding environment variables} {exec} {
sl@0
   124
    getenv
sl@0
   125
} {}
sl@0
   126
sl@0
   127
set env(NAME1) "test string"
sl@0
   128
test env-2.2 {adding environment variables} {exec} {
sl@0
   129
    getenv
sl@0
   130
} {NAME1=test string}
sl@0
   131
sl@0
   132
set env(NAME2) "more"
sl@0
   133
test env-2.3 {adding environment variables} {exec} {
sl@0
   134
    getenv
sl@0
   135
} {NAME1=test string
sl@0
   136
NAME2=more}
sl@0
   137
sl@0
   138
set env(XYZZY) "garbage"
sl@0
   139
test env-2.4 {adding environment variables} {exec} {
sl@0
   140
    getenv
sl@0
   141
} {NAME1=test string
sl@0
   142
NAME2=more
sl@0
   143
XYZZY=garbage}
sl@0
   144
sl@0
   145
set env(NAME2) "new value"
sl@0
   146
test env-3.1 {changing environment variables} {exec} {
sl@0
   147
    set result [getenv]
sl@0
   148
    unset env(NAME2)
sl@0
   149
    set result
sl@0
   150
} {NAME1=test string
sl@0
   151
NAME2=new value
sl@0
   152
XYZZY=garbage}
sl@0
   153
sl@0
   154
test env-4.1 {unsetting environment variables} {exec} {
sl@0
   155
    set result [getenv]
sl@0
   156
    unset env(NAME1)
sl@0
   157
    set result
sl@0
   158
} {NAME1=test string
sl@0
   159
XYZZY=garbage}
sl@0
   160
sl@0
   161
test env-4.2 {unsetting environment variables} {exec} {
sl@0
   162
    set result [getenv]
sl@0
   163
    unset env(XYZZY)
sl@0
   164
    set result
sl@0
   165
} {XYZZY=garbage}
sl@0
   166
sl@0
   167
test env-4.3 {setting international environment variables} {exec} {
sl@0
   168
    set env(\ua7) \ub6
sl@0
   169
    getenv
sl@0
   170
} "\ua7=\ub6"
sl@0
   171
test env-4.4 {changing international environment variables} {exec} {
sl@0
   172
    set env(\ua7) \ua7
sl@0
   173
    getenv
sl@0
   174
} "\ua7=\ua7"
sl@0
   175
test env-4.5 {unsetting international environment variables} {exec} {
sl@0
   176
    set env(\ub6) \ua7
sl@0
   177
    unset env(\ua7)
sl@0
   178
    set result [getenv]
sl@0
   179
    unset env(\ub6)
sl@0
   180
    set result
sl@0
   181
} "\ub6=\ua7"
sl@0
   182
sl@0
   183
test env-5.0 {corner cases - set a value, it should exist} {} {
sl@0
   184
    set env(temp) a
sl@0
   185
    set result [set env(temp)]
sl@0
   186
    unset env(temp)
sl@0
   187
    set result
sl@0
   188
} {a}
sl@0
   189
test env-5.1 {corner cases - remove one elem at a time} {} {
sl@0
   190
    # When no environment variables exist, the env var will
sl@0
   191
    # contain no entries.  The "array names" call synchs up
sl@0
   192
    # the C-level environ array with the Tcl level env array.
sl@0
   193
    # Make sure an empty Tcl array is created.
sl@0
   194
sl@0
   195
    set x [array get env]
sl@0
   196
    foreach e [array names env] {
sl@0
   197
	unset env($e)
sl@0
   198
    }
sl@0
   199
    set result [catch {array names env}]
sl@0
   200
    array set env $x
sl@0
   201
    set result
sl@0
   202
} {0}
sl@0
   203
test env-5.2 {corner cases - unset the env array} {} {
sl@0
   204
    # Unsetting a variable in an interp detaches the C-level
sl@0
   205
    # traces from the Tcl "env" variable.
sl@0
   206
sl@0
   207
    interp create i 
sl@0
   208
    i eval { unset env }
sl@0
   209
    i eval { set env(THIS_SHOULDNT_EXIST) a}
sl@0
   210
    set result [info exists env(THIS_SHOULDNT_EXIST)]
sl@0
   211
    interp delete i
sl@0
   212
    set result
sl@0
   213
} {0}
sl@0
   214
test env-5.3 {corner cases - unset the env in master should unset child} {} {
sl@0
   215
    # Variables deleted in a master interp should be deleted in
sl@0
   216
    # child interp too.
sl@0
   217
sl@0
   218
    interp create i 
sl@0
   219
    i eval { set env(THIS_SHOULD_EXIST) a}
sl@0
   220
    set result [set env(THIS_SHOULD_EXIST)]
sl@0
   221
    unset env(THIS_SHOULD_EXIST)
sl@0
   222
    lappend result [i eval {catch {set env(THIS_SHOULD_EXIST)}}]
sl@0
   223
    interp delete i
sl@0
   224
    set result
sl@0
   225
} {a 1}
sl@0
   226
test env-5.4 {corner cases - unset the env array} {} {
sl@0
   227
    # The info exists command should be in synch with the env array.
sl@0
   228
    # Know Bug: 1737
sl@0
   229
sl@0
   230
    interp create i 
sl@0
   231
    i eval { set env(THIS_SHOULD_EXIST) a}
sl@0
   232
    set     result [info exists env(THIS_SHOULD_EXIST)]
sl@0
   233
    lappend result [set env(THIS_SHOULD_EXIST)]
sl@0
   234
    lappend result [info exists env(THIS_SHOULD_EXIST)]
sl@0
   235
    interp delete i
sl@0
   236
    set result
sl@0
   237
} {1 a 1}
sl@0
   238
test env-5.5 {corner cases - cannot have null entries on Windows} {pcOnly} {
sl@0
   239
    set env() a
sl@0
   240
    catch {set env()}
sl@0
   241
} {1}
sl@0
   242
sl@0
   243
test env-6.1 {corner cases - add lots of env variables} {} {
sl@0
   244
    set size [array size env]
sl@0
   245
    for {set i 0} {$i < 100} {incr i} {
sl@0
   246
	set env(BOGUS$i) $i
sl@0
   247
    }
sl@0
   248
    expr {[array size env] - $size}
sl@0
   249
} 100
sl@0
   250
sl@0
   251
# Restore the environment variables at the end of the test.
sl@0
   252
sl@0
   253
foreach name [array names env] {
sl@0
   254
    unset env($name)
sl@0
   255
}
sl@0
   256
foreach name [array names env2] {
sl@0
   257
    set env($name) $env2($name)
sl@0
   258
}
sl@0
   259
sl@0
   260
# cleanup
sl@0
   261
removeFile $printenvScript
sl@0
   262
::tcltest::cleanupTests
sl@0
   263
return