tests/tests.yml

Sun, 20 Jan 2008 15:32:02 -0500

author
brett
date
Sun, 20 Jan 2008 15:32:02 -0500
branch
trunk
changeset 58
16506464d57b
parent 53
cd853ddb224c
child 62
17d845dacff5
permissions
-rw-r--r--

[svn] Steel FilenameChecker against race conditions.

Since FilenameChecker was just using os.path.exists() to see whether or not
a filename was free, it had a time of check vs. time of use vulnerability.
Matthew was prodding me about the inconsistency with DirectoryChecker, so
that inspired me to fix this. This also entailed some refactoring. Thanks
Matthew.

- name: basic .tar
  filenames: test-1.23.tar
  baseline: |
    tar -xf $1

- name: basic .tar.gz
  filenames: test-1.23.tar.gz
  baseline: |
    tar -zxf $1

- name: basic .tar.bz2
  filenames: test-1.23.tar.bz2
  baseline: |
    mkdir test-1.23
    cd test-1.23
    tar -jxf ../$1

- name: basic .zip
  filenames: test-1.23.zip
  baseline: |
    mkdir test-1.23
    cd test-1.23
    unzip -q ../$1

- name: basic .deb
  filenames: test-1.23_all.deb
  baseline: |
    mkdir test-1.23
    cd test-1.23
    ar p ../$1 data.tar.gz | tar -zx

- name: basic .gem
  filenames: test-1.23.gem
  baseline: |
    mkdir test-1.23
    cd test-1.23
    tar -xOf ../$1 data.tar.gz | tar -zx

- name: basic .7z
  filenames: test-1.23.7z
  baseline: |
    7z x $1

- name: basic .lzma
  filenames: test-1.23.tar.lzma
  baseline: |
    lzcat $1 | tar -x

- name: .deb metadata
  filenames: test-1.23_all.deb
  options: --metadata
  baseline: |
    mkdir test-1.23
    cd test-1.23
    ar p ../$1 control.tar.gz | tar -zx
    
- name: .gem metadata
  filenames: test-1.23.gem
  options: -m
  baseline: |
    tar -xOf $1 metadata.gz | zcat > test-1.23.gem-metadata.txt
  cleanup: rm -f test-1.23.gem-metadata.txt
  posttest: |
    if [ "x`cat test-1.23.gem-metadata.txt`" != "xhi" ]; then exit 1; fi

- name: recursion and permissions
  filenames: test-recursive-badperms.tar.bz2
  options: -n -r
  baseline: |
    mkdir test-recursive-badperms
    cd test-recursive-badperms
    tar -jxf ../$1
    mkdir test-badperms
    cd test-badperms
    tar -xf ../test-badperms.tar
    chmod 700 testdir
  posttest: |
    if [ "x`cat test-recursive-badperms/test-badperms/testdir/testfile`" != \
         "xhey" ]; then exit 1; fi

- name: decompressing gz
  directory: inside-dir
  filenames: ../test-text.gz
  baseline: |
    zcat $1 >test-text
  posttest: |
    if [ "x`cat test-text`" != "xhi" ]; then exit 1; fi

- name: decompressing bz2
  directory: inside-dir
  filenames: ../test-text.bz2
  baseline: |
    bzcat $1 >test-text
  posttest: |
    if [ "x`cat test-text`" != "xhi" ]; then exit 1; fi

- name: decompression with -r
  directory: inside-dir
  filenames: ../test-text.gz
  options: -n -r
  baseline: |
    zcat $1 >test-text

- name: decompression with -fr
  directory: inside-dir
  filenames: ../test-text.gz
  options: -n -fr
  baseline: |
    zcat $1 >test-text

- name: overwrite protection
  filenames: test-1.23.tar.bz2
  baseline: |
    mkdir test-1.23.1
    cd test-1.23.1
    tar -jxf ../$1
  prerun: |
    mkdir test-1.23

- name: overwrite option
  filenames: test-1.23.tar.bz2
  options: -n -o
  baseline: |
    cd test-1.23
    tar -jxf ../$1
  prerun: |
    mkdir test-1.23 

- name: flat option
  directory: inside-dir
  filenames: ../test-1.23.tar.bz2
  options: -n -f
  baseline: |
    tar -jxf $1

- name: flat recursion and permissions
  directory: inside-dir
  filenames: ../test-recursive-badperms.tar.bz2
  options: -n -fr
  baseline: |
    tar -jxf $1
    tar -xf test-badperms.tar
    chmod 700 testdir
  posttest: |
    if [ "x`cat testdir/testfile`" != "xhey" ]; then exit 1; fi

- name: no files
  error: true
  grep: "[Uu]sage"

- name: bad file
  error: true
  filenames: nonexistent-file.tar

- name: not an archive
  error: true
  filenames: tests.yml

- name: bad options
  options: -n --nonexistent-option
  filenames: test-1.23.tar
  error: true

- name: --version
  options: -n --version
  grep: ersion \d+\.\d+
  filenames: test-1.23.tar
  baseline: |
    exit 0

- name: one good archive of many
  filenames: tests.yml test-1.23.tar nonexistent-file.tar
  error: true
  baseline: |
    tar -xf $2

- name: silence
  filenames: tests.yml
  options: -n -qq
  error: true
  antigrep: .

- name: can't write to directory
  directory: inside-dir
  filenames: ../test-1.23.tar
  error: true
  grep: ERROR
  antigrep: Traceback
  prerun: |
    chmod 500 .

- name: list contents of one file
  options: -n -l
  filenames: test-1.23.tar
  output: |
    test-1.23/
    test-1.23/1/
    test-1.23/1/2/
    test-1.23/1/2/3
    test-1.23/a/
    test-1.23/a/b
    test-1.23/foobar

- name: list contents of multiple files
  options: -n --table
  filenames: test-1.23_all.deb test-1.23.zip
  output: |
    test-1.23_all.deb:
    1/
    1/2/
    1/2/3
    a/
    a/b
    foobar
    
    test-1.23.zip:
    1/2/3
    a/b
    foobar

- name: list contents of compressed file
  options: -n -t
  filenames: test-text.gz
  output: test-text

- name: default behavior with one directory (gz)
  options: -n
  filenames: test-onedir.tar.gz
  baseline: |
    mkdir test-onedir
    cd test-onedir
    tar -zxf ../$1

- name: one directory extracted inside another (gz)
  options: ""
  filenames: test-onedir.tar.gz
  input: i
  baseline: |
    mkdir test-onedir
    cd test-onedir
    tar -zxf ../$1

- name: one directory extracted with rename (gz)
  options: ""
  filenames: test-onedir.tar.gz
  input: r
  baseline: |
    tar -zxf $1
    mv test test-onedir

- name: one directory extracted here (gz)
  options: ""
  filenames: test-onedir.tar.gz
  input: h
  baseline: |
    tar -zxf $1

- name: default behavior with one directory (bz2)
  options: -n
  filenames: test-onedir.tar.gz
  baseline: |
    mkdir test-onedir
    cd test-onedir
    tar -zxf ../$1

- name: one directory extracted inside another (bz2)
  options: ""
  filenames: test-onedir.tar.gz
  input: i
  baseline: |
    mkdir test-onedir
    cd test-onedir
    tar -zxf ../$1

- name: one directory extracted with rename (bz2)
  options: ""
  filenames: test-onedir.tar.gz
  input: r
  baseline: |
    tar -zxf $1
    mv test test-onedir

- name: one directory extracted here (bz2)
  options: ""
  filenames: test-onedir.tar.gz
  input: h
  baseline: |
    tar -zxf $1

- name: default behavior with one file
  options: -n
  filenames: test-onefile.tar.gz
  baseline: |
    mkdir test-onefile
    cd test-onefile
    tar -zxf ../$1

- name: one file extracted inside a directory
  options: ""
  filenames: test-onefile.tar.gz
  input: i
  baseline: |
    mkdir test-onefile
    cd test-onefile
    tar -zxf ../$1

- name: one file extracted with rename
  options: ""
  filenames: test-onefile.tar.gz
  input: r
  baseline: |
    tar -zxOf $1 >test-onefile

- name: one file extracted here
  options: ""
  filenames: test-onefile.tar.gz
  input: h
  baseline: |
    tar -zxf $1

- name: bomb with preceding dot in the table
  filenames: test-dot-first-bomb.tar.gz
  options: ""
  antigrep: one entry
  baseline: |
    mkdir test-dot-first-bomb
    cd test-dot-first-bomb
    tar -zxf ../$1

- name: one directory preceded by dot in the table
  filenames: test-dot-first-onedir.tar.gz
  options: ""
  grep: "one entry: (./)?dir/"
  input: h
  baseline: |
    tar -zxf $1

- name: two one-item archives with different answers
  filenames: test-onedir.tar.gz test-onedir.tar.gz
  options: ""
  input: |
    h
    r
  baseline: |
    tar -zxf $1
    mv test test-onedir
    tar -zxf $1

- name: interactive recursion (always)
  filenames: test-recursive-badperms.tar.bz2 test-recursive-badperms.tar.bz2
  options: ""
  input: |
    i
    a
    i
  baseline: |
    extract() {
      mkdir test-recursive-badperms$2
      cd test-recursive-badperms$2
      tar -jxf ../$1
      mkdir test-badperms
      cd test-badperms
      tar -xf ../test-badperms.tar
      chmod 700 testdir
      cd ../..
    }
    extract $1
    extract $1 .1

- name: interactive recursion (once)
  filenames: test-recursive-badperms.tar.bz2 test-recursive-badperms.tar.bz2
  options: ""
  input: |
    i
    o
    i
    n
  baseline: |
    mkdir test-recursive-badperms
    cd test-recursive-badperms
    tar -jxf ../$1
    mkdir test-badperms
    cd test-badperms
    tar -xf ../test-badperms.tar
    chmod 700 testdir
    cd ../..
    mkdir test-recursive-badperms.1
    cd test-recursive-badperms.1
    tar -jxf ../$1

- name: interactive recursion (never)
  filenames: test-recursive-badperms.tar.bz2 test-recursive-badperms.tar.bz2
  options: ""
  input: |
    i
    v
    i
  baseline: |
    extract() {
      mkdir test-recursive-badperms$2
      cd test-recursive-badperms$2
      tar -jxf ../$1
      cd ..
    }
    extract $1
    extract $1 .1

- name: recursion in subdirectories here
  filenames: test-deep-recursion.tar
  options: ""
  input: |
    h
    o
  grep: "contains 2"
  baseline: |
    tar -xf $1
    cd subdir
    zcat test-text.gz > test-text
    cd subsubdir
    zcat test-text.gz > test-text

- name: recursion in subdirectories with rename
  filenames: test-deep-recursion.tar
  options: ""
  input: |
    r
    o
  grep: "contains 2"
  baseline: |
    tar -xf $1
    mv subdir test-deep-recursion
    cd test-deep-recursion
    zcat test-text.gz > test-text
    cd subsubdir
    zcat test-text.gz > test-text

- name: recursion in subdirectories inside new dir
  filenames: test-deep-recursion.tar
  options: ""
  input: |
    i
    o
  grep: "contains 2"
  baseline: |
    mkdir test-deep-recursion
    cd test-deep-recursion
    tar -xf ../$1
    cd subdir
    zcat test-text.gz > test-text
    cd subsubdir
    zcat test-text.gz > test-text

- name: extracting file with bad extension
  filenames: test-1.23.bin
  prerun: cp ${1}test-1.23.tar.gz ${1}test-1.23.bin
  cleanup: rm -f ${1}test-1.23.bin
  baseline: |
    tar -zxf $1

- name: extracting file with misleading extension
  filenames: trickery.tar.gz
  prerun: cp ${1}test-1.23.zip ${1}trickery.tar.gz
  cleanup: rm -f ${1}trickery.tar.gz
  baseline: |
    mkdir trickery
    cd trickery
    unzip -q ../$1

- name: non-archive error
  filenames: /dev/null
  error: true
  grep: "not a known archive type"

- name: no such file error
  filenames: nonexistent-file.tar.gz
  error: true
  grep: "[Nn]o such file"

- name: no such file error with no extension
  filenames: nonexistent-file
  error: true
  grep: "[Nn]o such file"

- name: try to extract a directory error
  filenames: test-directory
  prerun: mkdir test-directory
  error: true
  grep: "cannot extract a directory"

- name: permission denied error
  filenames: unreadable-file.tar.gz
  prerun: |
    touch unreadable-file.tar.gz
    chmod 000 unreadable-file.tar.gz
  cleanup: rm -f unreadable-file.tar.gz
  error: true
  grep: "[Pp]ermission denied"

- name: permission denied no-pipe file error
  filenames: unreadable-file.zip
  prerun: |
    touch unreadable-file.zip
    chmod 000 unreadable-file.zip
  cleanup: rm -f unreadable-file.zip
  error: true
  grep: "[Pp]ermission denied"

- name: bad file error
  filenames: bogus-file.tar.gz
  prerun: |
    touch bogus-file.tar.gz
  cleanup: rm -f bogus-file.tar.gz
  error: true
  grep: "returned status code [^0]"

- name: try to extract in unwritable directory
  directory: unwritable-dir
  filenames: ../test-1.23.tar.gz
  prerun: chmod 500 .
  error: true
  grep: "cannot extract here: [Pp]ermission denied"

- name: recursive listing is a no-op
  options: -rl
  filenames: test-recursive-badperms.tar.bz2
  grep: test-badperms.tar
  antigrep: testdir/

- name: graceful coping when many extraction directories are taken
  directory: busydir
  prerun: |
    mkdir test-1.23
    for i in $(seq 1 10); do mkdir test-1.23.$i; done
  filenames: ../test-1.23.tar.gz
  grep: "WARNING: extracting"

- name: graceful coping when many decompression targets are taken
  directory: busydir
  prerun: |
    touch test-text
    for i in $(seq 1 10); do touch test-text.$i; done
  filenames: ../test-text.gz
  grep: "WARNING: extracting"

- name: output filenames with -v
  options: -v -n
  filenames: test-onedir.tar.gz test-text.gz
  output: |
    test-onedir.tar.gz:
    test-onedir/
    test-onedir/test/
    test-onedir/test/foobar
    test-onedir/test/quux
    
    test-text.gz:
    test-text

- name: output filenames with -v and -f
  options: -nvf
  directory: busydir
  filenames: ../test-onedir.tar.gz
  output: |
    ../test-onedir.tar.gz:
    test/
    test/foobar
    test/quux

- name: list recursive archives
  options: ""
  filenames: test-deep-recursion.tar
  input: |
    r
    l
    n
  grep: "^test-deep-recursion/subsubdir/test-text\.gz$"

mercurial