From 6e03e7ef4e4f3ce21a5544d33b825533602f3171 Mon Sep 17 00:00:00 2001 From: Andrea Gazzarini Date: Thu, 26 Feb 2009 13:52:33 +0000 Subject: QPID-1579 : Instead of having one huge WSDM test case now WS-DM Adapter test is a suite that contains different test cases ( one for each interface) git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@748154 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/qpid/management/TestConstants.java | 2 +- .../configuration/ConfigurationTest.java | 39 +- .../management/wsdm/BaseWsDmAdapterTestCase.java | 185 ++++ .../GetMultipleResourcePropertiesTestCase.java | 126 +++ .../wsdm/GetResourcePropertyDocumentTestCase.java | 134 +++ .../wsdm/MetadataExchangeInterfaceTestCase.java | 143 +++ .../wsdm/OperationInvocationInterfaceTestCase.java | 597 +++++++++++++ .../wsdm/SetResourcePropertiesTestCase.java | 221 +++++ .../qpid/management/wsdm/WsDmAdapterTest.java | 974 +-------------------- 9 files changed, 1431 insertions(+), 990 deletions(-) create mode 100644 qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/BaseWsDmAdapterTestCase.java create mode 100644 qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/GetMultipleResourcePropertiesTestCase.java create mode 100644 qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/GetResourcePropertyDocumentTestCase.java create mode 100644 qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/MetadataExchangeInterfaceTestCase.java create mode 100644 qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/OperationInvocationInterfaceTestCase.java create mode 100644 qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/SetResourcePropertiesTestCase.java (limited to 'qpid/java/management/client/src/test') diff --git a/qpid/java/management/client/src/test/java/org/apache/qpid/management/TestConstants.java b/qpid/java/management/client/src/test/java/org/apache/qpid/management/TestConstants.java index 12ba1fab73..9abcd08eef 100644 --- a/qpid/java/management/client/src/test/java/org/apache/qpid/management/TestConstants.java +++ b/qpid/java/management/client/src/test/java/org/apache/qpid/management/TestConstants.java @@ -63,5 +63,5 @@ public interface TestConstants int SAMPLE_ACCESS_CODE = 1; String YEARS = "years"; int SAMPLE_MIN_VALUE = 1; - int SAMPLE_MAX_VALUE = 120; + int SAMPLE_MAX_VALUE = 120; } \ No newline at end of file diff --git a/qpid/java/management/client/src/test/java/org/apache/qpid/management/configuration/ConfigurationTest.java b/qpid/java/management/client/src/test/java/org/apache/qpid/management/configuration/ConfigurationTest.java index 8e9c3ccd6b..72bd45f70f 100644 --- a/qpid/java/management/client/src/test/java/org/apache/qpid/management/configuration/ConfigurationTest.java +++ b/qpid/java/management/client/src/test/java/org/apache/qpid/management/configuration/ConfigurationTest.java @@ -23,16 +23,13 @@ package org.apache.qpid.management.configuration; import java.util.Map; import java.util.UUID; +import junit.framework.TestCase; + import org.apache.qpid.management.TestConstants; import org.apache.qpid.management.domain.handler.base.IMessageHandler; import org.apache.qpid.management.domain.handler.impl.ConfigurationMessageHandler; import org.apache.qpid.management.domain.handler.impl.InstrumentationMessageHandler; import org.apache.qpid.management.domain.handler.impl.SchemaResponseMessageHandler; -import org.apache.qpid.management.domain.model.AccessMode; -import org.apache.qpid.management.domain.model.type.Type; -import org.apache.qpid.management.domain.model.type.Uint8; - -import junit.framework.TestCase; /** * Test case for Configuration singleton. @@ -46,22 +43,7 @@ public class ConfigurationTest extends TestCase { assertSame(Configuration.getInstance(),Configuration.getInstance()); } - - /** - * Tests the execution of getType() method when a valid code is supplied. - * - *
precondition : the requested type already exist on the configuration. - *
postcondition : the requested type is returned and no exception is thrown. - */ - public void testGetTypeOk() throws UnknownTypeCodeException - { - TypeMapping mapping = new TypeMapping(TestConstants.VALID_CODE,new Uint8()); - Configuration.getInstance().addTypeMapping(mapping); - Type type = Configuration.getInstance().getType(TestConstants.VALID_CODE); - assertTrue(type instanceof Uint8); - } - /** * Tests the execution of getType() method when a unknown code is supplied. * @@ -79,22 +61,7 @@ public class ConfigurationTest extends TestCase assertEquals(TestConstants.VALID_CODE*10001,expected.getCode()); } } - - /** - * Tests the execution of getAccessMode() method when a valid code is supplied. - * - *
precondition : the requested access mode already exist on the configuration. - *
postcondition : the requested access mode is returned and no exception is thrown. - */ - public void testGetAccessModeOk() throws UnknownAccessCodeException - { - AccessModeMapping mapping = new AccessModeMapping(TestConstants.VALID_CODE,AccessMode.RW); - Configuration.getInstance().addAccessModeMapping(mapping); - AccessMode accessMode = Configuration.getInstance().getAccessMode(TestConstants.VALID_CODE); - - assertSame(AccessMode.RW,accessMode); - } - + /** * Tests the execution of getAccessMode() method when a unknown code is supplied. * diff --git a/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/BaseWsDmAdapterTestCase.java b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/BaseWsDmAdapterTestCase.java new file mode 100644 index 0000000000..34f359e56b --- /dev/null +++ b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/BaseWsDmAdapterTestCase.java @@ -0,0 +1,185 @@ +/* + * + * 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.qpid.management.wsdm; + +import java.lang.management.ManagementFactory; +import java.lang.reflect.Array; +import java.net.URI; +import java.util.UUID; + +import javax.management.MBeanAttributeInfo; +import javax.management.MBeanInfo; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.xml.namespace.QName; + +import junit.framework.TestCase; + +import org.apache.muse.ws.addressing.EndpointReference; +import org.apache.muse.ws.resource.remote.WsResourceClient; +import org.apache.muse.ws.resource.sg.remote.ServiceGroupClient; +import org.apache.qpid.management.Names; +import org.apache.qpid.management.Protocol; +import org.apache.qpid.management.TestConstants; + +/** + * Test case for WS-Resource lifecycle management. + * + * @author Andrea Gazzarini + */ +public abstract class BaseWsDmAdapterTestCase extends TestCase implements TestConstants{ + + protected MBeanServer _managementServer; + protected ObjectName _resourceObjectName; + + protected WsResourceClient _resourceClient; + protected MBeanInfo _mbeanInfo; + + /** + * Set up fixture for this test case. + * + * @throws Exception when the test case intialization fails. + */ + protected void setUp() throws Exception + { + _managementServer = ManagementFactory.getPlatformMBeanServer(); + + ServiceGroupClient serviceGroup = getServiceGroupClient(); + WsResourceClient [] members = serviceGroup.getMembers(); + + assertEquals( + "No resource has been yet created so how is " + + "it possible that service group children list is not empty?", + 0, + members.length); + + _managementServer.invoke( + Names.QPID_EMULATOR_OBJECT_NAME, + "createQueue", + new Object[]{_resourceObjectName = createResourceName()}, + new String[]{ObjectName.class.getName()}); + + members = serviceGroup.getMembers(); + assertEquals( + "One resource has just been created so " + + "I expect to find it on service group children list...", + 1, + members.length); + + _resourceClient = members[0]; + _mbeanInfo = _managementServer.getMBeanInfo(_resourceObjectName); + } + + /** + * Shutdown procedure for this test case. + * + * @throws Exception when either the server or some resource fails to shutdown. + */ + @Override + protected void tearDown() throws Exception + { + ServiceGroupClient serviceGroup = getServiceGroupClient(); + WsResourceClient [] members = serviceGroup.getMembers(); + + _managementServer.invoke( + Names.QPID_EMULATOR_OBJECT_NAME, + "unregister", + new Object[]{_resourceObjectName}, + new String[]{ObjectName.class.getName()}); + + members = serviceGroup.getMembers(); + + assertEquals( + "No resource has been yet created so how is it possible that service group children list is not empty?", + 0, + members.length); + } + + /** + * Test the WS-RP GetResourceProperty interface of the WS-DM adapter. + * + *
precondition : a ws resource exists and is registered. + *
postcondition : property values coming from WS-DM resource are the same of the JMX interface. + */ + public void testGetResourcePropertiesOK() throws Exception + { + MBeanAttributeInfo [] attributesMetadata = _mbeanInfo.getAttributes(); + for (MBeanAttributeInfo attributeMetadata : attributesMetadata) + { + String name = attributeMetadata.getName(); + Object propertyValues = _resourceClient.getPropertyAsObject( + new QName( + Names.NAMESPACE_URI, + name, + Names.PREFIX), + Class.forName(attributeMetadata.getType())); + + int length = Array.getLength(propertyValues); + if (length != 0) + { + Object propertyValue = Array.get(propertyValues, 0); + + assertEquals( + "Comparison failed for property "+name, + _managementServer.getAttribute(_resourceObjectName,name), + propertyValue); + } else { + assertNull( + String.format( + "\"%s\" property value shouldn't be null. Its value is %s", + name, + _managementServer.getAttribute(_resourceObjectName,name)), + _managementServer.getAttribute(_resourceObjectName,name)); + } + } + } + + /** + * Creates a service group client reference. + * + * @return a service group client reference. + */ + private ServiceGroupClient getServiceGroupClient() + { + URI address = URI.create( + Protocol.DEFAULT_ENDPOINT_URI.replaceFirst("8080",System.getProperty(Names.ADAPTER_PORT_PROPERTY_NAME))); + return new ServiceGroupClient(new EndpointReference(address)); + } + + /** + * In order to test the behaviour of the WS-DM adapter, at + * least one resource must be created. This is the method that + * returns the name (ObjectName on JMX side, Resource-ID on WSDM side) + * of that resource + * + * @return the name of the MBean instance that will be created. + * @throws Exception when the name if malformed. Practically never. + */ + private ObjectName createResourceName() throws Exception + { + return new ObjectName( + "Q-MAN:objectId="+UUID.randomUUID()+ + ", brokerID="+UUID.randomUUID()+ + ",class=queue"+ + ",package=org.apache.qpid"+ + ",name="+System.currentTimeMillis()); + } +} \ No newline at end of file diff --git a/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/GetMultipleResourcePropertiesTestCase.java b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/GetMultipleResourcePropertiesTestCase.java new file mode 100644 index 0000000000..2481d4a406 --- /dev/null +++ b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/GetMultipleResourcePropertiesTestCase.java @@ -0,0 +1,126 @@ +/* + * + * 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.qpid.management.wsdm; + +import java.util.Date; +import java.util.UUID; + +import javax.management.MBeanAttributeInfo; +import javax.xml.namespace.QName; + +import org.apache.muse.ws.addressing.soap.SoapFault; +import org.apache.muse.ws.resource.WsrfConstants; +import org.apache.qpid.management.Names; +import org.w3c.dom.Element; + +/** + * Test case for Web Service Resource Properties interfaces. + * Those interfaces are defined on http://docs.oasis-open.org/wsrf/wsrf-ws_resource_properties-1.2-spec-os.pdf + * (Web Services Resource Properties 1.2 - (WS-ResourceProperties). + * For a better explanation see chapter 5 of the specification above. + * + * @author Andrea Gazzarini + */ +public class GetMultipleResourcePropertiesTestCase extends BaseWsDmAdapterTestCase +{ + /** + * Tests the GetMultipleResourceProperties interface when the request contains + * an unknwon target resource. + * + *
precondition : the GetMultipleResourceProperties request contains an unknwon resource. + *
postcondition : a SoapFault is thrown and the corresponding detail contains an + * UnknownResourceFault element. + */ + public void testGetMultipleResourcePropertiesKO_WithUnknownResourceFault() throws Exception + { + try + { + _resourceClient.getEndpointReference().removeParameter(Names.RESOURCE_ID_QNAME); + _resourceClient.getEndpointReference().addParameter(Names.RESOURCE_ID_QNAME,"lablabalbal"); + _resourceClient.setTrace(true); + + _resourceClient.getMultipleResourceProperties(new QName[]{}); + } catch(SoapFault expected) + { + assertEquals( + WsrfConstants.RESOURCE_UNKNOWN_QNAME.getLocalPart(), + expected.getDetail().getLocalName()); + } + } + + /** + * Test the WS-RP GetResourceProperties interface of the WS-DM adapter. + * + *
precondition : a ws resource exists and is registered. + *
postcondition : Properties are correctly returned according to WSRP interface and they (their value) + * are matching with corresponding MBean properties. + */ + public void testGetMultipleResourcePropertiesOK() throws Exception + { + MBeanAttributeInfo [] attributesMetadata = _mbeanInfo.getAttributes(); + QName[] names = new QName[attributesMetadata.length]; + + int index = 0; + for (MBeanAttributeInfo attributeMetadata : _mbeanInfo.getAttributes()) + { + QName qname = new QName(Names.NAMESPACE_URI,attributeMetadata.getName(),Names.PREFIX); + names[index++] = qname; + } + + Element[] properties =_resourceClient.getMultipleResourceProperties(names); + for (Element element : properties) + { + String name = element.getLocalName(); + Object value = _managementServer.getAttribute(_resourceObjectName, name); + if ("Name".equals(name)) + { + assertEquals( + value, + element.getTextContent()); + } else if ("Durable".equals(name)) + { + assertEquals( + value, + Boolean.valueOf(element.getTextContent())); + } else if ("ExpireTime".equals(name)) + { + assertEquals( + value, + new Date(Long.valueOf(element.getTextContent()))); + } else if ("MsgTotalEnqueues".equals(name)) + { + assertEquals( + value, + Long.valueOf(element.getTextContent())); + } else if ("ConsumerCount".equals(name)) + { + assertEquals( + value, + Integer.valueOf(element.getTextContent())); + }else if ("VhostRef".equals(name)) + { + assertEquals( + value, + UUID.fromString(element.getTextContent())); + } + } + } +} diff --git a/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/GetResourcePropertyDocumentTestCase.java b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/GetResourcePropertyDocumentTestCase.java new file mode 100644 index 0000000000..862115f841 --- /dev/null +++ b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/GetResourcePropertyDocumentTestCase.java @@ -0,0 +1,134 @@ +/* + * + * 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.qpid.management.wsdm; + +import javax.xml.namespace.QName; + +import org.apache.muse.util.xml.XmlUtils; +import org.apache.muse.ws.addressing.soap.SoapFault; +import org.apache.muse.ws.resource.WsrfConstants; +import org.apache.qpid.management.Names; +import org.w3c.dom.Element; + +/** + * Test case for Web Service Resource Properties interfaces. + * Those interfaces are defined on http://docs.oasis-open.org/wsrf/wsrf-ws_resource_properties-1.2-spec-os.pdf + * (Web Services Resource Properties 1.2 - (WS-ResourceProperties). + * For a better explanation see chapter 5 of the specification above. + * + * @author Andrea Gazzarini + */ +public class GetResourcePropertyDocumentTestCase extends BaseWsDmAdapterTestCase +{ + /** + * Tests the GetResourcePropertyDocument interface when the request contains + * an unknwon target resource. + * + *
precondition : the GetResourcePropertyDocument contains an unknwon resource. + *
postcondition : a SoapFault is thrown and the corresponding detail contains an + * UnknownResourceFault element. + */ + public void testGetResourcePropertyDocumentKO_WithUnknownResourceFault() throws Exception + { + try + { + _resourceClient.getEndpointReference().removeParameter(Names.RESOURCE_ID_QNAME); + _resourceClient.getEndpointReference().addParameter(Names.RESOURCE_ID_QNAME,"lablabalbal"); + _resourceClient.setTrace(true); + + _resourceClient.getResourcePropertyDocument(); + } catch(SoapFault expected) + { + assertEquals( + WsrfConstants.RESOURCE_UNKNOWN_QNAME.getLocalPart(), + expected.getDetail().getLocalName()); + } + } + + /** + * Tests the WS-RP PutResourcePropertyDocument interface of the WS-DM adapter. + * + *
precondition : a ws resource exists and is registered. + *
postcondition : A read / write property is correctly set according to WSRP interface. + */ + public void testGetAndPutResourcePropertyDocumentOK() throws Exception + { + String expectedMgmtPubIntervalValue = "4321"; + String propertyName = "MgmtPubInterval"; + + Element propertiesDocument = _resourceClient.getResourcePropertyDocument(); + Element [] properties = XmlUtils.getAllElements(propertiesDocument); + + for (Element element : properties) + { + if (propertyName.equals(element.getLocalName())) { + element.setTextContent(expectedMgmtPubIntervalValue); + } else { + propertiesDocument.removeChild(element); + } + } + + _resourceClient.putResourcePropertyDocument(propertiesDocument); + + Element newProperties = _resourceClient.getResourcePropertyDocument(); + + Element mgmtPubInterval = XmlUtils.getElement( + newProperties, new QName( + Names.NAMESPACE_URI, + propertyName, + Names.PREFIX)); + + assertEquals(expectedMgmtPubIntervalValue,mgmtPubInterval.getTextContent()); + } + + /** + * Tests the WS-RP PutResourcePropertyDocument interface of the WS-DM adapter. + * Specifically it tries to update the value of a read-only property. + * + *
precondition : a ws resource exists, it is registered and has at least one read-only property. + *
postcondition : An exception is thrown indicating the failure. + */ + public void testGetAndPutResourcePropertyDocumentKO_WithReadOnlyProperty() throws Exception + { + String propertyName = "Name"; + + Element propertiesDocument = _resourceClient.getResourcePropertyDocument(); + Element [] properties = XmlUtils.getAllElements(propertiesDocument); + + for (Element element : properties) + { + if (propertyName.equals(element.getLocalName())) { + element.setTextContent("ThisIsTheNewValueOfNameProperty"); + } else { + propertiesDocument.removeChild(element); + } + } + + try + { + _resourceClient.putResourcePropertyDocument(propertiesDocument); + fail("It's not possible to update the value of a read-only property."); + } catch (SoapFault expected) + { + + } + } +} diff --git a/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/MetadataExchangeInterfaceTestCase.java b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/MetadataExchangeInterfaceTestCase.java new file mode 100644 index 0000000000..d22c51f57e --- /dev/null +++ b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/MetadataExchangeInterfaceTestCase.java @@ -0,0 +1,143 @@ +/* + * + * 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.qpid.management.wsdm; + +import javax.xml.namespace.QName; + +import org.apache.muse.core.proxy.ProxyHandler; +import org.apache.muse.core.proxy.ReflectionProxyHandler; +import org.apache.muse.util.xml.XmlUtils; +import org.apache.muse.ws.metadata.WsxConstants; +import org.apache.muse.ws.resource.metadata.WsrmdConstants; +import org.w3c.dom.Element; + +/** + * Test case for QMan metadata exchange interface. + * + * @author Andrea Gazzarini + */ +public class MetadataExchangeInterfaceTestCase extends BaseWsDmAdapterTestCase +{ + /** + * Test the MetadataExchange interface when the corresponding + * request doesn't contain a dialect. According to WS-MetadataExchange specs this should be + * intended as a "give-me-all-metadata" for that resource. + * + *
precondition : the GetMetadata request doesn't contain a dialect. + *
postcondition : the whole metadata document is returned with all metadata . + * It will contain both WSDL and RMD. + */ + @SuppressWarnings("unchecked") + public void testGetMetadataOK_WithoutDialect() throws Exception + { + Element[] result = (Element[]) _resourceClient.invoke( + getProxyHandler(), + new Object[]{""}); + + assertEquals(2,result.length); + + Element rmdMetadataSection = result[0]; + Element wsdlMetadataSection = result[1]; + + Element rmd = XmlUtils.getFirstElement(rmdMetadataSection); + Element wsdl = XmlUtils.getFirstElement(wsdlMetadataSection); + + assertEquals("MetadataDescriptor",rmd.getLocalName()); + assertEquals("definitions",wsdl.getLocalName()); + } + + /** + * Test the MetadataExchange interface when the WSDL dialect is specified on the request. + * + *
precondition : the GetMetadata request contains WSDL dialect. + *
postcondition : the resource WSDL metadata document is returned. + */ + @SuppressWarnings("unchecked") + public void testGetMetadataOK_WithWSDLDialect() throws Exception + { + Element[] result = (Element[]) _resourceClient.invoke( + getProxyHandler(), + new Object[]{WsxConstants.WSDL_DIALECT}); + + assertEquals(1,result.length); + + Element wsdlMetadataSection = result[0]; + + Element wsdl = XmlUtils.getFirstElement(wsdlMetadataSection); + + assertEquals("definitions",wsdl.getLocalName()); + } + + /** + * Test the MetadataExchange interface when the RMD dialect is specified on the request. + * + *
precondition : the GetMetadata request contains RMD dialect. + *
postcondition : the RMD metadata document is returned. + */ + @SuppressWarnings("unchecked") + public void testGetMetadataOK_WithRMDDialect() throws Exception + { + Element[] result = (Element[]) _resourceClient.invoke( + getProxyHandler(), + new Object[]{WsrmdConstants.NAMESPACE_URI}); + + assertEquals(1,result.length); + + Element rmdMetadataSection = result[0]; + + Element wsdl = XmlUtils.getFirstElement(rmdMetadataSection); + + assertEquals("MetadataDescriptor",wsdl.getLocalName()); + } + + /** + * Test the MetadataExchange interface with an unknown metadata dialect. + * + *
precondition : the GetMetadata request contains an unknown dialect. + *
postcondition : the returned metadata section is empty. + */ + @SuppressWarnings("unchecked") + public void testGetMetadataKO_WithoutUnknownDialect() throws Exception + { + Element [] metadata = (Element[]) _resourceClient.invoke( + getProxyHandler(), + new Object[]{"HopeThisIsAnUnknownDialect"}); + + assertEquals(0,metadata.length); + } + + /** + * Returns a proxy handler used for working with metadata exchange + * interface. + * + * @return a metadata proxy handler. + */ + private ProxyHandler getProxyHandler() + { + ProxyHandler getMetadataHandler = new ReflectionProxyHandler(); + getMetadataHandler.setAction("http://schemas.xmlsoap.org/ws/2004/09/mex/GetMetadata"); + getMetadataHandler.setRequestName(new QName("http://schemas.xmlsoap.org/ws/2004/09/mex", "GetMetadata", "wsx")); + getMetadataHandler.setRequestParameterNames(new QName[]{new QName("http://schemas.xmlsoap.org/ws/2004/09/mex", "Dialect", "wsx")}); + getMetadataHandler.setResponseName(new QName("http://schemas.xmlsoap.org/ws/2004/09/mex", "Metadata", "wsx")); + getMetadataHandler.setReturnType(Element[].class); + return getMetadataHandler; + } +} \ No newline at end of file diff --git a/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/OperationInvocationInterfaceTestCase.java b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/OperationInvocationInterfaceTestCase.java new file mode 100644 index 0000000000..76d3775334 --- /dev/null +++ b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/OperationInvocationInterfaceTestCase.java @@ -0,0 +1,597 @@ +/* + * + * 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.qpid.management.wsdm; + +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.net.URI; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import javax.xml.namespace.QName; + +import org.apache.muse.core.proxy.ProxyHandler; +import org.apache.muse.core.proxy.ReflectionProxyHandler; +import org.apache.muse.ws.addressing.soap.SoapFault; +import org.apache.qpid.management.Names; +import org.apache.qpid.management.wsdm.capabilities.Result; + +/** + * Test case for QMan operation invocation interface. + * + * @author Andrea Gazzarini + */ +public class OperationInvocationInterfaceTestCase extends BaseWsDmAdapterTestCase +{ + private final Long _retCodeOk = new Long(0); + private Map _invocationHandlers = createInvocationHandlers(); + + /** + * Test operation invocation on WS-Resource. + * This method tests the exchange of a byte type array between requestor + * and service provider. + * + *
precondition : a WS-Resource exists and is registered and the requested + * operation is available on that. + *
postcondition : invocations are executed successfully, no exception is thrown + * and byte array are correctly returned. + */ + @SuppressWarnings("unchecked") + public void testOperationInvocationOK_withByteArray() throws Exception + { + byte [] expectedByteResult = {1,3,4,2,2,44,22,3,3,55,66}; + + Object result = _resourceClient.invoke( + _invocationHandlers.get("echoWithByteArray"), + new Object[]{expectedByteResult}); + + Method getStatusCode = result.getClass().getMethod("getStatusCode"); + Method getOutputParameters = result.getClass().getMethod("getOutputParameters"); + + assertEquals(_retCodeOk,getStatusCode.invoke(result)); + Map out = (Map) getOutputParameters.invoke(result); + + assertEquals("Output parameters must be 1.",1,out.size()); + assertArrayEquals(expectedByteResult, out.get(byte[].class.getName())); + } + + /** + * Test a simple operation invocation on a WS-Resource. + * This method tests a simple operation without any input and output parameters. + * + *
precondition : a ws resource exists and is registered and the requested operation + * is available on that. + *
postcondition : invocations are executed successfully an no exception is thrown. + */ + @SuppressWarnings("unchecked") + public void testSimpleOperationInvocationOK() throws Exception + { + Object result = _resourceClient.invoke( + _invocationHandlers.get("voidWithoutArguments"), + null); + + Method getStatusCode = result.getClass().getMethod("getStatusCode"); + assertEquals( + "Something was wrong...expected return code is "+_retCodeOk, + _retCodeOk, + getStatusCode.invoke(result)); + } + + /** + * Test a the invocation on a WS-Resource with a method that throws an exception.. + * + *
precondition : a ws resource exists and is registered and the requested + * operation is available on that. + *
postcondition : an exception is thrown by the requested method. + */ + @SuppressWarnings("unchecked") + public void testInvocationException_OK() throws Exception + { + try + { + _resourceClient.invoke( + _invocationHandlers.get("throwsException"), + null); + fail("The requested operation has thrown an exception so a Soap Fault is expected..."); + } catch(SoapFault expected) + { + } + } + + /** + * Test operation invocation on WS-Resource. + * This method tests the exchange of UUID type between requestor and service provider. + * + *
precondition : a WS-Resource exists and is registered and the requested operation + * is available on that. + *
postcondition : invocations are executed successfully, no exception is thrown + * and parameters are correctly returned. + */ + @SuppressWarnings("unchecked") + public void testOperationInvocationOK_withUUID() throws Exception + { + UUID expectedUuid = UUID.randomUUID(); + + Object result = _resourceClient.invoke( + _invocationHandlers.get("echoWithUUID"), + new Object[]{expectedUuid}); + + Method getStatusCode = result.getClass().getMethod("getStatusCode"); + Method getOutputParameters = result.getClass().getMethod("getOutputParameters"); + + assertEquals(_retCodeOk,getStatusCode.invoke(result)); + Map out = (Map) getOutputParameters.invoke(result); + + assertEquals("Output parameters must be 1.",1,out.size()); + assertEquals(expectedUuid, out.get("uuid")); + } + + /** + * Test operation invocation on WS-Resource. + * This method tests the exchange of Map type between requestor and service provider. + * For this test exchanged arrays contain : + * + *
precondition : a ws resource exists and is registered and the requested + * operation is available on that. + *
postcondition : invocations are executed successfully, no exception is + * thrown and parameters are correctly returned. + */ + @SuppressWarnings("unchecked") + public void testOperationInvocationOK_withMap() throws Exception + { + Map expectedMap = new HashMap(); + expectedMap.put("p1", new Long(1)); + expectedMap.put("p2", Boolean.TRUE); + expectedMap.put("p3", 1234d); + expectedMap.put("p4", 11.2f); + expectedMap.put("p5", 1272); + expectedMap.put("p6", (short)12); + expectedMap.put("p7", "aString"); + expectedMap.put("p8", "http://qpid.apache.org"); + expectedMap.put("p9", new Date(12383137128L)); + expectedMap.put("p10", new byte[]{1,2,2,3,3,4}); + + Object result = _resourceClient.invoke( + _invocationHandlers.get("echoWithMap"), + new Object[]{expectedMap}); + + Method getStatusCode = result.getClass().getMethod("getStatusCode"); + Method getOutputParameters = result.getClass().getMethod("getOutputParameters"); + + assertEquals(_retCodeOk,getStatusCode.invoke(result)); + Map out = (Map) ((Map) getOutputParameters.invoke(result)).get("map"); + + assertEquals("Output parameters must be 10.",10,out.size()); + assertEquals(expectedMap.get("p1"),out.get("p1")); + assertEquals(expectedMap.get("p2"),out.get("p2")); + assertEquals(expectedMap.get("p3"),out.get("p3")); + assertEquals(expectedMap.get("p4"),out.get("p4")); + assertEquals(expectedMap.get("p5"),out.get("p5")); + assertEquals(expectedMap.get("p6"),out.get("p6")); + assertEquals(expectedMap.get("p7"),out.get("p7")); + assertEquals(expectedMap.get("p8"),out.get("p8")); + assertEquals(expectedMap.get("p9"),out.get("p9")); + assertTrue( Arrays.equals((byte[])expectedMap.get("p10"),(byte[])out.get("p10"))); + } + + /** + * Test operation invocation on WS-Resource. + * This method tests the exchange of simple types between requestor and + * service provider. + * + * With simple types we mean : + * + *
    + *
  • java.lang.Long / long (xsd:long) + *
  • java.lang.Integer / int (xsd:int / xsd:integer) + *
  • java.lang.Double/ double (xsd:double) + *
  • java.lang.Float / float (xsd:float) + *
  • java.lang.Short / short (xsd:short) + *
  • java.lang.Boolean / boolean (xsd:boolean) + *
  • java.lang.String (xsd:string) + *
  • java.net.URI (xsd:anyURI) + *
  • java.util.Date(xsd:dateTime) + *
+ * + *
precondition : a ws resource exists and is registered and the requested operation is + * available on that. + *
postcondition : invocations are executed successfully, no exception is thrown and + * parameters are correctly returned. + */ + @SuppressWarnings("unchecked") + public void testOperationInvocationOK_withSimpleTypes() throws Exception + { + Long expectedLongResult = new Long(1373); + Boolean expectedBooleanResult = Boolean.TRUE; + Double expectedDoubleResult = new Double(12763.44); + Float expectedFloatResult = new Float(2727.233f); + Integer expectedIntegerResult = new Integer(28292); + Short expectedShortResult = new Short((short)227); + String expectedStringResult = "expectedStringResult"; + URI expectedUriResult = URI.create("http://qpid.apache.org/"); + Date expectedDateResult = new Date(); + + Object result = _resourceClient.invoke( + _invocationHandlers.get("echoWithSimpleTypes"), + new Object[]{ + expectedLongResult, + expectedBooleanResult, + expectedDoubleResult, + expectedFloatResult, + expectedIntegerResult, + expectedShortResult, + expectedStringResult, + expectedUriResult, + expectedDateResult}); + + Method getStatusCode = result.getClass().getMethod("getStatusCode"); + Method getOutputParameters = result.getClass().getMethod("getOutputParameters"); + assertEquals(_retCodeOk,getStatusCode.invoke(result)); + Map out = (Map) getOutputParameters.invoke(result); + + assertEquals("Output parameters must be 9.",9,out.size()); + assertTrue("Long output parameter not found on result object.",out.containsValue(expectedLongResult)); + assertTrue("Boolean output parameter not found on result object.",out.containsValue(expectedBooleanResult)); + assertTrue("Double output parameter not found on result object.",out.containsValue(expectedDoubleResult)); + assertTrue("Float output parameter not found on result object.",out.containsValue(expectedFloatResult)); + assertTrue("Integer output parameter not found on result object.",out.containsValue(expectedIntegerResult)); + assertTrue("Short output parameter not found on result object.",out.containsValue(expectedShortResult)); + assertTrue("String output parameter not found on result object.",out.containsValue(expectedStringResult)); + assertTrue("URI output parameter not found on result object.",out.containsValue(expectedUriResult)); + assertTrue("Date output parameter not found on result object.",out.containsValue(expectedDateResult)); + } + + /** + * Test operation invocation on WS-Resource. + * This method tests the exchange of arrays between requestor and service provider. + * For this test exchanged arrays contain : + * + *
    + *
  • java.lang.Long (xsd:long) + *
  • java.lang.Integer (xsd:int / xsd:integer) + *
  • java.lang.Double (xsd:double) + *
  • java.lang.Float (xsd:float) + *
  • java.lang.Short (xsd:short) + *
  • java.lang.Boolean (xsd:boolean) + *
  • java.lang.String (xsd:string) + *
  • java.net.URI (xsd:anyURI) + *
  • java.util.Date(xsd:dateTime) + *
+ * + *
precondition : a ws resource exists and is registered and the requested operation is available on that. + *
postcondition : invocations are executed successfully, no exception is thrown and parameters are correctly returned. + */ + @SuppressWarnings("unchecked") + public void testOperationInvocationOK_withWrapperArrays() throws Exception + { + Long [] expectedLongResult = {new Long(2),new Long(1),new Long(3),new Long(4)}; + Boolean [] expectedBooleanResult = { Boolean.TRUE,Boolean.FALSE,Boolean.FALSE}; + Double [] expectedDoubleResult = {12763.44d,2832.33d,2292.33d,22293.22d}; + Float [] expectedFloatResult = {2727.233f,1f,2f,4f,5.4f,33.2f}; + Integer [] expectedIntegerResult = {1,2,3,4,55,66,77,88,99}; + Short [] expectedShortResult = {(short)227,(short)23,(short)9}; + String [] expectedStringResult = {"s1","s2","s333","s4"}; + URI [] expectedUriResult = { + URI.create("http://qpid.apache.org/"), + URI.create("http://www.apache.org"), + URI.create("http://projects.apache.org")}; + + Date [] expectedDateResult = { + new Date(), + new Date(38211897), + new Date(903820382)}; + + Object result = _resourceClient.invoke( + _invocationHandlers.get("echoWithArrays"), + new Object[]{ + expectedLongResult, + expectedBooleanResult, + expectedDoubleResult, + expectedFloatResult, + expectedIntegerResult, + expectedShortResult, + expectedStringResult, + expectedUriResult, + expectedDateResult}); + + Method getStatusCode = result.getClass().getMethod("getStatusCode"); + Method getOutputParameters = result.getClass().getMethod("getOutputParameters"); + assertEquals(_retCodeOk,getStatusCode.invoke(result)); + Map out = (Map) getOutputParameters.invoke(result); + + assertEquals("Output parameters must be 9.",9,out.size()); + assertTrue("Long array doesn't match.",Arrays.equals(expectedLongResult, (Long[])out.get(Long.class.getName()))); + assertTrue("Boolean array doesn't match.",Arrays.equals(expectedBooleanResult, (Boolean[])out.get(Boolean.class.getName()))); + assertTrue("Double array doesn't match.",Arrays.equals(expectedDoubleResult, (Double[])out.get(Double.class.getName()))); + assertTrue("Float array doesn't match.",Arrays.equals(expectedFloatResult, (Float[])out.get(Float.class.getName()))); + assertTrue("Integer array doesn't match.", Arrays.equals(expectedIntegerResult, (Integer[])out.get(Integer.class.getName()))); + assertTrue("Short array doesn't match.",Arrays.equals(expectedShortResult, (Short[])out.get(Short.class.getName()))); + assertTrue("String array doesn't match.",Arrays.equals(expectedStringResult, (String[])out.get(String.class.getName()))); + assertTrue("URI array doesn't match.",Arrays.equals(expectedUriResult, (URI[])out.get(URI.class.getName()))); + assertTrue("Date array doesn't match.",Arrays.equals(expectedDateResult, (Date[])out.get(Date.class.getName()))); + } + + /** + * Test operation invocation on WS-Resource. + * This method tests the exchange of primitive type arrays between requestor and service provider. + * NOte that even the sent array contain primtiive type QMan deals only with objects so in the result + * object you will find the corresponding wrapper types. + * + * For this test exchanged arrays contain : + * + *
    + *
  • java.lang.Long / long (xsd:long) + *
  • java.lang.Integer / int (xsd:int / xsd:integer) + *
  • java.lang.Double/ double (xsd:double) + *
  • java.lang.Float / float (xsd:float) + *
  • java.lang.Short / short (xsd:short) + *
  • java.lang.Boolean / boolean (xsd:boolean) + *
+ * + *
precondition : a ws resource exists and is registered and the requested operation is available on that. + *
postcondition : invocations are executed successfully, no exception is thrown and parameters are correctly returned. + */ + @SuppressWarnings("unchecked") + public void testOperationInvocationOK_withPrimitiveArrays() throws Exception + { + long [] expectedLongResult = {1L,2L,3L,4L}; + boolean [] expectedBooleanResult = { true,false,false}; + double [] expectedDoubleResult = {12763.44d,2832.33d,2292.33d,22293.22d}; + float [] expectedFloatResult = {2727.233f,1f,2f,4f,5.4f,33.2f}; + int [] expectedIntegerResult = {1,2,3,4,55,66,77,88,99}; + short [] expectedShortResult = {(short)227,(short)23,(short)9}; + + Object result = _resourceClient.invoke( + _invocationHandlers.get("echoWithSimpleTypeArrays"), + new Object[]{ + expectedLongResult, + expectedBooleanResult, + expectedDoubleResult, + expectedFloatResult, + expectedIntegerResult, + expectedShortResult}); + + Method getStatusCode = result.getClass().getMethod("getStatusCode"); + Method getOutputParameters = result.getClass().getMethod("getOutputParameters"); + assertEquals(_retCodeOk,getStatusCode.invoke(result)); + Map out = (Map) getOutputParameters.invoke(result); + + assertEquals("Output parameters must be 6.",6,out.size()); + assertArrayEquals(expectedLongResult, out.get(long.class.getName())); + assertArrayEquals(expectedBooleanResult, out.get(boolean.class.getName())); + assertArrayEquals(expectedDoubleResult, out.get(double.class.getName())); + assertArrayEquals(expectedFloatResult, out.get(float.class.getName())); + assertArrayEquals(expectedIntegerResult, out.get(int.class.getName())); + assertArrayEquals(expectedShortResult, out.get(short.class.getName())); + } + + /** + * Internal method used for array comparison using reflection. + * + * @param expectedArray the expected array. + * @param resultArray the array that must match the expected one. + */ + private void assertArrayEquals(Object expectedArray, Object resultArray) + { + int expectedArrayLength = Array.getLength(expectedArray); + int resultArrayLength = Array.getLength(resultArray); + + assertEquals(expectedArrayLength,resultArrayLength); + + for (int index = 0; index < expectedArrayLength; index++) + { + Object expected = Array.get(expectedArray, index); + Object result = Array.get(resultArray, index); + + assertEquals(expected,result); + } + } + + private Map createInvocationHandlers() + { + Map handlers = new HashMap(); + + ProxyHandler handler = new ReflectionProxyHandler(); + handler.setAction(Names.NAMESPACE_URI+"/"+"voidWithoutArguments"); + handler.setRequestName( + new QName( + Names.NAMESPACE_URI, + "voidWithoutArgumentsRequest", + Names.PREFIX)); + handler.setRequestParameterNames(new QName[]{}); + handler.setResponseName( + new QName( + Names.NAMESPACE_URI, + "voidWithoutArgumentsResponse", + Names.PREFIX)); + handler.setReturnType(Result.class); + + ProxyHandler exceptionHandler = new ReflectionProxyHandler(); + exceptionHandler.setAction(Names.NAMESPACE_URI+"/"+"throwsException"); + exceptionHandler.setRequestName( + new QName( + Names.NAMESPACE_URI, + "throwsExceptionRequest", + Names.PREFIX)); + + exceptionHandler.setRequestParameterNames(new QName[]{}); + exceptionHandler.setResponseName( + new QName( + Names.NAMESPACE_URI, + "throwsExceptionResponse", + Names.PREFIX)); + + exceptionHandler.setReturnType(Result.class); + + ProxyHandler echoWithWrapperTypesHandler = new ReflectionProxyHandler(); + echoWithWrapperTypesHandler.setAction(Names.NAMESPACE_URI+"/"+"echoWithSimpleTypes"); + echoWithWrapperTypesHandler.setRequestName( + new QName( + Names.NAMESPACE_URI, + "echoWithSimpleTypesRequest", + Names.PREFIX)); + + echoWithWrapperTypesHandler.setRequestParameterNames(new QName[]{ + new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p2",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p3",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p4",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p5",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p6",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p7",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p8",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p9",Names.PREFIX), + }); + + echoWithWrapperTypesHandler.setResponseName( + new QName( + Names.NAMESPACE_URI, + "echoWithSimpleTypesResponse", + Names.PREFIX)); + + echoWithWrapperTypesHandler.setReturnType(Result.class); + + ProxyHandler echoWithArrayOfWrapperTypes = new ReflectionProxyHandler(); + echoWithArrayOfWrapperTypes.setAction(Names.NAMESPACE_URI+"/"+"echoWithArrays"); + echoWithArrayOfWrapperTypes.setRequestName( + new QName( + Names.NAMESPACE_URI, + "echoWithArraysRequest", + Names.PREFIX)); + + echoWithArrayOfWrapperTypes.setRequestParameterNames(new QName[]{ + new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p2",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p3",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p4",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p5",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p6",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p7",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p8",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p9",Names.PREFIX), + }); + + echoWithArrayOfWrapperTypes.setResponseName( + new QName( + Names.NAMESPACE_URI, + "echoWithArraysResponse", + Names.PREFIX)); + + echoWithArrayOfWrapperTypes.setReturnType(Result.class); + + ProxyHandler echoWithArrayOfPrimitiveTypes = new ReflectionProxyHandler(); + echoWithArrayOfPrimitiveTypes.setAction(Names.NAMESPACE_URI+"/"+"echoWithSimpleTypeArrays"); + echoWithArrayOfPrimitiveTypes.setRequestName( + new QName( + Names.NAMESPACE_URI, + "echoWithSimpleTypeArraysRequest", + Names.PREFIX)); + + echoWithArrayOfPrimitiveTypes.setRequestParameterNames(new QName[]{ + new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p2",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p3",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p4",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p5",Names.PREFIX), + new QName(Names.NAMESPACE_URI,"p6",Names.PREFIX)}); + + echoWithArrayOfPrimitiveTypes.setResponseName( + new QName( + Names.NAMESPACE_URI, + "echoWithSimpleTypeArraysResponse", + Names.PREFIX)); + + echoWithArrayOfPrimitiveTypes.setReturnType(Result.class); + + ProxyHandler echoWithByteArray = new EnhancedReflectionProxyHandler(); + echoWithByteArray.setAction(Names.NAMESPACE_URI+"/"+"echoWithByteArray"); + echoWithByteArray.setRequestName( + new QName( + Names.NAMESPACE_URI, + "echoWithByteArrayRequest", + Names.PREFIX)); + + echoWithByteArray.setRequestParameterNames( + new QName[]{ + new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX)}); + + echoWithByteArray.setResponseName( + new QName( + Names.NAMESPACE_URI, + "echoWithByteArrayResponse", + Names.PREFIX)); + + echoWithByteArray.setReturnType(Result.class); + + ProxyHandler echoWithUUID = new EnhancedReflectionProxyHandler(); + echoWithUUID.setAction(Names.NAMESPACE_URI+"/"+"echoWithUUID"); + echoWithUUID.setRequestName( + new QName( + Names.NAMESPACE_URI, + "echoWithUUIDRequest", + Names.PREFIX)); + + echoWithUUID.setRequestParameterNames( + new QName[]{ + new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX)}); + + echoWithUUID.setResponseName( + new QName( + Names.NAMESPACE_URI, + "echoWithUUIDResponse", + Names.PREFIX)); + + echoWithUUID.setReturnType(Result.class); + + ProxyHandler echoWithMap = new EnhancedReflectionProxyHandler(); + echoWithMap.setAction(Names.NAMESPACE_URI+"/"+"echoWithMap"); + echoWithMap.setRequestName( + new QName( + Names.NAMESPACE_URI, + "echoWithMapRequest", + Names.PREFIX)); + + echoWithMap.setRequestParameterNames( + new QName[]{ + new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX)}); + + echoWithMap.setResponseName( + new QName( + Names.NAMESPACE_URI, + "echoWithMapResponse", + Names.PREFIX)); + + echoWithMap.setReturnType(Result.class); + + handlers.put("voidWithoutArguments",handler); + handlers.put("echoWithSimpleTypes",echoWithWrapperTypesHandler); + handlers.put("echoWithArrays",echoWithArrayOfWrapperTypes); + handlers.put("echoWithSimpleTypeArrays", echoWithArrayOfPrimitiveTypes); + handlers.put("echoWithByteArray", echoWithByteArray); + handlers.put("echoWithUUID", echoWithUUID); + handlers.put("echoWithMap", echoWithMap); + handlers.put("throwsException",exceptionHandler); + return handlers; + } +} \ No newline at end of file diff --git a/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/SetResourcePropertiesTestCase.java b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/SetResourcePropertiesTestCase.java new file mode 100644 index 0000000000..eed8a00508 --- /dev/null +++ b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/SetResourcePropertiesTestCase.java @@ -0,0 +1,221 @@ +/* + * + * 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.qpid.management.wsdm; + +import java.lang.reflect.Array; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import javax.management.MBeanAttributeInfo; +import javax.xml.namespace.QName; + +import org.apache.muse.ws.addressing.soap.SoapFault; +import org.apache.muse.ws.resource.WsrfConstants; +import org.apache.qpid.management.Names; + +/** + * Test case for Set Resource Properties interfaces. + * + * @author Andrea Gazzarini + */ +public class SetResourcePropertiesTestCase extends BaseWsDmAdapterTestCase +{ + /** + * Test the WS-RP SetResourceProperty interface of the WS-DM adapter. + * + *
precondition : a WS-Resource exists and is registered. + *
postcondition : property values are correctly updated on the target WS-Resource.. + */ + public void testSetResourcePropertiesOK() throws Exception + { + Map sampleMap = new HashMap(); + sampleMap.put("Key1", "BLABALABLABALBAL"); + sampleMap.put("Key2", 182838484l); + sampleMap.put("Key3", -928376362); + sampleMap.put("Key4", 23762736276.33D); + sampleMap.put("Key4", 2327363.2F); + + Map sampleValues = new HashMap(); + sampleValues.put(String.class.getName(),"SAMPLE_STRING"); + sampleValues.put(UUID.class.getName(),UUID.randomUUID()); + sampleValues.put(Boolean.class.getName(),Boolean.FALSE); + sampleValues.put(Map.class.getName(),sampleMap); + sampleValues.put(Long.class.getName(),283781273L); + sampleValues.put(Integer.class.getName(),12727); + sampleValues.put(Short.class.getName(),new Short((short)22)); + sampleValues.put(Date.class.getName(),new Date()); + + MBeanAttributeInfo [] attributesMetadata = _mbeanInfo.getAttributes(); + boolean atLeastThereIsOneWritableProperty = false; + + for (MBeanAttributeInfo attributeMetadata : attributesMetadata) + { + String name = attributeMetadata.getName(); + + if (attributeMetadata.isWritable()) + { + atLeastThereIsOneWritableProperty = true; + Object sampleValue = sampleValues.get(attributeMetadata.getType()); + Object []values = new Object[]{sampleValue}; + + Object result = _managementServer.getAttribute(_resourceObjectName, name); + if (result == null) + { + _resourceClient.insertResourceProperty( + new QName( + Names.NAMESPACE_URI, + name, + Names.PREFIX), + values); + } else + { + _resourceClient.updateResourceProperty( + new QName( + Names.NAMESPACE_URI, + name, + Names.PREFIX), + values); + } + + Object propertyValues = _resourceClient.getPropertyAsObject( + new QName( + Names.NAMESPACE_URI, + name, + Names.PREFIX), + Class.forName(attributeMetadata.getType())); + int length = Array.getLength(propertyValues); + if (length != 0) + { + Object propertyValue = Array.get(propertyValues, 0); + + assertEquals( + "Comparison failed for property "+name, + sampleValue, + propertyValue); + } else { + assertNull( + String.format( + "\"%s\" property value shouldn't be null. Its value is %s", + name, + _managementServer.getAttribute(_resourceObjectName,name)), + sampleValue); + } + } + } + assertTrue( + "It's not possibile to run successfully this test case if " + + "the target WS-Resource has no at least one writable property", + atLeastThereIsOneWritableProperty); + } + + /** + * Test the WS-RP SetResourceProperty interface of the WS-DM adapter when the + * target property is null. + * According to WS-RP specs this operation is not allowed because in this case a SetResourceProperty with an "Insert" + * message should be sent in order to initialize the property. + * + *
precondition : a ws resource exists and is registered. The value of the target property is null. + *
postcondition : a Soap fault is received indicating the failuire. + */ + public void testSetResourcePropertiesKO() throws Exception + { + Object typePropertyValue = _managementServer.getAttribute(_resourceObjectName, "Type"); + assertNull(typePropertyValue); + + try + { + _resourceClient.updateResourceProperty( + new QName( + Names.NAMESPACE_URI, + "Type", + Names.PREFIX), + new Object[]{"sampleValue"}); + fail( + "If the property is null on the target ws resource, according " + + "to WS-RP specs, an update of its value is not possible."); + } catch(SoapFault expected) + { + + } + } + + /** + * Tests the SetResourceProperties (update) interface when the request contains + * an unknwon target resource. + * + *
precondition : the SetResourceProperties contains an unknwon resource. + *
postcondition : a SoapFault is thrown and the corresponding detail contains an + * UnknownResourceFault element. + */ + public void testUpdateResourcePropertiesKO_WithUnknownResourceFault() throws Exception + { + try + { + _resourceClient.getEndpointReference().removeParameter(Names.RESOURCE_ID_QNAME); + _resourceClient.getEndpointReference().addParameter(Names.RESOURCE_ID_QNAME,"lablabalbal"); + _resourceClient.setTrace(true); + + _resourceClient.updateResourceProperty( + new QName( + Names.NAMESPACE_URI, + "Type", + Names.PREFIX), + new Object[]{"sampleValue"}); + } catch(SoapFault expected) + { + assertEquals( + WsrfConstants.RESOURCE_UNKNOWN_QNAME.getLocalPart(), + expected.getDetail().getLocalName()); + } + } + + /** + * Tests the SetResourceProperties (insert) interface when the request contains + * an unknwon target resource. + * + *
precondition : the SetResourceProperties contains an unknwon resource. + *
postcondition : a SoapFault is thrown and the corresponding detail contains an + * UnknownResourceFault element. + */ + public void testInsertResourcePropertiesKO_WithUnknownResourceFault() throws Exception + { + try + { + _resourceClient.getEndpointReference().removeParameter(Names.RESOURCE_ID_QNAME); + _resourceClient.getEndpointReference().addParameter(Names.RESOURCE_ID_QNAME,"lablabalbal"); + _resourceClient.setTrace(true); + + _resourceClient.insertResourceProperty( + new QName( + Names.NAMESPACE_URI, + "Type", + Names.PREFIX), + new Object[]{"sampleValue"}); + } catch(SoapFault expected) + { + assertEquals( + WsrfConstants.RESOURCE_UNKNOWN_QNAME.getLocalPart(), + expected.getDetail().getLocalName()); + } + } +} diff --git a/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/WsDmAdapterTest.java b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/WsDmAdapterTest.java index 6644b5ae25..631beb7488 100644 --- a/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/WsDmAdapterTest.java +++ b/qpid/java/management/client/src/test/java/org/apache/qpid/management/wsdm/WsDmAdapterTest.java @@ -21,36 +21,13 @@ package org.apache.qpid.management.wsdm; import java.io.IOException; -import java.lang.management.ManagementFactory; -import java.lang.reflect.Array; -import java.lang.reflect.Method; import java.net.ServerSocket; -import java.net.URI; -import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; -import javax.management.MBeanAttributeInfo; -import javax.management.MBeanInfo; -import javax.management.MBeanServer; -import javax.management.ObjectName; -import javax.xml.namespace.QName; - -import junit.extensions.TestSetup; -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -import org.apache.muse.core.proxy.ProxyHandler; -import org.apache.muse.core.proxy.ReflectionProxyHandler; import org.apache.muse.core.serializer.SerializerRegistry; -import org.apache.muse.util.xml.XmlUtils; -import org.apache.muse.ws.addressing.EndpointReference; -import org.apache.muse.ws.addressing.soap.SoapFault; -import org.apache.muse.ws.resource.remote.WsResourceClient; -import org.apache.muse.ws.resource.sg.remote.ServiceGroupClient; import org.apache.qpid.management.Names; import org.apache.qpid.management.Protocol; import org.apache.qpid.management.wsdm.capabilities.Result; @@ -61,26 +38,14 @@ import org.apache.qpid.management.wsdm.muse.serializer.ObjectSerializer; import org.apache.qpid.management.wsdm.muse.serializer.UUIDSerializer; import org.mortbay.component.LifeCycle; import org.mortbay.component.LifeCycle.Listener; -import org.w3c.dom.Element; -/** - * Test case for WS-Resource lifecycle management. - * - * @author Andrea Gazzarini - */ -public class WsDmAdapterTest extends TestCase { - - private MBeanServer _managementServer; - private ObjectName _resourceObjectName; - - private WsResourceClient _resourceClient; - private MBeanInfo _mbeanInfo; - - private Map _invocationHandlers = createInvocationHandlers(); - final Long retCodeOk = new Long(0); +import junit.extensions.TestSetup; +import junit.framework.Test; +import junit.framework.TestSuite; + +public class WsDmAdapterTest +{ - private static ServerThread _server; - /** * Test case wide set up. * Provides Server startup & shutdown global procedure. @@ -102,6 +67,7 @@ public class WsDmAdapterTest extends TestCase { } }; + private ServerThread _server; /** * Builds a new test setup with for the given test. @@ -153,927 +119,29 @@ public class WsDmAdapterTest extends TestCase { }; /** - * Set up fixture for this test case. - * - * @throws Exception when the test case intialization fails. - */ - protected void setUp() throws Exception - { - _managementServer = ManagementFactory.getPlatformMBeanServer(); - - ServiceGroupClient serviceGroup = getServiceGroupClient(); - WsResourceClient [] members = serviceGroup.getMembers(); - - assertEquals( - "No resource has been yet created so how is " + - "it possible that service group children list is not empty?", - 0, - members.length); - - _managementServer.invoke( - Names.QPID_EMULATOR_OBJECT_NAME, - "createQueue", new Object[]{_resourceObjectName = createResourceName()}, - new String[]{ObjectName.class.getName()}); - - members = serviceGroup.getMembers(); - assertEquals( - "One resource has just been created so " + - "I expect to find it on service group children list...", - 1, - members.length); - - _resourceClient = members[0]; - _mbeanInfo = _managementServer.getMBeanInfo(_resourceObjectName); - } - - /** - * Shutdown procedure for this test case. - * - * @throws Exception when either the server or some resource fails to shutdown. - */ - @Override - protected void tearDown() throws Exception - { - ServiceGroupClient serviceGroup = getServiceGroupClient(); - WsResourceClient [] members = serviceGroup.getMembers(); - - _managementServer.invoke( - Names.QPID_EMULATOR_OBJECT_NAME, - "unregister", - new Object[]{_resourceObjectName}, - new String[]{ObjectName.class.getName()}); - - members = serviceGroup.getMembers(); - - assertEquals( - "No resource has been yet created so how is it possible that service group children list is not empty?", - 0, - members.length); - } - - /** - * Test the WS-RP GetResourceProperty interface of the WS-DM adapter. - * - *
precondition : a ws resource exists and is registered. - *
postcondition : property values coming from WS-DM resource are the same of the JMX interface. - */ - public void testGetResourcePropertiesOK() throws Exception - { - MBeanAttributeInfo [] attributesMetadata = _mbeanInfo.getAttributes(); - for (MBeanAttributeInfo attributeMetadata : attributesMetadata) - { - String name = attributeMetadata.getName(); - Object propertyValues = _resourceClient.getPropertyAsObject( - new QName( - Names.NAMESPACE_URI, - name, - Names.PREFIX), - Class.forName(attributeMetadata.getType())); - - int length = Array.getLength(propertyValues); - if (length != 0) - { - Object propertyValue = Array.get(propertyValues, 0); - - assertEquals( - "Comparison failed for property "+name, - _managementServer.getAttribute(_resourceObjectName,name), - propertyValue); - } else { - assertNull( - String.format( - "\"%s\" property value shouldn't be null. Its value is %s", - name, - _managementServer.getAttribute(_resourceObjectName,name)), - _managementServer.getAttribute(_resourceObjectName,name)); - } - } - } - - /** - * Test the WS-RP SetResourceProperty interface of the WS-DM adapter. + * Gets the test suite composition. * - *
precondition : a WS-Resource exists and is registered. - *
postcondition : property values are correctly updated on the target WS-Resource.. + * @return the test suite composition. */ - public void testSetResourcePropertiesOK() throws Exception + public static Test suite() { - Map sampleMap = new HashMap(); - sampleMap.put("Key1", "BLABALABLABALBAL"); - sampleMap.put("Key2", 182838484l); - sampleMap.put("Key3", -928376362); - sampleMap.put("Key4", 23762736276.33D); - sampleMap.put("Key4", 2327363.2F); - - Map sampleValues = new HashMap(); - sampleValues.put(String.class.getName(),"SAMPLE_STRING"); - sampleValues.put(UUID.class.getName(),UUID.randomUUID()); - sampleValues.put(Boolean.class.getName(),Boolean.FALSE); - sampleValues.put(Map.class.getName(),sampleMap); - sampleValues.put(Long.class.getName(),283781273L); - sampleValues.put(Integer.class.getName(),12727); - sampleValues.put(Short.class.getName(),new Short((short)22)); - sampleValues.put(Date.class.getName(),new Date()); - - MBeanAttributeInfo [] attributesMetadata = _mbeanInfo.getAttributes(); - boolean atLeastThereIsOneWritableProperty = false; - - for (MBeanAttributeInfo attributeMetadata : attributesMetadata) - { - String name = attributeMetadata.getName(); - - if (attributeMetadata.isWritable()) - { - atLeastThereIsOneWritableProperty = true; - Object sampleValue = sampleValues.get(attributeMetadata.getType()); - Object []values = new Object[]{sampleValue}; - - Object result = _managementServer.getAttribute(_resourceObjectName, name); - if (result == null) - { - _resourceClient.insertResourceProperty( - new QName( - Names.NAMESPACE_URI, - name, - Names.PREFIX), - values); - } else - { - _resourceClient.updateResourceProperty( - new QName( - Names.NAMESPACE_URI, - name, - Names.PREFIX), - values); - } - - Object propertyValues = _resourceClient.getPropertyAsObject( - new QName( - Names.NAMESPACE_URI, - name, - Names.PREFIX), - Class.forName(attributeMetadata.getType())); - int length = Array.getLength(propertyValues); - if (length != 0) - { - Object propertyValue = Array.get(propertyValues, 0); - - assertEquals( - "Comparison failed for property "+name, - sampleValue, - propertyValue); - } else { - assertNull( - String.format( - "\"%s\" property value shouldn't be null. Its value is %s", - name, - _managementServer.getAttribute(_resourceObjectName,name)), - sampleValue); - } - } - } - assertTrue( - "It's not possibile to run successfully this test case if " + - "the target WS-Resource has no at least one writable property", - atLeastThereIsOneWritableProperty); - } - - /** - * Test the WS-RP SetResourceProperty interface of the WS-DM adapter when the - * target property is null. - * According to WS-RP specs this operation is not allowed because in this case a SetResourceProperty with an "Insert" - * message should be sent in order to initialize the property. - * - *
precondition : a ws resource exists and is registered. The value of the target property is null. - *
postcondition : a Soap fault is received indicating the failuire. - */ - public void testSetResourcePropertiesKO() throws Exception - { - Object typePropertyValue = _managementServer.getAttribute(_resourceObjectName, "Type"); - assertNull(typePropertyValue); - - try - { - _resourceClient.updateResourceProperty( - new QName( - Names.NAMESPACE_URI, - "Type", - Names.PREFIX), - new Object[]{"sampleValue"}); - fail( - "If the property is null on the target ws resource, according " + - "to WS-RP specs, an update of its value is not possible."); - } catch(SoapFault expected) - { - - } - } - - /** - * Tests the WS-RP PutResourcePropertyDocument interface of the WS-DM adapter. - * - *
precondition : a ws resource exists and is registered. - *
postcondition : A read / write property is correctly set according to WSRP interface. - */ - public void testGetAndPutResourcePropertyDocumentOK() throws Exception - { - String expectedMgmtPubIntervalValue = "4321"; - String propertyName = "MgmtPubInterval"; - - Element propertiesDocument = _resourceClient.getResourcePropertyDocument(); - Element [] properties = XmlUtils.getAllElements(propertiesDocument); - - for (Element element : properties) - { - if (propertyName.equals(element.getLocalName())) { - element.setTextContent(expectedMgmtPubIntervalValue); - } else { - propertiesDocument.removeChild(element); - } - } - - _resourceClient.putResourcePropertyDocument(propertiesDocument); - - Element newProperties = _resourceClient.getResourcePropertyDocument(); - - Element mgmtPubInterval = XmlUtils.getElement( - newProperties, new QName( - Names.NAMESPACE_URI, - propertyName, - Names.PREFIX)); - - assertEquals(expectedMgmtPubIntervalValue,mgmtPubInterval.getTextContent()); - } - - /** - * Tests the WS-RP PutResourcePropertyDocument interface of the WS-DM adapter. - * Specifically it tries to update the value of a read-only property. - * - *
precondition : a ws resource exists, it is registered and has at least one read-only property. - *
postcondition : An exception is thrown indicating the failure. - */ - public void testGetAndPutResourcePropertyDocumentKO_WithReadOnlyProperty() throws Exception - { - String propertyName = "Name"; - - Element propertiesDocument = _resourceClient.getResourcePropertyDocument(); - Element [] properties = XmlUtils.getAllElements(propertiesDocument); - - for (Element element : properties) - { - if (propertyName.equals(element.getLocalName())) { - element.setTextContent("ThisIsTheNewValueOfNameProperty"); - } else { - propertiesDocument.removeChild(element); - } - } - - try - { - _resourceClient.putResourcePropertyDocument(propertiesDocument); - fail("It's not possible to update the value of a read-only property."); - } catch (SoapFault expected) - { - - } - } - - /** - * Test the WS-RP GetResourceProperties interface of the WS-DM adapter. - * - *
precondition : a ws resource exists and is registered. - *
postcondition : Properties are correctly returned according to WSRP interface and they (their value) - * are matching with corresponding MBean properties. - */ - public void testGetMultipleResourcePropertiesOK() throws Exception - { - MBeanAttributeInfo [] attributesMetadata = _mbeanInfo.getAttributes(); - QName[] names = new QName[attributesMetadata.length]; - - int index = 0; - for (MBeanAttributeInfo attributeMetadata : _mbeanInfo.getAttributes()) - { - QName qname = new QName(Names.NAMESPACE_URI,attributeMetadata.getName(),Names.PREFIX); - names[index++] = qname; - } - - Element[] properties =_resourceClient.getMultipleResourceProperties(names); - for (Element element : properties) - { - String name = element.getLocalName(); - Object value = _managementServer.getAttribute(_resourceObjectName, name); - if ("Name".equals(name)) - { - assertEquals( - value, - element.getTextContent()); - } else if ("Durable".equals(name)) - { - assertEquals( - value, - Boolean.valueOf(element.getTextContent())); - } else if ("ExpireTime".equals(name)) - { - assertEquals( - value, - new Date(Long.valueOf(element.getTextContent()))); - } else if ("MsgTotalEnqueues".equals(name)) - { - assertEquals( - value, - Long.valueOf(element.getTextContent())); - } else if ("ConsumerCount".equals(name)) - { - assertEquals( - value, - Integer.valueOf(element.getTextContent())); - }else if ("VhostRef".equals(name)) - { - assertEquals( - value, - UUID.fromString(element.getTextContent())); - } - } - } - - /** - * Test operation invocation on WS-Resource. - * This method tests the exchange of simple types between requestor and service provider. - * With simple types we mean : - * - *
    - *
  • java.lang.Long / long (xsd:long) - *
  • java.lang.Integer / int (xsd:int / xsd:integer) - *
  • java.lang.Double/ double (xsd:double) - *
  • java.lang.Float / float (xsd:float) - *
  • java.lang.Short / short (xsd:short) - *
  • java.lang.Boolean / boolean (xsd:boolean) - *
  • java.lang.String (xsd:string) - *
  • java.net.URI (xsd:anyURI) - *
  • java.util.Date(xsd:dateTime) - *
- * - *
precondition : a ws resource exists and is registered and the requested operation is available on that. - *
postcondition : invocations are executed successfully, no exception is thrown and parameters are correctly returned. - */ - @SuppressWarnings("unchecked") - public void testOperationInvocationOK_withSimpleTypes() throws Exception - { - Long expectedLongResult = new Long(1373); - Boolean expectedBooleanResult = Boolean.TRUE; - Double expectedDoubleResult = new Double(12763.44); - Float expectedFloatResult = new Float(2727.233f); - Integer expectedIntegerResult = new Integer(28292); - Short expectedShortResult = new Short((short)227); - String expectedStringResult = "expectedStringResult"; - URI expectedUriResult = URI.create("http://qpid.apache.org/"); - Date expectedDateResult = new Date(); - - Object result = _resourceClient.invoke( - _invocationHandlers.get("echoWithSimpleTypes"), - new Object[]{ - expectedLongResult, - expectedBooleanResult, - expectedDoubleResult, - expectedFloatResult, - expectedIntegerResult, - expectedShortResult, - expectedStringResult, - expectedUriResult, - expectedDateResult}); - - Method getStatusCode = result.getClass().getMethod("getStatusCode"); - Method getOutputParameters = result.getClass().getMethod("getOutputParameters"); - assertEquals(retCodeOk,getStatusCode.invoke(result)); - Map out = (Map) getOutputParameters.invoke(result); - - assertEquals("Output parameters must be 9.",9,out.size()); - assertTrue("Long output parameter not found on result object.",out.containsValue(expectedLongResult)); - assertTrue("Boolean output parameter not found on result object.",out.containsValue(expectedBooleanResult)); - assertTrue("Double output parameter not found on result object.",out.containsValue(expectedDoubleResult)); - assertTrue("Float output parameter not found on result object.",out.containsValue(expectedFloatResult)); - assertTrue("Integer output parameter not found on result object.",out.containsValue(expectedIntegerResult)); - assertTrue("Short output parameter not found on result object.",out.containsValue(expectedShortResult)); - assertTrue("String output parameter not found on result object.",out.containsValue(expectedStringResult)); - assertTrue("URI output parameter not found on result object.",out.containsValue(expectedUriResult)); - assertTrue("Date output parameter not found on result object.",out.containsValue(expectedDateResult)); - } - - /** - * Test operation invocation on WS-Resource. - * This method tests the exchange of arrays between requestor and service provider. - * For this test exchanged arrays contain : - * - *
    - *
  • java.lang.Long (xsd:long) - *
  • java.lang.Integer (xsd:int / xsd:integer) - *
  • java.lang.Double (xsd:double) - *
  • java.lang.Float (xsd:float) - *
  • java.lang.Short (xsd:short) - *
  • java.lang.Boolean (xsd:boolean) - *
  • java.lang.String (xsd:string) - *
  • java.net.URI (xsd:anyURI) - *
  • java.util.Date(xsd:dateTime) - *
- * - *
precondition : a ws resource exists and is registered and the requested operation is available on that. - *
postcondition : invocations are executed successfully, no exception is thrown and parameters are correctly returned. - */ - @SuppressWarnings("unchecked") - public void testOperationInvocationOK_withWrapperArrays() throws Exception - { - Long [] expectedLongResult = {new Long(2),new Long(1),new Long(3),new Long(4)}; - Boolean [] expectedBooleanResult = { Boolean.TRUE,Boolean.FALSE,Boolean.FALSE}; - Double [] expectedDoubleResult = {12763.44d,2832.33d,2292.33d,22293.22d}; - Float [] expectedFloatResult = {2727.233f,1f,2f,4f,5.4f,33.2f}; - Integer [] expectedIntegerResult = {1,2,3,4,55,66,77,88,99}; - Short [] expectedShortResult = {(short)227,(short)23,(short)9}; - String [] expectedStringResult = {"s1","s2","s333","s4"}; - URI [] expectedUriResult = { - URI.create("http://qpid.apache.org/"), - URI.create("http://www.apache.org"), - URI.create("http://projects.apache.org")}; - - Date [] expectedDateResult = { - new Date(), - new Date(38211897), - new Date(903820382)}; - - Object result = _resourceClient.invoke( - _invocationHandlers.get("echoWithArrays"), - new Object[]{ - expectedLongResult, - expectedBooleanResult, - expectedDoubleResult, - expectedFloatResult, - expectedIntegerResult, - expectedShortResult, - expectedStringResult, - expectedUriResult, - expectedDateResult}); - - Method getStatusCode = result.getClass().getMethod("getStatusCode"); - Method getOutputParameters = result.getClass().getMethod("getOutputParameters"); - assertEquals(retCodeOk,getStatusCode.invoke(result)); - Map out = (Map) getOutputParameters.invoke(result); - - assertEquals("Output parameters must be 9.",9,out.size()); - assertTrue("Long array doesn't match.",Arrays.equals(expectedLongResult, (Long[])out.get(Long.class.getName()))); - assertTrue("Boolean array doesn't match.",Arrays.equals(expectedBooleanResult, (Boolean[])out.get(Boolean.class.getName()))); - assertTrue("Double array doesn't match.",Arrays.equals(expectedDoubleResult, (Double[])out.get(Double.class.getName()))); - assertTrue("Float array doesn't match.",Arrays.equals(expectedFloatResult, (Float[])out.get(Float.class.getName()))); - assertTrue("Integer array doesn't match.", Arrays.equals(expectedIntegerResult, (Integer[])out.get(Integer.class.getName()))); - assertTrue("Short array doesn't match.",Arrays.equals(expectedShortResult, (Short[])out.get(Short.class.getName()))); - assertTrue("String array doesn't match.",Arrays.equals(expectedStringResult, (String[])out.get(String.class.getName()))); - assertTrue("URI array doesn't match.",Arrays.equals(expectedUriResult, (URI[])out.get(URI.class.getName()))); - assertTrue("Date array doesn't match.",Arrays.equals(expectedDateResult, (Date[])out.get(Date.class.getName()))); - } - - /** - * Test operation invocation on WS-Resource. - * This method tests the exchange of primitive type arrays between requestor and service provider. - * NOte that even the sent array contain primtiive type QMan deals only with objects so in the result - * object you will find the corresponding wrapper types. - * - * For this test exchanged arrays contain : - * - *
    - *
  • java.lang.Long / long (xsd:long) - *
  • java.lang.Integer / int (xsd:int / xsd:integer) - *
  • java.lang.Double/ double (xsd:double) - *
  • java.lang.Float / float (xsd:float) - *
  • java.lang.Short / short (xsd:short) - *
  • java.lang.Boolean / boolean (xsd:boolean) - *
- * - *
precondition : a ws resource exists and is registered and the requested operation is available on that. - *
postcondition : invocations are executed successfully, no exception is thrown and parameters are correctly returned. - */ - @SuppressWarnings("unchecked") - public void testOperationInvocationOK_withPrimitiveArrays() throws Exception - { - long [] expectedLongResult = {1L,2L,3L,4L}; - boolean [] expectedBooleanResult = { true,false,false}; - double [] expectedDoubleResult = {12763.44d,2832.33d,2292.33d,22293.22d}; - float [] expectedFloatResult = {2727.233f,1f,2f,4f,5.4f,33.2f}; - int [] expectedIntegerResult = {1,2,3,4,55,66,77,88,99}; - short [] expectedShortResult = {(short)227,(short)23,(short)9}; - - Object result = _resourceClient.invoke( - _invocationHandlers.get("echoWithSimpleTypeArrays"), - new Object[]{ - expectedLongResult, - expectedBooleanResult, - expectedDoubleResult, - expectedFloatResult, - expectedIntegerResult, - expectedShortResult}); - - Method getStatusCode = result.getClass().getMethod("getStatusCode"); - Method getOutputParameters = result.getClass().getMethod("getOutputParameters"); - assertEquals(retCodeOk,getStatusCode.invoke(result)); - Map out = (Map) getOutputParameters.invoke(result); - - assertEquals("Output parameters must be 6.",6,out.size()); - assertArrayEquals(expectedLongResult, out.get(long.class.getName())); - assertArrayEquals(expectedBooleanResult, out.get(boolean.class.getName())); - assertArrayEquals(expectedDoubleResult, out.get(double.class.getName())); - assertArrayEquals(expectedFloatResult, out.get(float.class.getName())); - assertArrayEquals(expectedIntegerResult, out.get(int.class.getName())); - assertArrayEquals(expectedShortResult, out.get(short.class.getName())); - } - - /** - * Test operation invocation on WS-Resource. - * This method tests the exchange of a byte type array between requestor and service provider. - * - *
precondition : a WS-Resource exists and is registered and the requested operation is available on that. - *
postcondition : invocations are executed successfully, no exception is thrown and byte array are correctly returned. - */ - @SuppressWarnings("unchecked") - public void testOperationInvocationOK_withByteArray() throws Exception - { - byte [] expectedByteResult = {1,3,4,2,2,44,22,3,3,55,66}; - - Object result = _resourceClient.invoke( - _invocationHandlers.get("echoWithByteArray"), - new Object[]{expectedByteResult}); - - Method getStatusCode = result.getClass().getMethod("getStatusCode"); - Method getOutputParameters = result.getClass().getMethod("getOutputParameters"); - - assertEquals(retCodeOk,getStatusCode.invoke(result)); - Map out = (Map) getOutputParameters.invoke(result); - - assertEquals("Output parameters must be 1.",1,out.size()); - assertArrayEquals(expectedByteResult, out.get(byte[].class.getName())); - } - - /** - * Test a simple operation invocation on a WS-Resource. - * This method tests a simple operation without any input and output parameters. - * - *
precondition : a ws resource exists and is registered and the requested operation is available on that. - *
postcondition : invocations are executed successfully an no exception is thrown. - */ - @SuppressWarnings("unchecked") - public void testSimpleOperationInvocationOK() throws Exception - { - Object result = _resourceClient.invoke( - _invocationHandlers.get("voidWithoutArguments"), - null); - - Method getStatusCode = result.getClass().getMethod("getStatusCode"); - assertEquals( - "Something was wrong...expected return code is "+retCodeOk, - retCodeOk, - getStatusCode.invoke(result)); - } - - /** - * Test a the invocation on a WS-Resource with a method that throws an exception.. - * - *
precondition : a ws resource exists and is registered and the requested operation is available on that. - *
postcondition : an exception is thrown by the requested method. - */ - @SuppressWarnings("unchecked") - public void testInvocationException_OK() throws Exception - { - try - { - _resourceClient.invoke( - _invocationHandlers.get("throwsException"), - null); - fail("The requested operation has thrown an exception so a Soap Fault is expected..."); - } catch(SoapFault expected) - { - } - } - - /** - * Test operation invocation on WS-Resource. - * This method tests the exchange of UUID type between requestor and service provider. - * - *
precondition : a WS-Resource exists and is registered and the requested operation is available on that. - *
postcondition : invocations are executed successfully, no exception is thrown and parameters are correctly returned. - */ - @SuppressWarnings("unchecked") - public void testOperationInvocationOK_withUUID() throws Exception - { - UUID expectedUuid = UUID.randomUUID(); - - Object result = _resourceClient.invoke( - _invocationHandlers.get("echoWithUUID"), - new Object[]{expectedUuid}); - - Method getStatusCode = result.getClass().getMethod("getStatusCode"); - Method getOutputParameters = result.getClass().getMethod("getOutputParameters"); - - assertEquals(retCodeOk,getStatusCode.invoke(result)); - Map out = (Map) getOutputParameters.invoke(result); - - assertEquals("Output parameters must be 1.",1,out.size()); - assertEquals(expectedUuid, out.get("uuid")); - } - - /** - * Test operation invocation on WS-Resource. - * This method tests the exchange of Map type between requestor and service provider. - * For this test exchanged arrays contain : - * - *
precondition : a ws resource exists and is registered and the requested operation is available on that. - *
postcondition : invocations are executed successfully, no exception is thrown and parameters are correctly returned. - */ - @SuppressWarnings("unchecked") - public void testOperationInvocationOK_withMap() throws Exception - { - Map expectedMap = new HashMap(); - expectedMap.put("p1", new Long(1)); - expectedMap.put("p2", Boolean.TRUE); - expectedMap.put("p3", 1234d); - expectedMap.put("p4", 11.2f); - expectedMap.put("p5", 1272); - expectedMap.put("p6", (short)12); - expectedMap.put("p7", "aString"); - expectedMap.put("p8", "http://qpid.apache.org"); - expectedMap.put("p9", new Date(12383137128L)); - expectedMap.put("p10", new byte[]{1,2,2,3,3,4}); - - Object result = _resourceClient.invoke( - _invocationHandlers.get("echoWithMap"), - new Object[]{expectedMap}); - - Method getStatusCode = result.getClass().getMethod("getStatusCode"); - Method getOutputParameters = result.getClass().getMethod("getOutputParameters"); - - assertEquals(retCodeOk,getStatusCode.invoke(result)); - Map out = (Map) ((Map) getOutputParameters.invoke(result)).get("map"); - - assertEquals("Output parameters must be 10.",10,out.size()); - assertEquals(expectedMap.get("p1"),out.get("p1")); - assertEquals(expectedMap.get("p2"),out.get("p2")); - assertEquals(expectedMap.get("p3"),out.get("p3")); - assertEquals(expectedMap.get("p4"),out.get("p4")); - assertEquals(expectedMap.get("p5"),out.get("p5")); - assertEquals(expectedMap.get("p6"),out.get("p6")); - assertEquals(expectedMap.get("p7"),out.get("p7")); - assertEquals(expectedMap.get("p8"),out.get("p8")); - assertEquals(expectedMap.get("p9"),out.get("p9")); - assertTrue( Arrays.equals((byte[])expectedMap.get("p10"),(byte[])out.get("p10"))); - } - - /** - * Main entry point for running this test case. - * - * @return the decorated test case. - */ - public static Test suite() { - TestSuite suite = new TestSuite("Test Suite for WS-DM Adapter"); - suite.addTestSuite(WsDmAdapterTest.class); + TestSuite suite = new TestSuite("Test suite for QMan WS-DM."); + suite.addTestSuite(MetadataExchangeInterfaceTestCase.class); + suite.addTestSuite(OperationInvocationInterfaceTestCase.class); + suite.addTestSuite(GetResourcePropertyDocumentTestCase.class); + suite.addTestSuite(SetResourcePropertiesTestCase.class); + suite.addTestSuite(GetMultipleResourcePropertiesTestCase.class); return new WsDmAdapterTestSetup(suite); } /** - * Creates a service group client reference. - * - * @return a service group client reference. - */ - private ServiceGroupClient getServiceGroupClient() - { - URI address = URI.create( - Protocol.DEFAULT_ENDPOINT_URI.replaceFirst("8080",System.getProperty(Names.ADAPTER_PORT_PROPERTY_NAME))); - return new ServiceGroupClient(new EndpointReference(address)); - } - - /** - * In order to test the behaviour of the WS-DM adapter, at - * least one resource must be created. This is the method that - * returns the name (ObjectName on JMX side, Resource-ID on WSDM side) - * of that resource - * - * @return the name of the MBean instance that will be created. - * @throws Exception when the name if malformed. Practically never. - */ - private ObjectName createResourceName() throws Exception - { - return new ObjectName( - "Q-MAN:objectId="+UUID.randomUUID()+ - ", brokerID="+UUID.randomUUID()+ - ",class=queue"+ - ",package=org.apache.qpid"+ - ",name="+System.currentTimeMillis()); - } - - private Map createInvocationHandlers() - { - Map handlers = new HashMap(); - - ProxyHandler handler = new ReflectionProxyHandler(); - handler.setAction(Names.NAMESPACE_URI+"/"+"voidWithoutArguments"); - handler.setRequestName( - new QName( - Names.NAMESPACE_URI, - "voidWithoutArgumentsRequest", - Names.PREFIX)); - handler.setRequestParameterNames(new QName[]{}); - handler.setResponseName( - new QName( - Names.NAMESPACE_URI, - "voidWithoutArgumentsResponse", - Names.PREFIX)); - handler.setReturnType(Result.class); - - ProxyHandler exceptionHandler = new ReflectionProxyHandler(); - exceptionHandler.setAction(Names.NAMESPACE_URI+"/"+"throwsException"); - exceptionHandler.setRequestName( - new QName( - Names.NAMESPACE_URI, - "throwsExceptionRequest", - Names.PREFIX)); - - exceptionHandler.setRequestParameterNames(new QName[]{}); - exceptionHandler.setResponseName( - new QName( - Names.NAMESPACE_URI, - "throwsExceptionResponse", - Names.PREFIX)); - - exceptionHandler.setReturnType(Result.class); - - ProxyHandler echoWithWrapperTypesHandler = new ReflectionProxyHandler(); - echoWithWrapperTypesHandler.setAction(Names.NAMESPACE_URI+"/"+"echoWithSimpleTypes"); - echoWithWrapperTypesHandler.setRequestName( - new QName( - Names.NAMESPACE_URI, - "echoWithSimpleTypesRequest", - Names.PREFIX)); - - echoWithWrapperTypesHandler.setRequestParameterNames(new QName[]{ - new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p2",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p3",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p4",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p5",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p6",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p7",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p8",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p9",Names.PREFIX), - }); - - echoWithWrapperTypesHandler.setResponseName( - new QName( - Names.NAMESPACE_URI, - "echoWithSimpleTypesResponse", - Names.PREFIX)); - - echoWithWrapperTypesHandler.setReturnType(Result.class); - - ProxyHandler echoWithArrayOfWrapperTypes = new ReflectionProxyHandler(); - echoWithArrayOfWrapperTypes.setAction(Names.NAMESPACE_URI+"/"+"echoWithArrays"); - echoWithArrayOfWrapperTypes.setRequestName( - new QName( - Names.NAMESPACE_URI, - "echoWithArraysRequest", - Names.PREFIX)); - - echoWithArrayOfWrapperTypes.setRequestParameterNames(new QName[]{ - new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p2",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p3",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p4",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p5",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p6",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p7",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p8",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p9",Names.PREFIX), - }); - - echoWithArrayOfWrapperTypes.setResponseName( - new QName( - Names.NAMESPACE_URI, - "echoWithArraysResponse", - Names.PREFIX)); - - echoWithArrayOfWrapperTypes.setReturnType(Result.class); - - ProxyHandler echoWithArrayOfPrimitiveTypes = new ReflectionProxyHandler(); - echoWithArrayOfPrimitiveTypes.setAction(Names.NAMESPACE_URI+"/"+"echoWithSimpleTypeArrays"); - echoWithArrayOfPrimitiveTypes.setRequestName( - new QName( - Names.NAMESPACE_URI, - "echoWithSimpleTypeArraysRequest", - Names.PREFIX)); - - echoWithArrayOfPrimitiveTypes.setRequestParameterNames(new QName[]{ - new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p2",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p3",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p4",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p5",Names.PREFIX), - new QName(Names.NAMESPACE_URI,"p6",Names.PREFIX)}); - - echoWithArrayOfPrimitiveTypes.setResponseName( - new QName( - Names.NAMESPACE_URI, - "echoWithSimpleTypeArraysResponse", - Names.PREFIX)); - - echoWithArrayOfPrimitiveTypes.setReturnType(Result.class); - - ProxyHandler echoWithByteArray = new EnhancedReflectionProxyHandler(); - echoWithByteArray.setAction(Names.NAMESPACE_URI+"/"+"echoWithByteArray"); - echoWithByteArray.setRequestName( - new QName( - Names.NAMESPACE_URI, - "echoWithByteArrayRequest", - Names.PREFIX)); - - echoWithByteArray.setRequestParameterNames( - new QName[]{ - new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX)}); - - echoWithByteArray.setResponseName( - new QName( - Names.NAMESPACE_URI, - "echoWithByteArrayResponse", - Names.PREFIX)); - - echoWithByteArray.setReturnType(Result.class); - - ProxyHandler echoWithUUID = new EnhancedReflectionProxyHandler(); - echoWithUUID.setAction(Names.NAMESPACE_URI+"/"+"echoWithUUID"); - echoWithUUID.setRequestName( - new QName( - Names.NAMESPACE_URI, - "echoWithUUIDRequest", - Names.PREFIX)); - - echoWithUUID.setRequestParameterNames( - new QName[]{ - new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX)}); - - echoWithUUID.setResponseName( - new QName( - Names.NAMESPACE_URI, - "echoWithUUIDResponse", - Names.PREFIX)); - - echoWithUUID.setReturnType(Result.class); - - ProxyHandler echoWithMap = new EnhancedReflectionProxyHandler(); - echoWithMap.setAction(Names.NAMESPACE_URI+"/"+"echoWithMap"); - echoWithMap.setRequestName( - new QName( - Names.NAMESPACE_URI, - "echoWithMapRequest", - Names.PREFIX)); - - echoWithMap.setRequestParameterNames( - new QName[]{ - new QName(Names.NAMESPACE_URI,"p1",Names.PREFIX)}); - - echoWithMap.setResponseName( - new QName( - Names.NAMESPACE_URI, - "echoWithMapResponse", - Names.PREFIX)); - - echoWithMap.setReturnType(Result.class); - - handlers.put("voidWithoutArguments",handler); - handlers.put("echoWithSimpleTypes",echoWithWrapperTypesHandler); - handlers.put("echoWithArrays",echoWithArrayOfWrapperTypes); - handlers.put("echoWithSimpleTypeArrays", echoWithArrayOfPrimitiveTypes); - handlers.put("echoWithByteArray", echoWithByteArray); - handlers.put("echoWithUUID", echoWithUUID); - handlers.put("echoWithMap", echoWithMap); - handlers.put("throwsException",exceptionHandler); - return handlers; - } - - /** - * Internal method used for array comparison using reflection. + * Finds a free port that will be used to run the embedded + * web server. * - * @param expectedArray the expected array. - * @param resultArray the array that must match the expected one. + * @return a free port that will be used to run the + * embedded web server. */ - private void assertArrayEquals(Object expectedArray, Object resultArray) - { - int expectedArrayLength = Array.getLength(expectedArray); - int resultArrayLength = Array.getLength(resultArray); - - assertEquals(expectedArrayLength,resultArrayLength); - - for (int index = 0; index < expectedArrayLength; index++) - { - Object expected = Array.get(expectedArray, index); - Object result = Array.get(resultArray, index); - - assertEquals(expected,result); - } - } - - public static int getFreePort() throws IOException { + private static int getFreePort() throws IOException { ServerSocket server = null; try { -- cgit v1.2.1