1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
;;; erc-scenarios-base-association-nick.el --- base assoc scenarios -*- lexical-binding: t -*-
;; Copyright (C) 2022-2025 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/>.
;;; Code:
(require 'ert-x)
(eval-and-compile
(let ((load-path (cons (ert-resource-directory) load-path)))
(require 'erc-scenarios-common)))
(eval-when-compile (require 'erc-join))
;; You register a new nick in a dedicated query buffer, disconnect,
;; and log back in, but your nick is not granted (maybe you just
;; turned off SASL). In any case, ERC obtains a backticked version.
;; You open a query buffer for NickServ, and ERC gives you the
;; existing one. And after you identify, all buffers retain their
;; names, although your net ID has changed internally.
;;
;; If ERC had instead failed (or intentionally refused) to make the
;; association, you would find yourself with a new NickServ buffer
;; named with a suffix reflecting the new net ID (based on the
;; backticked nick), for example, NickServ@foonet/tester`. And the
;; original (disconnected) NickServ buffer would also receive a suffix
;; with *its* net-ID, e.g., NickServ@foonet/tester. Upon identifying
;; yourself, you'd see ERC merge both buffers along with their server
;; buffers. While this alternate behavior might more accurately
;; reflect reality, it introduces significant inconvenience. For a
;; clearer example, see the original version of this file introduced
;; by "Add user-oriented test scenarios for ERC".
(ert-deftest erc-scenarios-base-association-nick-bumped ()
:tags '(:expensive-test)
(erc-scenarios-common-with-cleanup
((erc-scenarios-common-dialog "base/assoc/bumped")
(dumb-server (erc-d-run "localhost" t 'renicked 'again))
(port (process-contact dumb-server :service))
(expect (erc-d-t-make-expecter))
(erc-server-flood-penalty 0.5)
(erc-server-flood-margin 30))
(ert-info ("Connect to foonet with nick tester")
(with-current-buffer (erc :server "127.0.0.1"
:port port
:nick "tester"
:full-name "tester")
(erc-scenarios-common-assert-initial-buf-name nil port)
(erc-d-t-wait-for 5 (eq erc-network 'foonet))))
(ert-info ("Create an account for tester and quit")
(with-current-buffer "foonet"
(funcall expect 3 "debug mode")
(erc-cmd-QUERY "NickServ")
(with-current-buffer "NickServ"
(erc-scenarios-common-say "REGISTER changeme")
(funcall expect 5 "Account created")
(funcall expect 1 "You're now logged in as tester"))
(with-current-buffer "foonet"
(erc-cmd-QUIT "")
(erc-d-t-wait-for 4 (not (erc-server-process-alive)))
(funcall expect 5 "ERC finished"))))
(with-current-buffer "foonet"
(erc-cmd-RECONNECT)
(funcall expect 10 "User modes for tester`"))
(ert-info ("Server buffer reassociated with new nick")
(should-not (get-buffer "foonet/tester`")))
(ert-info ("Ask NickServ to change nick")
(with-current-buffer "foonet"
(funcall expect 3 "debug mode")
(erc-cmd-QUERY "NickServ"))
(ert-info ( "NickServ buffer reassociated")
(should-not (get-buffer "NickServ@foonet/tester`"))
(should-not (get-buffer "NickServ@foonet/tester")))
(with-current-buffer "NickServ" ; new one
(erc-scenarios-common-say "IDENTIFY tester changeme")
(funcall expect 5 "You're now logged in as tester")))
(ert-info ("Still just one NickServ buffer")
(should-not (cdr (erc-scenarios-common-buflist "NickServ"))))
(ert-info ("As well as one server buffer")
(should (not (get-buffer "foonet/tester`")))
(should (not (get-buffer "foonet/tester")))
(should (get-buffer "foonet")))))
;; A less common variant is when your bouncer switches to an alternate
;; nick while you're disconnected, and upon reconnecting, you get
;; a new nick.
(ert-deftest erc-scenarios-base-association-nick-bumped-mandated-renick ()
:tags '(:expensive-test)
(erc-scenarios-common-with-cleanup
((erc-scenarios-common-dialog "base/assoc/bumped")
(dumb-server (erc-d-run "localhost" t 'foisted 'refoisted))
(port (process-contact dumb-server :service))
(expect (erc-d-t-make-expecter))
(erc-server-flood-penalty 0.5)
(erc-server-flood-margin 30))
(ert-info ("Connect to foonet with nick tester")
(with-current-buffer (erc :server "127.0.0.1"
:port port
:nick "tester"
:full-name "tester")
(erc-scenarios-common-assert-initial-buf-name nil port)
(erc-d-t-wait-for 5 (eq erc-network 'foonet))))
(ert-info ("Greet bob and quit")
(with-current-buffer "foonet"
(funcall expect 3 "debug mode")
(erc-cmd-QUERY "bob")
(with-current-buffer "bob"
(erc-scenarios-common-say "hi")
(funcall expect 5 "hola")
(funcall expect 1 "how r u?"))
(with-current-buffer "foonet"
(erc-cmd-QUIT "")
(erc-d-t-wait-for 4 (not (erc-server-process-alive)))
(funcall expect 5 "ERC finished"))))
;; Since we use reconnect, a new buffer won't be created
;; TODO add variant with clean `erc' invocation
(with-current-buffer "foonet"
(erc-cmd-RECONNECT)
(funcall expect 10 "User modes for dummy"))
(ert-info ("Server-initiated renick associated correctly")
(with-current-buffer "foonet"
(funcall expect 15 "debug mode")
(should-not (get-buffer "foonet/dummy"))
(should-not (get-buffer "foonet/tester")))
(ert-info ("Old query reassociated")
(should (get-buffer "bob"))
(should-not (get-buffer "bob@foonet/tester"))
(should-not (get-buffer "bob@foonet/dummy")))
(with-current-buffer "foonet"
(erc-cmd-NICK "tester")
(funcall expect 5 "You're now logged in as tester")))
(ert-info ("Ours is still the only bob buffer that remains")
(should-not (cdr (erc-scenarios-common-buflist "bob"))))
(ert-info ("Visible network ID still truncated to one component")
(should (not (get-buffer "foonet/tester")))
(should (not (get-buffer "foonet/dummy"))))))
;;; erc-scenarios-base-association-nick.el ends here
|