mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-25 07:28:20 +00:00
385741fae2
* test/lisp/abbrev-tests.el (read-write-abbrev-file-test) (read-write-abbrev-file-test-with-props) (abbrev-edit-save-to-file-test): * test/lisp/auth-source-tests.el (auth-source-test-netrc-create-secret) (auth-source-delete): * test/lisp/autoinsert-tests.el (autoinsert-tests-auto-insert-file): * test/lisp/bookmark-tests.el (with-bookmark-test-save-load): * test/lisp/buff-menu-tests.el (buff-menu-24962): * test/lisp/calendar/icalendar-tests.el (icalendar-tests--do-test-export): * test/lisp/calendar/todo-mode-tests.el (with-todo-test): * test/lisp/dired-tests.el (dired-test-bug27243-01, dired-test-bug27243-02) (dired-test-bug27243-03, dired-test-bug27631) (dired-test-bug27968, dired-test-with-temp-dirs): * test/lisp/dired-x-tests.el (dired-test-bug25942): * test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--with-temp-file): * test/lisp/emacs-lisp/check-declare-tests.el (check-declare-tests-scan) (check-declare-tests-verify-mismatch): * test/lisp/emacs-lisp/edebug-tests.el (edebug-tests-with-normal-env): * test/lisp/emacs-lisp/package-tests.el (with-package-test) (package-test-signed): * test/lisp/emacs-lisp/testcover-tests.el (testcover-tests-markup-region) (testcover-tests-run-test-case): * test/lisp/emulation/viper-tests.el (viper-test-undo-kmacro): * test/lisp/epg-tests.el (with-epg-tests): * test/lisp/eshell/em-hist-tests.el (eshell-write-readonly-history): * test/lisp/eshell/em-ls-tests.el (em-ls-test-bug27631): * test/lisp/ffap-tests.el (ffap-tests-25243): * test/lisp/files-tests.el (files-tests-bug-18141) (files-tests-read-file-in-~, files-tests-make-directory) (files-tests-copy-directory, files-tests-executable-find) (files-tests-dont-rewrite-precious-files) (files-tests--save-some-buffers): * test/lisp/ls-lisp-tests.el (ls-lisp-test-bug27631): * test/lisp/mail/uudecode-tests.el (uudecode-tests-decode-region-internal) (uudecode-tests-decode-region-external): * test/lisp/net/browse-url-tests.el (browse-url-tests-delete-temp-file): * test/lisp/progmodes/elisp-mode-tests.el (xref--case-insensitive): * test/lisp/progmodes/etags-tests.el (etags-buffer-local-tags-table-list): * test/lisp/progmodes/flymake-tests.el (ruby-backend): * test/lisp/progmodes/python-tests.el (python-tests-with-temp-file): * test/lisp/progmodes/sql-tests.el (with-sql-test-connect-harness): * test/lisp/saveplace-tests.el (saveplace-test-save-place-to-alist/file) (saveplace-test-forget-unreadable-files) (saveplace-test-place-alist-to-file): * test/lisp/so-long-tests/spelling-tests.el: * test/lisp/textmodes/reftex-tests.el (reftex-locate-bibliography-files) (reftex-parse-from-file-test): * test/lisp/thumbs-tests.el (thumbs-tests-thumbsdir/create-if-missing): * test/lisp/vc/vc-bzr-tests.el (vc-bzr-test-bug9726) (vc-bzr-test-bug9781, vc-bzr-test-faulty-bzr-autoloads): * test/lisp/vc/diff-mode-tests.el (diff-mode-test-ignore-trailing-dashes): * test/lisp/vc/ediff-ptch-tests.el (ediff-ptch-test-bug26084): * test/lisp/wdired-tests.el (wdired-test-bug32173-01) (wdired-test-bug32173-02, wdired-test-symlink-name) (wdired-test-unfinished-edit-01, wdired-test-bug34915) (wdired-test-bug39280): * test/src/buffer-tests.el (test-kill-buffer-auto-save-default): * test/src/filelock-tests.el (filelock-tests--fixture): * test/src/inotify-tests.el (inotify-file-watch-simple): * test/src/undo-tests.el (undo-test-file-modified): Prefer 'ert-with-temp-(directory|file)' to using 'make-temp-file' directly. In some cases, this is just cleanup, but in several cases this fixes bugs where an error would have lead to us not cleaning up.
191 lines
7.6 KiB
EmacsLisp
191 lines
7.6 KiB
EmacsLisp
;;; epg-tests.el --- Test suite for epg.el -*- lexical-binding: t -*-
|
|
|
|
;; Copyright (C) 2013-2021 Free Software Foundation, Inc.
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
|
;; it under the terms of the GNU General Public License as published by
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
;; (at your option) any later version.
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;; GNU General Public License for more details.
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
;;; Commentary:
|
|
|
|
;;; Code:
|
|
|
|
(require 'ert)
|
|
(require 'ert-x)
|
|
(require 'epg)
|
|
|
|
(defvar epg-tests-context nil)
|
|
|
|
(defconst epg-tests--config-program-alist
|
|
;; The default `epg-config--program-alist' requires gpg2 2.1 or
|
|
;; greater due to some practical problems with pinentry. But most
|
|
;; tests here work fine with 2.0 as well.
|
|
(let ((prog-alist (copy-tree epg-config--program-alist)))
|
|
(setf (alist-get "gpg2"
|
|
(alist-get 'OpenPGP prog-alist)
|
|
nil nil #'equal)
|
|
"2.0")
|
|
prog-alist))
|
|
|
|
(defun epg-tests-find-usable-gpg-configuration
|
|
(&optional require-passphrase require-public-key)
|
|
;; Clear config cache because we may be using a different
|
|
;; program-alist. We do want to update the cache, so that
|
|
;; `epg-make-context' can use our result.
|
|
(setq epg--configurations nil)
|
|
(epg-find-configuration 'OpenPGP nil
|
|
;; The symmetric operations fail on Hydra
|
|
;; with gpg 2.0.
|
|
(if (or (not require-passphrase) require-public-key)
|
|
epg-tests--config-program-alist)))
|
|
|
|
(defun epg-tests-passphrase-callback (_c _k _d)
|
|
;; Need to create a copy here, since the string will be wiped out
|
|
;; after the use.
|
|
(copy-sequence "test0123456789"))
|
|
|
|
(cl-defmacro with-epg-tests ((&optional &key require-passphrase
|
|
require-public-key
|
|
require-secret-key)
|
|
&rest body)
|
|
"Set up temporary locations and variables for testing."
|
|
(declare (indent 1) (debug (sexp body)))
|
|
`(ert-with-temp-directory epg-tests-home-directory
|
|
(let* ((process-environment
|
|
(append
|
|
(list "GPG_AGENT_INFO"
|
|
(format "GNUPGHOME=%s" epg-tests-home-directory))
|
|
process-environment)))
|
|
;; GNUPGHOME is needed to find a usable gpg, so we can't
|
|
;; check whether to skip any earlier (Bug#23561).
|
|
(let ((epg-config (or (epg-tests-find-usable-gpg-configuration
|
|
,require-passphrase ,require-public-key)
|
|
(ert-skip "No usable gpg config")))
|
|
(context (epg-make-context 'OpenPGP)))
|
|
(setf (epg-context-program context)
|
|
(alist-get 'program epg-config))
|
|
(setf (epg-context-home-directory context)
|
|
epg-tests-home-directory)
|
|
,(if require-passphrase
|
|
'(with-temp-file (expand-file-name
|
|
"gpg-agent.conf" epg-tests-home-directory)
|
|
(insert "pinentry-program "
|
|
(ert-resource-file "dummy-pinentry")
|
|
"\n")
|
|
(epg-context-set-passphrase-callback
|
|
context
|
|
#'epg-tests-passphrase-callback)))
|
|
,(if require-public-key
|
|
'(epg-import-keys-from-file
|
|
context
|
|
(ert-resource-file "pubkey.asc")))
|
|
,(if require-secret-key
|
|
'(epg-import-keys-from-file
|
|
context
|
|
(ert-resource-file "seckey.asc")))
|
|
(with-temp-buffer
|
|
(setq-local epg-tests-context context)
|
|
,@body)))))
|
|
|
|
(ert-deftest epg-decrypt-1 ()
|
|
:expected-result (if (getenv "EMACS_HYDRA_CI") :failed :passed) ; fixme
|
|
(with-epg-tests (:require-passphrase t)
|
|
(with-temp-file (expand-file-name "gpg.conf" epg-tests-home-directory)
|
|
(insert "ignore-mdc-error"))
|
|
(should (equal "test"
|
|
(epg-decrypt-string epg-tests-context "\
|
|
-----BEGIN PGP MESSAGE-----
|
|
Version: GnuPG v2
|
|
|
|
jA0EAwMCE19JBLTvvmhgyRrGGglRbnKkK9PJG8fDwO5ccjysrR7IcdNcnA==
|
|
=U8z7
|
|
-----END PGP MESSAGE-----")))))
|
|
|
|
(ert-deftest epg-roundtrip-1 ()
|
|
:expected-result (if (getenv "EMACS_HYDRA_CI") :failed :passed) ; fixme
|
|
(with-epg-tests (:require-passphrase t)
|
|
(let ((cipher (epg-encrypt-string epg-tests-context "symmetric" nil)))
|
|
(should (equal "symmetric"
|
|
(epg-decrypt-string epg-tests-context cipher))))))
|
|
|
|
(ert-deftest epg-roundtrip-2 ()
|
|
(with-epg-tests (:require-passphrase t
|
|
:require-public-key t
|
|
:require-secret-key t)
|
|
(let* ((recipients (epg-list-keys epg-tests-context "joe@example.com"))
|
|
(cipher (epg-encrypt-string epg-tests-context "public key"
|
|
recipients nil t)))
|
|
(should (equal "public key"
|
|
(epg-decrypt-string epg-tests-context cipher))))))
|
|
|
|
(ert-deftest epg-sign-verify-1 ()
|
|
(with-epg-tests (:require-passphrase t
|
|
:require-public-key t
|
|
:require-secret-key t)
|
|
(let (signature verify-result)
|
|
(setf (epg-context-signers epg-tests-context)
|
|
(epg-list-keys epg-tests-context "joe@example.com"))
|
|
(setq signature (epg-sign-string epg-tests-context "signed" t))
|
|
(epg-verify-string epg-tests-context signature "signed")
|
|
(setq verify-result (epg-context-result-for context 'verify))
|
|
(should (= 1 (length verify-result)))
|
|
(should (eq 'good (epg-signature-status (car verify-result)))))))
|
|
|
|
(ert-deftest epg-sign-verify-2 ()
|
|
(with-epg-tests (:require-passphrase t
|
|
:require-public-key t
|
|
:require-secret-key t)
|
|
(let (signature verify-result)
|
|
(setf (epg-context-signers epg-tests-context)
|
|
(epg-list-keys epg-tests-context "joe@example.com"))
|
|
(setq signature (epg-sign-string epg-tests-context "clearsigned" 'clear))
|
|
;; Clearsign signature always ends with a new line.
|
|
(should (equal "clearsigned\n"
|
|
(epg-verify-string epg-tests-context signature)))
|
|
(setq verify-result (epg-context-result-for context 'verify))
|
|
(should (= 1 (length verify-result)))
|
|
(should (eq 'good (epg-signature-status (car verify-result)))))))
|
|
|
|
(ert-deftest epg-sign-verify-3 ()
|
|
(with-epg-tests (:require-passphrase t
|
|
:require-public-key t
|
|
:require-secret-key t)
|
|
(let (signature verify-result)
|
|
(setf (epg-context-signers epg-tests-context)
|
|
(epg-list-keys epg-tests-context "joe@example.com"))
|
|
(setq signature (epg-sign-string epg-tests-context "normal signed"))
|
|
(should (equal "normal signed"
|
|
(epg-verify-string epg-tests-context signature)))
|
|
(setq verify-result (epg-context-result-for context 'verify))
|
|
(should (= 1 (length verify-result)))
|
|
(should (eq 'good (epg-signature-status (car verify-result)))))))
|
|
|
|
(ert-deftest epg-import-1 ()
|
|
(with-epg-tests (:require-passphrase nil)
|
|
(should (= 0 (length (epg-list-keys epg-tests-context))))
|
|
(should (= 0 (length (epg-list-keys epg-tests-context nil t)))))
|
|
(with-epg-tests (:require-passphrase nil
|
|
:require-public-key t)
|
|
(should (= 1 (length (epg-list-keys epg-tests-context))))
|
|
(should (= 0 (length (epg-list-keys epg-tests-context nil t)))))
|
|
(with-epg-tests (:require-public-key nil
|
|
:require-public-key t
|
|
:require-secret-key t)
|
|
(should (= 1 (length (epg-list-keys epg-tests-context))))
|
|
(should (= 1 (length (epg-list-keys epg-tests-context nil t))))))
|
|
|
|
(provide 'epg-tests)
|
|
|
|
;;; epg-tests.el ends here
|