xref: /sqlite-3.40.0/test/shell8.test (revision dfdfd8c7)
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