blob: 40e15b1a73f5bcf4aab8bffde9a87e6fbf9c7985 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.vysper.xmpp.modules.extension.xep0045_muc.handler;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.apache.vysper.xml.fragment.Renderer;
import org.apache.vysper.xml.fragment.XMLElement;
import org.apache.vysper.xml.fragment.XMLSemanticError;
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.addressing.EntityImpl;
import org.apache.vysper.xmpp.delivery.StanzaReceiverQueue;
import org.apache.vysper.xmpp.delivery.StanzaReceiverRelay;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.MUCFeatures;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.RecordingStanzaBroker;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.TestSessionContext;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.model.Conference;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.MucUserItem;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.Status.StatusCode;
import org.apache.vysper.xmpp.modules.extension.xep0045_muc.stanzas.X;
import org.apache.vysper.xmpp.protocol.NamespaceURIs;
import org.apache.vysper.xmpp.protocol.ProtocolException;
import org.apache.vysper.xmpp.protocol.SimpleStanzaBroker;
import org.apache.vysper.xmpp.protocol.StanzaHandler;
import org.apache.vysper.xmpp.stanza.IQStanza;
import org.apache.vysper.xmpp.stanza.IQStanzaType;
import org.apache.vysper.xmpp.stanza.MessageStanza;
import org.apache.vysper.xmpp.stanza.PresenceStanza;
import org.apache.vysper.xmpp.stanza.PresenceStanzaType;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
import org.apache.vysper.xmpp.stanza.StanzaErrorCondition;
import org.apache.vysper.xmpp.stanza.StanzaErrorType;
import junit.framework.TestCase;
/**
*/
public abstract class AbstractMUCHandlerTestCase extends TestCase {
protected TestSessionContext sessionContext;
protected static final String SERVERDOMAIN = "test";
protected static final String SUBDOMAIN = "chat";
protected static final String FULLDOMAIN = SUBDOMAIN + "." + SERVERDOMAIN;
protected static final Entity MODULE_JID = EntityImpl.parseUnchecked(FULLDOMAIN);
protected static final Entity ROOM1_JID = EntityImpl.parseUnchecked("room1@" + FULLDOMAIN);
protected static final Entity ROOM2_JID = EntityImpl.parseUnchecked("room2@" + FULLDOMAIN);
protected static final Entity ROOM1_JID_WITH_NICK = EntityImpl.parseUnchecked("room1@" + FULLDOMAIN + "/nick");
protected static final Entity ROOM2_JID_WITH_NICK = EntityImpl.parseUnchecked("room2@" + FULLDOMAIN + "/nick");
protected static final Entity OCCUPANT1_JID = EntityImpl.parseUnchecked("user1@" + SERVERDOMAIN);
protected static final Entity OCCUPANT2_JID = EntityImpl.parseUnchecked("user2@" + SERVERDOMAIN);
protected static final Entity OCCUPANT3_JID = EntityImpl.parseUnchecked("user3@" + SERVERDOMAIN);
protected StanzaHandler handler;
protected Conference conference;
protected StanzaReceiverQueue occupant1Queue = new StanzaReceiverQueue();
protected StanzaReceiverQueue occupant2Queue = new StanzaReceiverQueue();
@Override
protected void setUp() throws Exception {
conference = new Conference("foo", new MUCFeatures());
sessionContext = TestSessionContext.createWithStanzaReceiverRelayAuthenticated();
sessionContext.setInitiatingEntity(OCCUPANT1_JID);
StanzaReceiverRelay stanzaRelay = (StanzaReceiverRelay) sessionContext.getStanzaRelay();
stanzaRelay.add(OCCUPANT1_JID, occupant1Queue);
stanzaRelay.add(OCCUPANT2_JID, occupant2Queue);
conference.createRoom(ROOM1_JID, "Room 1");
handler = createHandler();
}
protected abstract StanzaHandler createHandler();
protected void assertErrorStanza(Stanza response, String stanzaName, Entity from, Entity to, StanzaErrorType type,
StanzaErrorCondition expectedError, XMLElement... expectedInnerElements) {
assertNotNull(response);
assertEquals(stanzaName, response.getName());
assertEquals(to, response.getTo());
assertEquals(from, response.getFrom());
assertEquals("error", response.getAttributeValue("type"));
List<XMLElement> innerElements = response.getInnerElements();
int index = 0;
if (expectedInnerElements != null) {
for (XMLElement expectedInnerElement : expectedInnerElements) {
assertEquals(
new Renderer(expectedInnerElement).getComplete() + "\n"
+ new Renderer(innerElements.get(index)).getComplete(),
expectedInnerElement, innerElements.get(index));
index++;
}
}
// error element must always be present
XMLElement errorElement = innerElements.get(index);
assertEquals("error", errorElement.getName());
assertEquals(type.value(), errorElement.getAttributeValue("type"));
XMLElement errorTypeElement = errorElement.getFirstInnerElement();
assertEquals(expectedError.value(), errorTypeElement.getName());
assertEquals(NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS, errorTypeElement.getNamespaceURI());
}
protected void assertMessageStanza(Entity from, Entity to, String type, String body, Stanza stanza)
throws XMLSemanticError {
assertMessageStanza(from, to, type, body, null, null, stanza);
}
protected void assertMessageStanza(Entity from, Entity to, String type, String expectedBody, String expectedSubject,
X expectedX, Stanza stanza) throws XMLSemanticError {
assertNotNull(stanza);
MessageStanza msgStanza = (MessageStanza) MessageStanza.getWrapper(stanza);
assertEquals(from, stanza.getFrom());
assertEquals(to, stanza.getTo());
if (type != null) {
assertEquals(type, msgStanza.getType());
}
assertEquals(expectedBody, msgStanza.getBody(null));
assertEquals(expectedSubject, msgStanza.getSubject(null));
if (expectedX != null) {
X actualX = X.fromStanza(stanza);
assertEquals(expectedX, actualX);
}
}
protected void assertMessageStanza(Entity from, Entity to, String type, XMLElement expectedInner, Stanza actual)
throws XMLSemanticError {
assertMessageStanza(from, to, type, Arrays.asList(expectedInner), actual);
}
protected void assertMessageStanza(Entity from, Entity to, String type, List<XMLElement> expectedInner,
Stanza actual) throws XMLSemanticError {
assertNotNull(actual);
MessageStanza msgStanza = (MessageStanza) MessageStanza.getWrapper(actual);
assertEquals(from, actual.getFrom());
assertEquals(to, actual.getTo());
if (type != null) {
assertEquals(type, msgStanza.getType());
}
assertEquals("Length of inner elements", expectedInner.size(), actual.getInnerElements().size());
for (int i = 0; i < expectedInner.size(); i++) {
assertEquals(
new Renderer(expectedInner.get(i)).getComplete() + " \n "
+ new Renderer(actual.getInnerElements().get(i)).getComplete(),
expectedInner.get(i), actual.getInnerElements().get(i));
}
}
protected void assertIqResultStanza(Entity from, Entity to, String id, Stanza stanza) throws XMLSemanticError {
assertNotNull(stanza);
IQStanza iqStanza = (IQStanza) IQStanza.getWrapper(stanza);
assertEquals(from, iqStanza.getFrom());
assertEquals(to, iqStanza.getTo());
assertEquals(id, iqStanza.getID());
assertEquals("result", iqStanza.getType());
}
protected void assertPresenceStanza(Entity expectedFrom, Entity expectedTo, PresenceStanzaType expectedType,
MucUserItem expectedItem, StatusCode expectedStatus, Stanza actualStanza) throws Exception {
List<MucUserItem> expectedItems = Arrays.asList(expectedItem);
List<StatusCode> expectedStatuses = expectedStatus == null ? null : Arrays.asList(expectedStatus);
assertPresenceStanza(expectedFrom, expectedTo, expectedType, expectedItems, expectedStatuses, actualStanza);
}
protected void assertPresenceStanza(Entity expectedFrom, Entity expectedTo, PresenceStanzaType expectedType,
List<MucUserItem> expectedMucItems, List<StatusCode> expectedMucStatuses, Stanza actualStanza)
throws Exception {
assertPresenceStanza(expectedFrom, expectedTo, expectedType, null, null, expectedMucItems, expectedMucStatuses,
actualStanza);
}
protected void assertPresenceStanza(Entity expectedFrom, Entity expectedTo, PresenceStanzaType expectedType,
String expectedShow, String expectedStatus, List<MucUserItem> expectedMucItems,
List<StatusCode> expectedMucStatuses, Stanza actualStanza) throws Exception {
PresenceStanza actualPresenceStanza = (PresenceStanza) PresenceStanza.getWrapper(actualStanza);
assertNotNull(actualStanza);
assertEquals(expectedFrom, actualStanza.getFrom());
assertEquals(expectedTo, actualStanza.getTo());
if (expectedType != null) {
assertEquals(expectedType.value(), actualStanza.getAttributeValue("type"));
} else {
assertEquals(null, actualStanza.getAttributeValue("type"));
}
assertEquals(expectedShow, actualPresenceStanza.getShow());
assertEquals(expectedStatus, actualPresenceStanza.getStatus(null));
XMLElement xElm = actualStanza.getSingleInnerElementsNamed("x", NamespaceURIs.XEP0045_MUC_USER);
assertNotNull(xElm);
Iterator<XMLElement> innerElements = xElm.getInnerElements().iterator();
for (MucUserItem expectedItem : expectedMucItems) {
XMLElement itemElm = innerElements.next();
assertEquals("item", itemElm.getName());
if (expectedItem.getJid() != null) {
assertEquals(expectedItem.getJid().getFullQualifiedName(), itemElm.getAttributeValue("jid"));
} else {
assertNull(itemElm.getAttributeValue("jid"));
}
assertEquals(expectedItem.getNick(), itemElm.getAttributeValue("nick"));
assertEquals(expectedItem.getAffiliation().toString(), itemElm.getAttributeValue("affiliation"));
assertEquals(expectedItem.getRole().toString(), itemElm.getAttributeValue("role"));
}
if (expectedMucStatuses != null) {
for (StatusCode status : expectedMucStatuses) {
XMLElement statusElm = innerElements.next();
assertEquals("status", statusElm.getName());
assertEquals(status.code(), Integer.parseInt(statusElm.getAttributeValue("code")));
}
}
}
protected Stanza sendIq(Entity from, Entity to, IQStanzaType type, String id, String namespaceUri,
XMLElement... items) throws ProtocolException {
StanzaBuilder stanzaBuilder = StanzaBuilder.createIQStanza(from, to, type, id);
stanzaBuilder.startInnerElement("query", namespaceUri);
for (XMLElement item : items) {
stanzaBuilder.addPreparedElement(item);
}
stanzaBuilder.endInnerElement();
Stanza iqStanza = stanzaBuilder.build();
RecordingStanzaBroker stanzaBroker = new RecordingStanzaBroker(new SimpleStanzaBroker(sessionContext.getStanzaRelay(), sessionContext));
handler.execute(iqStanza, sessionContext.getServerRuntimeContext(), true, sessionContext, null, stanzaBroker);
return stanzaBroker.getUniqueStanzaWrittenToSession();
}
}