1
0
mirror of git://git.gnupg.org/gnupg.git synced 2025-04-17 15:44:34 +02:00

tests: Speed up the test suite.

* tests/openpgp/run-tests.scm (test::run-sync): Pass additional
arguments to the test.
(test::run-sync-quiet): Likewise.
(test::run-async): Likewise.
(run-tests-{parallel,sequential}-isolated): Create a tarball of the
gnupghome, then extract it for each test.
* tests/openpgp/setup.scm: Refactor into functions, add an interface
to tar-up the created environment, and untar it multiple times.

Signed-off-by: Justus Winter <justus@g10code.com>
This commit is contained in:
Justus Winter 2016-09-05 17:17:24 +02:00
parent c97bde2dfe
commit 46c4333c37
2 changed files with 150 additions and 126 deletions

View File

@ -82,10 +82,10 @@
(new name directory command pid x)) (new name directory command pid x))
(define (set-pid x) (define (set-pid x)
(new name directory command x retcode)) (new name directory command x retcode))
(define (run-sync) (define (run-sync . args)
(with-working-directory directory (with-working-directory directory
(let* ((p (inbound-pipe)) (let* ((p (inbound-pipe))
(pid (spawn-process-fd command CLOSED_FD (pid (spawn-process-fd (append command args) CLOSED_FD
(:write-end p) (:write-end p)))) (:write-end p) (:write-end p))))
(close (:write-end p)) (close (:write-end p))
(splice (:read-end p) STDERR_FILENO) (splice (:read-end p) STDERR_FILENO)
@ -93,14 +93,16 @@
(let ((t' (set-retcode (wait-process name pid #t)))) (let ((t' (set-retcode (wait-process name pid #t))))
(t'::report) (t'::report)
t')))) t'))))
(define (run-sync-quiet) (define (run-sync-quiet . args)
(with-working-directory directory (with-working-directory directory
(set-retcode (set-retcode
(wait-process (wait-process
name (spawn-process-fd command CLOSED_FD CLOSED_FD CLOSED_FD) #t)))) name (spawn-process-fd (append command args)
(define (run-async) CLOSED_FD CLOSED_FD CLOSED_FD) #t))))
(define (run-async . args)
(with-working-directory directory (with-working-directory directory
(set-pid (spawn-process-fd command CLOSED_FD CLOSED_FD CLOSED_FD)))) (set-pid (spawn-process-fd (append command args)
CLOSED_FD CLOSED_FD CLOSED_FD))))
(define (status) (define (status)
(let ((t (assoc retcode '((0 "PASS") (77 "SKIP") (99 "ERROR"))))) (let ((t (assoc retcode '((0 "PASS") (77 "SKIP") (99 "ERROR")))))
(if (not t) "FAIL" (cadr t)))) (if (not t) "FAIL" (cadr t))))
@ -119,21 +121,24 @@
(loop (pool::add (test::run-async)) (cdr tests')))))) (loop (pool::add (test::run-async)) (cdr tests'))))))
(define (run-tests-parallel-isolated setup teardown . tests) (define (run-tests-parallel-isolated setup teardown . tests)
(let loop ((pool (test-pool::new '())) (tests' tests)) (lettmp (gpghome-tar)
(if (null? tests') (setup::run-sync '--create-tarball gpghome-tar)
(let ((results (pool::wait))) (let loop ((pool (test-pool::new '())) (tests' tests))
(for-each (lambda (t) (if (null? tests')
(let ((teardown' (teardown::set-directory t::directory))) (let ((results (pool::wait)))
(teardown'::run-sync-quiet)) (for-each (lambda (t)
(unlink-recursively t::directory) (let ((teardown' (teardown::set-directory
(t::report)) results::procs) t::directory)))
(exit (results::report))) (teardown'::run-sync-quiet))
(let* ((wd (mkdtemp)) (unlink-recursively t::directory)
(test (car tests')) (t::report)) results::procs)
(test' (test::set-directory wd)) (exit (results::report)))
(setup' (setup::set-directory wd))) (let* ((wd (mkdtemp))
(setup'::run-sync-quiet) (test (car tests'))
(loop (pool::add (test'::run-async)) (cdr tests')))))) (test' (test::set-directory wd))
(setup' (setup::set-directory wd)))
(setup'::run-sync-quiet '--unpack-tarball gpghome-tar)
(loop (pool::add (test'::run-async)) (cdr tests')))))))
(define (run-tests-sequential-shared setup teardown . tests) (define (run-tests-sequential-shared setup teardown . tests)
(let loop ((pool (test-pool::new '())) (let loop ((pool (test-pool::new '()))
@ -145,21 +150,24 @@
(loop (pool::add (test::run-sync)) (cdr tests')))))) (loop (pool::add (test::run-sync)) (cdr tests'))))))
(define (run-tests-sequential-isolated setup teardown . tests) (define (run-tests-sequential-isolated setup teardown . tests)
(let loop ((pool (test-pool::new '())) (tests' tests)) (lettmp (gpghome-tar)
(if (null? tests') (setup::run-sync '--create-tarball gpghome-tar)
(let ((results (pool::wait))) (let loop ((pool (test-pool::new '())) (tests' tests))
(for-each (lambda (t) (if (null? tests')
(let ((teardown' (teardown::set-directory t::directory))) (let ((results (pool::wait)))
(teardown'::run-sync-quiet)) (for-each (lambda (t)
(unlink-recursively t::directory)) (let ((teardown' (teardown::set-directory
results::procs) t::directory)))
(exit (results::report))) (teardown'::run-sync-quiet))
(let* ((wd (mkdtemp)) (unlink-recursively t::directory))
(test (car tests')) results::procs)
(test' (test::set-directory wd)) (exit (results::report)))
(setup' (setup::set-directory wd))) (let* ((wd (mkdtemp))
(setup'::run-sync-quiet) (test (car tests'))
(loop (pool::add (test'::run-sync)) (cdr tests')))))) (test' (test::set-directory wd))
(setup' (setup::set-directory wd)))
(setup'::run-sync-quiet '--unpack-tarball gpghome-tar)
(loop (pool::add (test'::run-sync)) (cdr tests')))))))
(define all-tests (define all-tests
'("version.scm" '("version.scm"

View File

@ -19,103 +19,119 @@
(load (with-path "defs.scm")) (load (with-path "defs.scm"))
(echo "Creating test environment...") (define (create-gpghome)
(echo "Creating test environment...")
(letfd ((fd (open "random_seed" (logior O_WRONLY O_CREAT O_BINARY) #o600))) (letfd ((fd (open "random_seed" (logior O_WRONLY O_CREAT O_BINARY) #o600)))
(call-with-fds (list (tool 'mktdata) "600") CLOSED_FD fd STDERR_FILENO)) (call-with-fds (list (tool 'mktdata) "600") CLOSED_FD fd STDERR_FILENO))
(for-each-p (for-each-p
"Creating configuration files" "Creating configuration files"
(lambda (name) (lambda (name)
(file-copy (in-srcdir (string-append name ".tmpl")) name) (file-copy (in-srcdir (string-append name ".tmpl")) name)
(let ((p (open-input-output-file name))) (let ((p (open-input-output-file name)))
(cond (cond
((string=? "gpg.conf" name) ((string=? "gpg.conf" name)
(if have-opt-always-trust (if have-opt-always-trust
(display "no-auto-check-trustdb\n" p)) (display "no-auto-check-trustdb\n" p))
(display (string-append "agent-program " (display (string-append "agent-program "
(tool 'gpg-agent) (tool 'gpg-agent)
"|--debug-quick-random\n") p) "|--debug-quick-random\n") p)
(display "allow-weak-digest-algos\n" p)) (display "allow-weak-digest-algos\n" p))
((string=? "gpg-agent.conf" name) ((string=? "gpg-agent.conf" name)
(display (string-append "pinentry-program " PINENTRY "\n") p))))) (display (string-append "pinentry-program " PINENTRY "\n") p)))))
'("gpg.conf" "gpg-agent.conf")) '("gpg.conf" "gpg-agent.conf"))
(echo "Starting gpg-agent...") (for-each-p "Creating sample data files"
(call-check `(,(tool 'gpg-connect-agent) --verbose (lambda (size)
,(string-append "--agent-program=" (tool 'gpg-agent) (letfd ((fd (open (string-append "data-" (number->string size))
"|--debug-quick-random") (logior O_WRONLY O_CREAT O_BINARY) #o600)))
/bye)) (call-with-fds (list (tool 'mktdata) (number->string size))
CLOSED_FD fd STDERR_FILENO)))
'(500 9000 32000 80000))
(for-each-p "Creating sample data files" (for-each-p "Unpacking samples"
(lambda (size) (lambda (name)
(letfd ((fd (open (string-append "data-" (number->string size)) (dearmor (in-srcdir (string-append name "o.asc")) name))
(logior O_WRONLY O_CREAT O_BINARY) #o600))) '("plain-1" "plain-2" "plain-3" "plain-large"))
(call-with-fds (list (tool 'mktdata) (number->string size))
CLOSED_FD fd STDERR_FILENO)))
'(500 9000 32000 80000))
(for-each-p "Unpacking samples" ;; XXX implement cleanup
(lambda (name) (catch '()
(dearmor (in-srcdir (string-append name "o.asc")) name)) (mkdir "private-keys-v1.d" "-rwx"))
'("plain-1" "plain-2" "plain-3" "plain-large"))
;; XXX implement cleanup (define counter (make-counter))
(catch '() (for-each-p' "Storing private keys"
(mkdir "private-keys-v1.d" "-rwx")) (lambda (name)
(dearmor (in-srcdir (string-append "/privkeys/" name ".asc"))
(string-append "private-keys-v1.d/" name ".key")))
(lambda (name) (counter))
'("50B2D4FA4122C212611048BC5FC31BD44393626E"
"7E201E28B6FEB2927B321F443205F4724EBE637E"
"13FDB8809B17C5547779F9D205C45F47CE0217CE"
"343D8AF79796EE107D645A2787A9D9252F924E6F"
"8B5ABF3EF9EB8D96B91A0B8C2C4401C91C834C34"
"0D6F6AD4C4C803B25470F9104E9F4E6A4CA64255"
"FD692BD59D6640A84C8422573D469F84F3B98E53"
"76F7E2B35832976B50A27A282D9B87E44577EB66"
"A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD"
"00FE67F28A52A8AA08FFAED20AF832DA916D1985"
"1DF48228FEFF3EC2481B106E0ACA8C465C662CC5"
"A2832820DC9F40751BDCD375BB0945BA33EC6B4C"
"ADE710D74409777B7729A7653373D820F67892E0"
"CEFC51AF91F68A2904FBFF62C4F075A4785B803F"
"1E28F20E41B54C2D1234D896096495FF57E08D18"
"EB33B687EB8581AB64D04852A54453E85F3DF62D"
"C6A6390E9388CDBAD71EAEA698233FE5E04F001E"
"D69102E0F5AC6B6DB8E4D16DA8E18CF46D88CAE3"))
(define counter (make-counter)) (info "Importing public demo and test keys")
(for-each-p' "Storing private keys" (call-check `(,@GPG --yes --import
(lambda (name) ,(in-srcdir "pubdemo.asc")
(dearmor (in-srcdir (string-append "/privkeys/" name ".asc")) ,(in-srcdir "pubring.asc")
(string-append "private-keys-v1.d/" name ".key"))) ,(in-srcdir key-file1)))
(lambda (name) (counter)) (pipe:do
'("50B2D4FA4122C212611048BC5FC31BD44393626E" (pipe:open (in-srcdir "pubring.pkr.asc") (logior O_RDONLY O_BINARY))
"7E201E28B6FEB2927B321F443205F4724EBE637E" (pipe:spawn `(,@GPG --dearmor))
"13FDB8809B17C5547779F9D205C45F47CE0217CE" (pipe:spawn `(,@GPG --yes --import))))
"343D8AF79796EE107D645A2787A9D9252F924E6F"
"8B5ABF3EF9EB8D96B91A0B8C2C4401C91C834C34"
"0D6F6AD4C4C803B25470F9104E9F4E6A4CA64255"
"FD692BD59D6640A84C8422573D469F84F3B98E53"
"76F7E2B35832976B50A27A282D9B87E44577EB66"
"A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD"
"00FE67F28A52A8AA08FFAED20AF832DA916D1985"
"1DF48228FEFF3EC2481B106E0ACA8C465C662CC5"
"A2832820DC9F40751BDCD375BB0945BA33EC6B4C"
"ADE710D74409777B7729A7653373D820F67892E0"
"CEFC51AF91F68A2904FBFF62C4F075A4785B803F"
"1E28F20E41B54C2D1234D896096495FF57E08D18"
"EB33B687EB8581AB64D04852A54453E85F3DF62D"
"C6A6390E9388CDBAD71EAEA698233FE5E04F001E"
"D69102E0F5AC6B6DB8E4D16DA8E18CF46D88CAE3"))
(info "Importing public demo and test keys") (define (start-agent)
(call-check `(,@GPG --yes --import (echo "Starting gpg-agent...")
,(in-srcdir "pubdemo.asc") (call-check `(,(tool 'gpg-connect-agent) --verbose
,(in-srcdir "pubring.asc") ,(string-append "--agent-program=" (tool 'gpg-agent)
,(in-srcdir key-file1))) "|--debug-quick-random")
;; (letfd ((source (open (in-srcdir "pubring.pkr.asc") O_RDONLY))) /bye))
;; ((gpg-pipe '(--dearmor) '(--yes --import) STDERR_FILENO)
;; source CLOSED_FD))
(pipe:do
(pipe:open (in-srcdir "pubring.pkr.asc") (logior O_RDONLY O_BINARY))
(pipe:spawn `(,@GPG --dearmor))
(pipe:spawn `(,@GPG --yes --import)))
(info "Preset passphrases") (info "Preset passphrases")
;; one@example.com ;; one@example.com
(call-check `(,(tool 'gpg-preset-passphrase) (call-check `(,(tool 'gpg-preset-passphrase)
--preset --passphrase def --preset --passphrase def
"50B2D4FA4122C212611048BC5FC31BD44393626E")) "50B2D4FA4122C212611048BC5FC31BD44393626E"))
(call-check `(,(tool 'gpg-preset-passphrase) (call-check `(,(tool 'gpg-preset-passphrase)
--preset --passphrase def --preset --passphrase def
"7E201E28B6FEB2927B321F443205F4724EBE637E")) "7E201E28B6FEB2927B321F443205F4724EBE637E"))
;; alpha@example.net ;; alpha@example.net
(call-check `(,(tool 'gpg-preset-passphrase) (call-check `(,(tool 'gpg-preset-passphrase)
--preset --passphrase abc --preset --passphrase abc
"76F7E2B35832976B50A27A282D9B87E44577EB66")) "76F7E2B35832976B50A27A282D9B87E44577EB66"))
(call-check `(,(tool 'gpg-preset-passphrase) (call-check `(,(tool 'gpg-preset-passphrase)
--preset --passphrase abc --preset --passphrase abc
"A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD")) "A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD"))
(echo "All set up."))
(echo "All set up.") (define (kill-agent)
(call-check `(,(tool 'gpg-connect-agent) --verbose killagent /bye)))
(cond
((member "--create-tarball" *args*)
(with-temporary-working-directory
(setenv "GNUPGHOME" (getcwd) #t)
(create-gpghome)
(kill-agent)
(call-check `(,(tool 'gpgtar) --create --output ,(cadr *args*)
,@(glob "*")))))
((member "--unpack-tarball" *args*)
(call-check `(,(tool 'gpgtar) --extract --directory=. ,(cadr *args*)))
(start-agent))
(else
(create-gpghome)
(start-agent)))