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
|