package com.blazemeter.jmeter.xmpp; import com.blazemeter.jmeter.xmpp.actions.*; import junit.framework.AssertionFailedError; import kg.apc.emulators.TestJMeterUtils; import org.apache.jmeter.samplers.SampleResult; import org.apache.jorphan.logging.LoggingManager; import org.apache.log.Logger; import org.jivesoftware.smack.SASLAuthentication; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smackx.iqprivate.packet.PrivateData; import org.junit.BeforeClass; import org.junit.Test; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.Map; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class JMeterXMPPSamplerTest { private static final Logger log = LoggingManager.getLoggerForClass(); @BeforeClass public static void setUpClass() throws Exception { } @Test public void testSample_noConfig() throws Exception { JMeterXMPPSampler obj = new JMeterXMPPSampler(); try { doAction(obj, Login.class); fail(); } catch (AssertionError ignored) { } } @Test public void testSample1() throws Exception { JMeterXMPPSampler obj = getjMeterXMPPSampler(); obj.setProperty(Login.LOGIN, "user1"); obj.setProperty(Login.PASSWORD, "1"); doAction(obj, Login.class); } @Test public void sendMessageFrom() throws Exception { JMeterXMPPSampler obj = getjMeterXMPPSampler(); obj.getXMPPConnection().setFromMode(XMPPConnection.FromMode.USER); obj.setProperty(SendMessage.RECIPIENT, "user2@undera-desktop"); obj.setProperty(SendMessage.BODY, "body"); SampleResult res = doAction(obj, SendMessage.class); assertTrue(res.getSamplerData().contains("from")); } public void testLoginLogout() throws Exception { TestJMeterUtils.createJmeterEnv(); JMeterXMPPSampler obj = new JMeterXMPPSampler(); JMeterXMPPConnection conn = new JMeterXMPPConnection(); fillActionClasses(conn.getActions()); conn.setConnectionType(JMeterXMPPConnectionBase.Type.BOSH.toString()); conn.setAddress("view.webcast.cisco.com"); conn.setPort("443"); conn.setBOSHSSL(true); conn.setServiceName("cisco.com"); conn.setPacketReplyTimeout("0"); conn.setBOSHURL("/httpbinding/"); conn.setAddress("192.168.5.4"); conn.setPort("7070"); conn.setBOSHSSL(false); conn.setServiceName("example.com"); conn.setPacketReplyTimeout("5000"); conn.setBOSHURL("/http-bind/"); conn.testStarted(); obj.addTestElement(conn); obj.setProperty(Login.LOGIN, "dkollava@cisco.com"); obj.setProperty(Login.PASSWORD, "cisco123"); obj.setProperty(Login.RESOURCE, "qanda-panelist"); for (int a = 0; a < 2; a++) { doAction(obj, Connect.class); SASLAuthentication.getRegisterSASLMechanisms(); doAction(obj, Login.class); //Thread.sleep(500); doAction(obj, Disconnect.class); //Thread.sleep(500); } } //@Test public void testSample() throws Exception { JMeterXMPPSampler obj = getjMeterXMPPSampler(); obj.setProperty(Login.LOGIN, "user1"); obj.setProperty(Login.PASSWORD, "1"); doAction(obj, Login.class); doAction(obj, SendPresence.class); doAction(obj, RosterAction.class); doAction(obj, GetBookmarks.class); obj.setProperty(SendPresence.RECIPIENT, "user1@localhost"); obj.setProperty(SendPresence.TYPE, Presence.Type.subscribe.toString()); doAction(obj, SendPresence.class); obj.setProperty(SendMessage.RECIPIENT, "user1@localhost"); obj.setProperty(SendMessage.BODY, "test"); doAction(obj, SendMessage.class); while (true) { try { if (doAction(obj, NoOp.class) == null) { break; } } catch (AssertionFailedError ignored) { } } obj.setProperty(SendMessage.RECIPIENT, "user1@localhost"); doAction(obj, SendMessage.class); obj.setProperty(SendMessage.RECIPIENT, "user1@localhost"); obj.setProperty(SendMessage.BODY, "need response"); obj.setProperty(SendMessage.WAIT_RESPONSE, true); doAction(obj, SendMessage.class); Thread.sleep(1000); doAction(obj, Disconnect.class); Thread.sleep(1000); JMeterXMPPSampler obj2 = getjMeterXMPPSampler(); obj2.setProperty(Login.LOGIN, "user2"); obj2.setProperty(Login.PASSWORD, "1"); doAction(obj2, Login.class); doAction(obj2, SendPresence.class); while (true) { try { if (doAction(obj2, NoOp.class) == null) { break; } } catch (AssertionFailedError ignored) { } } doAction(obj2, Disconnect.class); } //@Test public void testSample_FileTransfer() throws Exception { JMeterXMPPSampler obj = getjMeterXMPPSampler(); obj.setProperty(Login.LOGIN, "user1"); obj.setProperty(Login.PASSWORD, "1"); doAction(obj, Login.class); doAction(obj, SendPresence.class); obj.setProperty(SendFileXEP0096.FILE_PATH, "/bin/mv"); obj.setProperty(SendFileXEP0096.FILE_RECIPIENT, "user1@localhost/Smack"); doAction(obj, SendFileXEP0096.class); doAction(obj, Disconnect.class); } private JMeterXMPPSampler getjMeterXMPPSampler() { JMeterXMPPSampler obj = new JMeterXMPPSampler(); JMeterXMPPConnection conn = new JMeterXMPPConnectionMock(); fillActionClasses(conn.getActions()); conn.setAddress("192.168.5.3"); conn.setServiceName("localhost"); conn.setPacketReplyTimeout("1000"); conn.testStarted(); obj.addTestElement(conn); return obj; } private SampleResult doAction(JMeterXMPPSampler obj, Class action) { obj.setAction(action.getCanonicalName()); SampleResult res = obj.sample(null); if (res != null) { log.debug("Action " + action + " response: " + res.getResponseDataAsString()); assertTrue(res.isSuccessful()); } return res; } public static void fillActionClasses(Map<String, AbstractXMPPAction> list) { list.put(RosterAction.class.getCanonicalName(), new RosterAction()); list.put(Login.class.getCanonicalName(), new Login()); list.put(NoOp.class.getCanonicalName(), new NoOp()); list.put(SendFileXEP0096.class.getCanonicalName(), new SendFileXEP0096()); list.put(SendMessage.class.getCanonicalName(), new SendMessage()); list.put(SendPresence.class.getCanonicalName(), new SendPresence()); list.put(GetBookmarks.class.getCanonicalName(), new GetBookmarks()); list.put(Disconnect.class.getCanonicalName(), new Disconnect()); list.put(Connect.class.getCanonicalName(), new Connect()); } private class JMeterXMPPConnectionMock extends JMeterXMPPConnection { public XMPPConnectionMock conn = new XMPPConnectionMock(); @Override public XMPPConnection getConnection() throws NoSuchAlgorithmException, KeyManagementException, SmackException { return conn; } } private static class PrivateDataResult extends IQ { private PrivateData privateData; PrivateDataResult(PrivateData privateData) { this.privateData = privateData; } public PrivateData getPrivateData() { return privateData; } public String getChildElementXML() { StringBuilder buf = new StringBuilder(); buf.append("<query xmlns=\"jabber:iq:private\">"); if (privateData != null) { buf.append(privateData.toXML()); } buf.append("</query>"); return buf.toString(); } } }