188be0209Sdan# 2017 December 9 288be0209Sdan# 388be0209Sdan# The author disclaims copyright to this source code. In place of 488be0209Sdan# a legal notice, here is a blessing: 588be0209Sdan# 688be0209Sdan# May you do good and not evil. 788be0209Sdan# May you find forgiveness for yourself and forgive others. 888be0209Sdan# May you share freely, never taking more than you give. 988be0209Sdan# 1088be0209Sdan#*********************************************************************** 1188be0209Sdan# 1288be0209Sdan# Test the shell tool ".ar" command. 1388be0209Sdan# 1488be0209Sdan 1588be0209Sdanset testdir [file dirname $argv0] 1688be0209Sdansource $testdir/tester.tcl 1788be0209Sdanset testprefix shell8 1888be0209Sdanset CLI [test_find_cli] 1988be0209Sdan 2088be0209Sdanproc populate_dir {dirname spec} { 2188be0209Sdan # First delete the current tree, if one exists. 2288be0209Sdan file delete -force $dirname 2388be0209Sdan 2488be0209Sdan # Recreate the root of the new tree. 2588be0209Sdan file mkdir $dirname 2688be0209Sdan 2788be0209Sdan # Add each file to the new tree. 2888be0209Sdan foreach {f d} $spec { 2988be0209Sdan set path [file join $dirname $f] 3088be0209Sdan file mkdir [file dirname $path] 3188be0209Sdan set fd [open $path w] 3288be0209Sdan puts -nonewline $fd $d 3388be0209Sdan close $fd 3488be0209Sdan } 3588be0209Sdan} 3688be0209Sdan 372ad0949dSdanproc dir_to_list {dirname {n -1}} { 382ad0949dSdan if {$n<0} {set n [llength [file split $dirname]]} 392ad0949dSdan 4088be0209Sdan set res [list] 4188be0209Sdan foreach f [glob -nocomplain $dirname/*] { 4288be0209Sdan set mtime [file mtime $f] 43*dfdfd8c7Smistachkin if {$::tcl_platform(platform)!="windows"} { 4488be0209Sdan set perm [file attributes $f -perm] 45*dfdfd8c7Smistachkin } else { 46*dfdfd8c7Smistachkin set perm 0 47*dfdfd8c7Smistachkin } 482ad0949dSdan set relpath [file join {*}[lrange [file split $f] $n end]] 4988be0209Sdan lappend res 5088be0209Sdan if {[file isdirectory $f]} { 5188be0209Sdan lappend res [list $relpath / $mtime $perm] 5288be0209Sdan lappend res {*}[dir_to_list $f] 5388be0209Sdan } else { 5488be0209Sdan set fd [open $f] 5588be0209Sdan set data [read $fd] 5688be0209Sdan close $fd 5788be0209Sdan lappend res [list $relpath $data $mtime $perm] 5888be0209Sdan } 5988be0209Sdan } 6088be0209Sdan lsort $res 6188be0209Sdan} 6288be0209Sdan 6388be0209Sdanproc dir_compare {d1 d2} { 6488be0209Sdan set l1 [dir_to_list $d1] 6588be0209Sdan set l2 [dir_to_list $d1] 6688be0209Sdan string compare $l1 $l2 6788be0209Sdan} 6888be0209Sdan 69d4b56e59Sdanforeach {tn tcl} { 70d4b56e59Sdan 1 { 71d4b56e59Sdan set c1 ".ar c ar1" 72d4b56e59Sdan set x1 ".ar x" 73d4b56e59Sdan 74d4b56e59Sdan set c2 ".ar cC ar1 ." 75d4b56e59Sdan set x2 ".ar Cx ar3" 76ece4b0c1Sdan 77ece4b0c1Sdan set c3 ".ar cCf ar1 test_xyz.db ." 78ece4b0c1Sdan set x3 ".ar Cfx ar3 test_xyz.db" 79d4b56e59Sdan } 80d4b56e59Sdan 81d4b56e59Sdan 2 { 82d4b56e59Sdan set c1 ".ar -c ar1" 83d4b56e59Sdan set x1 ".ar -x" 84d4b56e59Sdan 85d4b56e59Sdan set c2 ".ar -cC ar1 ." 86d4b56e59Sdan set x2 ".ar -xC ar3" 87ece4b0c1Sdan 88ece4b0c1Sdan set c3 ".ar -cCar1 -ftest_xyz.db ." 89ece4b0c1Sdan set x3 ".ar -x -C ar3 -f test_xyz.db" 90d4b56e59Sdan } 91d4b56e59Sdan 92d4b56e59Sdan 3 { 93d4b56e59Sdan set c1 ".ar --create ar1" 94d4b56e59Sdan set x1 ".ar --extract" 95d4b56e59Sdan 96d4b56e59Sdan set c2 ".ar --directory ar1 --create ." 97d4b56e59Sdan set x2 ".ar --extract --dir ar3" 98ece4b0c1Sdan 99ece4b0c1Sdan set c3 ".ar --creat --dir ar1 --file test_xyz.db ." 100ece4b0c1Sdan set x3 ".ar --e --d ar3 --f test_xyz.db" 101d4b56e59Sdan } 102d4b56e59Sdan 103d4b56e59Sdan 4 { 104d4b56e59Sdan set c1 ".ar --cr ar1" 105d4b56e59Sdan set x1 ".ar --e" 106d4b56e59Sdan 107d4b56e59Sdan set c2 ".ar -C ar1 -c ." 108d4b56e59Sdan set x2 ".ar -x -C ar3" 109ece4b0c1Sdan 110ece4b0c1Sdan set c3 ".ar -c --directory ar1 --file test_xyz.db ." 111ece4b0c1Sdan set x3 ".ar -x --directory ar3 --file test_xyz.db" 112d4b56e59Sdan } 113d4b56e59Sdan} { 114d4b56e59Sdan eval $tcl 115d4b56e59Sdan 116d4b56e59Sdan # Populate directory "ar1" with some files. 117d4b56e59Sdan # 11888be0209Sdan populate_dir ar1 { 11988be0209Sdan file1 "abcd" 12088be0209Sdan file2 "efgh" 12188be0209Sdan dir1/file3 "ijkl" 12288be0209Sdan } 12388be0209Sdan set expected [dir_to_list ar1] 12488be0209Sdan 125d4b56e59Sdan do_test 1.$tn.1 { 126d4b56e59Sdan catchcmd test_ar.db $c1 12788be0209Sdan file delete -force ar1 128d4b56e59Sdan catchcmd test_ar.db $x1 12988be0209Sdan dir_to_list ar1 13088be0209Sdan } $expected 13188be0209Sdan 132d4b56e59Sdan do_test 1.$tn.2 { 1332ad0949dSdan file delete -force ar3 134d4b56e59Sdan catchcmd test_ar.db $c2 135d4b56e59Sdan catchcmd test_ar.db $x2 1361ad3f61bSdan dir_to_list ar3 1371ad3f61bSdan } $expected 138ece4b0c1Sdan 139ece4b0c1Sdan do_test 1.$tn.3 { 140ece4b0c1Sdan file delete -force ar3 141ece4b0c1Sdan file delete -force test_xyz.db 142ece4b0c1Sdan catchcmd ":memory:" $c3 143ece4b0c1Sdan catchcmd ":memory:" $x3 144ece4b0c1Sdan dir_to_list ar3 145ece4b0c1Sdan } $expected 146ac15e2d7Sdan 147ac15e2d7Sdan # This is a repeat of test 1.$tn.1, except that there is a 2 second 148ac15e2d7Sdan # pause between creating the archive and extracting its contents. 149ac15e2d7Sdan # This is to test that timestamps are set correctly. 150ac15e2d7Sdan # 151ac15e2d7Sdan # Because it is slow, only do this for $tn==1. 152ac15e2d7Sdan if {$tn==1} { 153ac15e2d7Sdan do_test 1.$tn.1 { 154ac15e2d7Sdan catchcmd test_ar.db $c1 155ac15e2d7Sdan file delete -force ar1 156ac15e2d7Sdan after 2000 157ac15e2d7Sdan catchcmd test_ar.db $x1 158ac15e2d7Sdan dir_to_list ar1 159ac15e2d7Sdan } $expected 160ac15e2d7Sdan } 161d4b56e59Sdan} 162d4b56e59Sdan 163d4b56e59Sdanfinish_test 1641ad3f61bSdan 16588be0209Sdan 16688be0209Sdan 16788be0209Sdanfinish_test 168d4b56e59Sdan 169