Unit Testing Multistage Protocols

So far, the class of protocols we have considered was rather simple: one side sent out a request, the other side responded, and we were done. Although many of the XMPP protocols fall within this category, there are several others that consist of multiple iterations of these request-response cycles. These protocols start by doing a request, and then take subsequent steps based on the response of previous requests. Testing these types of protocols is the focus of this section.

Besides person-to-person conversations, XMPP also allows users to join chat “rooms” to communicate with multiple people at once. Whenever a user wants to join such a multiuser chat (MUC for short), an IM client needs to detect the MUC rooms that are available on a server and present this list to the server. Obtaining this list requires a chain of multiple service discovery (often called disco in the XMPP world) requests. For example, let’s assume Alice wants to get a list of all the available rooms on the wonderland.lit server. She starts by requesting all the available services of her server, which is done by sending a disco#items request to the server:

<iq type="get" id="muc-1" to="wonderland.lit">
  <query xmlns="http://jabber.org/protocol/disco#items"/>

The server then responds with the list of all its services:

<iq type="result" id="muc-1" from="wonderland.lit" to="alice@wonderland.lit/RabbitHole"> <query xmlns="http://jabber.org/protocol/disco#items"> <item jid="pubsub.wonderland.lit"/> ...

Get Beautiful Testing now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.