diff options
author | Lars Ingebrigtsen <larsi@gnus.org> | 2021-12-16 07:19:58 +0100 |
---|---|---|
committer | Lars Ingebrigtsen <larsi@gnus.org> | 2021-12-16 07:20:04 +0100 |
commit | bfc38ff05826631fecc7ff5a1acf522763fa9d51 (patch) | |
tree | 2ad34fd0f6bb5f6b6c65f92440757939c7aca8ed /test/lisp/emacs-lisp/multisession-tests.el | |
parent | 1c6363ff4b430fb47865b095fe8d04460355e213 (diff) | |
download | emacs-bfc38ff05826631fecc7ff5a1acf522763fa9d51.tar.gz emacs-bfc38ff05826631fecc7ff5a1acf522763fa9d51.tar.bz2 emacs-bfc38ff05826631fecc7ff5a1acf522763fa9d51.zip |
Add support for multisession variables
* doc/lispref/elisp.texi (Top): Add to menu.
(Top):
* doc/lispref/variables.texi (Variables): Ditto.
(Multisession Variables): Document multisession variables.
* lisp/emacs-lisp/multisession.el: New file.
Diffstat (limited to 'test/lisp/emacs-lisp/multisession-tests.el')
-rw-r--r-- | test/lisp/emacs-lisp/multisession-tests.el | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/test/lisp/emacs-lisp/multisession-tests.el b/test/lisp/emacs-lisp/multisession-tests.el new file mode 100644 index 00000000000..41fcde04f21 --- /dev/null +++ b/test/lisp/emacs-lisp/multisession-tests.el @@ -0,0 +1,201 @@ +;;; multisession-tests.el --- Tests for multisession.el -*- lexical-binding: t; -*- + +;; Copyright (C) 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 'multisession) +(require 'ert) +(require 'ert-x) +(require 'cl-lib) + +(ert-deftest multi-test-sqlite-simple () + (skip-unless (sqlite-available-p)) + (ert-with-temp-file dir + :directory t + (let ((user-init-file "/tmp/foo.el") + (multisession-storage 'sqlite) + (multisession-directory dir)) + (unwind-protect + (progn + (define-multisession-variable foo 0 + "" + :synchronized t) + (should (= (multisession-value foo) 0)) + (cl-incf (multisession-value foo)) + (should (= (multisession-value foo) 1)) + (call-process + (concat invocation-directory invocation-name) + nil t nil + "-Q" "-batch" + "--eval" (prin1-to-string + `(progn + (require 'multisession) + (let ((multisession-directory ,dir) + (multisession-storage 'sqlite) + (user-init-file "/tmp/foo.el")) + (define-multisession-variable foo 0 + "" + :synchronized t) + (cl-incf (multisession-value foo)))))) + (should (= (multisession-value foo) 2))) + (sqlite-close multisession--db) + (setq multisession--db nil))))) + +(ert-deftest multi-test-sqlite-busy () + (skip-unless (and t (sqlite-available-p))) + (ert-with-temp-file dir + :directory t + (let ((user-init-file "/tmp/foo.el") + (multisession-directory dir) + (multisession-storage 'sqlite) + proc) + (unwind-protect + (progn + (define-multisession-variable bar 0 + "" + :synchronized t) + (should (= (multisession-value bar) 0)) + (cl-incf (multisession-value bar)) + (should (= (multisession-value bar) 1)) + (setq proc + (start-process + "other-emacs" + nil + (concat invocation-directory invocation-name) + "-Q" "-batch" + "--eval" (prin1-to-string + `(progn + (require 'multisession) + (let ((multisession-directory ,dir) + (multisession-storage 'sqlite) + (user-init-file "/tmp/bar.el")) + (define-multisession-variable bar 0 + "" :synchronized t) + (dotimes (i 100) + (cl-incf (multisession-value bar)))))))) + (while (process-live-p proc) + (ignore-error 'sqlite-locked-error + (message "bar %s" (multisession-value bar)) + ;;(cl-incf (multisession-value bar)) + ) + (sleep-for 0.1)) + (message "bar ends up as %s" (multisession-value bar)) + (should (< (multisession-value bar) 1003))) + (sqlite-close multisession--db) + (setq multisession--db nil))))) + +(ert-deftest multi-test-files-simple () + (ert-with-temp-file dir + :directory t + (let ((user-init-file "/tmp/sfoo.el") + (multisession-storage 'files) + (multisession-directory dir)) + (define-multisession-variable sfoo 0 + "" + :synchronized t) + (should (= (multisession-value sfoo) 0)) + (cl-incf (multisession-value sfoo)) + (should (= (multisession-value sfoo) 1)) + (call-process + (concat invocation-directory invocation-name) + nil t nil + "-Q" "-batch" + "--eval" (prin1-to-string + `(progn + (require 'multisession) + (let ((multisession-directory ,dir) + (multisession-storage 'files) + (user-init-file "/tmp/sfoo.el")) + (define-multisession-variable sfoo 0 + "" + :synchronized t) + (cl-incf (multisession-value sfoo)))))) + (should (= (multisession-value sfoo) 2))))) + +(ert-deftest multi-test-files-busy () + (skip-unless (and t (sqlite-available-p))) + (ert-with-temp-file dir + :directory t + (let ((user-init-file "/tmp/foo.el") + (multisession-storage 'files) + (multisession-directory dir) + proc) + (define-multisession-variable sbar 0 + "" + :synchronized t) + (should (= (multisession-value sbar) 0)) + (cl-incf (multisession-value sbar)) + (should (= (multisession-value sbar) 1)) + (setq proc + (start-process + "other-emacs" + nil + (concat invocation-directory invocation-name) + "-Q" "-batch" + "--eval" (prin1-to-string + `(progn + (require 'multisession) + (let ((multisession-directory ,dir) + (multisession-storage 'files) + (user-init-file "/tmp/sbar.el")) + (define-multisession-variable sbar 0 + "" :synchronized t) + (dotimes (i 1000) + (cl-incf (multisession-value sbar)))))))) + (while (process-live-p proc) + (message "sbar %s" (multisession-value sbar)) + ;;(cl-incf (multisession-value sbar)) + (sleep-for 0.1)) + (message "sbar ends up as %s" (multisession-value sbar)) + (should (< (multisession-value sbar) 2000))))) + +(ert-deftest multi-test-files-some-values () + (ert-with-temp-file dir + :directory t + (let ((user-init-file "/tmp/sfoo.el") + (multisession-storage 'files) + (multisession-directory dir)) + (define-multisession-variable foo1 nil) + (should (eq (multisession-value foo1) nil)) + (setf (multisession-value foo1) nil) + (should (eq (multisession-value foo1) nil)) + (setf (multisession-value foo1) t) + (should (eq (multisession-value foo1) t)) + + (define-multisession-variable foo2 t) + (setf (multisession-value foo2) nil) + (should (eq (multisession-value foo2) nil)) + (setf (multisession-value foo2) t) + (should (eq (multisession-value foo2) t)) + + (define-multisession-variable foo3 t) + (should-error (setf (multisession-value foo3) (make-marker))) + + (let ((string (with-temp-buffer + (set-buffer-multibyte nil) + (insert 0 1 2) + (buffer-string)))) + (should-not (multibyte-string-p string)) + (define-multisession-variable foo4 nil) + (setf (multisession-value foo4) string) + (should (equal (multisession-value foo4) string)))))) + +;;; multisession-tests.el ends here |