package com.blazemeter.jmeter.xmpp.actions; import com.blazemeter.jmeter.xmpp.JMeterXMPPSampler; import org.apache.jmeter.samplers.SampleResult; import org.apache.jorphan.logging.LoggingManager; import org.apache.log.Logger; import org.jivesoftware.smack.PacketListener; import org.jivesoftware.smack.SmackException; import org.jivesoftware.smack.filter.OrFilter; import org.jivesoftware.smack.filter.PacketFilter; import org.jivesoftware.smack.filter.PacketTypeFilter; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.packet.Presence; import javax.swing.*; import java.awt.*; import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; public class NoOp extends AbstractXMPPAction implements PacketListener { private static final Logger log = LoggingManager.getLoggerForClass(); private Queue<Packet> incomingPackets = new LinkedBlockingQueue<>(); @Override public String getLabel() { return "Collect Incoming Packets"; } @Override public void addUI(JComponent panel, GridBagConstraints labelConstraints, GridBagConstraints editConstraints) { panel.add(new JLabel("Generates no sample if there was no incoming packets.")); } @Override public SampleResult perform(JMeterXMPPSampler sampler, SampleResult res) throws Exception { long counter = 0; for (Packet packet : incomingPackets) { incomingPackets.remove(packet); SampleResult subRes = new SampleResult(); subRes.setSuccessful(true); subRes.setResponseCode("200"); subRes.setResponseMessage("OK"); subRes.setSampleLabel(packet.getClass().getSimpleName().isEmpty() ? packet.getClass().getName() : packet.getClass().getSimpleName()); subRes.setResponseData(packet.toXML().toString().getBytes()); if ((packet instanceof Presence) && (((Presence) packet).getType() == Presence.Type.error)) { subRes.setSuccessful(false); subRes.setResponseCode("500"); subRes.setResponseMessage(packet.getError().toString()); } else if ((packet instanceof Message) && (((Message) packet).getType() == Message.Type.error)) { subRes.setSuccessful(false); subRes.setResponseCode("500"); subRes.setResponseMessage(packet.getError().toString()); } else if ((packet instanceof IQ) && (((IQ) packet).getType() == IQ.Type.ERROR)) { subRes.setSuccessful(false); subRes.setResponseCode("500"); subRes.setResponseMessage(packet.getError().toString()); } res.addSubResult(subRes); counter++; } res.setResponseData(("Received packets: " + counter).getBytes()); return counter > 0 ? res : null; } @Override public void clearGui() { } @Override public void setSamplerProperties(JMeterXMPPSampler sampler) { } @Override public void setGuiFieldsFromSampler(JMeterXMPPSampler sampler) { } @Override public void processPacket(Packet packet) throws SmackException.NotConnectedException { log.debug("Adding pending packet: " + packet.toXML()); //log.debug("Extensions: " + Arrays.toString(packet.getExtensions().toArray())); incomingPackets.add(packet); } @Override public PacketFilter getPacketFilter() { return new OrFilter(PacketTypeFilter.MESSAGE, PacketTypeFilter.PRESENCE, new PacketTypeFilter(IQ.class)); } }