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"/> </iq>
The server then responds with the list of all its services:
<iq type="result" id="muc-1" from="wonderland.lit" to="email@example.com/RabbitHole"> <query xmlns="http://jabber.org/protocol/disco#items"> <item jid="pubsub.wonderland.lit"/> ...