aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorF. Jason Park2021-05-03 05:54:56 -0700
committerF. Jason Park2022-06-30 15:03:26 -0700
commit752e860db4800a26599c4cd6ca2c39ab1909b425 (patch)
tree8a2dfd5e98c8bfdda3375e5fe9145a4f7eaa8ee1 /test
parent9be08ceb314888c7f86bddbec6490e7ead718a88 (diff)
downloademacs-752e860db4800a26599c4cd6ca2c39ab1909b425.tar.gz
emacs-752e860db4800a26599c4cd6ca2c39ab1909b425.zip
Address long-standing ERC buffer-naming issues
* lisp/erc/erc-backend.el (erc-server-connected): Revise doc string. (erc-server-reconnect, erc-server-JOIN): Reuse original ID param from the first connection when calling `erc-open'. (erc-server-NICK): Apply same name generation process used by `erc-open'; except here, do so for the purpose of "re-nicking". Update network identifier and maybe buffer names after a user's own nick changes. * lisp/erc/erc-networks.el (erc-networks--id, erc-networks--id-fixed, erc-networks--id-qualifying): Define new set of structs to contain all info relevant to specifying a unique identifier for a network context. Add a new variable `erc-networks--id' to store a local reference to a `erc-networks--id' object, shared among all buffers in a logical session. (erc-networks--id-given, erc-networks--id-create, erc-networks--id-on-connect, erc-networks--id--equal-p, erc-networks--id-qualifying-init-parts, erc-networks--id-qualifying-init-symbol, erc-networks--id-qualifying-grow-id, erc-networks--id-qualifying-reset-id, erc-networks--id-qualifying-prefix-length, erc-networks--id-qualifying-update, erc-networks--id-reload, erc-networks--id-ensure-comparable, erc-networks--id-sort-buffers): Add new functions to support management of `erc-networks--id' struct instances. (erc-networks--id-sep): New variable for to help when formatting buffer names. (erc-obsolete-var): Define new generic context rewriter. (erc-networks-shrink-ids-and-buffer-names, erc-networks--refresh-buffer-names, erc-networks--shrink-ids-and-buffer-names-any): Add functions to reassess all network IDs and shrink them if necessary along with affected buffer names. Also add function to rename buffers so that their names are unique. Register these on all three of ERC's kill-buffer hooks because an orphaned target buffer is enough to keep its session alive. (erc-networks-rename-surviving-target-buffer): Add new function that renames a target buffer when it becomes the sole bearer of a name based on a target that has become unique across all sessions and, in most cases, all networks. IOW, remove the @NETWORK-ID suffix from the last remaining channel or query buffer after its namesakes have all been killed off. Register this function with ERC's target-related kill-buffer hooks. (erc-networks--examine-targets): Add new utility function that visits all ERC buffers and runs callbacks when a buffer-name collision is encountered. (erc-networks--qualified-sep): Add constant to hold separator between target and suffix. (erc-networks--construct-target-buffer-name, erc-networks--ensure-unique-target-buffer-name, erc-networks--ensure-unique-server-buffer-name, erc-networks--maybe-update-buffer-name): Add helpers to support `erc-networks--reconcile-buffer-names' and friends. (erc-networks--reconcile-buffer-names): Add new buffer-naming strategy function and helper for `erc-generate-new-buffer-name' that only run in target buffers. (erc-determine-network, erc-networks--determine): Deprecate former and partially replace with latter, which demotes RPL_ISUPPORT-derived NETWORK name to fallback in favor of known `erc-networks-alist' members as part of shift to network-based connection-identity policy. Return sentinel on failure. Expect `erc-server-announced-name' to be set, and signal when it's not. (erc-networks--name-missing-sentinel): Value returned when new function `erc-networks--determine' fails to find network name. The rationale for not making this customizable is that the value signifies the pathological case where a user of an uncommon IRC setup has not yet set a mapping from announced- to network name. And the chances of there being multiple unknown networks is low. (erc-set-network-name, erc-networks--set-name): Deprecate former and partially replace with latter. Ding with helpful message, and don't set `erc-network' when network name is not found. (erc-networks--ensure-announced): Add new fallback function to ensure `erc-server-announced-name' is set. Register with post-MOTD hooks. (erc-unset-network-name): Deprecate function unused internally. (erc-networks--insert-transplanted-content, erc-networks--reclaim-orphaned-target-buffers, erc-networks--copy-over-server-buffer-contents, erc--update-server-identity): Add helpers for `erc-networks--rename-server-buffer'. The first re-associates all existing target buffers that ought to be owned by the new server process. The second grabs buffer text from an old, dead server buffer before killing it. It then inserts that text above everything in the current, replacement server buffer. The other two massage the IDs of related sessions, possibly renaming them as well. They may also uniquify the current session's network ID. (erc-networks--init-identity): Add new function to perform one-time session-related setup. This could be combined with `erc-set-network-name'. (erc-networks--rename-server-buffer): Add new function to replace `erc-unset-network-name' as default `erc-disconnected-hook' member; renames server buffers once network is discovered; added to/removed from `erc-after-connect' hook on `erc-networks' minor mode. (erc-networks--bouncer-targets): Add constant to hold target symbols of well known bouncer-configuration bots. (erc-networks-on-MOTD-end): Add primary network-context handler to run on 376/422 functions, just before logical connection is officially established. (erc-networks-enable, erc-networks-mode): Register main network-setup handler with 376/422 hooks. * lisp/erc/erc.el (erc-rename-buffers): Change this option's default to t, remove the only instance where it's actually used, and make it an obsolete variable. (erc-reuse-buffers): Make this an obsolete variable, but take pains to ensure its pre-28.1 behavior is preserved. That is, undo the regression involving unwanted automatic reassociation of channel buffers during joins, which arrived in ERC 5.4 and effectively inverted the meaning of this variable, when nil, for channel buffers, all without accompanying documentation or announcement. (erc-generate-new-buffer-name): Replace current policy of appending a slash and the invocation host name. Favor instead temporary names for server buffers and network-based uniquifying suffixes for channels and query buffers. Fall back to the TCP host:port<n> convention when necessary. Accept additional optional params after the others. (erc-get-buffer-create): Don't generate a new name when reconnecting, just return the same buffer. `erc-open' starts from a clean slate anyway, so this just keeps things simple. Also add optional params. (erc-open): Add new ID param to for a network identifier explicitly passed to an entry-point command. This is stored in the `given' slot of the `erc-network--id' object. Also initialize the latter in new connections and otherwise copy it over. As part of the push to recast erc-networks.el as an essential library, set `erc-network' explicitly, when known, rather than via hooks. (erc, erc-tls): Add new ID keyword parameter and pass it to `erc-open'. (erc-log-irc-protocol): Use `erc--network-id' instead of the function `erc-network' to determine preferred peer name. (erc-format-target-and/or-network): This is called frequently from mode-line updates, so renaming buffers here is not ideal. Instead, do so in `erc-networks--rename-server-buffer'. (erc-kill-server-hook): Add `erc-networks-shrink-ids-and-buffer-names' as default member. (erc-kill-channel-hook, erc-kill-buffer-hook): Add `erc-networks-shrink-ids-and-buffer-names' and `erc-networks-rename-surviving-target-buffer' as default member. * test/lisp/erc/erc-tests.el (erc-log-irc-protocol): Use network-ID focused internal API. * test/lisp/erc/erc-networks-tests.el: Add new file that includes tests for the above network-ID focused functions. See bug#48598 for background on all of the above.
Diffstat (limited to 'test')
-rw-r--r--test/lisp/erc/erc-networks-tests.el1707
-rw-r--r--test/lisp/erc/erc-tests.el3
2 files changed, 1709 insertions, 1 deletions
diff --git a/test/lisp/erc/erc-networks-tests.el b/test/lisp/erc/erc-networks-tests.el
new file mode 100644
index 00000000000..dcda04692ec
--- /dev/null
+++ b/test/lisp/erc/erc-networks-tests.el
@@ -0,0 +1,1707 @@
1;;; erc-networks-tests.el --- Tests for erc-networks. -*- lexical-binding:t -*-
2
3;; Copyright (C) 2020-2022 Free Software Foundation, Inc.
4
5;; This file is part of GNU Emacs.
6;;
7;; GNU Emacs is free software: you can redistribute it and/or modify
8;; it under the terms of the GNU General Public License as published
9;; by the Free Software Foundation, either version 3 of the License,
10;; or (at your option) any later version.
11;;
12;; GNU Emacs is distributed in the hope that it will be useful, but
13;; WITHOUT ANY WARRANTY; without even the implied warranty of
14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15;; General Public License for more details.
16;;
17;; You should have received a copy of the GNU General Public License
18;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
19
20;;; Code:
21
22(require 'ert-x) ; cl-lib
23(require 'erc-networks)
24
25(defun erc-networks-tests--create-dead-proc (&optional buf)
26 (let ((p (start-process "true" (or buf (current-buffer)) "true")))
27 (while (process-live-p p) (sit-for 0.1))
28 p))
29
30(defun erc-networks-tests--create-live-proc (&optional buf)
31 (let ((proc (start-process "sleep" (or buf (current-buffer)) "sleep" "1")))
32 (set-process-query-on-exit-flag proc nil)
33 proc))
34
35;; When we drop 27, call `get-buffer-create with INHIBIT-BUFFER-HOOKS.
36(defun erc-networks-tests--clean-bufs ()
37 (let (erc-kill-channel-hook
38 erc-kill-server-hook
39 erc-kill-buffer-hook)
40 (dolist (buf (erc-buffer-list))
41 (kill-buffer buf))))
42
43(defun erc-networks-tests--bufnames (prefix)
44 (let* ((case-fold-search)
45 (pred (lambda (b) (string-prefix-p prefix (buffer-name b))))
46 (prefixed (seq-filter pred (buffer-list))))
47 (sort (mapcar #'buffer-name prefixed) #'string<)))
48
49(ert-deftest erc-networks--id ()
50 (cl-letf (((symbol-function 'float-time)
51 (lambda () 0.0)))
52
53 ;; Fixed
54 (should (equal (erc-networks--id-fixed-create 'foo)
55 (make-erc-networks--id-fixed :ts (float-time)
56 :symbol 'foo)))
57
58 ;; Eliding
59 (let* ((erc-network 'FooNet)
60 (erc-server-current-nick "Joe")
61 (identity (erc-networks--id-create nil)))
62
63 (should (equal identity #s(erc-networks--id-qualifying
64 0.0 FooNet [FooNet "joe"] 1)))
65 (should (equal (erc-networks--id-qualifying-grow-id identity)
66 'FooNet/joe))
67 (should (equal identity #s(erc-networks--id-qualifying
68 0.0 FooNet/joe [FooNet "joe"] 2)))
69 (should-not (erc-networks--id-qualifying-grow-id identity))
70 (should (equal identity #s(erc-networks--id-qualifying
71 0.0 FooNet/joe [FooNet "joe"] 2))))
72
73 ;; Compat
74 (with-current-buffer (get-buffer-create "fake.chat")
75 (with-suppressed-warnings ((obsolete erc-rename-buffers))
76 (let (erc-rename-buffers)
77 (should (equal (erc-networks--id-create nil)
78 (make-erc-networks--id-fixed :ts (float-time)
79 :symbol 'fake.chat)))))
80 (kill-buffer))))
81
82(ert-deftest erc-networks--id-create ()
83 (cl-letf (((symbol-function 'float-time)
84 (lambda () 0.0)))
85
86 (should (equal (erc-networks--id-create 'foo)
87 (make-erc-networks--id-fixed :ts (float-time)
88 :symbol 'foo)))
89 (should (equal (erc-networks--id-create "foo")
90 (make-erc-networks--id-fixed :ts (float-time)
91 :symbol 'foo)))
92 (should (equal (erc-networks--id-create [h i])
93 (make-erc-networks--id-fixed :ts (float-time)
94 :symbol (quote \[h\ \i\]))))
95
96 (with-current-buffer (get-buffer-create "foo")
97 (let ((expected (make-erc-networks--id-fixed :ts (float-time)
98 :symbol 'foo)))
99 (with-suppressed-warnings ((obsolete erc-rename-buffers))
100 (let (erc-rename-buffers)
101 (should (equal (erc-networks--id-create nil) expected))))
102 (with-suppressed-warnings ((obsolete erc-reuse-buffers))
103 (let (erc-reuse-buffers)
104 (should (equal (erc-networks--id-create nil) expected))
105 (should (equal (erc-networks--id-create 'bar) expected)))))
106 (kill-buffer))))
107
108(ert-deftest erc-networks--id-qualifying-prefix-length ()
109 (should-not (erc-networks--id-qualifying-prefix-length
110 (make-erc-networks--id-qualifying)
111 (make-erc-networks--id-qualifying)))
112
113 (should-not (erc-networks--id-qualifying-prefix-length
114 (make-erc-networks--id-qualifying :parts [1 2])
115 (make-erc-networks--id-qualifying :parts [2 3])))
116
117 (should (= 1 (erc-networks--id-qualifying-prefix-length
118 (make-erc-networks--id-qualifying :parts [1])
119 (make-erc-networks--id-qualifying :parts [1 2]))))
120
121 (should (= 1 (erc-networks--id-qualifying-prefix-length
122 (make-erc-networks--id-qualifying :parts [1 2])
123 (make-erc-networks--id-qualifying :parts [1 3]))))
124
125 (should (= 2 (erc-networks--id-qualifying-prefix-length
126 (make-erc-networks--id-qualifying :parts [1 2])
127 (make-erc-networks--id-qualifying :parts [1 2]))))
128
129 (should (= 1 (erc-networks--id-qualifying-prefix-length
130 (make-erc-networks--id-qualifying :parts ["1"])
131 (make-erc-networks--id-qualifying :parts ["1"])))))
132
133(ert-deftest erc-networks--id-sort-buffers ()
134 (let (oldest middle newest)
135
136 (with-temp-buffer
137 (setq erc-networks--id (erc-networks--id-fixed-create 'oldest)
138 oldest (current-buffer))
139
140 (with-temp-buffer
141 (setq erc-networks--id (erc-networks--id-fixed-create 'middle)
142 middle (current-buffer))
143
144 (with-temp-buffer
145 (setq erc-networks--id (erc-networks--id-fixed-create 'newest)
146 newest (current-buffer))
147
148 (should (equal (erc-networks--id-sort-buffers
149 (list oldest newest middle))
150 (list newest middle oldest))))))))
151
152(ert-deftest erc-networks-rename-surviving-target-buffer--channel ()
153 (should (memq #'erc-networks-rename-surviving-target-buffer
154 erc-kill-channel-hook))
155
156 (let ((chan-foonet-buffer (get-buffer-create "#chan@foonet")))
157
158 (with-current-buffer chan-foonet-buffer
159 (erc-mode)
160 (setq erc-networks--id (make-erc-networks--id-qualifying
161 :parts [foonet "bob"] :len 1)
162 erc--target (erc--target-from-string "#chan")))
163
164 (with-current-buffer (get-buffer-create "#chan@barnet")
165 (erc-mode)
166 (setq erc-networks--id (make-erc-networks--id-qualifying
167 :parts [barnet "bob"] :len 1)
168 erc--target (erc--target-from-string "#chan")))
169
170 (kill-buffer "#chan@barnet")
171 (should (equal (erc-networks-tests--bufnames "#chan") '("#chan")))
172 (should (eq chan-foonet-buffer (get-buffer "#chan"))))
173
174 (erc-networks-tests--clean-bufs))
175
176(ert-deftest erc-networks-rename-surviving-target-buffer--query ()
177 (should (memq #'erc-networks-rename-surviving-target-buffer
178 erc-kill-buffer-hook))
179
180 (let ((bob-foonet (get-buffer-create "bob@foonet")))
181
182 (with-current-buffer bob-foonet
183 (erc-mode)
184 (setq erc-networks--id (make-erc-networks--id-qualifying
185 :parts [foonet "bob"] :len 1)
186 erc--target (erc--target-from-string "bob")))
187
188 (with-current-buffer (get-buffer-create "bob@barnet")
189 (erc-mode)
190 (setq erc-networks--id (make-erc-networks--id-qualifying
191 :parts [barnet "bob"] :len 1)
192 erc--target (erc--target-from-string "bob")))
193
194 (kill-buffer "bob@barnet")
195 (should (equal (erc-networks-tests--bufnames "bob") '("bob")))
196 (should (eq bob-foonet (get-buffer "bob"))))
197
198 (erc-networks-tests--clean-bufs))
199
200(ert-deftest erc-networks-rename-surviving-target-buffer--multi ()
201
202 (ert-info ("Multiple leftover channels untouched")
203 (with-current-buffer (get-buffer-create "#chan@foonet")
204 (erc-mode)
205 (setq erc--target (erc--target-from-string "#chan")))
206 (with-current-buffer (get-buffer-create "#chan@barnet")
207 (erc-mode)
208 (setq erc--target (erc--target-from-string "#chan")))
209 (with-current-buffer (get-buffer-create "#chan@baznet")
210 (erc-mode)
211 (setq erc--target (erc--target-from-string "#chan")))
212 (kill-buffer "#chan@baznet")
213 (should (equal (erc-networks-tests--bufnames "#chan")
214 '("#chan@barnet" "#chan@foonet")))
215 (erc-networks-tests--clean-bufs))
216
217 (ert-info ("Multiple leftover queries untouched")
218 (with-current-buffer (get-buffer-create "bob@foonet")
219 (erc-mode)
220 (setq erc--target (erc--target-from-string "bob")))
221 (with-current-buffer (get-buffer-create "bob@barnet")
222 (erc-mode)
223 (setq erc--target (erc--target-from-string "bob")))
224 (with-current-buffer (get-buffer-create "bob@baznet")
225 (erc-mode)
226 (setq erc--target (erc--target-from-string "bob")))
227 (kill-buffer "bob@baznet")
228 (should (equal (erc-networks-tests--bufnames "bob")
229 '("bob@barnet" "bob@foonet")))
230 (erc-networks-tests--clean-bufs)))
231
232;; As of May 2022, this "shrink" stuff runs whenever an ERC buffer is
233;; killed because `erc-networks-shrink-ids-and-buffer-names' is a
234;; default member of all three erc-kill-* functions.
235
236;; Note: this overlaps a fair bit with the "hook" variants, i.e.,
237;; `erc-networks--shrink-ids-and-buffer-names--hook-outstanding-*' If
238;; this ever fails, just delete this and fix those. But please copy
239;; over and adapt the comments first.
240
241(ert-deftest erc-networks--shrink-ids-and-buffer-names--perform-outstanding ()
242 ;; While some buffer #a@barnet/dummy is being killed, its display ID
243 ;; is not collapsed because collisions still exist.
244 ;;
245 ;; Note that we don't have to set `erc-server-connected' because
246 ;; this function is intentionally connectivity agnostic.
247 (with-current-buffer (get-buffer-create "foonet/tester")
248 (erc-mode)
249 (setq erc-server-current-nick "tester" ; Always set (`erc-open')
250 ;; Set when transport connected
251 erc-server-process (erc-networks-tests--create-live-proc)
252 ;; Both set just before IRC (logically) connected (post MOTD)
253 erc-network 'foonet
254 erc-networks--id (make-erc-networks--id-qualifying
255 :symbol 'foonet/tester
256 :parts [foonet "tester"]
257 :len 2))) ; is/was a plain foonet collision
258
259 ;; Presumably, some server buffer named foonet/dummy was just
260 ;; killed, hence the length 2 display ID.
261
262 ;; A target buffer for chan #a exists for foonet/tester. The
263 ;; precise form of its name should not affect shrinking.
264 (with-current-buffer (get-buffer-create
265 (elt ["#a" "#a@foonet" "#a@foonet/tester"] (random 3)))
266 (erc-mode)
267 (setq erc-server-process (buffer-local-value 'erc-server-process
268 (get-buffer "foonet/tester"))
269 erc-network 'foonet
270 erc-server-current-nick "tester"
271 erc-networks--id (buffer-local-value 'erc-networks--id
272 (get-buffer "foonet/tester"))
273 erc--target (erc--target-from-string "#a")))
274
275 ;; Another network context exists (so we have buffers to iterate
276 ;; over), and it's also part of a collision group.
277 (with-current-buffer (get-buffer-create "barnet/tester")
278 (erc-mode)
279 (setq erc-network 'barnet
280 erc-server-current-nick "tester"
281 erc-networks--id (make-erc-networks--id-qualifying
282 :symbol 'barnet/tester
283 :parts [barnet "tester"]
284 :len 2)
285 erc-server-process (erc-networks-tests--create-live-proc)))
286
287 (with-current-buffer (get-buffer-create "barnet/dummy")
288 (erc-mode)
289 (setq erc-network 'barnet
290 erc-server-current-nick "dummy"
291 erc-networks--id (make-erc-networks--id-qualifying
292 :symbol 'barnet/dummy
293 :parts [barnet "dummy"]
294 :len 2)
295 erc-server-process (erc-networks-tests--create-live-proc)))
296
297 ;; The buffer being killed is not part of the foonet collision
298 ;; group, which contains one display ID eligible for shrinkage.
299 (with-current-buffer (get-buffer-create
300 (elt ["#a@barnet" "#a@barnet/tester"] (random 2)))
301 (erc-mode)
302 (setq erc-network 'barnet
303 erc-server-current-nick "tester"
304 erc-server-process (buffer-local-value 'erc-server-process
305 (get-buffer "barnet/tester"))
306 erc-networks--id (buffer-local-value 'erc-networks--id
307 (get-buffer "barnet/tester"))
308 erc--target (erc--target-from-string "#a")))
309
310 (with-temp-buffer ; doesn't matter what the current buffer is
311 (setq erc-networks--id (make-erc-networks--id-qualifying)) ; mock
312 (erc-networks--shrink-ids-and-buffer-names))
313
314 (should (equal (mapcar #'buffer-name (erc-buffer-list))
315 '("foonet" ; shrunk
316 "#a@foonet" ; shrunk
317 "barnet/tester"
318 "barnet/dummy"
319 "#a@barnet/tester")))
320
321 (erc-networks-tests--clean-bufs))
322
323;; This likewise overlaps with the "hook" variants below. If this
324;; should ever fail, just delete it and optionally fix those.
325
326(ert-deftest erc-networks--shrink-ids-and-buffer-names--perform-collapse ()
327 ;; This is similar to the "outstanding" variant above, but both
328 ;; groups are eligible for renaming, which is abnormal but possible
329 ;; when recovering from some mishap.
330 (with-current-buffer (get-buffer-create "foonet/tester")
331 (erc-mode)
332 (setq erc-network 'foonet
333 erc-server-current-nick "tester"
334 erc-networks--id (make-erc-networks--id-qualifying
335 :symbol 'foonet/tester
336 :parts [foonet "tester"]
337 :len 2)
338 erc-server-process (erc-networks-tests--create-live-proc)))
339
340 (with-current-buffer
341 (get-buffer-create (elt ["#a" "#a@foonet/tester"] (random 2)))
342 (erc-mode)
343 (setq erc-server-process (buffer-local-value 'erc-server-process
344 (get-buffer "foonet/tester"))
345 erc-network 'foonet
346 erc-server-current-nick "tester"
347 erc-networks--id (buffer-local-value 'erc-networks--id
348 (get-buffer "foonet/tester"))
349 erc--target (erc--target-from-string "#a")))
350
351 (with-current-buffer (get-buffer-create "barnet/tester")
352 (erc-mode)
353 (setq erc-network 'barnet
354 erc-server-current-nick "tester"
355 erc-networks--id (make-erc-networks--id-qualifying
356 :symbol 'barnet/tester
357 :parts [barnet "tester"]
358 :len 2)
359 erc-server-process (erc-networks-tests--create-live-proc)))
360
361 (with-current-buffer
362 (get-buffer-create (elt ["#b" "#b@foonet/tester"] (random 2)))
363 (erc-mode)
364 (setq erc-network 'barnet
365 erc-server-current-nick "tester"
366 erc-server-process (buffer-local-value 'erc-server-process
367 (get-buffer "barnet/tester"))
368 erc-networks--id (buffer-local-value 'erc-networks--id
369 (get-buffer "barnet/tester"))
370 erc--target (erc--target-from-string "#b")))
371
372 (with-temp-buffer
373 (setq erc-networks--id (make-erc-networks--id-qualifying))
374 (erc-networks--shrink-ids-and-buffer-names))
375
376 (should (equal (mapcar #'buffer-name (erc-buffer-list))
377 '("foonet" "#a" "barnet" "#b")))
378
379 (erc-networks-tests--clean-bufs))
380
381(defun erc-networks--shrink-ids-and-buffer-names--hook-outstanding-common ()
382
383 (with-current-buffer (get-buffer-create "foonet/tester")
384 (erc-mode)
385 (setq erc-network 'foonet
386 erc-server-current-nick "tester"
387 erc-networks--id (make-erc-networks--id-qualifying
388 :symbol 'foonet/tester
389 :parts [foonet "tester"]
390 :len 2)
391 erc-server-process (erc-networks-tests--create-live-proc)))
392
393 (with-current-buffer (get-buffer-create "#a@foonet/tester")
394 (erc-mode)
395 (setq erc-server-process (buffer-local-value 'erc-server-process
396 (get-buffer "foonet/tester"))
397 erc-network 'foonet
398 erc-server-current-nick "tester"
399 erc-networks--id (buffer-local-value 'erc-networks--id
400 (get-buffer "foonet/tester"))
401 erc--target (erc--target-from-string "#a")))
402
403 (with-current-buffer (get-buffer-create "barnet/tester")
404 (erc-mode)
405 (setq erc-network 'barnet
406 erc-server-current-nick "tester"
407 erc-networks--id (make-erc-networks--id-qualifying
408 :symbol 'barnet/tester
409 :parts [barnet "tester"]
410 :len 2)
411 erc-server-process (erc-networks-tests--create-live-proc)))
412
413 (with-current-buffer (get-buffer-create "barnet/dummy")
414 (erc-mode)
415 (setq erc-network 'barnet
416 erc-server-current-nick "dummy"
417 erc-networks--id (make-erc-networks--id-qualifying
418 :symbol 'barnet/dummy
419 :parts [barnet "dummy"]
420 :len 2)
421 erc-server-process (erc-networks-tests--create-live-proc)))
422
423 (with-current-buffer (get-buffer-create "#a@barnet/tester")
424 (erc-mode)
425 (setq erc-network 'barnet
426 erc-server-current-nick "tester"
427 erc-server-process (buffer-local-value 'erc-server-process
428 (get-buffer "barnet/tester"))
429 erc-networks--id (buffer-local-value 'erc-networks--id
430 (get-buffer "barnet/tester"))
431 erc--target (erc--target-from-string "#a"))))
432
433(ert-deftest erc-networks--shrink-ids-and-buffer-names--hook-outstanding-srv ()
434 (erc-networks--shrink-ids-and-buffer-names--hook-outstanding-common)
435 (with-current-buffer (get-buffer-create "foonet/dummy")
436 (erc-mode)
437 (setq erc-network 'foonet
438 erc-server-current-nick "dummy"
439 erc-networks--id (make-erc-networks--id-qualifying
440 :symbol 'foonet/dummy
441 :parts [foonet "dummy"]
442 :len 2)
443 erc-server-process (erc-networks-tests--create-live-proc))
444 (kill-buffer))
445
446 (should (equal (mapcar #'buffer-name (erc-buffer-list))
447 '("foonet"
448 "#a@foonet"
449 "barnet/tester"
450 "barnet/dummy"
451 "#a@barnet/tester")))
452 (erc-networks-tests--clean-bufs))
453
454(ert-deftest erc-networks--shrink-ids-and-buffer-names--hook-outstanding-tgt ()
455 (erc-networks--shrink-ids-and-buffer-names--hook-outstanding-common)
456 (with-current-buffer (get-buffer-create "#a@foonet/dummy")
457 (erc-mode)
458 (setq erc-network 'foonet
459 erc-server-current-nick "dummy"
460 erc-networks--id (make-erc-networks--id-qualifying
461 :symbol 'foonet/dummy
462 :parts [foonet "dummy"]
463 :len 2)
464 erc--target (erc--target-from-string "#a")
465 erc-server-process (with-temp-buffer
466 (erc-networks-tests--create-dead-proc))))
467
468 (with-current-buffer "#a@foonet/dummy" (kill-buffer))
469
470 ;; Identical to *-server variant above
471 (should (equal (mapcar #'buffer-name (erc-buffer-list))
472 '("foonet"
473 "#a@foonet"
474 "barnet/tester"
475 "barnet/dummy"
476 "#a@barnet/tester")))
477 (erc-networks-tests--clean-bufs))
478
479(ert-deftest erc-networks-rename-surviving-target-buffer--shrink ()
480 (erc-networks--shrink-ids-and-buffer-names--hook-outstanding-common)
481
482 ;; This buffer isn't "#a@foonet" (yet) because the shrink-ids hook
483 ;; hasn't run. However, when it's the rename hook runs, its network
484 ;; id *is* "foonet", not "foonet/tester".
485 (with-current-buffer "#a@foonet/tester" (kill-buffer))
486
487 (should (equal (mapcar #'buffer-name (erc-buffer-list))
488 '("foonet"
489 "barnet/tester"
490 "barnet/dummy"
491 "#a")))
492
493 (erc-networks-tests--clean-bufs))
494
495(ert-deftest erc-networks--shrink-ids-and-buffer-names--server ()
496
497 (with-current-buffer (get-buffer-create "foonet/tester")
498 (erc-mode)
499 (setq erc-network 'foonet
500 erc-server-current-nick "tester"
501 erc-networks--id (make-erc-networks--id-qualifying
502 :symbol 'foonet/tester
503 :parts [foonet "tester"]
504 :len 2)
505 erc-server-process (erc-networks-tests--create-live-proc)))
506
507 (with-current-buffer (get-buffer-create "foonet/dummy")
508 (erc-mode)
509 (setq erc-network 'foonet
510 erc-server-current-nick "dummy"
511 erc-networks--id (make-erc-networks--id-qualifying
512 :symbol 'foonet/dummy
513 :parts [foonet "dummy"]
514 :len 2)
515 erc-server-process (erc-networks-tests--create-dead-proc))
516 (kill-buffer))
517
518 (should (equal (mapcar #'buffer-name (erc-buffer-list)) '("foonet")))
519
520 (erc-networks-tests--clean-bufs))
521
522(defun erc-networks--shrink-ids-and-buffer-names--hook-collapse (check)
523
524 (with-current-buffer (get-buffer-create "foonet/tester")
525 (erc-mode)
526 (setq erc-network 'foonet
527 erc-server-current-nick "tester"
528 erc-networks--id (make-erc-networks--id-qualifying
529 :symbol 'foonet/tester
530 :parts [foonet "tester"]
531 :len 2)
532 erc-server-process (erc-networks-tests--create-live-proc)))
533
534 (with-current-buffer (get-buffer-create "#a@foonet/tester")
535 (erc-mode)
536 (setq erc-server-process (buffer-local-value 'erc-server-process
537 (get-buffer "foonet/tester"))
538 erc-network 'foonet
539 erc-server-current-nick "tester"
540 erc-networks--id (buffer-local-value 'erc-networks--id
541 (get-buffer "foonet/tester"))
542 erc--target (erc--target-from-string "#a")))
543
544 (with-current-buffer (get-buffer-create "barnet/tester")
545 (erc-mode)
546 (setq erc-network 'barnet
547 erc-server-current-nick "tester"
548 erc-networks--id (make-erc-networks--id-qualifying
549 :symbol 'barnet/tester
550 :parts [barnet "tester"]
551 :len 2)
552 erc-server-process (erc-networks-tests--create-live-proc)))
553
554 (with-current-buffer (get-buffer-create "#b@foonet/tester")
555 (erc-mode)
556 (setq erc-network 'barnet
557 erc-server-current-nick "tester"
558 erc-server-process (buffer-local-value 'erc-server-process
559 (get-buffer "barnet/tester"))
560 erc-networks--id (buffer-local-value 'erc-networks--id
561 (get-buffer "barnet/tester"))
562 erc--target (erc--target-from-string "#b")))
563
564 (funcall check)
565
566 (should (equal (mapcar #'buffer-name (erc-buffer-list))
567 '("foonet" "#a" "barnet" "#b")))
568
569 (erc-networks-tests--clean-bufs))
570
571(ert-deftest erc-networks--shrink-ids-and-buffer-names--hook-collapse-server ()
572 (erc-networks--shrink-ids-and-buffer-names--hook-collapse
573 (lambda ()
574 (with-current-buffer (get-buffer-create "foonet/dummy")
575 (erc-mode)
576 (setq erc-network 'foonet
577 erc-server-current-nick "dummy"
578 erc-networks--id (make-erc-networks--id-qualifying
579 :symbol 'foonet/dummy
580 :parts [foonet "dummy"]
581 :len 2)
582 erc-server-process (erc-networks-tests--create-live-proc))
583 (kill-buffer)))))
584
585(ert-deftest erc-networks--shrink-ids-and-buffer-names--hook-collapse-target ()
586 (erc-networks--shrink-ids-and-buffer-names--hook-collapse
587 (lambda ()
588 (with-current-buffer (get-buffer-create "#a@foonet/dummy")
589 (erc-mode)
590 (setq erc-network 'foonet
591 erc-server-current-nick "dummy"
592 erc-networks--id (make-erc-networks--id-qualifying
593 :symbol 'foonet/dummy
594 :parts [foonet "dummy"]
595 :len 2)
596 ;; `erc-kill-buffer-function' uses legacy target detection
597 ;; but falls back on buffer name, so no need for:
598 ;;
599 ;; erc-default-recipients '("#a")
600 ;;
601 erc--target (erc--target-from-string "#a")
602 erc-server-process (with-temp-buffer
603 (erc-networks-tests--create-dead-proc)))
604 (kill-buffer)))))
605
606;; FIXME this test is old and may describe impossible states:
607;; leftover identities being qual-equal but not eq (implies
608;; `erc-networks--reclaim-orphaned-target-buffers' is somehow broken).
609;;
610;; Otherwise, the point of this test is to show that server process
611;; identity does not impact the hunt for duplicates.
612
613(defun erc-tests--prep-erc-networks--reconcile-buffer-names--duplicates (start)
614
615 (with-current-buffer (get-buffer-create "foonet")
616 (erc-mode)
617 (setq erc-network 'foonet
618 erc-server-current-nick "tester"
619 erc-networks--id (erc-networks--id-create nil)
620 erc-server-process (funcall start)))
621
622 (with-current-buffer (get-buffer-create "#chan") ; prior session
623 (erc-mode)
624 (setq erc-server-process (buffer-local-value 'erc-server-process
625 (get-buffer "foonet"))
626 erc--target (erc--target-from-string "#chan")
627 erc-networks--id (erc-networks--id-create nil)))
628
629 (ert-info ("Conflicts not recognized as ERC buffers and not renamed")
630 (get-buffer-create "#chan@foonet")
631 (should (equal (erc-networks-tests--bufnames "#chan")
632 '("#chan" "#chan@foonet"))))
633
634 ;; These are dupes (not "collisions")
635
636 (with-current-buffer "#chan@foonet" ; same proc
637 (erc-mode)
638 (setq erc--target (erc--target-from-string "#chan")
639 erc-network 'foonet
640 erc-server-current-nick "tester"
641 erc-server-process (buffer-local-value 'erc-server-process
642 (get-buffer "foonet"))
643 erc-networks--id (erc-networks--id-create nil)))
644
645 (with-current-buffer (get-buffer-create "#chan@foonet<dead>")
646 (erc-mode)
647 (setq erc--target (erc--target-from-string "#chan")
648 erc-server-process (erc-networks-tests--create-dead-proc)
649 erc-network 'foonet
650 erc-server-current-nick "tester"
651 erc-networks--id (erc-networks--id-create nil)))
652
653 (with-current-buffer (get-buffer-create "#chan@foonet<live>")
654 (erc-mode)
655 (setq erc--target (erc--target-from-string "#chan")
656 erc-server-process (erc-networks-tests--create-live-proc)
657 erc-network 'foonet
658 erc-server-current-nick "tester"
659 erc-networks--id (erc-networks--id-create nil)))
660
661 (let ((created (list (get-buffer "#chan@foonet<live>")
662 (get-buffer "#chan@foonet<dead>")
663 (get-buffer "#chan@foonet"))))
664
665 (with-current-buffer "foonet"
666 (should (string= (erc-networks--reconcile-buffer-names
667 (erc--target-from-string "#chan") erc-networks--id)
668 "#chan")))
669
670 (ert-info ("All buffers considered dupes renamed")
671 (should (equal (erc-networks-tests--bufnames "#chan")
672 '("#chan" "#chan<2>" "#chan<3>" "#chan<4>"))))
673
674 (ert-info ("All buffers renamed from newest to oldest")
675 (should (equal created (list (get-buffer "#chan<2>")
676 (get-buffer "#chan<3>")
677 (get-buffer "#chan<4>"))))))
678
679 (erc-networks-tests--clean-bufs))
680
681(defun erc-tests--prep-erc-networks--reconcile-buffer-names--dupes-given (go)
682
683 ;; The connection's network is discovered before target buffers are
684 ;; created. This shows that the network doesn't matter when only
685 ;; "given" IDs are present.
686 (with-current-buffer (get-buffer-create "oofnet")
687 (erc-mode)
688 (setq erc-networks--id (erc-networks--id-create 'oofnet)
689 erc-network 'foonet
690 erc-server-current-nick "tester"
691 erc-server-process (funcall go)))
692
693 (with-current-buffer (get-buffer-create "#chan") ; prior session
694 (erc-mode)
695 (setq erc-networks--id (erc-networks--id-create 'oofnet)
696 erc-server-process (buffer-local-value 'erc-server-process
697 (get-buffer "oofnet"))
698 erc--target (erc--target-from-string "#chan")))
699
700 (with-current-buffer (get-buffer-create "#chan@oofnet") ;dupe/not collision
701 (erc-mode)
702 (setq erc-networks--id (erc-networks--id-create 'oofnet)
703 erc-server-process (buffer-local-value 'erc-server-process
704 (get-buffer "oofnet"))
705 erc--target (erc--target-from-string "#chan")))
706
707 (with-current-buffer "oofnet"
708 (should (string= (erc-networks--reconcile-buffer-names
709 (erc--target-from-string "#chan") erc-networks--id)
710 "#chan")))
711
712 (ert-info ("All buffers matching target and network renamed")
713 (should (equal (erc-networks-tests--bufnames "#chan")
714 '("#chan" "#chan<2>"))))
715
716 (erc-networks-tests--clean-bufs))
717
718(ert-deftest erc-networks--reconcile-buffer-names--duplicates ()
719 (ert-info ("Process live, no error")
720 (erc-tests--prep-erc-networks--reconcile-buffer-names--duplicates
721 #'erc-networks-tests--create-live-proc))
722
723 (ert-info ("Process live, no error, given ID")
724 (erc-tests--prep-erc-networks--reconcile-buffer-names--dupes-given
725 #'erc-networks-tests--create-live-proc))
726
727 (ert-info ("Process dead")
728 (erc-tests--prep-erc-networks--reconcile-buffer-names--duplicates
729 #'erc-networks-tests--create-dead-proc))
730
731 (ert-info ("Process dead, given ID")
732 (erc-tests--prep-erc-networks--reconcile-buffer-names--dupes-given
733 #'erc-networks-tests--create-dead-proc)))
734
735(defun erc-tests--prep-erc-networks--reconcile-buffer-names--no-srv-buf (check)
736 (let ((foonet-proc (with-temp-buffer
737 (erc-networks-tests--create-dead-proc))))
738 (with-current-buffer (get-buffer-create "barnet")
739 (erc-mode)
740 (setq erc-network 'barnet
741 erc-server-current-nick "tester"
742 erc-networks--id (erc-networks--id-create nil)
743 erc-server-process (erc-networks-tests--create-dead-proc)))
744
745 ;; Different proc and not "qual-equal" (different elts)
746 (with-current-buffer (get-buffer-create "#chan")
747 (erc-mode)
748 (setq erc-network 'foonet
749 erc-server-current-nick "tester"
750 erc-networks--id (erc-networks--id-create nil)
751 erc--target (erc--target-from-string "#chan")
752 erc-server-process foonet-proc))
753 (funcall check)
754 (erc-networks-tests--clean-bufs)))
755
756(ert-deftest erc-networks--reconcile-buffer-names--no-server-buf ()
757 (ert-info ("Existing #chan buffer respected")
758 (erc-tests--prep-erc-networks--reconcile-buffer-names--no-srv-buf
759 (lambda ()
760 (with-current-buffer "barnet"
761 (should (string= (erc-networks--reconcile-buffer-names
762 (erc--target-from-string "#chan") erc-networks--id)
763 "#chan@barnet")))
764 (ert-info ("Existing #chan buffer found and renamed")
765 (should (equal (erc-networks-tests--bufnames "#chan")
766 '("#chan@foonet")))))))
767
768 (ert-info ("Existing #chan buffer")
769 (erc-tests--prep-erc-networks--reconcile-buffer-names--no-srv-buf
770 (lambda ()
771 (with-current-buffer (get-buffer-create "foonet")
772 (erc-mode)
773 (setq erc-network 'foonet
774 erc-server-current-nick "tester"
775 erc-networks--id (erc-networks--id-create nil)
776 erc-server-process (erc-networks-tests--create-dead-proc))
777 (should (string= (erc-networks--reconcile-buffer-names
778 (erc--target-from-string "#chan") erc-networks--id)
779 "#chan")))
780 (ert-info ("Nothing renamed")
781 (should (equal (erc-networks-tests--bufnames "#chan") '("#chan")))))))
782
783 (ert-info ("Existing #chan@foonet and #chan@barnet buffers")
784 (erc-tests--prep-erc-networks--reconcile-buffer-names--no-srv-buf
785 (lambda ()
786 (with-current-buffer "#chan"
787 (rename-buffer "#chan@foonet"))
788 (should-not (get-buffer "#chan@barnet"))
789 (with-current-buffer (get-buffer-create "#chan@barnet")
790 (erc-mode)
791 (setq erc--target (erc--target-from-string "#chan")
792 erc-server-process (buffer-local-value 'erc-server-process
793 (get-buffer "barnet"))
794 erc-networks--id (erc-networks--id-create nil)))
795 (with-current-buffer (get-buffer-create "foonet")
796 (erc-mode)
797 (setq erc-network 'foonet
798 erc-server-current-nick "tester"
799 erc-server-process (erc-networks-tests--create-live-proc)
800 erc-networks--id (erc-networks--id-create nil))
801 (set-process-query-on-exit-flag erc-server-process nil)
802 (should (string= (erc-networks--reconcile-buffer-names
803 (erc--target-from-string "#chan") erc-networks--id)
804 "#chan@foonet")))
805 (ert-info ("Nothing renamed")
806 (should (equal (erc-networks-tests--bufnames "#chan")
807 '("#chan@barnet" "#chan@foonet"))))))))
808
809(defun erc-tests--prep-erc-networks--reconcile-buffer-names--no-srv-buf-given
810 (check)
811 (let ((oofnet-proc (with-temp-buffer
812 (erc-networks-tests--create-dead-proc))))
813
814 (with-current-buffer (get-buffer-create "rabnet")
815 (erc-mode)
816 ;; Again, given name preempts network lookup (unrealistic but
817 ;; highlights priorities)
818 (setq erc-networks--id (erc-networks--id-create 'rabnet)
819 erc-network 'barnet
820 erc-server-current-nick "tester"
821 erc-server-process (erc-networks-tests--create-dead-proc)))
822
823 ;; Identity is not "qual-equal" to above
824 (with-current-buffer (get-buffer-create "#chan")
825 (erc-mode)
826 (setq erc-networks--id (erc-networks--id-create 'oofnet)
827 erc-network 'foonet
828 erc--target (erc--target-from-string "#chan")
829 erc-server-process oofnet-proc))
830 (funcall check)
831 (erc-networks-tests--clean-bufs)))
832
833(ert-deftest erc-networks--reconcile-buffer-names--no-server-buf-given ()
834
835 (ert-info ("Existing #chan buffer respected")
836 (erc-tests--prep-erc-networks--reconcile-buffer-names--no-srv-buf-given
837 (lambda ()
838 (with-current-buffer "rabnet"
839 (should (string= (erc-networks--reconcile-buffer-names
840 (erc--target-from-string "#chan") erc-networks--id)
841 "#chan@rabnet")))
842
843 (ert-info ("Existing #chan buffer found and renamed")
844 (should (equal (erc-networks-tests--bufnames "#chan")
845 '("#chan@oofnet")))))))
846
847 (ert-info ("Existing #chan@oofnet and #chan@rabnet buffers")
848 (erc-tests--prep-erc-networks--reconcile-buffer-names--no-srv-buf-given
849 (lambda ()
850 ;; #chan has already been uniquified (but not grown)
851 (with-current-buffer "#chan" (rename-buffer "#chan@oofnet"))
852 (should-not (get-buffer "#chan@rabnet"))
853
854 (with-current-buffer (get-buffer-create "#chan@rabnet")
855 (erc-mode)
856 (setq erc--target (erc--target-from-string "#chan")
857 erc-server-process (buffer-local-value 'erc-server-process
858 (get-buffer "rabnet"))
859 erc-networks--id (buffer-local-value 'erc-networks--id
860 (get-buffer "rabnet"))))
861
862 (with-current-buffer (get-buffer-create "oofnet")
863 (erc-mode)
864 (setq erc-network 'oofnet
865 erc-server-current-nick "tester"
866 erc-server-process (erc-networks-tests--create-live-proc)
867 erc-networks--id (erc-networks--id-create 'oofnet)) ; given
868 (set-process-query-on-exit-flag erc-server-process nil)
869 (should (string= (erc-networks--reconcile-buffer-names
870 (erc--target-from-string "#chan") erc-networks--id)
871 "#chan@oofnet")))
872
873 (ert-info ("Nothing renamed")
874 (should (equal (erc-networks-tests--bufnames "#chan")
875 '("#chan@oofnet" "#chan@rabnet"))))))))
876
877;; This shows a corner case where a user explicitly assigns a "given"
878;; ID via `erc-tls' but later connects again without one. It would
879;; actually probably be better if the given identity were to win and
880;; the derived one got an <n>-suffix.
881;;
882;; If we just compared net identities, the two would match, but they
883;; don't here because one has a given name and the other a
884;; discovered/assembled one; so they are *not* qual-equal.
885(ert-deftest erc-networks--reconcile-buffer-names--no-srv-buf-given-mismatch ()
886 ;; Existing #chan buffer *not* respected
887 (erc-tests--prep-erc-networks--reconcile-buffer-names--no-srv-buf-given
888 (lambda ()
889 (with-current-buffer (get-buffer-create "oofnet")
890 (erc-mode)
891 (setq erc-network 'oofnet
892 erc-server-current-nick "tester"
893 erc-server-process (erc-networks-tests--create-dead-proc)
894 erc-networks--id (erc-networks--id-create nil)) ; derived
895 (should (string= (erc-networks--reconcile-buffer-names
896 (erc--target-from-string "#chan") erc-networks--id)
897 "#chan@oofnet")))
898
899 (ert-info ("Collision renamed but not grown (because it's a given)")
900 ;; Original chan uniquified and moved out of the way
901 (should (equal (erc-networks-tests--bufnames "#chan")
902 '("#chan@oofnet<2>")))))))
903
904(defun erc-tests--prep-erc-networks--reconcile-buffer-names--multi-net (check)
905
906 (with-current-buffer (get-buffer-create "foonet")
907 (erc-mode)
908 (setq erc-network 'foonet
909 erc-server-current-nick "tester"
910 erc-server-process (erc-networks-tests--create-dead-proc)
911 erc-networks--id (erc-networks--id-create nil))) ; derived
912
913 (with-current-buffer (get-buffer-create "barnet")
914 (erc-mode)
915 (setq erc-network 'barnet
916 erc-server-current-nick "tester"
917 erc-server-process (erc-networks-tests--create-dead-proc)
918 erc-networks--id (erc-networks--id-create nil))) ; derived
919
920 (with-current-buffer
921 (get-buffer-create (elt ["#chan" "#chan@foonet"] (random 2)))
922 (erc-mode)
923 (setq erc--target (erc--target-from-string "#chan"))
924 (cl-multiple-value-setq (erc-server-process erc-networks--id)
925 (with-current-buffer "foonet"
926 (list erc-server-process erc-networks--id))))
927
928 (with-current-buffer (get-buffer-create "#chan@barnet")
929 (erc-mode)
930 (setq erc--target (erc--target-from-string "#chan"))
931 (cl-multiple-value-setq (erc-server-process erc-networks--id)
932 (with-current-buffer "barnet"
933 (list erc-server-process erc-networks--id))))
934
935 (funcall check)
936 (erc-networks-tests--clean-bufs))
937
938(ert-deftest erc-networks--reconcile-buffer-names--multi-net ()
939 (ert-info ("Same network rename")
940 (erc-tests--prep-erc-networks--reconcile-buffer-names--multi-net
941 (lambda ()
942 (with-current-buffer "foonet"
943 (let ((result (erc-networks--reconcile-buffer-names
944 (erc--target-from-string "#chan") erc-networks--id)))
945 (should (string= result "#chan@foonet"))))
946
947 (should (equal (erc-networks-tests--bufnames "#chan")
948 '("#chan@barnet" "#chan@foonet"))))))
949
950 (ert-info ("Same network keep name")
951 (erc-tests--prep-erc-networks--reconcile-buffer-names--multi-net
952 (lambda ()
953 (with-current-buffer "barnet"
954 (let ((result (erc-networks--reconcile-buffer-names
955 (erc--target-from-string "#chan") erc-networks--id)))
956 (should (string= result "#chan@barnet"))))
957
958 (should (equal (erc-networks-tests--bufnames "#chan")
959 '("#chan@barnet" "#chan@foonet")))))))
960
961(defun erc-tests--prep-erc-networks--reconcile-buffer-names--multi-net-given
962 (check)
963
964 (with-current-buffer (get-buffer-create "oofnet")
965 (erc-mode)
966 (setq erc-network 'foonet
967 erc-server-current-nick "tester"
968 erc-networks--id (erc-networks--id-create 'oofnet) ; one given
969 erc-server-process (erc-networks-tests--create-dead-proc)))
970
971 (with-current-buffer (get-buffer-create "rabnet")
972 (erc-mode)
973 (setq erc-network 'barnet
974 erc-server-current-nick "tester"
975 erc-networks--id (erc-networks--id-create 'rabnet) ; another given
976 erc-server-process (erc-networks-tests--create-dead-proc)))
977
978 (with-current-buffer (get-buffer-create (elt ["chan" "#chan@oofnet"]
979 (random 2)))
980 (erc-mode)
981 (setq erc--target (erc--target-from-string "#chan"))
982 (cl-multiple-value-setq (erc-server-process erc-networks--id)
983 (with-current-buffer "oofnet"
984 (list erc-server-process erc-networks--id))))
985
986 (with-current-buffer (get-buffer-create "#chan@barnet")
987 (erc-mode)
988 (setq erc--target (erc--target-from-string "#chan"))
989 (cl-multiple-value-setq (erc-server-process erc-networks--id)
990 (with-current-buffer "rabnet"
991 (list erc-server-process erc-networks--id))))
992
993 (funcall check)
994 (erc-networks-tests--clean-bufs))
995
996(ert-deftest erc-networks--reconcile-buffer-names--multi-net-given ()
997 (ert-info ("Same network rename")
998 (erc-tests--prep-erc-networks--reconcile-buffer-names--multi-net-given
999 (lambda ()
1000 (with-current-buffer "oofnet"
1001 (let ((result (erc-networks--reconcile-buffer-names
1002 (erc--target-from-string "#chan") erc-networks--id)))
1003 (should (string= result "#chan@oofnet"))))
1004
1005 (should (equal (erc-networks-tests--bufnames "#chan")
1006 '("#chan@oofnet" "#chan@rabnet"))))))
1007
1008 (ert-info ("Same network keep name")
1009 (erc-tests--prep-erc-networks--reconcile-buffer-names--multi-net-given
1010 (lambda ()
1011 (with-current-buffer "rabnet"
1012 (let ((result (erc-networks--reconcile-buffer-names
1013 (erc--target-from-string "#chan") erc-networks--id)))
1014 (should (string= result "#chan@rabnet"))))
1015
1016 (should (equal (erc-networks-tests--bufnames "#chan")
1017 '("#chan@oofnet" "#chan@rabnet")))))))
1018
1019(defun erc-tests--prep-erc-networks--reconcile-buffer-names--multi-net-mixed
1020 (check)
1021
1022 (with-current-buffer (get-buffer-create "foonet")
1023 (erc-mode)
1024 (setq erc-network 'foonet
1025 erc-server-current-nick "tester"
1026 erc-networks--id (erc-networks--id-create nil) ; one derived
1027 erc-server-process (erc-networks-tests--create-dead-proc)))
1028
1029 (with-current-buffer (get-buffer-create "my-conn")
1030 (erc-mode)
1031 (setq erc-network 'barnet
1032 erc-server-current-nick "tester"
1033 erc-networks--id (erc-networks--id-create 'my-conn) ; one given
1034 erc-server-process (erc-networks-tests--create-dead-proc)))
1035
1036 (with-current-buffer (get-buffer-create (elt ["#chan" "#chan@foonet"]
1037 (random 2)))
1038 (erc-mode)
1039 (setq erc--target (erc--target-from-string "#chan"))
1040 (cl-multiple-value-setq (erc-server-process erc-networks--id)
1041 (with-current-buffer "foonet"
1042 (list erc-server-process erc-networks--id))))
1043
1044 (with-current-buffer (get-buffer-create "#chan@my-conn")
1045 (erc-mode)
1046 (setq erc--target (erc--target-from-string "#chan"))
1047 (cl-multiple-value-setq (erc-server-process erc-networks--id)
1048 (with-current-buffer "my-conn"
1049 (list erc-server-process erc-networks--id))))
1050
1051 (funcall check)
1052 (erc-networks-tests--clean-bufs))
1053
1054(ert-deftest erc-networks--reconcile-buffer-names--multi-net-existing ()
1055
1056 (ert-info ("Buf name derived from network")
1057 (erc-tests--prep-erc-networks--reconcile-buffer-names--multi-net-mixed
1058 (lambda ()
1059 (with-current-buffer "foonet"
1060 (let ((result (erc-networks--reconcile-buffer-names
1061 (erc--target-from-string "#chan") erc-networks--id)))
1062 (should (string= result "#chan@foonet"))))
1063
1064 (should (equal (erc-networks-tests--bufnames "#chan")
1065 '("#chan@foonet" "#chan@my-conn"))))))
1066
1067 (ert-info ("Buf name given")
1068 (erc-tests--prep-erc-networks--reconcile-buffer-names--multi-net-mixed
1069 (lambda ()
1070 (with-current-buffer "my-conn"
1071 (let ((result (erc-networks--reconcile-buffer-names
1072 (erc--target-from-string "#chan") erc-networks--id)))
1073 (should (string= result "#chan@my-conn"))))
1074
1075 (should (equal (erc-networks-tests--bufnames "#chan")
1076 '("#chan@foonet" "#chan@my-conn")))))))
1077
1078(ert-deftest erc-networks--reconcile-buffer-names--multi-net-suffixed ()
1079 ;; Two networks, same channel. One network has two connections.
1080 ;; When the same channel is joined on the latter under a different
1081 ;; nick, all buffer names involving that network are suffixed with
1082 ;; the network identity.
1083
1084 (with-current-buffer (get-buffer-create "foonet/bob")
1085 (erc-mode)
1086 (setq erc-network 'foonet
1087 erc-server-current-nick "bob"
1088 erc-networks--id (make-erc-networks--id-qualifying
1089 :symbol 'foonet/bob
1090 :parts [foonet "bob"]
1091 :len 2)
1092 erc-server-process (erc-networks-tests--create-live-proc)))
1093
1094 (with-current-buffer (get-buffer-create
1095 (elt ["#chan@foonet" "#chan@foonet/bob"] (random 2)))
1096 (erc-mode)
1097 (setq erc--target (erc--target-from-string "#chan")
1098 erc-server-process (buffer-local-value 'erc-server-process
1099 (get-buffer "foonet/bob"))
1100 erc-networks--id (buffer-local-value 'erc-networks--id
1101 (get-buffer "foonet/bob"))))
1102
1103 (with-current-buffer (get-buffer-create "barnet")
1104 (erc-mode)
1105 (setq erc-network 'barnet
1106 erc-server-current-nick (elt ["alice" "bob"] (random 2))
1107 erc-networks--id (erc-networks--id-create 'barnet)
1108 erc-server-process (erc-networks-tests--create-live-proc)))
1109
1110 (with-current-buffer (get-buffer-create "#chan@barnet")
1111 (erc-mode)
1112 (setq erc--target (erc--target-from-string "#chan")
1113 erc-server-process (buffer-local-value 'erc-server-process
1114 (get-buffer "barnet"))
1115 erc-networks--id (buffer-local-value 'erc-networks--id
1116 (get-buffer "barnet"))))
1117
1118 (with-current-buffer (get-buffer-create "foonet/alice")
1119 (erc-mode)
1120 (setq erc-network 'foonet
1121 erc-server-current-nick "alice"
1122 erc-networks--id (make-erc-networks--id-qualifying
1123 :symbol 'foonet/alice
1124 :parts [foonet "alice"]
1125 :len 2)
1126 erc-server-process (erc-networks-tests--create-live-proc)))
1127
1128 (with-current-buffer "foonet/alice"
1129 (let ((result (erc-networks--reconcile-buffer-names
1130 (erc--target-from-string "#chan") erc-networks--id)))
1131 (should (string= result "#chan@foonet/alice"))))
1132
1133 (should (equal (erc-networks-tests--bufnames "#chan")
1134 '("#chan@barnet" "#chan@foonet/bob")))
1135
1136 (erc-networks-tests--clean-bufs))
1137
1138(ert-deftest erc-networks--reconcile-buffer-names--local ()
1139 (with-current-buffer (get-buffer-create "DALnet")
1140 (erc-mode)
1141 (setq erc-network 'DALnet
1142 erc-server-announced-name "elysium.ga.us.dal.net"
1143 erc-server-process (erc-networks-tests--create-dead-proc)
1144 erc--isupport-params (make-hash-table)
1145 erc-networks--id (erc-networks--id-create nil))
1146 (puthash 'CHANTYPES '("&#") erc--isupport-params))
1147
1148 (ert-info ("Local chan buffer from older, disconnected identity")
1149 (with-current-buffer (get-buffer-create "&chan")
1150 (erc-mode)
1151 ;; Cheat here because localp is determined on identity init
1152 (setq erc--target (with-current-buffer "DALnet"
1153 (erc--target-from-string "&chan"))
1154 erc-network 'DALnet
1155 erc-server-announced-name "twisted.ma.us.dal.net"
1156 erc-server-process (erc-networks-tests--create-dead-proc)
1157 erc-networks--id (erc-networks--id-create nil))))
1158
1159 (ert-info ("Local channels renamed using network server names")
1160 (with-current-buffer "DALnet"
1161 (let ((result (erc-networks--reconcile-buffer-names
1162 (erc--target-from-string "&chan") erc-networks--id)))
1163 (should (string= result "&chan@elysium.ga.us.dal.net")))))
1164
1165 (should (get-buffer "&chan@twisted.ma.us.dal.net"))
1166 (should-not (get-buffer "&chan"))
1167 (erc-networks-tests--clean-bufs))
1168
1169(ert-deftest erc-networks--set-name ()
1170 (with-current-buffer (get-buffer-create "localhost:6667")
1171 (let (erc-server-announced-name
1172 (erc--isupport-params (make-hash-table))
1173 erc-network
1174 calls)
1175 (erc-mode)
1176
1177 (cl-letf (((symbol-function 'erc-display-line)
1178 (lambda (&rest r) (push r calls))))
1179
1180 (ert-info ("Signals when `erc-server-announced-name' unset")
1181 (should-error (erc-networks--set-name nil (make-erc-response)))
1182 (should-not calls))
1183
1184 (ert-info ("Signals when table empty and NETWORK param unset")
1185 (setq erc-server-announced-name "irc.fake.gnu.org")
1186 (let ((err (should-error (erc-networks--set-name
1187 nil (make-erc-response)))))
1188 (should (string-match-p "failed" (cadr err)))
1189 (should (eq (car err) 'error)))
1190 (should (string-match-p "*** Failed" (car (pop calls)))))))
1191
1192 (erc-networks-tests--clean-bufs)))
1193
1194(ert-deftest erc-networks--ensure-announced ()
1195 (with-current-buffer (get-buffer-create "localhost:6667")
1196 (should (local-variable-if-set-p 'erc-server-announced-name))
1197 (let (erc-insert-modify-hook
1198 (erc-server-process (erc-networks-tests--create-live-proc))
1199 (parsed (make-erc-response
1200 :unparsed ":irc.barnet.org 422 tester :MOTD File is missing"
1201 :sender "irc.barnet.org"
1202 :command "422"
1203 :command-args '("tester" "MOTD File is missing")
1204 :contents "MOTD File is missing")))
1205
1206 (erc-mode) ; boilerplate displayable start (needs `erc-server-process')
1207 (insert "\n\n")
1208 (setq erc-input-marker (make-marker) erc-insert-marker (make-marker))
1209 (set-marker erc-insert-marker (point-max))
1210 (erc-display-prompt) ; boilerplate displayable end
1211
1212 (erc-networks--ensure-announced erc-server-process parsed)
1213 (goto-char (point-min))
1214 (search-forward "Failed")
1215 (should (string= erc-server-announced-name "irc.barnet.org")))
1216 (when noninteractive (kill-buffer))))
1217
1218(ert-deftest erc-networks--rename-server-buffer--no-existing--orphan ()
1219 (with-current-buffer (get-buffer-create "#chan")
1220 (erc-mode)
1221 (setq erc-network 'FooNet
1222 erc-server-current-nick "tester"
1223 erc--target (erc--target-from-string "#chan")
1224 erc-networks--id (erc-networks--id-create nil)))
1225
1226 (with-current-buffer (get-buffer-create "irc.foonet.org")
1227 (erc-mode)
1228 (setq erc-network 'FooNet
1229 erc-server-current-nick "tester"
1230 erc-server-process (erc-networks-tests--create-live-proc)
1231 erc-networks--id (erc-networks--id-create nil))
1232 (should-not (erc-networks--rename-server-buffer erc-server-process))
1233 (should (string= (buffer-name) "FooNet")))
1234
1235 (ert-info ("Channel buffer reassociated")
1236 (erc-server-process-alive "#chan")
1237 (with-current-buffer "#chan"
1238 (should erc-server-connected)
1239 (erc-with-server-buffer
1240 (should (string= (buffer-name) "FooNet")))))
1241
1242 (erc-networks-tests--clean-bufs))
1243
1244(ert-deftest erc-networks--rename-server-buffer--existing--reuse ()
1245 (let* ((old-buf (get-buffer-create "FooNet"))
1246 (old-proc (erc-networks-tests--create-dead-proc old-buf)))
1247
1248 (with-current-buffer old-buf
1249 (erc-mode)
1250 (insert "*** Old buf")
1251 (setq erc-network 'FooNet
1252 erc-server-current-nick "tester"
1253 erc-insert-marker (set-marker (make-marker) (point-max))
1254 erc-server-process old-proc
1255 erc-networks--id (erc-networks--id-create nil)))
1256
1257 (with-current-buffer (get-buffer-create "#chan")
1258 (erc-mode)
1259 (setq erc-network 'FooNet
1260 erc-server-process old-proc
1261 erc-networks--id (erc-networks--id-create nil)
1262 erc--target (erc--target-from-string "#chan")))
1263
1264 (ert-info ("New buffer steals name, content")
1265 (with-current-buffer (get-buffer-create "irc.foonet.org")
1266 (erc-mode)
1267 (setq erc-network 'FooNet
1268 erc-server-current-nick "tester"
1269 erc-server-process (erc-networks-tests--create-live-proc)
1270 erc-networks--id (erc-networks--id-create nil))
1271 (should-not (erc-networks--rename-server-buffer erc-server-process))
1272 (should (string= (buffer-name) "FooNet"))
1273 (goto-char (point-min))
1274 (should (search-forward "Old buf"))))
1275
1276 (ert-info ("Channel buffer reassociated")
1277 (erc-server-process-alive "#chan")
1278 (with-current-buffer "#chan"
1279 (should erc-server-connected)
1280 (should-not (eq erc-server-process old-proc))
1281 (erc-with-server-buffer
1282 (should (string= (buffer-name) "FooNet")))))
1283
1284 (ert-info ("Original buffer killed off")
1285 (should-not (buffer-live-p old-buf))))
1286
1287 (erc-networks-tests--clean-bufs))
1288
1289;; This is for compatibility with pre-28.1 behavior. Basically, we're
1290;; trying to match the behavior bug for bug. All buffers were always
1291;; suffixed and never reassociated. 28.1 introduced a regression that
1292;; reversed the latter, but we've reverted that.
1293
1294(ert-deftest erc-networks--rename-server-buffer--existing--noreuse ()
1295 (with-suppressed-warnings ((obsolete erc-reuse-buffers))
1296 (should erc-reuse-buffers) ; default
1297 (let* ((old-buf (get-buffer-create "irc.foonet.org:6697/irc.foonet.org"))
1298 (old-proc (erc-networks-tests--create-dead-proc old-buf))
1299 erc-reuse-buffers)
1300 (with-current-buffer old-buf
1301 (erc-mode)
1302 (insert "*** Old buf")
1303 (setq erc-network 'FooNet
1304 erc-server-current-nick "tester"
1305 erc-insert-marker (set-marker (make-marker) (point-max))
1306 erc-server-process old-proc
1307 erc-networks--id (erc-networks--id-create nil)))
1308 (with-current-buffer (get-buffer-create "#chan")
1309 (erc-mode)
1310 (setq erc-network 'FooNet
1311 erc-server-process old-proc
1312 erc-networks--id (buffer-local-value 'erc-networks--id old-buf)
1313 erc--target (erc--target-from-string "#chan"))
1314 (rename-buffer (erc-networks--construct-target-buffer-name erc--target)))
1315
1316 (ert-info ("Server buffer uniquely renamed")
1317 (with-current-buffer
1318 (get-buffer-create "irc.foonet.org:6697/irc.foonet.org<2>")
1319 (erc-mode)
1320 (setq erc-network 'FooNet
1321 erc-server-current-nick "tester"
1322 erc-server-process (erc-networks-tests--create-live-proc)
1323 erc-networks--id (erc-networks--id-create nil))
1324 (should-not (erc-networks--rename-server-buffer erc-server-process))
1325 (should (string= (buffer-name)
1326 "irc.foonet.org:6697/irc.foonet.org<2>"))
1327 (goto-char (point-min))
1328 (should-not (search-forward "Old buf" nil t))))
1329
1330 (ert-info ("Channel buffer not reassociated")
1331 (should-not
1332 (erc-server-process-alive
1333 (should (get-buffer "#chan/irc.foonet.org"))))
1334 (with-current-buffer (get-buffer "#chan/irc.foonet.org")
1335 (should-not erc-server-connected)
1336 (should (eq erc-server-process old-proc))
1337 (erc-with-server-buffer
1338 (should (string= (buffer-name)
1339 "irc.foonet.org:6697/irc.foonet.org")))))
1340
1341 (ert-info ("Old buffer still around")
1342 (should (buffer-live-p old-buf)))))
1343 (erc-networks-tests--clean-bufs))
1344
1345(ert-deftest erc-networks--rename-server-buffer--reconnecting ()
1346 (let* ((old-buf (get-buffer-create "FooNet"))
1347 (old-proc (erc-networks-tests--create-dead-proc old-buf)))
1348
1349 (with-current-buffer old-buf
1350 (erc-mode)
1351 (insert "*** Old buf")
1352 (setq erc-network 'FooNet
1353 erc-server-current-nick "tester"
1354 erc-insert-marker (set-marker (make-marker) (point-max))
1355 erc-server-process old-proc
1356 erc-networks--id (erc-networks--id-create nil)))
1357
1358 (with-current-buffer (get-buffer-create "#chan")
1359 (erc-mode)
1360 (setq erc-network 'FooNet
1361 erc-server-process old-proc
1362 erc--target (erc--target-from-string "#chan")
1363 erc-networks--id (erc-networks--id-create nil)))
1364
1365 (ert-info ("No new buffer")
1366 (with-current-buffer old-buf
1367 (setq erc-server-process (erc-networks-tests--create-live-proc))
1368 (should-not (erc-networks--rename-server-buffer erc-server-process))
1369 (should (string= (buffer-name) "FooNet"))
1370 (goto-char (point-min))
1371 (should (search-forward "Old buf"))))
1372
1373 (ert-info ("Channel buffer updated with live proc")
1374 (erc-server-process-alive "#chan")
1375 (with-current-buffer "#chan"
1376 (should erc-server-connected)
1377 (should-not (eq erc-server-process old-proc))
1378 (erc-with-server-buffer
1379 (should (string= (buffer-name) "FooNet"))))))
1380
1381 (erc-networks-tests--clean-bufs))
1382
1383(ert-deftest erc-networks--rename-server-buffer--id ()
1384 (let* ((old-buf (get-buffer-create "MySession"))
1385 (old-proc (erc-networks-tests--create-dead-proc old-buf)))
1386
1387 (with-current-buffer old-buf
1388 (erc-mode)
1389 (insert "*** Old buf")
1390 (setq erc-network 'FooNet
1391 erc-networks--id (erc-networks--id-create 'MySession)
1392 erc-insert-marker (set-marker (make-marker) (point-max))
1393 erc-server-process old-proc))
1394
1395 (with-current-buffer (get-buffer-create "#chan")
1396 (erc-mode)
1397 (setq erc-network 'FooNet
1398 erc-networks--id (erc-networks--id-create 'MySession)
1399 erc-server-process old-proc
1400 erc--target (erc--target-from-string "#chan")))
1401
1402 (ert-info ("No new buffer")
1403 (with-current-buffer old-buf
1404 (setq erc-server-process (erc-networks-tests--create-live-proc))
1405 (should-not (erc-networks--rename-server-buffer erc-server-process))
1406 (should (string= (buffer-name) "MySession"))
1407 (goto-char (point-min))
1408 (should (search-forward "Old buf"))))
1409
1410 (ert-info ("Channel buffer updated with live proc")
1411 (erc-server-process-alive "#chan")
1412 (with-current-buffer "#chan"
1413 (should erc-server-connected)
1414 (should-not (eq erc-server-process old-proc))
1415 (erc-with-server-buffer
1416 (should (string= (buffer-name) "MySession"))))))
1417
1418 (erc-networks-tests--clean-bufs))
1419
1420(ert-deftest erc-networks--rename-server-buffer--existing--live ()
1421 (let* (erc-kill-server-hook
1422 erc-insert-modify-hook
1423 (old-buf (get-buffer-create "FooNet"))
1424 (old-proc (erc-networks-tests--create-live-proc old-buf))) ; live
1425
1426 (with-current-buffer old-buf
1427 (erc-mode)
1428 (insert "*** Old buf")
1429 (setq erc-network 'FooNet
1430 erc-server-current-nick "tester"
1431 erc-insert-marker (set-marker (make-marker) (point-max))
1432 erc-server-process old-proc
1433 erc-networks--id (erc-networks--id-create nil))
1434 (should (erc-server-process-alive)))
1435
1436 (with-current-buffer (get-buffer-create "#chan")
1437 (erc-mode)
1438 (setq erc-network 'FooNet
1439 erc-server-process old-proc
1440 erc-networks--id (erc-networks--id-create nil)
1441 erc-server-connected t
1442 erc--target (erc--target-from-string "#chan")))
1443
1444 (ert-info ("New buffer rejected, abandoned, not killed")
1445 (with-current-buffer (get-buffer-create "irc.foonet.org")
1446 (erc-mode)
1447 (setq erc-network 'FooNet
1448 erc-server-current-nick "tester"
1449 erc-insert-marker (set-marker (make-marker) (point-max))
1450 erc-server-process (erc-networks-tests--create-live-proc)
1451 erc-networks--id (erc-networks--id-create nil))
1452 (should-not (erc-networks--rename-server-buffer erc-server-process))
1453 (should (eq erc-active-buffer old-buf))
1454 (should-not (erc-server-process-alive))
1455 (should (string= (buffer-name) "irc.foonet.org"))
1456 (goto-char (point-min))
1457 (search-forward "still connected")))
1458
1459 (ert-info ("Channel buffer updated with live proc")
1460 (should (erc-server-process-alive "#chan"))
1461 (with-current-buffer "#chan"
1462 (should erc-server-connected)
1463 (should (erc-server-buffer-live-p))
1464 (should (eq erc-server-process old-proc))
1465 (should (buffer-live-p (process-buffer erc-server-process)))
1466 (with-current-buffer (process-buffer erc-server-process)
1467 (should (eq (current-buffer) (get-buffer "FooNet")))
1468 (should (eq (current-buffer) old-buf))))))
1469
1470 (should (get-buffer "FooNet"))
1471 (should (get-buffer "irc.foonet.org"))
1472
1473 (erc-networks-tests--clean-bufs))
1474
1475(ert-deftest erc-networks--rename-server-buffer--local-match ()
1476 (let* ((old-buf (get-buffer-create "FooNet"))
1477 (old-proc (erc-networks-tests--create-dead-proc old-buf)))
1478
1479 (with-current-buffer old-buf
1480 (erc-mode)
1481 (insert "*** Old buf")
1482 (setq erc-network 'FooNet
1483 erc-server-current-nick "tester"
1484 erc-server-announced-name "us-east.foonet.org"
1485 erc-insert-marker (set-marker (make-marker) (point-max))
1486 erc-server-process old-proc
1487 erc--isupport-params (make-hash-table)
1488 erc-networks--id (erc-networks--id-create nil))
1489 (puthash 'CHANTYPES '("&#") erc--isupport-params))
1490
1491 (with-current-buffer (get-buffer-create "&chan")
1492 (erc-mode)
1493 (setq erc-network 'FooNet
1494 erc-server-process old-proc
1495 erc-server-announced-name "us-east.foonet.org"
1496 erc--target (erc--target-from-string "&chan")
1497 erc-networks--id (erc-networks--id-create nil)))
1498
1499 (ert-info ("New server buffer steals name, content")
1500 (with-current-buffer (get-buffer-create "irc.foonet.org")
1501 (erc-mode)
1502 (setq erc-network 'FooNet
1503 erc-server-current-nick "tester"
1504 erc-server-announced-name "us-east.foonet.org"
1505 erc-server-process (erc-networks-tests--create-live-proc)
1506 erc--isupport-params (make-hash-table)
1507 erc-networks--id (erc-networks--id-create nil))
1508 (puthash 'CHANTYPES '("&#") erc--isupport-params)
1509 (should-not (erc-networks--rename-server-buffer erc-server-process))
1510 (should (string= (buffer-name) "FooNet"))
1511 (goto-char (point-min))
1512 (should (search-forward "Old buf"))))
1513
1514 (ert-info ("Channel buffer reassociated when &local server matches")
1515 (should (erc-server-process-alive "&chan"))
1516 (with-current-buffer "&chan"
1517 (should erc-server-connected)
1518 (should-not (eq erc-server-process old-proc))
1519 (erc-with-server-buffer
1520 (should (string= (buffer-name) "FooNet")))))
1521
1522 (ert-info ("Original buffer killed off")
1523 (should-not (buffer-live-p old-buf)))
1524
1525 (erc-networks-tests--clean-bufs)))
1526
1527(ert-deftest erc-networks--rename-server-buffer--local-nomatch ()
1528 (let* ((old-buf (get-buffer-create "FooNet"))
1529 (old-proc (erc-networks-tests--create-dead-proc old-buf)))
1530
1531 (with-current-buffer old-buf
1532 (erc-mode)
1533 (insert "*** Old buf")
1534 (setq erc-network 'FooNet
1535 erc-server-current-nick "tester"
1536 erc-server-announced-name "us-west.foonet.org"
1537 erc-insert-marker (set-marker (make-marker) (point-max))
1538 erc-server-process old-proc
1539 erc--isupport-params (make-hash-table)
1540 erc-networks--id (erc-networks--id-create nil))
1541 (puthash 'CHANTYPES '("&#") erc--isupport-params))
1542
1543 (with-current-buffer (get-buffer-create "&chan")
1544 (erc-mode)
1545 (setq erc-network 'FooNet
1546 erc-server-process old-proc
1547 erc-server-announced-name "us-west.foonet.org" ; west
1548 erc--target (erc--target-from-string "&chan")
1549 erc-networks--id (erc-networks--id-create nil)))
1550
1551 (ert-info ("New server buffer steals name, content")
1552 (with-current-buffer (get-buffer-create "irc.foonet.org")
1553 (erc-mode)
1554 (setq erc-network 'FooNet
1555 erc-server-current-nick "tester"
1556 erc-server-announced-name "us-east.foonet.org" ; east
1557 erc-server-process (erc-networks-tests--create-live-proc)
1558 erc--isupport-params (make-hash-table)
1559 erc-networks--id (erc-networks--id-create nil))
1560
1561 (puthash 'CHANTYPES '("&#") erc--isupport-params)
1562 (should-not (erc-networks--rename-server-buffer erc-server-process))
1563 (should (string= (buffer-name) "FooNet"))
1564 (goto-char (point-min))
1565 (should (search-forward "Old buf"))))
1566
1567 (ert-info ("Channel buffer now orphaned even though network matches")
1568 (should-not (erc-server-process-alive "&chan"))
1569 (with-current-buffer "&chan"
1570 (should-not erc-server-connected)
1571 (should (eq erc-server-process old-proc))
1572 (erc-with-server-buffer
1573 (should (string= (buffer-name) "FooNet")))))
1574
1575 (ert-info ("Original buffer killed off")
1576 (should-not (buffer-live-p old-buf)))
1577
1578 (erc-networks-tests--clean-bufs)))
1579
1580(ert-deftest erc-networks--update-server-identity--double-existing ()
1581 (with-temp-buffer
1582 (erc-mode)
1583 (setq erc-networks--id (make-erc-networks--id-qualifying
1584 :parts [foonet "bob"] :len 1))
1585
1586 (with-current-buffer (get-buffer-create "#chan@foonet/bob")
1587 (erc-mode)
1588 (setq erc-networks--id (make-erc-networks--id-qualifying
1589 :parts [foonet "bob"] :len 2)))
1590 (with-current-buffer (get-buffer-create "foonet/alice")
1591 (erc-mode)
1592 (setq erc-networks--id
1593 (make-erc-networks--id-qualifying :parts [foonet "alice"] :len 2)))
1594
1595 (ert-info ("Adopt equivalent identity")
1596 (should (eq (erc-networks--update-server-identity)
1597 (buffer-local-value 'erc-networks--id
1598 (get-buffer "#chan@foonet/bob")))))
1599
1600 (ert-info ("Ignore non-matches")
1601 (should-not (erc-networks--update-server-identity))
1602 (should (eq erc-networks--id
1603 (buffer-local-value 'erc-networks--id
1604 (get-buffer "#chan@foonet/bob"))))))
1605
1606 (erc-networks-tests--clean-bufs))
1607
1608(ert-deftest erc-networks--update-server-identity--double-new ()
1609 (with-temp-buffer
1610 (erc-mode)
1611 (setq erc-networks--id (make-erc-networks--id-qualifying
1612 :parts [foonet "bob"] :len 1))
1613
1614 (with-current-buffer (get-buffer-create "foonet/alice")
1615 (erc-mode)
1616 (setq erc-networks--id
1617 (make-erc-networks--id-qualifying :parts [foonet "alice"] :len 2)))
1618 (with-current-buffer (get-buffer-create "#chan@foonet/alice")
1619 (erc-mode)
1620 (setq erc-networks--id (buffer-local-value 'erc-networks--id
1621 (get-buffer "foonet/alice"))))
1622
1623 (ert-info ("Evolve identity to prevent ambiguity")
1624 (should-not (erc-networks--update-server-identity))
1625 (should (= (erc-networks--id-qualifying-len erc-networks--id) 2))
1626 (should (eq (erc-networks--id-symbol erc-networks--id) 'foonet/bob))))
1627
1628 (erc-networks-tests--clean-bufs))
1629
1630(ert-deftest erc-networks--update-server-identity--double-bounded ()
1631 (with-temp-buffer
1632 (erc-mode)
1633 (setq erc-networks--id (make-erc-networks--id-qualifying
1634 :parts [foonet "bob"] :len 1))
1635
1636 (with-current-buffer (get-buffer-create "foonet/alice/home")
1637 (erc-mode)
1638 (setq erc-networks--id (make-erc-networks--id-qualifying
1639 :parts [foonet "alice" home] :len 3)))
1640 (with-current-buffer (get-buffer-create "#chan@foonet/alice/home")
1641 (erc-mode)
1642 (setq erc-networks--id
1643 (buffer-local-value 'erc-networks--id
1644 (get-buffer "foonet/alice/home"))))
1645
1646 (ert-info ("Evolve identity to prevent ambiguity")
1647 (should-not (erc-networks--update-server-identity))
1648 (should (= (erc-networks--id-qualifying-len erc-networks--id) 2))
1649 (should (eq (erc-networks--id-symbol erc-networks--id) 'foonet/bob))))
1650
1651 (erc-networks-tests--clean-bufs))
1652
1653(ert-deftest erc-networks--update-server-identity--double-even ()
1654 (with-temp-buffer
1655 (erc-mode)
1656 (setq erc-networks--id
1657 (make-erc-networks--id-qualifying :parts [foonet "bob"] :len 1))
1658
1659 (with-current-buffer (get-buffer-create "foonet")
1660 (erc-mode)
1661 (setq erc-networks--id
1662 (make-erc-networks--id-qualifying :parts [foonet "alice"] :len 1)))
1663 (with-current-buffer (get-buffer-create "#chan")
1664 (erc-mode)
1665 (setq erc--target (erc--target-from-string "#chan")
1666 erc-networks--id (buffer-local-value 'erc-networks--id
1667 (get-buffer "foonet"))))
1668
1669 (ert-info ("Evolve identity to prevent ambiguity")
1670 (should-not (erc-networks--update-server-identity))
1671 (should (= (erc-networks--id-qualifying-len erc-networks--id) 2))
1672 (should (eq (erc-networks--id-symbol erc-networks--id) 'foonet/bob)))
1673
1674 (ert-info ("Collision renamed")
1675 (with-current-buffer "foonet/alice"
1676 (should (eq (erc-networks--id-symbol erc-networks--id) 'foonet/alice)))
1677
1678 (with-current-buffer "#chan@foonet/alice"
1679 (should (eq (erc-networks--id-symbol erc-networks--id)
1680 'foonet/alice)))))
1681
1682 (erc-networks-tests--clean-bufs))
1683
1684(ert-deftest erc-networks--update-server-identity--triple-new ()
1685 (with-temp-buffer
1686 (erc-mode)
1687 (setq erc-networks--id
1688 (make-erc-networks--id-qualifying :parts [foonet "bob" home] :len 1))
1689
1690 (with-current-buffer (get-buffer-create "foonet/bob/office")
1691 (erc-mode)
1692 (setq erc-networks--id
1693 (make-erc-networks--id-qualifying :parts [foonet "bob" office]
1694 :len 3)))
1695 (with-current-buffer (get-buffer-create "#chan@foonet/bob/office")
1696 (erc-mode)
1697 (setq erc-networks--id
1698 (buffer-local-value 'erc-networks--id
1699 (get-buffer "foonet/bob/office"))))
1700
1701 (ert-info ("Extend our identity's canonical ID so that it's unique")
1702 (should-not (erc-networks--update-server-identity))
1703 (should (= (erc-networks--id-qualifying-len erc-networks--id) 3))))
1704
1705 (erc-networks-tests--clean-bufs))
1706
1707;;; erc-networks-tests.el ends here
diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el
index 5b04bff617b..618d7eeea02 100644
--- a/test/lisp/erc/erc-tests.el
+++ b/test/lisp/erc/erc-tests.el
@@ -566,8 +566,9 @@
566 (erc-log-irc-protocol ":irc.gnu.org 001 tester :Welcome") 566 (erc-log-irc-protocol ":irc.gnu.org 001 tester :Welcome")
567 (erc-log-irc-protocol ":irc.gnu.org 002 tester :Your host is irc.gnu.org") 567 (erc-log-irc-protocol ":irc.gnu.org 002 tester :Your host is irc.gnu.org")
568 (setq erc-network 'FooNet) 568 (setq erc-network 'FooNet)
569 (setq erc-networks--id (erc-networks--id-create nil))
569 (erc-log-irc-protocol ":irc.gnu.org 422 tester :MOTD missing") 570 (erc-log-irc-protocol ":irc.gnu.org 422 tester :MOTD missing")
570 (setq erc-network 'BarNet) 571 (setq erc-networks--id (erc-networks--id-create 'BarNet))
571 (erc-log-irc-protocol ":irc.gnu.org 221 tester +i") 572 (erc-log-irc-protocol ":irc.gnu.org 221 tester +i")
572 (set-process-query-on-exit-flag erc-server-process nil))) 573 (set-process-query-on-exit-flag erc-server-process nil)))
573 (with-current-buffer "*erc-protocol*" 574 (with-current-buffer "*erc-protocol*"