summaryrefslogtreecommitdiff
path: root/tests/nick-change-fail.el
diff options
context:
space:
mode:
Diffstat (limited to 'tests/nick-change-fail.el')
-rw-r--r--tests/nick-change-fail.el89
1 files changed, 89 insertions, 0 deletions
diff --git a/tests/nick-change-fail.el b/tests/nick-change-fail.el
new file mode 100644
index 0000000..b562db3
--- /dev/null
+++ b/tests/nick-change-fail.el
@@ -0,0 +1,89 @@
+;;; When the user tries to change nickname in an MUC room, and the
+;;; server denies this, we should detect this instead of believing
+;;; that the user was thrown out of the room.
+
+(require 'jabberd)
+
+(defconst ncf-room-name "orchard@romeo-and-juliet.shakespeare.lit"
+ "The MUC room used for this test.")
+
+(defun ncf-presence (fsm stanza)
+ "Stanza handler.
+This function is a very simple MUC implementation. It allows a user
+to enter the room named by `ncf-room-name' with the nick \"Romeo\"."
+ (jabber-xml-let-attributes (to) stanza
+ (when (and (eq (jabber-xml-node-name stanza) 'presence)
+ (string= (jabber-jid-user to) ncf-room-name))
+ (let ((nick (jabber-jid-resource to)))
+ ;; Allow only the nick Romeo
+ (if (string= nick "Romeo")
+ (jabberd-send fsm
+ `(presence ((from . ,to))
+ (x ((xmlns . "http://jabber.org/protocol/muc#user"))
+ (item ((affiliation . "none")
+ (role . "participant"))))))
+ (jabberd-send fsm
+ `(presence ((from . ,to)
+ (type . "error"))
+ (x ((xmlns . "http://jabber.org/protocol/muc#user")))
+ (error ((code . "409") (type . "cancel"))
+ (conflict ((xmlns . "urn:ietf:params:xml:ns:xmpp-stanzas")))))))))))
+
+(add-hook 'jabberd-stanza-handlers 'ncf-presence)
+(add-hook 'jabber-post-connect-hooks 'ncf-do)
+(setq jabber-muc-disable-disco-check t)
+(setq jabber-debug-log-xml t)
+
+(defvar ncf-done nil)
+;; We need an extra variable for the error, as errors from timers are
+;; ignored.
+(defvar ncf-error nil)
+
+(defun ncf-assert (assert-this format &rest args)
+ (unless assert-this
+ (let ((msg (apply #'format format args)))
+ (setq ncf-error msg)
+ (error "%s" msg))))
+
+(defun ncf-do (jc)
+ (setq ncf-done t)
+
+ (jabber-muc-join jc ncf-room-name "Romeo")
+ ;; We need a delay here, so that the client can process the response
+ ;; stanza.
+ (sit-for 0.01)
+ (let ((buffer (jabber-muc-get-buffer ncf-room-name)))
+ (ncf-assert (get-buffer buffer) "Couldn't enter MUC room")
+ (ncf-assert *jabber-active-groupchats* "Entering room not recorded")
+
+ ;; Now, do an unallowed nickname change.
+ (jabber-muc-join jc ncf-room-name "Mercutio")
+ (sit-for 0.01)
+
+ ;; We should still consider ourselves to be in the room as Romeo
+ (ncf-assert (assoc ncf-room-name *jabber-active-groupchats*)
+ "We thought we left the room, but we didn't")
+ (ncf-assert (string= (cdr (assoc ncf-room-name *jabber-active-groupchats*)) "Romeo")
+ "We thought we changed nickname, but we didn't")))
+
+(jabberd-connect)
+
+(with-timeout (5 (error "Timeout"))
+ (while (not ncf-done)
+ (sit-for 0.1)))
+(when ncf-error
+ (princ
+ (format
+ "nick-change-fail test FAILED: %s
+
+" ncf-error))
+ (princ "Conversation was:\n")
+ (with-current-buffer "*-jabber-xml-log-romeo@montague.net-*"
+ (princ (buffer-string)))
+ (let ((muc-buffer (get-buffer (jabber-muc-get-buffer ncf-room-name))))
+ (if muc-buffer
+ (with-current-buffer muc-buffer
+ (princ "Contents of groupchat buffer:\n")
+ (princ (buffer-string)))
+ (princ "Groupchat buffer not created.\n")))
+ (kill-emacs 1))