diff options
Diffstat (limited to 'db-4.8.30/test/fop004.tcl')
-rw-r--r-- | db-4.8.30/test/fop004.tcl | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/db-4.8.30/test/fop004.tcl b/db-4.8.30/test/fop004.tcl new file mode 100644 index 0000000..14ce8b3 --- /dev/null +++ b/db-4.8.30/test/fop004.tcl @@ -0,0 +1,260 @@ +# See the file LICENSE for redistribution information. +# +# Copyright (c) 2000-2009 Oracle. All rights reserved. +# +# $Id$ +# +# TEST fop004 +# TEST Test of DB->rename(). (formerly test075) +# TEST Test that files can be renamed from one directory to another. +# TEST Test that files can be renamed using absolute or relative +# TEST pathnames. +proc fop004 { method { tnum "004" } args } { + global encrypt + global errorCode + global errorInfo + source ./include.tcl + + set args [convert_args $method $args] + set omethod [convert_method $method] + + puts "Fop$tnum: ($method $args): Test of DB->rename()" + + set eindex [lsearch -exact $args "-env"] + if { $eindex != -1 } { + # If we are using an env, then skip this test. + # It needs its own. + incr eindex + set env [lindex $args $eindex] + puts "Skipping fop$tnum for env $env" + return + } + if { $encrypt != 0 } { + puts "Skipping fop$tnum for security" + return + } + cleanup $testdir NULL + + # Define absolute pathnames + set curdir [pwd] + cd $testdir + set fulldir [pwd] + cd $curdir + set reldir $testdir + + # Name subdirectories for renaming from one directory to another. + set subdira A + set subdirb B + + # Set up absolute and relative pathnames for test + set paths [list "absolute $fulldir" "relative $reldir"] + set files [list "fop$tnum-old.db fop$tnum-new.db {name change}" \ + "fop$tnum.db fop$tnum.db {directory change}"] + + foreach pathinfo $paths { + set pathtype [lindex $pathinfo 0] + set path [lindex $pathinfo 1] + foreach fileinfo $files { + set desc [lindex $fileinfo 2] + puts "Fop$tnum: Test of $pathtype path $path with $desc" + set env NULL + set envargs "" + + # Loop through test using the following rename options + # 1. no environment, not in transaction + # 2. with environment, not in transaction + # 3. rename with auto-commit + # 4. rename in committed transaction + # 5. rename in aborted transaction + + foreach op "noenv env auto commit abort" { + + puts "\tFop$tnum.a: Create/rename with $op" + # If we are using an env, then testfile should + # be the db name. Otherwise it is the path we + # are testing and the name. + # + set old [lindex $fileinfo 0] + set new [lindex $fileinfo 1] + # Set up subdirectories if necessary. + if { $desc == "directory change" } { + file mkdir $testdir/$subdira + file mkdir $testdir/$subdirb + set oldname $subdira/$old + set newname $subdirb/$new + set oldextent $subdira/__dbq.$old.0 + set newextent $subdirb/__dbq.$new.0 + } else { + set oldname $old + set newname $new + set oldextent __dbq.$old.0 + set newextent __dbq.$new.0 + } + # If we don't have an env, we're going to + # operate on the file using its absolute + # or relative path. Tack it on the front. + if { $op == "noenv" } { + set oldfile $path/$oldname + set newfile $path/$newname + set oldextent $path/$oldextent + set newextent $path/$newextent + } else { + set oldfile $oldname + set newfile $newname + set txnarg "" + if { $op == "auto" || $op == "commit" \ + || $op == "abort" } { + set txnarg " -txn" + } + set env [eval {berkdb_env -create} \ + $txnarg -home $path] + set envargs "-env $env" + error_check_good \ + env_open [is_valid_env $env] TRUE + } + + # Files don't exist before starting the test. + # + check_file_exist $oldfile $env $path 0 + check_file_exist $newfile $env $path 0 + + puts "\t\tFop$tnum.a.1: Create file $oldfile" + set db [eval {berkdb_open -create -mode 0644} \ + $omethod $envargs $args $oldfile] + error_check_good dbopen [is_valid_db $db] TRUE + + # Use numeric key so record-based methods + # don't need special treatment. + set key 1 + set data data + + error_check_good dbput \ + [$db put $key [chop_data $method $data]] 0 + error_check_good dbclose [$db close] 0 + + puts "\t\tFop$tnum.a.2:\ + Rename file to $newfile" + check_file_exist $oldfile $env $path 1 + check_file_exist $newfile $env $path 0 + + # Regular renames use berkdb dbrename + # Txn-protected renames use $env dbrename. + if { $op == "noenv" || $op == "env" } { + error_check_good rename [eval \ + {berkdb dbrename} $envargs \ + $oldfile $newfile] 0 + } elseif { $op == "auto" } { + error_check_good rename [eval \ + {$env dbrename} -auto_commit \ + $oldfile $newfile] 0 + } else { + # $op is "abort" or "commit" + set txn [$env txn] + error_check_good rename [eval \ + {$env dbrename} -txn $txn \ + $oldfile $newfile] 0 + error_check_good txn_$op [$txn $op] 0 + } + + if { $op != "abort" } { + check_file_exist $oldfile $env $path 0 + check_file_exist $newfile $env $path 1 + } else { + check_file_exist $oldfile $env $path 1 + check_file_exist $newfile $env $path 0 + } + + # Check that extent files moved too, unless + # we aborted the rename. + if { [is_queueext $method ] == 1 } { + if { $op != "abort" } { + check_file_exist \ + $oldextent $env $path 0 + check_file_exist \ + $newextent $env $path 1 + } else { + check_file_exist \ + $oldextent $env $path 1 + check_file_exist \ + $newextent $env $path 0 + } + } + + puts "\t\tFop$tnum.a.3: Check file contents" + # Open again with create to make sure we're not + # caching. In the normal case (no env), we + # already know the file doesn't exist. + set odb [eval {berkdb_open -create -mode 0644} \ + $envargs $omethod $args $oldfile] + set ndb [eval {berkdb_open -create -mode 0644} \ + $envargs $omethod $args $newfile] + error_check_good \ + odb_open [is_valid_db $odb] TRUE + error_check_good \ + ndb_open [is_valid_db $ndb] TRUE + + # The DBT from the "old" database should be + # empty, not the "new" one, except in the case + # of an abort. + set odbt [$odb get $key] + if { $op == "abort" } { + error_check_good \ + odbt_has_data [llength $odbt] 1 + } else { + set ndbt [$ndb get $key] + error_check_good \ + odbt_empty [llength $odbt] 0 + error_check_bad \ + ndbt_empty [llength $ndbt] 0 + error_check_good ndbt \ + [lindex [lindex $ndbt 0] 1] \ + [pad_data $method $data] + } + error_check_good odb_close [$odb close] 0 + error_check_good ndb_close [$ndb close] 0 + + # Now there's both an old and a new. Rename the + # "new" to the "old" and make sure that fails. + # + puts "\tFop$tnum.b: Make sure rename fails\ + instead of overwriting" + set envargs "" + if { $env != "NULL" } { + error_check_good \ + env_close [$env close] 0 + set env [berkdb_env_noerr -home $path] + set envargs " -env $env" + error_check_good env_open2 \ + [is_valid_env $env] TRUE + } + set ret [catch {eval {berkdb dbrename} \ + $envargs $newfile $oldfile} res] + error_check_bad rename_overwrite $ret 0 + error_check_good rename_overwrite_ret \ + [is_substr $errorCode EEXIST] 1 + + # Verify and then start over from a clean slate. + verify_dir $path "\tFop$tnum.c: " + verify_dir $path/$subdira "\tFop$tnum.c: " + verify_dir $path/$subdirb "\tFop$tnum.c: " + if { $env != "NULL" } { + error_check_good \ + env_close2 [$env close] 0 + } + env_cleanup $path + check_file_exist $oldfile $env $path 0 + check_file_exist $newfile $env $path 0 + } + } + } +} + +proc check_file_exist { filename env path expected } { + if { $env != "NULL" } { + error_check_good "$filename exists in env" \ + [file exists $path/$filename] $expected + } else { + error_check_good \ + "$filename exists" [file exists $filename] $expected + } +} |