1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
# See the file LICENSE for redistribution information.
#
# Copyright (c) 1999, 2000
# Sleepycat Software. All rights reserved.
#
# $Id: env003.tcl,v 11.12 2000/08/25 14:21:50 sue Exp $
#
# Env Test 003
# Test DB_TMP_DIR and env name resolution
# With an environment path specified using -home, and then again
# with it specified by the environment variable DB_HOME:
# 1) Make sure that the DB_TMP_DIR config file option is respected
# a) as a relative pathname.
# b) as an absolute pathname.
# 2) Make sure that the DB_TMP_DIR db_config argument is respected,
# again as relative and absolute pathnames.
# 3) Make sure that if -both- db_config and a file are present,
# only the file is respected (see doc/env/naming.html).
proc env003 { } {
# env003 is essentially just a small driver that runs
# env003_body twice. First, it supplies a "home" argument
# to use with environment opens, and the second time it sets
# DB_HOME instead.
# Note that env003_body itself calls env003_run_test to run
# the body of the actual test.
global env
source ./include.tcl
puts "Env003: DB_TMP_DIR test."
puts "\tEnv003: Running with -home argument to berkdb env."
env003_body "-home $testdir"
puts "\tEnv003: Running with environment variable DB_HOME set."
set env(DB_HOME) $testdir
env003_body "-use_environ"
unset env(DB_HOME)
puts "\tEnv003: Running with both DB_HOME and -home set."
# Should respect -only- -home, so we give it a bogus
# environment variable setting.
set env(DB_HOME) $testdir/bogus_home
env003_body "-use_environ -home $testdir"
unset env(DB_HOME)
}
proc env003_body { home_arg } {
source ./include.tcl
env_cleanup $testdir
set tmpdir "tmpfiles_in_here"
file mkdir $testdir/$tmpdir
# Set up full path to $tmpdir for when we test absolute paths.
set curdir [pwd]
cd $testdir/$tmpdir
set fulltmpdir [pwd]
cd $curdir
# Run test with the temp dir. nonexistent--it checks for failure.
env_cleanup $testdir
env003_make_config $tmpdir
# Run the meat of the test.
env003_run_test a 1 "relative path, config file" $home_arg \
$testdir/$tmpdir
env_cleanup $testdir
env003_make_config $fulltmpdir
# Run the test again
env003_run_test a 2 "absolute path, config file" $home_arg \
$fulltmpdir
env_cleanup $testdir
# Now we try without a config file, but instead with db_config
# relative paths
env003_run_test b 1 "relative path, db_config" "$home_arg \
-tmp_dir $tmpdir -data_dir ." \
$testdir/$tmpdir
env_cleanup $testdir
# absolute
env003_run_test b 2 "absolute path, db_config" "$home_arg \
-tmp_dir $fulltmpdir -data_dir ." \
$fulltmpdir
env_cleanup $testdir
# Now, set db_config -and- have a # DB_CONFIG file, and make
# sure only the latter is honored.
# Make a temp directory that actually does exist to supply
# as a bogus argument--the test checks for -nonexistent- temp
# dirs., as success is harder to detect.
file mkdir $testdir/bogus
env003_make_config $tmpdir
# note that we supply an -existent- tmp dir to db_config as
# a red herring
env003_run_test c 1 "relative path, both db_config and file" \
"$home_arg -tmp_dir $testdir/bogus -data_dir ." \
$testdir/$tmpdir
env_cleanup $testdir
file mkdir $fulltmpdir
file mkdir $fulltmpdir/bogus
env003_make_config $fulltmpdir/nonexistent
# note that we supply an -existent- tmp dir to db_config as
# a red herring
env003_run_test c 2 "relative path, both db_config and file" \
"$home_arg -tmp_dir $fulltmpdir/bogus -data_dir ." \
$fulltmpdir
}
proc env003_run_test { major minor msg env_args tmp_path} {
global testdir
global alphabet
global errorCode
puts "\t\tEnv003.$major.$minor: $msg"
# Create an environment and small-cached in-memory database to
# use.
set dbenv [eval {berkdb env -create -home $testdir} $env_args \
{-cachesize {0 40960 1}}]
error_check_good env_open [is_valid_env $dbenv] TRUE
set db [berkdb_open_noerr -env $dbenv -create -btree]
error_check_good db_open [is_valid_db $db] TRUE
# Fill the database with more than its cache can fit.
# !!!
# This is actually trickier than it sounds. The tempfile
# gets unlinked as soon as it's created, so there's no straightforward
# way to check for its existence. Instead, we make sure
# DB_TMP_DIR points somewhere bogus, and make sure that the temp
# dir. does -not- exist. But to do this, we have to know
# which call to DB->put is going to fail--the temp file is
# created lazily, so the failure only occurs when the cache finally
# overflows.
# The data we've conjured up will fit nicely once, but the second
# call will overflow the cache. Thus we check for success once,
# then failure.
#
set key1 "key1"
set key2 "key2"
set data [repeat $alphabet 1000]
# First put should succeed.
error_check_good db_put_1 [$db put $key1 $data] 0
# Second one should return ENOENT.
set errorCode NONE
catch {$db put $key2 $data} res
error_check_good db_put_2 [is_substr $errorCode ENOENT] 1
error_check_good db_close [$db close] 0
error_check_good env_close [$dbenv close] 0
}
proc env003_make_config { tmpdir } {
global testdir
set cid [open $testdir/DB_CONFIG w]
puts $cid "set_data_dir ."
puts $cid "set_tmp_dir $tmpdir"
close $cid
}
|