auth-source-tests.el 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. ;;; auth-source-tests.el --- Tests for auth-source.el -*- lexical-binding: t; -*-
  2. ;; Copyright (C) 2015-2016 Free Software Foundation, Inc.
  3. ;; Author: Damien Cassou <damien@cassou.me>,
  4. ;; Nicolas Petton <nicolas@petton.fr>
  5. ;; This file is part of GNU Emacs.
  6. ;; GNU Emacs is free software: you can redistribute it and/or modify
  7. ;; it under the terms of the GNU General Public License as published by
  8. ;; the Free Software Foundation, either version 3 of the License, or
  9. ;; (at your option) any later version.
  10. ;; GNU Emacs is distributed in the hope that it will be useful,
  11. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ;; GNU General Public License for more details.
  14. ;; You should have received a copy of the GNU General Public License
  15. ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
  16. ;;; Commentary:
  17. ;;
  18. ;;; Code:
  19. (require 'ert)
  20. (require 'auth-source)
  21. (defvar secrets-enabled t
  22. "Enable the secrets backend to test its features.")
  23. (defun auth-source-validate-backend (source validation-alist)
  24. (let ((backend (auth-source-backend-parse source)))
  25. (should (auth-source-backend-p backend))
  26. (dolist (pair validation-alist)
  27. (should (equal (eieio-oref backend (car pair)) (cdr pair))))))
  28. (ert-deftest auth-source-backend-parse-macos-keychain ()
  29. (auth-source-validate-backend '(:source (:macos-keychain-generic foobar))
  30. '((:source . "foobar")
  31. (:type . macos-keychain-generic)
  32. (:search-function . auth-source-macos-keychain-search)
  33. (:create-function . auth-source-macos-keychain-create))))
  34. (ert-deftest auth-source-backend-parse-macos-keychain-generic-string ()
  35. (auth-source-validate-backend "macos-keychain-generic:foobar"
  36. '((:source . "foobar")
  37. (:type . macos-keychain-generic)
  38. (:search-function . auth-source-macos-keychain-search)
  39. (:create-function . auth-source-macos-keychain-create))))
  40. (ert-deftest auth-source-backend-parse-macos-keychain-internet-string ()
  41. (auth-source-validate-backend "macos-keychain-internet:foobar"
  42. '((:source . "foobar")
  43. (:type . macos-keychain-internet)
  44. (:search-function . auth-source-macos-keychain-search)
  45. (:create-function . auth-source-macos-keychain-create))))
  46. (ert-deftest auth-source-backend-parse-macos-keychain-internet-symbol ()
  47. (auth-source-validate-backend 'macos-keychain-internet
  48. '((:source . "default")
  49. (:type . macos-keychain-internet)
  50. (:search-function . auth-source-macos-keychain-search)
  51. (:create-function . auth-source-macos-keychain-create))))
  52. (ert-deftest auth-source-backend-parse-macos-keychain-generic-symbol ()
  53. (auth-source-validate-backend 'macos-keychain-generic
  54. '((:source . "default")
  55. (:type . macos-keychain-generic)
  56. (:search-function . auth-source-macos-keychain-search)
  57. (:create-function . auth-source-macos-keychain-create))))
  58. (ert-deftest auth-source-backend-parse-macos-keychain-internet-default-string ()
  59. (auth-source-validate-backend 'macos-keychain-internet
  60. '((:source . "default")
  61. (:type . macos-keychain-internet)
  62. (:search-function . auth-source-macos-keychain-search)
  63. (:create-function . auth-source-macos-keychain-create))))
  64. (ert-deftest auth-source-backend-parse-plstore ()
  65. (auth-source-validate-backend '(:source "foo.plist")
  66. '((:source . "foo.plist")
  67. (:type . plstore)
  68. (:search-function . auth-source-plstore-search)
  69. (:create-function . auth-source-plstore-create))))
  70. (ert-deftest auth-source-backend-parse-netrc ()
  71. (auth-source-validate-backend '(:source "foo")
  72. '((:source . "foo")
  73. (:type . netrc)
  74. (:search-function . auth-source-netrc-search)
  75. (:create-function . auth-source-netrc-create))))
  76. (ert-deftest auth-source-backend-parse-netrc-string ()
  77. (auth-source-validate-backend "foo"
  78. '((:source . "foo")
  79. (:type . netrc)
  80. (:search-function . auth-source-netrc-search)
  81. (:create-function . auth-source-netrc-create))))
  82. (ert-deftest auth-source-backend-parse-secrets ()
  83. (provide 'secrets) ; simulates the presence of the `secrets' package
  84. (let ((secrets-enabled t))
  85. (auth-source-validate-backend '(:source (:secrets "foo"))
  86. '((:source . "foo")
  87. (:type . secrets)
  88. (:search-function . auth-source-secrets-search)
  89. (:create-function . auth-source-secrets-create)))))
  90. (ert-deftest auth-source-backend-parse-secrets-strings ()
  91. (provide 'secrets) ; simulates the presence of the `secrets' package
  92. (let ((secrets-enabled t))
  93. (auth-source-validate-backend "secrets:foo"
  94. '((:source . "foo")
  95. (:type . secrets)
  96. (:search-function . auth-source-secrets-search)
  97. (:create-function . auth-source-secrets-create)))))
  98. (ert-deftest auth-source-backend-parse-secrets-nil-source ()
  99. (provide 'secrets) ; simulates the presence of the `secrets' package
  100. (let ((secrets-enabled t))
  101. (auth-source-validate-backend '(:source (:secrets nil))
  102. '((:source . "session")
  103. (:type . secrets)
  104. (:search-function . auth-source-secrets-search)
  105. (:create-function . auth-source-secrets-create)))))
  106. (ert-deftest auth-source-backend-parse-secrets-alias ()
  107. (provide 'secrets) ; simulates the presence of the `secrets' package
  108. (let ((secrets-enabled t))
  109. ;; Redefine `secrets-get-alias' to map 'foo to "foo"
  110. (cl-letf (((symbol-function 'secrets-get-alias) (lambda (_) "foo")))
  111. (auth-source-validate-backend '(:source (:secrets foo))
  112. '((:source . "foo")
  113. (:type . secrets)
  114. (:search-function . auth-source-secrets-search)
  115. (:create-function . auth-source-secrets-create))))))
  116. (ert-deftest auth-source-backend-parse-secrets-symbol ()
  117. (provide 'secrets) ; simulates the presence of the `secrets' package
  118. (let ((secrets-enabled t))
  119. ;; Redefine `secrets-get-alias' to map 'default to "foo"
  120. (cl-letf (((symbol-function 'secrets-get-alias) (lambda (_) "foo")))
  121. (auth-source-validate-backend 'default
  122. '((:source . "foo")
  123. (:type . secrets)
  124. (:search-function . auth-source-secrets-search)
  125. (:create-function . auth-source-secrets-create))))))
  126. (ert-deftest auth-source-backend-parse-secrets-no-alias ()
  127. (provide 'secrets) ; simulates the presence of the `secrets' package
  128. (let ((secrets-enabled t))
  129. ;; Redefine `secrets-get-alias' to map 'foo to nil (so that
  130. ;; "Login" is used by default
  131. (cl-letf (((symbol-function 'secrets-get-alias) (lambda (_) nil)))
  132. (auth-source-validate-backend '(:source (:secrets foo))
  133. '((:source . "Login")
  134. (:type . secrets)
  135. (:search-function . auth-source-secrets-search)
  136. (:create-function . auth-source-secrets-create))))))
  137. ;; TODO This test shows suspicious behavior of auth-source: the
  138. ;; "secrets" source is used even though nothing in the input indicates
  139. ;; that is what we want
  140. (ert-deftest auth-source-backend-parse-secrets-no-source ()
  141. (provide 'secrets) ; simulates the presence of the `secrets' package
  142. (let ((secrets-enabled t))
  143. (auth-source-validate-backend '(:source '(foo))
  144. '((:source . "session")
  145. (:type . secrets)
  146. (:search-function . auth-source-secrets-search)
  147. (:create-function . auth-source-secrets-create)))))
  148. (defun auth-source--test-netrc-parse-entry (entry host user port)
  149. "Parse a netrc entry from buffer."
  150. (auth-source-forget-all-cached)
  151. (setq port (auth-source-ensure-strings port))
  152. (with-temp-buffer
  153. (insert entry)
  154. (goto-char (point-min))
  155. (let* ((check (lambda(alist)
  156. (and alist
  157. (auth-source-search-collection
  158. host
  159. (or
  160. (auth-source--aget alist "machine")
  161. (auth-source--aget alist "host")
  162. t))
  163. (auth-source-search-collection
  164. user
  165. (or
  166. (auth-source--aget alist "login")
  167. (auth-source--aget alist "account")
  168. (auth-source--aget alist "user")
  169. t))
  170. (auth-source-search-collection
  171. port
  172. (or
  173. (auth-source--aget alist "port")
  174. (auth-source--aget alist "protocol")
  175. t)))))
  176. (entries (auth-source-netrc-parse-entries check 1)))
  177. entries)))
  178. (ert-deftest auth-source-test-netrc-parse-entry ()
  179. (should (equal (auth-source--test-netrc-parse-entry
  180. "machine mymachine1 login user1 password pass1\n" t t t)
  181. '((("password" . "pass1")
  182. ("login" . "user1")
  183. ("machine" . "mymachine1")))))
  184. (should (equal (auth-source--test-netrc-parse-entry
  185. "machine mymachine1 login user1 password pass1 port 100\n"
  186. t t t)
  187. '((("port" . "100")
  188. ("password" . "pass1")
  189. ("login" . "user1")
  190. ("machine" . "mymachine1"))))))
  191. (provide 'auth-source-tests)
  192. ;;; auth-source-tests.el ends here