github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/shell8.test (about)

     1  # 2017 December 9
     2  #
     3  # The author disclaims copyright to this source code.  In place of
     4  # a legal notice, here is a blessing:
     5  #
     6  #    May you do good and not evil.
     7  #    May you find forgiveness for yourself and forgive others.
     8  #    May you share freely, never taking more than you give.
     9  #
    10  #***********************************************************************
    11  #
    12  # Test the shell tool ".ar" command.
    13  #
    14  
    15  set testdir [file dirname $argv0]
    16  source $testdir/tester.tcl
    17  set testprefix shell8
    18  
    19  ifcapable !vtab {
    20    finish_test; return
    21  }
    22  set CLI [test_find_cli]
    23  
    24  # Check to make sure the shell has been compiled with ".archive" support.
    25  #
    26  if {[string match {*unknown command*} [catchcmd :memory: .archive]]} {
    27    finish_test; return
    28  }
    29  
    30  proc populate_dir {dirname spec} {
    31    # First delete the current tree, if one exists.
    32    file delete -force $dirname
    33    
    34    # Recreate the root of the new tree.
    35    file mkdir $dirname
    36  
    37    # Add each file to the new tree.
    38    foreach {f d} $spec {
    39      set path [file join $dirname $f]
    40      file mkdir [file dirname $path]
    41      set fd [open $path w]
    42      puts -nonewline $fd $d
    43      close $fd
    44    }
    45  }
    46  
    47  proc dir_to_list {dirname {n -1}} {
    48    if {$n<0} {set n [llength [file split $dirname]]}
    49  
    50    set res [list]
    51    foreach f [glob -nocomplain $dirname/*] {
    52      set mtime [file mtime $f]
    53      if {$::tcl_platform(platform)!="windows"} {
    54        set perm [file attributes $f -perm]
    55      } else {
    56        set perm 0
    57      }
    58      set relpath [file join {*}[lrange [file split $f] $n end]]
    59      lappend res 
    60      if {[file isdirectory $f]} {
    61        lappend res [list $relpath / $mtime $perm]
    62        lappend res {*}[dir_to_list $f]
    63      } else {
    64        set fd [open $f]
    65        set data [read $fd]
    66        close $fd
    67        lappend res [list $relpath $data $mtime $perm]
    68      }
    69    }
    70    lsort $res
    71  }
    72  
    73  proc dir_compare {d1 d2} {
    74    set l1 [dir_to_list $d1]
    75    set l2 [dir_to_list $d1]
    76    string compare $l1 $l2
    77  }
    78  
    79  foreach {tn tcl} {
    80    1 {
    81      set c1 ".ar c ar1"
    82      set x1 ".ar x"
    83  
    84      set c2 ".ar cC ar1 ."
    85      set x2 ".ar Cx ar3"
    86  
    87      set c3 ".ar cCf ar1 test_xyz.db ."
    88      set x3 ".ar Cfx ar3 test_xyz.db"
    89    }
    90  
    91    2 {
    92      set c1 ".ar -c ar1"
    93      set x1 ".ar -x"
    94  
    95      set c2 ".ar -cC ar1 ."
    96      set x2 ".ar -xC ar3"
    97  
    98      set c3 ".ar -cCar1 -ftest_xyz.db ."
    99      set x3 ".ar -x -C ar3 -f test_xyz.db"
   100    }
   101  
   102    3 {
   103      set c1 ".ar --create ar1"
   104      set x1 ".ar --extract"
   105  
   106      set c2 ".ar --directory ar1 --create ."
   107      set x2 ".ar --extract --dir ar3"
   108  
   109      set c3 ".ar --creat --dir ar1 --file test_xyz.db ."
   110      set x3 ".ar --e  --dir ar3 --f test_xyz.db"
   111    }
   112  
   113    4 {
   114      set c1 ".ar --cr ar1"
   115      set x1 ".ar --e"
   116  
   117      set c2 ".ar -C ar1 -c ."
   118      set x2 ".ar -x -C ar3"
   119  
   120      set c3 ".ar -c --directory ar1 --file test_xyz.db ."
   121      set x3 ".ar -x --directory ar3 --file test_xyz.db"
   122    }
   123  } {
   124    eval $tcl
   125  
   126    # Populate directory "ar1" with some files.
   127    #
   128    populate_dir ar1 {
   129      file1 "abcd" 
   130      file2 "efgh"
   131      dir1/file3 "ijkl"
   132    }
   133    set expected [dir_to_list ar1]
   134  
   135    do_test 1.$tn.1 {
   136      catchcmd test_ar.db $c1
   137      file delete -force ar1
   138      catchcmd test_ar.db $x1
   139      dir_to_list ar1
   140    } $expected
   141  
   142    do_test 1.$tn.2 {
   143      file delete -force ar3
   144      catchcmd test_ar.db $c2
   145      catchcmd test_ar.db $x2
   146      dir_to_list ar3
   147    } $expected
   148  
   149    do_test 1.$tn.3 {
   150      file delete -force ar3
   151      file delete -force test_xyz.db
   152      catchcmd ":memory:" $c3
   153      catchcmd ":memory:" $x3
   154      dir_to_list ar3
   155    } $expected
   156  
   157    # This is a repeat of test 1.$tn.1, except that there is a 2 second 
   158    # pause between creating the archive and extracting its contents.
   159    # This is to test that timestamps are set correctly.
   160    #
   161    # Because it is slow, only do this for $tn==1.
   162    if {$tn==1} {
   163      do_test 1.$tn.1 {
   164        catchcmd test_ar.db $c1
   165        file delete -force ar1
   166        after 2000
   167        catchcmd test_ar.db $x1
   168        dir_to_list ar1
   169      } $expected
   170    }
   171  }
   172  
   173  finish_test
   174  
   175  
   176  
   177  finish_test