From be34337b06a50887bbb81bb6ef035549bec25d36 Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Fri, 25 Aug 2017 15:03:50 +0100 Subject: [PATCH] [functional-tests] Add some cache tests --- features/cache_check.feature | 100 ------------- features/cache_dump.feature | 50 ------- features/cache_restore.feature | 107 -------------- functional-tests/cache-functional-tests.scm | 138 +++++++++++++++++- .../scenario-string-constants.scm | 30 ++++ functional-tests/thin-functional-tests.scm | 8 +- 6 files changed, 166 insertions(+), 267 deletions(-) delete mode 100644 features/cache_check.feature delete mode 100644 features/cache_dump.feature delete mode 100644 features/cache_restore.feature diff --git a/features/cache_check.feature b/features/cache_check.feature deleted file mode 100644 index 7efbd40..0000000 --- a/features/cache_check.feature +++ /dev/null @@ -1,100 +0,0 @@ -Feature: cache_check - Scenario: print version (-V flag) - When I run `cache_check -V` - - Then it should pass with version - - Scenario: print version (--version flag) - When I run `cache_check --version` - - Then it should pass with version - - Scenario: print help - When I run `cache_check --help` - - Then it should pass - And cache_usage to stdout - - Scenario: print help - When I run `cache_check -h` - - Then it should pass - And cache_usage to stdout - - Scenario: Metadata file must be specified - When I run `cache_check` - - Then it should fail - And cache_usage to stderr - And the stderr should contain: - - """ - No input file provided. - """ - - Scenario: Metadata file doesn't exist - When I run `cache_check /arbitrary/filename` - - Then it should fail - And the stderr should contain: - """ - /arbitrary/filename: No such file or directory - """ - - Scenario: Metadata file cannot be a directory - Given a directory called foo - - When I run `cache_check foo` - - Then it should fail - And the stderr should contain: - """ - foo: Not a block device or regular file - """ - - # This test will fail if you're running as root - Scenario: Metadata file exists, but can't be opened - Given input without read permissions - When I run `cache_check input` - Then it should fail - And the stderr should contain: - """ - Permission denied - """ - - Scenario: Metadata file full of zeroes - Given input file - And block 1 is zeroed - When I run `cache_check input` - Then it should fail - - Scenario: --quiet is observed - Given input file - And block 1 is zeroed - When I run `cache_check --quiet input` - Then it should fail - And it should give no output - - Scenario: -q is observed - Given input file - And block 1 is zeroed - When I run `cache_check -q input` - Then it should fail - And it should give no output - - Scenario: A valid metadata area passes - Given valid cache metadata - When I run `cache_check metadata.bin` - Then it should pass - - Scenario: Invalid metadata version causes a fail - Given a small xml file - And input file - And I run cache_restore with -i metadata.xml -o input --debug-override-metadata-version 12345 - When I run `cache_check input` - Then it should fail - - Scenario: Accepts --clear-needs-check-flag - Given valid cache metadata - When I run `cache_check --clear-needs-check-flag metadata.bin` - Then it should pass \ No newline at end of file diff --git a/features/cache_dump.feature b/features/cache_dump.feature deleted file mode 100644 index 3415c6a..0000000 --- a/features/cache_dump.feature +++ /dev/null @@ -1,50 +0,0 @@ -Feature: cache_dump - Scenario: print version (-V flag) - When I run cache_dump with -V - Then it should pass with version - - Scenario: print version (--version flag) - When I run cache_dump with --version - Then it should pass with version - - @announce - Scenario: print help (-h) - When I run cache_dump with -h - Then it should pass with: - """ - Usage: cache_dump [options] {device|file} - Options: - {-h|--help} - {-o } - {-V|--version} - """ - - Scenario: print help (--help) - When I run cache_dump with -h - Then it should pass with: - """ - Usage: cache_dump [options] {device|file} - Options: - {-h|--help} - {-o } - {-V|--version} - """ - - Scenario: accepts an output file - Given valid cache metadata - When I run cache_dump with -o metadata.xml metadata.bin - Then it should pass - - Scenario: missing input file - When I run cache_dump - Then it should fail with: - """ - No input file provided. - """ - - Scenario: dump/restore is a noop - Given valid cache metadata - When I cache dump - And I cache restore - And I cache dump - Then cache dumps 1 and 2 should be identical diff --git a/features/cache_restore.feature b/features/cache_restore.feature deleted file mode 100644 index 8da011c..0000000 --- a/features/cache_restore.feature +++ /dev/null @@ -1,107 +0,0 @@ -Feature: cache_restore - Scenario: print version (-V flag) - When I run cache_restore with -V - Then it should pass with version - - Scenario: print version (--version flag) - When I run cache_restore with --version - Then it should pass with version - - Scenario: print help (-h) - When I run cache_restore with -h - Then it should pass - And the output should contain exactly: - - """ - Usage: cache_restore [options] - Options: - {-h|--help} - {-i|--input} - {-o|--output} - {-q|--quiet} - {-V|--version} - - {--debug-override-metadata-version} - {--omit-clean-shutdown} - - """ - - Scenario: print help (--help) - When I run cache_restore with -h - Then it should pass - And the output should contain exactly: - - """ - Usage: cache_restore [options] - Options: - {-h|--help} - {-i|--input} - {-o|--output} - {-q|--quiet} - {-V|--version} - - {--debug-override-metadata-version} - {--omit-clean-shutdown} - - """ - - Scenario: missing input file - Given the dev file metadata.bin - When I run cache_restore with -o metadata.bin - Then it should fail with: - """ - No input file provided. - """ - - Scenario: input file not found - Given the dev file metadata.bin - When I run cache_restore with -i foo.xml -o metadata.bin - Then it should fail - - Scenario: missing output file - When I run cache_restore with -i metadata.xml - Then it should fail with: - """ - No output file provided. - """ - - Scenario: successfully restores a valid xml file - Given a small xml file - And an empty dev file - When I run cache_restore with -i metadata.xml -o metadata.bin - Then it should pass - - Scenario: accepts --debug-override-metadata-version - Given a small xml file - And an empty dev file - When I run cache_restore with -i metadata.xml -o metadata.bin --debug-override-metadata-version 10298 - Then it should pass - - Scenario: accepts --omit-clean-shutdown - Given a small xml file - And an empty dev file - When I run cache_restore with -i metadata.xml -o metadata.bin --omit-clean-shutdown - Then it should pass - - Scenario: --quiet is accepted - Given valid cache metadata - When I run cache_restore with -i metadata.xml -o metadata.bin --quiet - Then it should pass - And the output should contain exactly: - """ - """ - - Scenario: -q is accepted - Given valid cache metadata - When I run cache_restore with -i metadata.xml -o metadata.bin -q - Then it should pass - And the output should contain exactly: - """ - """ - - Scenario: dump/restore is a noop - Given valid cache metadata - When I cache dump - And I cache restore - And I cache dump - Then dumps 1 and 2 should be identical diff --git a/functional-tests/cache-functional-tests.scm b/functional-tests/cache-functional-tests.scm index b515a5e..8ccdcef 100644 --- a/functional-tests/cache-functional-tests.scm +++ b/functional-tests/cache-functional-tests.scm @@ -37,6 +37,12 @@ (with-temp-file-sized ((md (meg 4))) b1 b2 ...)))) + (define-syntax with-empty-metadata + (syntax-rules () + ((_ (md) b1 b2 ...) + (with-temp-file-sized ((md (meg 4))) + b1 b2 ...)))) + ;; We have to export something that forces all the initialisation expressions ;; to run. (define (register-cache-tests) #t) @@ -89,14 +95,12 @@ (string-append bad-path ": Not a block device or regular file") stderr)))) - #| (define-scenario (cache-check unreadable-metadata) "Metadata file exists, but is unreadable." - (with-valid-metadata - (run-ok "chmod" "-r" (current-metadata)) - (receive (_ stderr) (run-fail "cache_check" (current-metadata)) + (with-valid-metadata (md) + (run-ok "chmod" "-r" md) + (receive (_ stderr) (run-fail "cache_check" md) (assert-starts-with "syscall 'open' failed: Permission denied" stderr)))) - |# (define-scenario (cache-check fails-with-corrupt-metadata) "Fail with corrupt superblock" @@ -129,7 +133,129 @@ (define-scenario (cache-check bad-metadata-version) "Invalid metadata version fails" (with-cache-xml (xml) - (with-temp-file-sized ((md (meg 4))) + (with-empty-metadata (md) (cache-restore "-i" xml "-o" md "--debug-override-metadata-version" "12345") (run-fail "cache_check" md)))) + + ;;;----------------------------------------------------------- + ;;; cache_restore scenarios + ;;;----------------------------------------------------------- + + (define-scenario (cache-restore v) + "print version (-V flag)" + (receive (stdout _) (cache-restore "-V") + (assert-equal tools-version stdout))) + + (define-scenario (cache-restore version) + "print version (--version flags)" + (receive (stdout _) (cache-restore "--version") + (assert-equal tools-version stdout))) + + (define-scenario (cache-restore h) + "cache_restore -h" + (receive (stdout _) (cache-restore "-h") + (assert-equal cache-restore-help stdout))) + + (define-scenario (cache-restore help) + "cache_restore --help" + (receive (stdout _) (cache-restore "--help") + (assert-equal cache-restore-help stdout))) + + (define-scenario (cache-restore no-input-file) + "forget to specify an input file" + (with-empty-metadata (md) + (receive (_ stderr) (run-fail "cache_restore" "-o" md) + (assert-starts-with "No input file provided." stderr)))) + + (define-scenario (cache-restore missing-input-file) + "the input file can't be found" + (with-empty-metadata (md) + (receive (_ stderr) (run-fail "cache_restore -i no-such-file -o" md) + (assert-starts-with "Couldn't stat file" stderr)))) + + (define-scenario (cache-restore missing-output-file) + "the output file can't be found" + (with-cache-xml (xml) + (receive (_ stderr) (run-fail "cache_restore -i " xml) + (assert-starts-with "No output file provided." stderr)))) + + (define-scenario (cache-restore tiny-output-file) + "Fails if the output file is too small." + (with-temp-file-sized ((md (* 1024 4))) + (with-cache-xml (xml) + (receive (_ stderr) (run-fail "cache_restore" "-i" xml "-o" md) + (assert-starts-with cache-restore-outfile-too-small-text stderr))))) + + (define-scenario (cache-restore successfully-restores) + "Restore succeeds." + (with-empty-metadata (md) + (with-cache-xml (xml) + (cache-restore "-i" xml "-o" md)))) + + (define-scenario (cache-restore q) + "cache_restore accepts -q" + (with-empty-metadata (md) + (with-cache-xml (xml) + (receive (stdout stderr) (cache-restore "-i" xml "-o" md "-q") + (assert-eof stdout) + (assert-eof stderr))))) + + (define-scenario (cache-restore quiet) + "cache_restore accepts --quiet" + (with-empty-metadata (md) + (with-cache-xml (xml) + (receive (stdout stderr) (cache-restore "-i" xml "-o" md "--quiet") + (assert-eof stdout) + (assert-eof stderr))))) + + ;; Failing due to a genuine bug in cache_restore + (define-scenario (cache-restore override-metadata-version) + "we can set any metadata version" + (with-empty-metadata (md) + (with-cache-xml (xml) + (cache-restore "-i" xml "-o" md "--debug-override-metadata-version 10298")))) + + (define-scenario (cache-restore omit-clean-shutdown) + "accepts --omit-clean-shutdown" + (with-empty-metadata (md) + (with-cache-xml (xml) + (cache-restore "-i" xml "-o" md "--omit-clean-shutdown")))) + + ;;;----------------------------------------------------------- + ;;; cache_dump scenarios + ;;;----------------------------------------------------------- + + (define-scenario (cache-dump v) + "print version (-V flag)" + (receive (stdout _) (cache-dump "-V") + (assert-equal tools-version stdout))) + + (define-scenario (cache-dump version) + "print version (--version flags)" + (receive (stdout _) (cache-dump "--version") + (assert-equal tools-version stdout))) + + (define-scenario (cache-dump h) + "cache_dump -h" + (receive (stdout _) (cache-dump "-h") + (assert-equal cache-dump-help stdout))) + + (define-scenario (cache-dump help) + "cache_dump --help" + (receive (stdout _) (cache-dump "--help") + (assert-equal cache-dump-help stdout))) + + (define-scenario (cache-dump missing-input-file) + "Fails with missing input file." + (receive (stdout stderr) (run-fail "cache_dump") + (assert-starts-with "No input file provided." stderr))) + + (define-scenario (cache-dump restore-is-noop) + "cache_dump followed by cache_restore is a noop." + (with-valid-metadata (md) + (receive (d1-stdout _) (cache-dump md) + (with-temp-file-containing ((xml d1-stdout)) + (cache-restore "-i" xml "-o" md) + (receive (d2-stdout _) (cache-dump md) + (assert-equal d1-stdout d2-stdout)))))) ) diff --git a/functional-tests/scenario-string-constants.scm b/functional-tests/scenario-string-constants.scm index ce2693b..f2bb014 100644 --- a/functional-tests/scenario-string-constants.scm +++ b/functional-tests/scenario-string-constants.scm @@ -7,6 +7,9 @@ thin-rmap-help cache-check-help + cache-restore-help + cache-restore-outfile-too-small-text + cache-dump-help ) (import (rnrs)) @@ -62,4 +65,31 @@ Options: {--skip-hints} {--skip-discards}") + (define cache-restore-help + "Usage: cache_restore [options] +Options: + {-h|--help} + {-i|--input} + {-o|--output} + {-q|--quiet} + {--metadata-version} <1 or 2> + {-V|--version} + + {--debug-override-metadata-version} + {--omit-clean-shutdown}") + + (define cache-restore-outfile-too-small-text + "Output file too small. + +The output file should either be a block device, +or an existing file. The file needs to be large +enough to hold the metadata.") + + (define cache-dump-help + "Usage: cache_dump [options] {device|file} +Options: + {-h|--help} + {-o } + {-V|--version} + {--repair}") ) diff --git a/functional-tests/thin-functional-tests.scm b/functional-tests/thin-functional-tests.scm index 9dded40..54b1dbd 100644 --- a/functional-tests/thin-functional-tests.scm +++ b/functional-tests/thin-functional-tests.scm @@ -143,10 +143,10 @@ (assert-starts-with "Couldn't stat file" stderr)))) (define-scenario (thin-restore missing-output-file) - "the input file can't be found" - (with-temp-file-sized ((md (meg 4))) - (receive (_ stderr) (run-fail "thin_restore -i no-such-file -o" md) - (assert-starts-with "Couldn't stat file" stderr)))) + "the output file can't be found" + (with-thin-xml (xml) + (receive (_ stderr) (run-fail "thin_restore -i " xml) + (assert-starts-with "No output file provided." stderr)))) (define-scenario (thin-restore tiny-output-file) "Fails if the output file is too small."