/* * JBoss, Home of Professional Open Source. * Copyright 2006, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.ws.management.recording; import java.net.InetAddress; import java.net.URL; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.management.Attribute; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import javax.xml.namespace.QName; import javax.xml.ws.Service; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.ws.api.monitoring.Record; import org.jboss.ws.api.monitoring.RecordFilter; import org.jboss.ws.common.monitoring.AndFilter; import org.jboss.ws.common.monitoring.HostFilter; import org.jboss.ws.common.monitoring.NotFilter; import org.jboss.ws.common.monitoring.OperationFilter; import org.jboss.wsf.test.JBossWSTest; import org.junit.Test; import org.junit.runner.RunWith; /** * This tests the MemoryBufferRecorder * * @author alessio.soldano@jboss.com * @since 7-Aug-2008 */ @RunWith(Arquillian.class) public class MemoryBufferRecorderTestCase extends JBossWSTest { private final String targetNS = "http://recording.management.ws.test.jboss.org/"; private final String endpointObjectName = "jboss.ws:context=management-recording,endpoint=EndpointWithConfigImpl"; @ArquillianResource private URL baseURL; @Deployment(testable = false) public static JavaArchive createDeployment() { JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "management-recording-as7.jar"); archive.setManifest(new StringAsset("Manifest-Version: 1.0\n" + "Dependencies: org.jboss.logging,org.jboss.ws.common\n")) //see https://docs.jboss.org/author/display/JBWS/Predefined+client+and+endpoint+configurations#Predefinedclientandendpointconfigurations-Handlersclassloading .addClass(org.jboss.test.ws.management.recording.Endpoint.class) .addClass(org.jboss.test.ws.management.recording.EndpointWithConfigImpl.class); return archive; } @Test @RunAsClient public void testRecording() throws Exception { Endpoint port = getPort(); MBeanServerConnection server = getServer(); ObjectName oname = new ObjectName(endpointObjectName + ",recordProcessor=MemoryBufferRecorder"); int startSize = (Integer)server.getAttribute(oname, "Size"); setRecording(true); port.echo1("Hello"); port.echo1("Hello again"); port.echo2("Hi"); setRecording(false); port.echo2("Hi again"); int endSize = (Integer)server.getAttribute(oname, "Size"); assertEquals(3, endSize - startSize); } @Test @RunAsClient @SuppressWarnings("unchecked") public void testGetRecordsByOperation() throws Exception { Endpoint port = getPort(); MBeanServerConnection server = getServer(); ObjectName oname = new ObjectName(endpointObjectName + ",recordProcessor=MemoryBufferRecorder"); setRecording(true); port.echo1("Test getRecordsByOperation"); port.echo2("Test getRecordsByOperation"); Map<String, List<Record>> echo1Records = (Map<String, List<Record>>)server.invoke(oname, "getRecordsByOperation", new Object[] { targetNS, "echo1" }, new String[] { "java.lang.String", "java.lang.String" }); Map<String, List<Record>> echo2Records = (Map<String, List<Record>>)server.invoke(oname, "getRecordsByOperation", new Object[] { targetNS, "echo2" }, new String[] { "java.lang.String", "java.lang.String" }); assertFalse(echo1Records.isEmpty()); assertFalse(echo2Records.isEmpty()); for (List<Record> list : echo1Records.values()) { for (Record record : list) { QName qName = record.getOperation(); assertEquals(targetNS, qName.getNamespaceURI()); assertEquals("echo1", qName.getLocalPart()); assertTrue(record.getEnvelope().contains("echo1")); } } for (List<Record> list : echo2Records.values()) { for (Record record : list) { QName qName = record.getOperation(); assertEquals(targetNS, qName.getNamespaceURI()); assertEquals("echo2", qName.getLocalPart()); assertTrue(record.getEnvelope().contains("echo2")); } } } @Test @RunAsClient @SuppressWarnings("unchecked") public void testGetRecordsByClientHost() throws Exception { Endpoint port = getPort(); MBeanServerConnection server = getServer(); ObjectName oname = new ObjectName(endpointObjectName + ",recordProcessor=MemoryBufferRecorder"); setRecording(true); port.echo1("Test getRecordsByClientHost"); // MemoryBufferRecorder stores source host host as InetAddress IP format, eg. [::1] will be stored as 0:0:0:0:0:0:0:1 String host = InetAddress.getByName(getServerHost()).getHostAddress(); Map<String, List<Record>> localhostRecords = (Map<String, List<Record>>)server.invoke(oname, "getRecordsByClientHost", new Object[] { host }, new String[] { "java.lang.String" }); Map<String, List<Record>> amazonRecords = (Map<String, List<Record>>)server.invoke(oname, "getRecordsByClientHost", new Object[] { "72.21.203.1" }, new String[] { "java.lang.String" }); assertTrue("No records for " + host, localhostRecords.size() > 0); assertTrue("There are records for 72.21.203.1", amazonRecords.size() == 0); } @Test @RunAsClient @SuppressWarnings("unchecked") public void testGetMatchingRecords() throws Exception { Endpoint port = getPort(); MBeanServerConnection server = getServer(); ObjectName oname = new ObjectName(endpointObjectName + ",recordProcessor=MemoryBufferRecorder"); setRecording(true); OperationFilter operationFilter = new OperationFilter(new QName(targetNS, "echo1")); LinkedList<String> l = new LinkedList<String>(); l.add(getServerHost().replace("127.0.0.1", "localhost")); HostFilter hostFilter = new HostFilter(l,false); //destination RecordFilter[] filters = new RecordFilter[] {operationFilter, hostFilter}; Map<String, List<Record>> startRecords = (Map<String, List<Record>>)server.invoke(oname, "getMatchingRecords", new Object[] { filters }, new String[] { filters.getClass().getName() }); port.echo1("Test getMatchingRecords"); port.echo2("Test getMatchingRecords"); Map<String, List<Record>> stopRecords = (Map<String, List<Record>>)server.invoke(oname, "getMatchingRecords", new Object[] { filters }, new String[] { filters.getClass().getName() }); Map<String, List<Record>> allRecords = (Map<String, List<Record>>) server.invoke(oname, "getMatchingRecords", new Object[] { new RecordFilter[]{ operationFilter } }, new String[] { filters.getClass().getName() }); assertTrue("No records for hosts " + l + ", all records found: " + dumpInboundRecordsInfo(allRecords), stopRecords.size() > 0); assertEquals("There must be only 1 record for echo1 operation", 1, stopRecords.keySet().size() - startRecords.keySet().size()); } @Test @RunAsClient public void testAddRemoveFilter() throws Exception { Endpoint port = getPort(); MBeanServerConnection server = getServer(); ObjectName oname = new ObjectName(endpointObjectName + ",recordProcessor=MemoryBufferRecorder"); setRecording(true); OperationFilter operationFilter = new OperationFilter(new QName(targetNS, "echo1")); //Adding Operation filter... server.invoke(oname, "addFilter", new Object[] { operationFilter }, new String[] { RecordFilter.class.getName() }); int size = (Integer)server.getAttribute(oname, "Size"); port.echo1("Test testAddRemoveFilter"); port.echo2("Test testAddRemoveFilter"); assertEquals(1, (Integer)server.getAttribute(oname, "Size") - size); //Clean filters... server.setAttribute(oname, new Attribute("Filters", new LinkedList<RecordFilter>())); size = (Integer)server.getAttribute(oname, "Size"); port.echo1("Test testAddRemoveFilter"); port.echo2("Test testAddRemoveFilter"); assertEquals(2, (Integer)server.getAttribute(oname, "Size") - size); NotFilter notFilter = new NotFilter(operationFilter); AndFilter andFilter = new AndFilter(operationFilter, notFilter); //Adding And filter... server.invoke(oname, "addFilter", new Object[] { andFilter }, new String[] { RecordFilter.class.getName() }); size = (Integer)server.getAttribute(oname, "Size"); port.echo1("Test testAddRemoveFilter"); port.echo2("Test testAddRemoveFilter"); assertEquals(0, (Integer)server.getAttribute(oname, "Size") - size); //Clean filters... server.setAttribute(oname, new Attribute("Filters", new LinkedList<RecordFilter>())); size = (Integer)server.getAttribute(oname, "Size"); port.echo1("Test testAddRemoveFilter"); port.echo2("Test testAddRemoveFilter"); assertEquals(2, (Integer)server.getAttribute(oname, "Size") - size); } private void setRecording(boolean recording) throws Exception { MBeanServerConnection server = getServer(); ObjectName oname = new ObjectName(endpointObjectName + ",recordProcessor=MemoryBufferRecorder"); Attribute attribute = new Attribute("Recording", recording); server.setAttribute(oname, attribute); assertEquals(recording, server.getAttribute(oname, "Recording")); } private Endpoint getPort() throws Exception { URL wsdlURL = new URL(baseURL + "/management-recording/EndpointImpl?wsdl"); QName serviceName = new QName(targetNS, "EndpointService"); Service service = Service.create(wsdlURL, serviceName); return service.getPort(Endpoint.class); } private String dumpInboundRecordsInfo(Map<String, List<Record>> records) { StringBuilder sb = new StringBuilder(); for (String key : records.keySet()) { sb.append(records.get(key)).append("\n"); for (Record record : records.get(key)) { if(record.getMessageType() == Record.MessageType.INBOUND) { sb.append(" ").append(record.getGroupID()).append("\n"); sb.append(" Source host: ").append(record.getSourceHost()).append("\n"); sb.append(" Destination host: ").append(record.getDestinationHost()).append("\n"); } } } return sb.toString(); } }