/** * * Copyright 2017 Paul Schaub * * Licensed 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.jivesoftware.smackx.jingle; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertNotNull; import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; import java.io.IOException; import org.jivesoftware.smack.DummyConnection; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.StreamOpen; import org.jivesoftware.smack.test.util.SmackTestSuite; import org.jivesoftware.smack.test.util.TestUtils; import org.jivesoftware.smackx.jingle.element.JingleAction; import org.jivesoftware.smackx.jingle.element.JingleContentElement; import org.jivesoftware.smackx.jingle.element.JingleElement; import org.jivesoftware.smackx.jingle.element.JingleReasonElement; import org.jivesoftware.smackx.jingle.provider.JingleProvider; import org.jivesoftware.smackx.jingle.transport.jingle_ibb.JingleIBBTransport; import org.jivesoftware.smackx.jingle.transport.jingle_ibb.element.JingleIBBTransportElement; import org.junit.Before; import org.junit.Test; import org.jxmpp.jid.FullJid; import org.jxmpp.jid.impl.JidCreate; import org.jxmpp.stringprep.XmppStringprepException; import org.xml.sax.SAXException; /** * Test the JingleUtil class. */ public class JingleElementTest extends SmackTestSuite { private FullJid romeo; private FullJid juliet; @Before public void setup() throws XmppStringprepException { XMPPConnection connection = new DummyConnection( DummyConnection.getDummyConfigurationBuilder() .setUsernameAndPassword("romeo@montague.lit", "iluvJulibabe13").build()); JingleManager jm = JingleManager.getInstanceFor(connection); romeo = connection.getUser().asFullJidOrThrow(); juliet = JidCreate.fullFrom("juliet@capulet.lit/balcony"); } @Test public void createSessionTerminateDeclineTest() throws Exception { JingleElement terminate = JingleElement.createSessionTerminate(juliet, "thisismadness", JingleReasonElement.Reason.decline); String jingleXML = "" + "" + "" + "" + ""; String xml = getIQXML(romeo, juliet, terminate.getStanzaId(), jingleXML); assertXMLEqual(xml, terminate.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); JingleElement jingle = new JingleProvider().parse(TestUtils.getParser(jingleXML)); assertNotNull(jingle); assertEquals(jingle.getAction(), JingleAction.session_terminate); assertEquals(jingle.getReason().asEnum(), JingleReasonElement.Reason.decline); } @Test public void createSessionTerminateSuccessTest() throws Exception { JingleElement success = JingleElement.createSessionTerminate(juliet, "thisissparta", JingleReasonElement.Reason.success); String jingleXML = "" + "" + "" + "" + ""; String xml = getIQXML(romeo, juliet, success.getStanzaId(), jingleXML); assertXMLEqual(xml, success.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); JingleElement jingle = new JingleProvider().parse(TestUtils.getParser(jingleXML)); assertNotNull(jingle); assertEquals(jingle.getAction(), JingleAction.session_terminate); assertEquals(jingle.getReason().asEnum(), JingleReasonElement.Reason.success); } @Test public void createSessionTerminateBusyTest() throws Exception { JingleElement busy = JingleElement.createSessionTerminate(juliet, "thisispatrick", JingleReasonElement.Reason.busy); String jingleXML = "" + "" + "" + "" + ""; String xml = getIQXML(romeo, juliet, busy.getStanzaId(), jingleXML); assertXMLEqual(xml, busy.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); JingleElement jingle = new JingleProvider().parse(TestUtils.getParser(jingleXML)); assertNotNull(jingle); assertEquals(jingle.getAction(), JingleAction.session_terminate); assertEquals(jingle.getReason().asEnum(), JingleReasonElement.Reason.busy); } @Test public void createSessionTerminateAlternativeSessionTest() throws Exception { JingleElement busy = JingleElement.createSessionTerminate(juliet, "thisistherhythm", JingleReasonElement.AlternativeSession("ofthenight")); String jingleXML = "" + "" + "" + "ofthenight" + "" + "" + ""; String xml = getIQXML(romeo, juliet, busy.getStanzaId(), jingleXML); assertXMLEqual(xml, busy.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); JingleElement jingle = new JingleProvider().parse(TestUtils.getParser(jingleXML)); assertNotNull(jingle); assertEquals(jingle.getAction(), JingleAction.session_terminate); assertEquals(jingle.getReason().asEnum(), JingleReasonElement.Reason.alternative_session); JingleReasonElement.AlternativeSession alt = (JingleReasonElement.AlternativeSession) jingle.getReason(); assertEquals("ofthenight", alt.getAlternativeSessionId()); } @Test public void createSessionTerminateCancelTest() throws Exception { JingleElement cancel = JingleElement.createSessionTerminate(juliet, "thisistheend", JingleReasonElement.Reason.cancel); String jingleXML = "" + "" + "" + "" + ""; String xml = getIQXML(romeo, juliet, cancel.getStanzaId(), jingleXML); assertXMLEqual(xml, cancel.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); JingleElement jingle = new JingleProvider().parse(TestUtils.getParser(jingleXML)); assertNotNull(jingle); assertEquals(jingle.getAction(), JingleAction.session_terminate); assertEquals(jingle.getReason().asEnum(), JingleReasonElement.Reason.cancel); } @Test public void createSessionTerminateUnsupportedTransportsTest() throws Exception { JingleElement unsupportedTransports = JingleElement.createSessionTerminate(juliet, "thisisus", JingleReasonElement.Reason.unsupported_transports); String jingleXML = "" + "" + "" + "" + ""; String xml = getIQXML(romeo, juliet, unsupportedTransports.getStanzaId(), jingleXML); assertXMLEqual(xml, unsupportedTransports.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); JingleElement jingle = new JingleProvider().parse(TestUtils.getParser(jingleXML)); assertNotNull(jingle); assertEquals(jingle.getAction(), JingleAction.session_terminate); assertEquals(jingle.getReason().asEnum(), JingleReasonElement.Reason.unsupported_transports); } @Test public void createSessionTerminateUnsupportedApplicationsTest() throws Exception { JingleElement unsupportedApplications = JingleElement.createSessionTerminate(juliet, "thisiswar", JingleReasonElement.Reason.unsupported_applications); String jingleXML = "" + "" + "" + "" + ""; String xml = getIQXML(romeo, juliet, unsupportedApplications.getStanzaId(), jingleXML); assertXMLEqual(xml, unsupportedApplications.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); JingleElement jingle = new JingleProvider().parse(TestUtils.getParser(jingleXML)); assertNotNull(jingle); assertEquals(jingle.getAction(), JingleAction.session_terminate); assertEquals(jingle.getReason().asEnum(), JingleReasonElement.Reason.unsupported_applications); } @Test public void createSessionTerminateFailedTransportTest() throws IOException, SAXException { JingleElement failedTransport = JingleElement.createSessionTerminate(juliet, "derailed", JingleReasonElement.Reason.failed_transport); String jingleXML = "" + "" + "" + "" + ""; String xml = getIQXML(romeo, juliet, failedTransport.getStanzaId(), jingleXML); assertXMLEqual(xml, failedTransport.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); assertEquals(JingleAction.session_terminate, failedTransport.getAction()); assertEquals(JingleReasonElement.Reason.failed_transport, failedTransport.getReason().asEnum()); } @Test public void createSessionTerminateFailedApplicationTest() throws IOException, SAXException { JingleElement failedApplication = JingleElement.createSessionTerminate(juliet, "crashed", JingleReasonElement.Reason.failed_application); String jingleXML = "" + "" + "" + "" + ""; String xml = getIQXML(romeo, juliet, failedApplication.getStanzaId(), jingleXML); assertXMLEqual(xml, failedApplication.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); assertEquals(JingleAction.session_terminate, failedApplication.getAction()); assertEquals(JingleReasonElement.Reason.failed_application, failedApplication.getReason().asEnum()); } @Test public void createSessionPingTest() throws Exception { JingleElement ping = JingleElement.createSessionPing(juliet, "thisisit"); String jingleXML = ""; String xml = getIQXML(romeo, juliet, ping.getStanzaId(), jingleXML); assertXMLEqual(xml, ping.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); JingleElement jingle = new JingleProvider().parse(TestUtils.getParser(jingleXML)); assertNotNull(jingle); assertEquals(JingleAction.session_info, jingle.getAction()); } @Test public void createSessionTerminateContentCancelTest() throws Exception { JingleElement cancel = JingleElement.createSessionTerminateContentCancel(juliet, "thisismumbo#5", JingleContentElement.Creator.initiator, "content123"); String jingleXML = "" + "" + "" + "" + "" + ""; String xml = getIQXML(romeo, juliet, cancel.getStanzaId(), jingleXML); assertXMLEqual(xml, cancel.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); JingleElement jingle = new JingleProvider().parse(TestUtils.getParser(jingleXML)); assertNotNull(jingle); assertEquals(JingleAction.session_terminate, jingle.getAction()); assertEquals(JingleReasonElement.Reason.cancel, jingle.getReason().asEnum()); assertEquals("thisismumbo#5", jingle.getSid()); JingleContentElement content = jingle.getContents().get(0); assertNotNull(content); assertEquals("content123", content.getName()); assertEquals(JingleContentElement.Creator.initiator, content.getCreator()); } @Test public void createSessionTerminateIncompatibleParameters() throws IOException, SAXException { JingleElement terminate = JingleElement.createSessionTerminate(juliet, "incompatibleSID", JingleReasonElement.Reason.incompatible_parameters); String jingleXML = "" + "" + "" + "" + ""; String xml = getIQXML(romeo, juliet, terminate.getStanzaId(), jingleXML); assertXMLEqual(xml, terminate.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); assertEquals(JingleReasonElement.Reason.incompatible_parameters, terminate.getReason().asEnum()); assertEquals("incompatibleSID", terminate.getSid()); } @Test public void createTransportAcceptTest() throws IOException, SAXException { JingleElement transportAccept = JingleElement.createTransportAccept(juliet, romeo, "transAcc", JingleContentElement.Creator.initiator, "cname", new JingleIBBTransportElement("transid", JingleIBBTransport.DEFAULT_BLOCK_SIZE)); String jingleXML = "" + "" + "" + "" + ""; String xml = getIQXML(juliet, romeo, transportAccept.getStanzaId(), jingleXML); assertXMLEqual(xml, transportAccept.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); assertEquals(JingleAction.transport_accept, transportAccept.getAction()); assertEquals("transAcc", transportAccept.getSid()); } @Test public void createTransportRejectTest() { // TODO: Find example } @Test public void createTransportReplaceTest() throws IOException, SAXException { JingleElement transportReplace = JingleElement.createTransportReplace(juliet, romeo, "transAcc", JingleContentElement.Creator.initiator, "cname", new JingleIBBTransportElement("transid", JingleIBBTransport.DEFAULT_BLOCK_SIZE)); String jingleXML = "" + "" + "" + "" + ""; String xml = getIQXML(juliet, romeo, transportReplace.getStanzaId(), jingleXML); assertXMLEqual(xml, transportReplace.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); assertEquals(JingleAction.transport_replace, transportReplace.getAction()); assertEquals("transAcc", transportReplace.getSid()); } @Test public void createErrorMalformedRequestTest() throws Exception { JingleElement j = defaultJingle(romeo, "error123"); IQ error = JingleElement.createJingleErrorMalformedRequest(j); String xml = "" + "" + "" + "" + ""; assertXMLEqual(xml, error.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); } @Test public void createErrorTieBreakTest() throws IOException, SAXException { JingleElement j = defaultJingle(romeo, "thisistie"); IQ error = JingleElement.createJingleErrorTieBreak(j); String xml = "" + "" + "" + "" + "" + ""; assertXMLEqual(xml, error.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); } @Test public void createErrorUnknownSessionTest() throws IOException, SAXException { JingleElement j = defaultJingle(romeo, "youknownothingjohnsnow"); IQ error = JingleElement.createJingleErrorUnknownSession(j); String xml = "" + "" + "" + "" + "" + ""; assertXMLEqual(xml, error.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); } @Test public void createErrorUnknownInitiatorTest() throws IOException, SAXException { JingleElement j = defaultJingle(romeo, "iamyourfather"); IQ error = JingleElement.createJingleErrorUnknownInitiator(j); String xml = "" + "" + "" + "" + ""; assertXMLEqual(xml, error.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); } @Test public void createErrorOutOfOrderTest() throws Exception { JingleElement j = defaultJingle(romeo, "yourfatheriam"); IQ error = JingleElement.createJingleErrorOutOfOrder(j); String xml = "" + "" + // TODO: Why? "" + "" + "" + ""; assertXMLEqual(xml, error.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); } @Test public void createErrorUnsupportedInfoTest() throws IOException, SAXException { JingleElement j = defaultJingle(romeo, "thisstatementiswrong"); IQ error = JingleElement.createJingleErrorUnsupportedInfo(j); String xml = "" + "" + "" + "" + "" + ""; assertXMLEqual(xml, error.toXML(StreamOpen.CLIENT_NAMESPACE).toString()); } public static String getIQXML(FullJid from, FullJid to, String stanzaId, String jingleXML) { return "" + jingleXML + ""; } private JingleElement defaultJingle(FullJid recipient, String sessionId) { return JingleElement.createSessionPing(recipient, sessionId); } }