;;; emacs-tests.el --- unit tests for emacs.c -*- lexical-binding: t; -*- ;; Copyright (C) 2020 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 . ;;; Commentary: ;; Unit tests for src/emacs.c. ;;; Code: (require 'cl-lib) (require 'ert) (ert-deftest emacs-tests/seccomp/absent-file () (let ((emacs (expand-file-name invocation-name invocation-directory)) (process-environment nil)) (skip-unless (file-executable-p emacs)) (should-not (file-exists-p "/does-not-exist.bpf")) (should-not (eql (call-process emacs nil nil nil "--quick" "--batch" "--seccomp=/does-not-exist.bpf") 0)))) (cl-defmacro emacs-tests--with-temp-file (var (prefix &optional suffix text) &rest body) "Evaluate BODY while a new temporary file exists. Bind VAR to the name of the file. Pass PREFIX, SUFFIX, and TEXT to `make-temp-file', which see." (declare (indent 2) (debug (symbolp (form form form) body))) (cl-check-type var symbol) ;; Use an uninterned symbol so that the code still works if BODY changes VAR. (let ((filename (make-symbol "filename"))) `(let ((,filename (make-temp-file ,prefix nil ,suffix ,text))) (unwind-protect (let ((,var ,filename)) ,@body) (delete-file ,filename))))) (ert-deftest emacs-tests/seccomp/empty-file () (let ((emacs (expand-file-name invocation-name invocation-directory)) (process-environment nil)) (skip-unless (file-executable-p emacs)) (emacs-tests--with-temp-file filter ("seccomp-invalid-" ".bpf") ;; The --seccomp option is processed early, without filename handlers. ;; Therefore remote or quoted filenames wouldn't work. (should-not (file-remote-p filter)) (cl-callf file-name-unquote filter) ;; According to the Seccomp man page, a filter must have at least one ;; element, so Emacs should reject an empty file. (should-not (eql (call-process emacs nil nil nil "--quick" "--batch" (concat "--seccomp=" filter)) 0))))) (ert-deftest emacs-tests/seccomp/invalid-file-size () (let ((emacs (expand-file-name invocation-name invocation-directory)) (process-environment nil)) (skip-unless (file-executable-p emacs)) (emacs-tests--with-temp-file filter ("seccomp-invalid-" ".bpf" "123456") ;; The --seccomp option is processed early, without filename handlers. ;; Therefore remote or quoted filenames wouldn't work. (should-not (file-remote-p filter)) (cl-callf file-name-unquote filter) ;; The Seccomp filter file must have a file size that's a multiple of the ;; size of struct sock_filter, which is 8 or 16, but never 6. (should-not (eql (call-process emacs nil nil nil "--quick" "--batch" (concat "--seccomp=" filter)) 0))))) ;;; emacs-tests.el ends here