aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
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*"