test001.tcl 5.93 KB
Newer Older
unknown's avatar
unknown committed
1 2
# See the file LICENSE for redistribution information.
#
unknown's avatar
unknown committed
3
# Copyright (c) 1996-2004
unknown's avatar
unknown committed
4 5
#	Sleepycat Software.  All rights reserved.
#
unknown's avatar
unknown committed
6
# $Id: test001.tcl,v 11.38 2004/09/22 18:01:06 bostic Exp $
unknown's avatar
unknown committed
7
#
unknown's avatar
unknown committed
8 9 10 11 12 13 14 15 16 17 18
# TEST	test001
# TEST	Small keys/data
# TEST		Put/get per key
# TEST		Dump file
# TEST		Close, reopen
# TEST		Dump file
# TEST
# TEST	Use the first 10,000 entries from the dictionary.
# TEST	Insert each with self as key and data; retrieve each.
# TEST	After all are entered, retrieve all; compare output to original.
# TEST	Close file, reopen, do retrieve and re-verify.
unknown's avatar
unknown committed
19 20
proc test001 { method {nentries 10000} \
    {start 0} {skip 0} {tnum "001"} args } {
unknown's avatar
unknown committed
21 22 23 24 25 26 27 28 29 30
	source ./include.tcl

	set args [convert_args $method $args]
	set omethod [convert_method $method]

	# Create the database and open the dictionary
	set eindex [lsearch -exact $args "-env"]
	#
	# If we are using an env, then testfile should just be the db name.
	# Otherwise it is the test directory and the name.
unknown's avatar
unknown committed
31 32 33
	# If we are not using an external env, then test setting
	# the database cache size and using multiple caches.
	set txnenv 0
unknown's avatar
unknown committed
34
	if { $eindex == -1 } {
unknown's avatar
unknown committed
35
		set testfile $testdir/test$tnum.db
unknown's avatar
unknown committed
36
		append args " -cachesize {0 1048576 3} "
unknown's avatar
unknown committed
37 38
		set env NULL
	} else {
unknown's avatar
unknown committed
39
		set testfile test$tnum.db
unknown's avatar
unknown committed
40 41
		incr eindex
		set env [lindex $args $eindex]
unknown's avatar
unknown committed
42 43 44 45 46 47 48 49 50 51 52 53 54
		set txnenv [is_txnenv $env]
		if { $txnenv == 1 } {
			append args " -auto_commit "
			#
			# If we are using txns and running with the
			# default, set the default down a bit.
			#
			if { $nentries == 10000 } {
				set nentries 100
			}
		}
		set testdir [get_home $env]
	}
unknown's avatar
unknown committed
55 56 57 58 59 60 61 62 63 64 65 66
	puts "Test$tnum: $method ($args) $nentries equal key/data pairs"
	set did [open $dict]

	# The "start" variable determines the record number to start
	# with, if we're using record numbers.  The "skip" variable
	# determines the dictionary entry to start with.
	# In normal use, skip will match start.

	puts "\tTest$tnum: Starting at $start with dictionary entry $skip"
	if { $skip != 0 } {
		for { set count 0 } { $count < $skip } { incr count } {
			gets $did str
unknown's avatar
unknown committed
67
		}
unknown's avatar
unknown committed
68
	}
unknown's avatar
unknown committed
69

unknown's avatar
unknown committed
70 71 72
	set t1 $testdir/t1
	set t2 $testdir/t2
	set t3 $testdir/t3
unknown's avatar
unknown committed
73 74 75
	set temp $testdir/temp
	cleanup $testdir $env

unknown's avatar
unknown committed
76
	set db [eval {berkdb_open \
unknown's avatar
unknown committed
77
	     -create -mode 0644} $args $omethod $testfile]
unknown's avatar
unknown committed
78 79 80 81 82 83 84 85 86 87 88 89
	error_check_good dbopen [is_valid_db $db] TRUE

	set pflags ""
	set gflags ""
	set txn ""

	if { [is_record_based $method] == 1 } {
		set checkfunc test001_recno.check
		append gflags " -recno"
	} else {
		set checkfunc test001.check
	}
unknown's avatar
unknown committed
90
	puts "\tTest$tnum.a: put/get loop"
unknown's avatar
unknown committed
91
	# Here is the loop where we put and get each key/data pair
unknown's avatar
unknown committed
92
	set count 0
unknown's avatar
unknown committed
93 94 95 96
	while { [gets $did str] != -1 && $count < $nentries } {
		if { [is_record_based $method] == 1 } {
			global kvals

unknown's avatar
unknown committed
97 98 99 100 101 102 103 104
			set key [expr $count + 1 + $start]
			if { 0xffffffff > 0 && $key > 0xffffffff } {
				set key [expr $key - 0x100000000]
			}
			if { $key == 0 || $key - 0xffffffff == 1 } {
				incr key
				incr count
			}
unknown's avatar
unknown committed
105 106 107 108 109
			set kvals($key) [pad_data $method $str]
		} else {
			set key $str
			set str [reverse $str]
		}
unknown's avatar
unknown committed
110 111 112 113 114
		if { $txnenv == 1 } {
			set t [$env txn]
			error_check_good txn [is_valid_txn $t $env] TRUE
			set txn "-txn $t"
		}
unknown's avatar
unknown committed
115 116 117
		set ret [eval \
		    {$db put} $txn $pflags {$key [chop_data $method $str]}]
		error_check_good put $ret 0
unknown's avatar
unknown committed
118 119 120 121 122 123 124
		if { $txnenv == 1 } {
			error_check_good txn [$t commit] 0
			if { $count % 50 == 0 } {
				error_check_good txn_checkpoint($count) \
				    [$env txn_checkpoint] 0
			}
		}
unknown's avatar
unknown committed
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141

		set ret [eval {$db get} $gflags {$key}]
		error_check_good \
		    get $ret [list [list $key [pad_data $method $str]]]

		# Test DB_GET_BOTH for success
		set ret [$db get -get_both $key [pad_data $method $str]]
		error_check_good \
		    getboth $ret [list [list $key [pad_data $method $str]]]

		# Test DB_GET_BOTH for failure
		set ret [$db get -get_both $key [pad_data $method BAD$str]]
		error_check_good getbothBAD [llength $ret] 0

		incr count
	}
	close $did
unknown's avatar
unknown committed
142 143 144 145 146
	if { $txnenv == 1 } {
		set t [$env txn]
		error_check_good txn [is_valid_txn $t $env] TRUE
		set txn "-txn $t"
	}
unknown's avatar
unknown committed
147 148
	# Now we will get each key from the DB and compare the results
	# to the original.
unknown's avatar
unknown committed
149 150

	puts "\tTest$tnum.b: dump file"
unknown's avatar
unknown committed
151
	dump_file $db $txn $t1 $checkfunc
unknown's avatar
unknown committed
152 153 154 155 156 157 158
	#
	# dump_file should just have been "get" calls, so
	# aborting a get should really be a no-op.  Abort
	# just for the fun of it.
	if { $txnenv == 1 } {
		error_check_good txn [$t abort] 0
	}
unknown's avatar
unknown committed
159 160 161 162 163
	error_check_good db_close [$db close] 0

	# Now compare the keys to see if they match the dictionary (or ints)
	if { [is_record_based $method] == 1 } {
		set oid [open $t2 w]
unknown's avatar
unknown committed
164 165 166 167
		for { set i 1 } { $i <= $nentries } { incr i } {
			set j [expr $i + $start]
			if { 0xffffffff > 0 && $j > 0xffffffff } {
				set j [expr $j - 0x100000000]
unknown's avatar
unknown committed
168
			}
unknown's avatar
unknown committed
169 170 171
			if { $j == 0 } {
				incr i
				incr j
unknown's avatar
unknown committed
172
			}
unknown's avatar
unknown committed
173
			puts $oid $j
unknown's avatar
unknown committed
174 175 176
		}
		close $oid
	} else {
unknown's avatar
unknown committed
177
		filehead [expr $nentries + $start] $dict $t2 [expr $start + 1]
unknown's avatar
unknown committed
178
	}
unknown's avatar
unknown committed
179 180
	filesort $t2 $temp
	file rename -force $temp $t2
unknown's avatar
unknown committed
181 182
	filesort $t1 $t3

unknown's avatar
unknown committed
183
	error_check_good Test$tnum:diff($t3,$t2) \
unknown's avatar
unknown committed
184 185
	    [filecmp $t3 $t2] 0

unknown's avatar
unknown committed
186
	puts "\tTest$tnum.c: close, open, and dump file"
unknown's avatar
unknown committed
187
	# Now, reopen the file and run the last test again.
unknown's avatar
unknown committed
188
	open_and_dump_file $testfile $env $t1 $checkfunc \
unknown's avatar
unknown committed
189 190 191 192 193
	    dump_file_direction "-first" "-next"
	if { [string compare $omethod "-recno"] != 0 } {
		filesort $t1 $t3
	}

unknown's avatar
unknown committed
194
	error_check_good Test$tnum:diff($t2,$t3) \
unknown's avatar
unknown committed
195 196 197 198
	    [filecmp $t2 $t3] 0

	# Now, reopen the file and run the last test again in the
	# reverse direction.
unknown's avatar
unknown committed
199
	puts "\tTest$tnum.d: close, open, and dump file in reverse direction"
unknown's avatar
unknown committed
200
	open_and_dump_file $testfile $env $t1 $checkfunc \
unknown's avatar
unknown committed
201 202 203 204 205 206
	    dump_file_direction "-last" "-prev"

	if { [string compare $omethod "-recno"] != 0 } {
		filesort $t1 $t3
	}

unknown's avatar
unknown committed
207
	error_check_good Test$tnum:diff($t3,$t2) \
unknown's avatar
unknown committed
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
	    [filecmp $t3 $t2] 0
}

# Check function for test001; keys and data are identical
proc test001.check { key data } {
	error_check_good "key/data mismatch" $data [reverse $key]
}

proc test001_recno.check { key data } {
	global dict
	global kvals

	error_check_good key"$key"_exists [info exists kvals($key)] 1
	error_check_good "key/data mismatch, key $key" $data $kvals($key)
}