diff options
| author | Arnaud Simon <arnaudsimon@apache.org> | 2008-09-29 14:06:18 +0000 |
|---|---|---|
| committer | Arnaud Simon <arnaudsimon@apache.org> | 2008-09-29 14:06:18 +0000 |
| commit | d7ab38dbf99d6f716d4b8843d1f64b327c35ce98 (patch) | |
| tree | 09f0dffa65691cd8df5cb69fa7cd640b4f3363e1 /java | |
| parent | 6686ec84f655769ae4ee4eb09d6362d66f4eb8d4 (diff) | |
| download | qpid-python-d7ab38dbf99d6f716d4b8843d1f64b327c35ce98.tar.gz | |
qpid-1284: Qman unit tests
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@700134 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java')
19 files changed, 2386 insertions, 0 deletions
diff --git a/java/client/src/test/java/org/apache/qpid/management/TestConstants.java b/java/client/src/test/java/org/apache/qpid/management/TestConstants.java new file mode 100644 index 0000000000..1ed938d9fd --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/TestConstants.java @@ -0,0 +1,48 @@ +/* + * + * 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; + +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import org.apache.qpid.management.domain.model.DomainModel; +import org.apache.qpid.management.domain.model.type.Binary; + +public interface TestConstants +{ + String QPID_PACKAGE_NAME = "qpid"; + String EXCHANGE_CLASS_NAME = "exchange"; + Binary HASH = new Binary(new byte []{1,2,3,4,5,6,7,8,9}); + int VALID_CODE = 1; + + + UUID BROKER_ID = UUID.randomUUID(); + Binary OBJECT_ID = new Binary(new byte []{1,2,3,2,1,1,2,3}); + + DomainModel DOMAIN_MODEL = new DomainModel(BROKER_ID); + + List<Map<String, Object>> EMPTY_PROPERTIES_SCHEMA = new LinkedList<Map<String,Object>>(); + List<Map<String, Object>> EMPTY_STATISTICS_SCHEMA = new LinkedList<Map<String,Object>>(); + List<Map<String, Object>> EMPTY_METHODS_SCHEMA = new LinkedList<Map<String,Object>>(); + List<Map<String, Object>> EMPTY_EVENTS_SCHEMA = new LinkedList<Map<String,Object>>(); +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/configuration/AccessModeMappingTest.java b/java/client/src/test/java/org/apache/qpid/management/configuration/AccessModeMappingTest.java new file mode 100644 index 0000000000..4c53c3d428 --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/configuration/AccessModeMappingTest.java @@ -0,0 +1,107 @@ +/* + * + * 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.configuration; + +import org.apache.qpid.management.TestConstants; +import org.apache.qpid.management.domain.model.AccessMode; + +import junit.framework.TestCase; + +/** + * Test case for AccessMode mapping. + * + * @author Andrea Gazzarini + */ +public class AccessModeMappingTest extends TestCase +{ + private AccessModeMapping _mapping; + + /** + * Set up fixture for this test case. + */ + @Override + protected void setUp () throws Exception + { + _mapping = new AccessModeMapping(); + } + + /** + * Tests the execution of the setCode method when a valid code is given. + * + * <br>precondition : given code is a valid number. + * <br>postcondition : no exception is thrown and the mapping contained the requested code. + */ + public void testSetCodeOK() + { + _mapping.setCode(String.valueOf(TestConstants.VALID_CODE)); + assertEquals(TestConstants.VALID_CODE,_mapping.getCode()); + } + + /** + * Tests the execution of the setCode method when an invalid code is given. + * + * <br>precondition : given code is an invalid number. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testSetCodeKO_withInvalidNumber () + { + try { + _mapping.setCode(String.valueOf(TestConstants.VALID_CODE)+"a"); + fail("The given string is not a number and therefore an exception must be thrown."); + } catch(NumberFormatException expected) { + + } + } + + /** + * Tests the execution of the setAccessMode method when a valid access code is given. + * + * <br>precondition : given code is valid (i.e. RW, RC or RO). + * <br>postcondition : no exception is thrown and the mapping contained the requested access mode. + */ + public void testSetAccessModeOK() + { + _mapping.setAccessMode("RW"); + assertEquals(AccessMode.RW,_mapping.getAccessMode()); + + _mapping.setAccessMode("RC"); + assertEquals(AccessMode.RC,_mapping.getAccessMode()); + + _mapping.setAccessMode("RO"); + assertEquals(AccessMode.RO,_mapping.getAccessMode()); + } + + /** + * Tests the execution of the setAccessMode method when an unknown code is given. + * + * <br>precondition : given code is an unknown code. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testSetAccessModeKO () + { + try { + _mapping.setAccessMode(AccessMode.RW.toString()+"X"); + fail("The given string is not a string representation of a valid access mode."); + } catch(IllegalArgumentException expected) { + + } + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/configuration/ConfigurationTest.java b/java/client/src/test/java/org/apache/qpid/management/configuration/ConfigurationTest.java new file mode 100644 index 0000000000..c948db59bf --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/configuration/ConfigurationTest.java @@ -0,0 +1,237 @@ +/* + * + * 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.configuration; + +import java.util.Map; +import java.util.UUID; + +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. + * + * @author Andrea Gazzarini + */ +public class ConfigurationTest extends TestCase +{ + /** + * Tests the singleton behaviour of the configuration object. + */ + public void testSingleton() + { + assertSame(Configuration.getInstance(),Configuration.getInstance()); + } + + /** + * Tests the execution of getType() method when a valid code is supplied. + * + * <br>precondition : the requested type already exist on the configuration. + * <br>postcondition : the requested type is returned and no exception is thrown. + */ + public void testGetTypeOk() throws UnknownTypeCodeException + { + TypeMapping mapping = new TypeMapping(); + mapping.setCode(String.valueOf(TestConstants.VALID_CODE)); + mapping.setType(Uint8.class.getName()); + 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. + * + * <br>precondition : the requested type doesn't exist on the configuration. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testGetTypeKO() + { + try + { + Configuration.getInstance().getType(TestConstants.VALID_CODE+1); + fail("If an unknwon code is supplied an exception must be thrown."); + } catch (UnknownTypeCodeException expected) + { + assertEquals(TestConstants.VALID_CODE+1,expected.getCode()); + } + } + + /** + * Tests the execution of getAccessMode() method when a valid code is supplied. + * + * <br>precondition : the requested access mode already exist on the configuration. + * <br>postcondition : the requested access mode is returned and no exception is thrown. + */ + public void testGetAccessModeOk() throws UnknownAccessCodeException + { + String accessModeAsString = "RW"; + + AccessModeMapping mapping = new AccessModeMapping(); + mapping.setCode(String.valueOf(TestConstants.VALID_CODE)); + mapping.setAccessMode(accessModeAsString); + 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. + * + * <br>precondition : the requested access mode doesn't exist on the configuration. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testGetAccessModeKO() + { + try + { + Configuration.getInstance().getAccessMode(TestConstants.VALID_CODE+1); + fail("If an unknwon code is supplied an exception must be thrown."); + } catch (UnknownAccessCodeException expected) + { + assertEquals(TestConstants.VALID_CODE+1,expected.getCode()); + } + } + + /** + * Tests the execution of the getBrokerConnectionData when a valid broker id is supplied. + * + * <br>precondition : on configuration a connection data is stored and associated with the supplied id. + * <br>postcondition : the requested connection data is returned and no exception is thrown. + */ + public void testGetBrokerConnectionDataOK() throws Exception + { + BrokerConnectionData connectionData = new BrokerConnectionData(); + connectionData.setHost("host"); + connectionData.setPort("7001"); + connectionData.setInitialPoolCapacity("0"); + connectionData.setMaxPoolCapacity("10"); + connectionData.setMaxWaitTimeout("1"); + Configuration.getInstance().addBrokerConnectionData(TestConstants.BROKER_ID, connectionData); + + BrokerConnectionData result = Configuration.getInstance().getBrokerConnectionData(TestConstants.BROKER_ID); + assertSame(connectionData, result); + } + + /** + * Tests the execution of the getBrokerConnectionData when a unknown broker id is supplied. + * + * <br>precondition : on configuration there's no connection data associated with the supplied id. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testGetBrokerConnectionDataKO_withUnknownBrokerId() + { + UUID brokerId = UUID.randomUUID(); + try + { + Configuration.getInstance().getBrokerConnectionData(brokerId); + fail("If an unknown broker id is supplied then an exception must be thrown."); + } catch(UnknownBrokerException expected) + { + assertEquals(brokerId.toString(),expected.getMessage()); + } + } + + /** + * Tests the execution of the getBrokerConnectionData when a null id is supplied. + * + * <br>precondition : a null broker is given. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testGetBrokerConnectionDataKO_withNullBrokerId() + { + try + { + Configuration.getInstance().getBrokerConnectionData(null); + fail("If a null broker id is supplied then an exception must be thrown."); + } catch(UnknownBrokerException expected) + { + } + } + + /** + * Tests the behaviour of the getManagementQueueHandlers() method. + * + * <br>precondition: 2 management handlers are in stored configuration + * <br>postcondition : 2 management handlers are returned. + */ + public void testGetManagementQueueHandlersOk() + { + String i = "i"; + String c = "c"; + + String instrMessageHandlerClassName = InstrumentationMessageHandler.class.getName(); + String configMessageHandlerClassName = ConfigurationMessageHandler.class.getName(); + + MessageHandlerMapping instrMapping = new MessageHandlerMapping(); + MessageHandlerMapping configMapping = new MessageHandlerMapping(); + + instrMapping.setOpcode(i); + instrMapping.setMessageHandlerClass(instrMessageHandlerClassName); + + configMapping.setOpcode(c); + configMapping.setMessageHandlerClass(configMessageHandlerClassName); + + Configuration.getInstance().addManagementMessageHandlerMapping(instrMapping); + Configuration.getInstance().addManagementMessageHandlerMapping(configMapping); + + Map<Character, IMessageHandler> handlerMappings = Configuration.getInstance().getManagementQueueHandlers(); + + assertEquals(2,handlerMappings.size()); + assertEquals(instrMessageHandlerClassName,handlerMappings.get(instrMapping.getOpcode()).getClass().getName()); + assertEquals(configMessageHandlerClassName,handlerMappings.get(configMapping.getOpcode()).getClass().getName()); + } + + /** + * Tests the behaviour of the getManagementQueueHandlers() method. + * + * <br>precondition: 2 management handlers are in stored configuration + * <br>postcondition : 2 management handlers are returned. + */ + public void testGetMethodReplyQueueHandlersOk() + { + String s = "s"; + + String schemaMessageHandlerClassName = SchemaResponseMessageHandler.class.getName(); + + MessageHandlerMapping schemaMapping = new MessageHandlerMapping(); + + schemaMapping.setOpcode(s); + schemaMapping.setMessageHandlerClass(schemaMessageHandlerClassName); + + Configuration.getInstance().addMethodReplyMessageHandlerMapping(schemaMapping); + + Map<Character, IMessageHandler> handlerMappings = Configuration.getInstance().getMethodReplyQueueHandlers(); + + assertEquals(schemaMessageHandlerClassName,handlerMappings.get(schemaMapping.getOpcode()).getClass().getName()); + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/configuration/ConfiguratorTest.java b/java/client/src/test/java/org/apache/qpid/management/configuration/ConfiguratorTest.java new file mode 100644 index 0000000000..c3fa0c13f3 --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/configuration/ConfiguratorTest.java @@ -0,0 +1,112 @@ +/* + * + * 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.configuration; + +import org.xml.sax.SAXException; + +import junit.framework.TestCase; + +/** + * Test case for configurator. + * + * @author Andrea Gazzarini + * + */ +public class ConfiguratorTest extends TestCase +{ + + /** + * Tests the execution of the configure() method when a inexistent configuration file is used. + * + * <br>precondition : the configuration file doesn't exist. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testConfigureKO_WithConfigFileNotFound() + { + Configurator configurator = getConfiguratorWithDatafileInjected("pippo/pluto/paperino.xml"); + try { + configurator.configure(); + fail("If there's no configuration file the configuration cannot be built."); + } catch(ConfigurationException expected) { + + } + } + + /** + * Tests the execution of the configure() method when configuration file is null. + * + * <br>precondition : the configuration file is null. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testConfigureKO_WithNullConfig() + { + Configurator configurator = getConfiguratorWithDatafileInjected(null); + try { + configurator.configure(); + fail("If there's no configuration file the configuration cannot be built."); + } catch(ConfigurationException expected) { + + } + } + + /** + * Tests the changes of the configurator internal state while configuration file is parsed. + * + * <br>precondition: N.A. + * <br>postcondition: N.A. + */ + public void testDirectorParsing() throws SAXException{ + Configurator configurator = new Configurator(); + + assertSame(Configurator.DEFAULT_PARSER,configurator._currentParser); + + configurator.startElement(null, null, Tag.TYPE_MAPPINGS.toString(), null); + assertSame(configurator._typeMappingParser,configurator._currentParser); + + configurator.startElement(null, null, Tag.ACCESS_MODE_MAPPINGS.toString(), null); + assertSame(configurator._accessModeMappingParser,configurator._currentParser); + + configurator.startElement(null, null, Tag.BROKERS.toString(), null); + assertSame(configurator._brokerConfigurationParser,configurator._currentParser); + + configurator.startElement(null, null, Tag.MANAGEMENT_QUEUE.toString(), null); + assertSame(configurator._managementQueueHandlerParser,configurator._currentParser); + + configurator.startElement(null, null, Tag.METHOD_REPLY_QUEUE.toString(), null); + assertSame(configurator._methodReplyQueueHandlerParser,configurator._currentParser); + } + /** + * Create a stub configurator which returns the given datafile path. + * + * @param filename the configuration file to be injected. + * @return a configurator which returns the given datafile path. + */ + private Configurator getConfiguratorWithDatafileInjected(final String filename) { + return new Configurator() + { + @Override + String getConfigurationFileName () + { + return filename; + } + }; + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/configuration/MappingParsersTest.java b/java/client/src/test/java/org/apache/qpid/management/configuration/MappingParsersTest.java new file mode 100644 index 0000000000..9755c62991 --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/configuration/MappingParsersTest.java @@ -0,0 +1,201 @@ +/* + * + * 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.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; + +/** + * Test case for mapping parsers. + * + * @author Andrea Gazzarini. + */ +public class MappingParsersTest extends TestCase +{ + /** + * Tests the execution of the access mode mapping parser. + * + * <br>precondition: An access mode mapping is built by the parser; + * <br>postcondition: the corresponding access mode is available on the configuration. + */ + public void testAccessModeMappingParser() throws UnknownAccessCodeException + { + AccessModeMappingParser parser = new AccessModeMappingParser(); + parser.setCurrrentAttributeValue(String.valueOf(TestConstants.VALID_CODE)); + parser.setCurrentAttributeName(Tag.CODE.toString()); + parser.setCurrrentAttributeValue("RW"); + parser.setCurrentAttributeName(Tag.VALUE.toString()); + parser.setCurrentAttributeName(Tag.MAPPING.toString()); + + AccessMode result = Configuration.getInstance().getAccessMode(TestConstants.VALID_CODE); + assertEquals(AccessMode.RW,result); + } + + /** + * Tests the execution of the broker connection data mapping parser. + * + * <br>precondition: A broker connection datamapping is built by the parser; + * <br>postcondition: the corresponding connection data is available on the configuration. + */ + public void testBrokerConnectionDataParser() throws UnknownBrokerException + { + String host = "127.0.0.1"; + String port = "7001"; + String virtualHost = "test"; + String username = "username_guest"; + String password ="password_guest"; + + BrokerConnectionDataParser parser = new BrokerConnectionDataParser() + { + @Override + UUID getUUId () + { + return TestConstants.BROKER_ID; + } + }; + + parser.setCurrrentAttributeValue(host); + parser.setCurrentAttributeName(Tag.HOST.toString()); + parser.setCurrrentAttributeValue(port); + parser.setCurrentAttributeName(Tag.PORT.toString()); + parser.setCurrrentAttributeValue(virtualHost); + parser.setCurrentAttributeName(Tag.VIRTUAL_HOST.toString()); + parser.setCurrrentAttributeValue(username); + parser.setCurrentAttributeName(Tag.USER.toString()); + parser.setCurrrentAttributeValue(password); + parser.setCurrentAttributeName(Tag.PASSWORD.toString()); + parser.setCurrentAttributeName(Tag.BROKER.toString()); + + BrokerConnectionData result = Configuration.getInstance().getBrokerConnectionData(TestConstants.BROKER_ID); + + assertEquals(host,result.getHost()); + assertEquals(Integer.parseInt(port),result.getPort()); + assertEquals(virtualHost,result.getVirtualHost()); + assertEquals(username,result.getUsername()); + assertEquals(password,result.getPassword()); + } + + /** + * Tests the execution of the management queue handler mapping parser. + * + * <br>precondition: Two managenent queue handlers mapping are built by the parser; + * <br>postcondition: the corresponding management handlers are available on the configuration. + */ + public void testManagementQueueMessageListenerParser() + { + String instrOpcode = "i"; + String configOpCode = "c"; + + ManagementQueueMessageListenerParser parser = new ManagementQueueMessageListenerParser(); + + parser.setCurrrentAttributeValue(instrOpcode); + parser.setCurrentAttributeName(Tag.OPCODE.toString()); + parser.setCurrrentAttributeValue(InstrumentationMessageHandler.class.getName()); + parser.setCurrentAttributeName(Tag.CLASS_NAME.toString()); + parser.setCurrentAttributeName(Tag.HANDLER.toString()); + + parser.setCurrrentAttributeValue(configOpCode); + parser.setCurrentAttributeName(Tag.OPCODE.toString()); + parser.setCurrrentAttributeValue(ConfigurationMessageHandler.class.getName()); + parser.setCurrentAttributeName(Tag.CLASS_NAME.toString()); + parser.setCurrentAttributeName(Tag.HANDLER.toString()); + + + Map<Character,IMessageHandler> result = Configuration.getInstance().getManagementQueueHandlers(); + + assertEquals(2,result.size()); + + assertEquals(InstrumentationMessageHandler.class,result.get(instrOpcode.charAt(0)).getClass()); + assertEquals(ConfigurationMessageHandler.class,result.get(configOpCode.charAt(0)).getClass()); + } + + /** + * Tests the execution of the method-reply queue handler mapping parser. + * + * <br>precondition: two method-reply queue handler mappings are built by the parser; + * <br>postcondition: the corresponding method-reply handlers are available on the configuration. + */ + public void testMethodReplyQueueMessageListenerParser() + { + String schemaOpcode = "s"; + String configOpCode = "c"; + + MethodReplyQueueMessageListenerParser parser = new MethodReplyQueueMessageListenerParser(); + + parser.setCurrrentAttributeValue(schemaOpcode); + parser.setCurrentAttributeName(Tag.OPCODE.toString()); + parser.setCurrrentAttributeValue(SchemaResponseMessageHandler.class.getName()); + parser.setCurrentAttributeName(Tag.CLASS_NAME.toString()); + parser.setCurrentAttributeName(Tag.HANDLER.toString()); + + parser.setCurrrentAttributeValue(configOpCode); + parser.setCurrentAttributeName(Tag.OPCODE.toString()); + parser.setCurrrentAttributeValue(ConfigurationMessageHandler.class.getName()); + parser.setCurrentAttributeName(Tag.CLASS_NAME.toString()); + parser.setCurrentAttributeName(Tag.HANDLER.toString()); + + Map<Character,IMessageHandler> result = Configuration.getInstance().getMethodReplyQueueHandlers(); + + assertEquals(2,result.size()); + + assertEquals(SchemaResponseMessageHandler.class,result.get(schemaOpcode.charAt(0)).getClass()); + assertEquals(ConfigurationMessageHandler.class,result.get(configOpCode.charAt(0)).getClass()); + } + + /** + * Tests the execution of the type mapping parser. + * + * <br>precondition: two type mappings are built by the parser; + * <br>postcondition: the corresponding types are available on the configuration. + */ + public void testMappingParser() throws NumberFormatException, UnknownTypeCodeException + { + TypeMappingParser parser = new TypeMappingParser(); + + String className = Uint8.class.getName(); + String validatorClassName = "a.b.c.Validator"; + + parser.setCurrrentAttributeValue(String.valueOf(TestConstants.VALID_CODE)); + parser.setCurrentAttributeName(Tag.CODE.toString()); + parser.setCurrrentAttributeValue(className); + parser.setCurrentAttributeName(Tag.CLASS_NAME.toString()); + parser.setCurrrentAttributeValue(validatorClassName); + parser.setCurrentAttributeName(Tag.VALIDATOR_CLASS_NAME.toString()); + parser.setCurrentAttributeName(Tag.MAPPING.toString()); + + Type type =Configuration.getInstance().getType(TestConstants.VALID_CODE); + String vClassName = Configuration.getInstance().getValidatorClassName(type); + + assertEquals(Uint8.class, type.getClass()); + assertEquals(validatorClassName,vClassName); + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/configuration/StubConfigurator.java b/java/client/src/test/java/org/apache/qpid/management/configuration/StubConfigurator.java new file mode 100644 index 0000000000..6d92e3b6f8 --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/configuration/StubConfigurator.java @@ -0,0 +1,56 @@ +/* + * + * 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.configuration; + +import org.apache.qpid.management.domain.model.type.Str8; + +public class StubConfigurator extends Configurator +{ + /** + * Builds whole configuration. + * + * @throws ConfigurationException when the build fails. + */ + public void configure() throws ConfigurationException + { + addAccessModeMapping("1", "RW"); + addAccessModeMapping("2", "RO"); + addAccessModeMapping("3", "RC"); + + addTypeMapping("1", Str8.class.getName()); + } + + public void addTypeMapping(String code,String clazzName) + { + TypeMapping mapping = new TypeMapping(); + mapping.setCode(code); + mapping.setType(clazzName); + Configuration.getInstance().addTypeMapping(mapping); + } + + public void addAccessModeMapping(String code, String value) + { + AccessModeMapping mapping = new AccessModeMapping(); + mapping.setCode(code);; + mapping.setAccessMode(value); + Configuration.getInstance().addAccessModeMapping(mapping); + } +} diff --git a/java/client/src/test/java/org/apache/qpid/management/configuration/TypeMappingTest.java b/java/client/src/test/java/org/apache/qpid/management/configuration/TypeMappingTest.java new file mode 100644 index 0000000000..bf44608c0e --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/configuration/TypeMappingTest.java @@ -0,0 +1,117 @@ +/* + * + * 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.configuration; + +import org.apache.qpid.management.TestConstants; +import org.apache.qpid.management.domain.model.type.Uint8; + +import junit.framework.TestCase; + +/** + * Test case for type mapping. + * + * @author Andrea Gazzarini + */ +public class TypeMappingTest extends TestCase +{ + private TypeMapping _mapping; + + @Override + protected void setUp () throws Exception + { + _mapping = new TypeMapping(); + } + + /** + * Tests the execution of the setCode method when a valid code is given. + * + * <br>precondition : given code is a valid number. + * <br>postcondition : no exception is thrown and the mapping contained the requested code. + */ + public void testSetCodeOK() + { + _mapping.setCode(String.valueOf(TestConstants.VALID_CODE)); + assertEquals(TestConstants.VALID_CODE,_mapping.getCode()); + } + + /** + * Tests the execution of the setCode method when an invalid code is given. + * + * <br>precondition : given code is an invalid number. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testSetCodeKO_withInvalidNumber () + { + try { + _mapping.setCode(String.valueOf(TestConstants.VALID_CODE)+"a"); + fail("The given string is not a number and therefore an exception must be thrown."); + } catch(NumberFormatException expected) + { + + } + } + + /** + * Tests the execution of the setType() method when a valid type class is given. + * + * <br>precondition : a valid class type is supplied. + * <br>postcondition : no exception is thrown and the mapping contains the previously associated type. + */ + public void testSetTypeOK() + { + _mapping.setType(Uint8.class.getName()); + assertTrue(_mapping.getType() instanceof Uint8); + } + + /** + * Tests the execution of the setType() method when a invalid type class is given. + * + * <br>precondition : an invalid class type is supplied. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testSetTypeKO_withTypeClassNotFound() + { + try + { + _mapping.setType(Uint8.class.getName()+"a"); + fail("If the supplied class doesn't exist an exception must be thrown."); + } catch(IllegalArgumentException expected) { + assertTrue(expected.getCause() instanceof ClassNotFoundException); + } + } + + /** + * Tests the execution of the setType() method when a invalid type class is given. + * + * <br>precondition : an invalid class type is supplied (is not a Type). + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testSetTypeKO_withInvalidType() + { + try + { + _mapping.setType(String.class.getName()); + fail("If the supplied class is not a Type an exception must be thrown."); + } catch(IllegalArgumentException expected) { + assertTrue(expected.getCause() instanceof ClassCastException); + } + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/domain/handler/base/ContentIndicationMessageHandlerTest.java b/java/client/src/test/java/org/apache/qpid/management/domain/handler/base/ContentIndicationMessageHandlerTest.java new file mode 100644 index 0000000000..6be4484f5c --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/domain/handler/base/ContentIndicationMessageHandlerTest.java @@ -0,0 +1,120 @@ +/* + * + * 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.domain.handler.base; + +import java.nio.ByteBuffer; + +import org.apache.qpid.management.TestConstants; +import org.apache.qpid.management.domain.model.type.Binary; +import org.apache.qpid.transport.codec.ManagementDecoder; +import org.apache.qpid.transport.codec.ManagementEncoder; + +import junit.framework.TestCase; + +/** + * Test case for Content indication message handler (base class). + * + * @author Andrea Gazzarini + */ +public class ContentIndicationMessageHandlerTest extends TestCase +{ + /** + * Tests the execution of the process method when the message is processed correctly. + */ + public void testProcessOk() { + final String expectedPackageName = "org.apache.qpid.broker"; + final String expectedClassName ="connection"; + final long expectedMessageTimestamp = System.currentTimeMillis(); + final long expectedCreationTime = expectedMessageTimestamp - 1000; + final long expectedDeletionTime = 0; + final Binary expectedClassHash = new Binary(new byte[]{9,9,9,9,8,8,8,8,7,7,7,7,6,6,6,6}); + final Binary expectedObjectId = new Binary(new byte[]{1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,16}); + final Binary expectedBody = new Binary(new byte[]{1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4}); + + ContentIndicationMessageHandler mockHandler = new ContentIndicationMessageHandler() + { + @Override + protected void updateDomainModel (String packageName, String className, Binary classHash, Binary objectId, + long timeStampOfCurrentSample, long timeObjectWasCreated, long timeObjectWasDeleted, byte[] contentData) + { + assertEquals(expectedPackageName,packageName); + assertEquals(expectedClassName,className); + assertEquals(expectedClassHash,classHash); + assertEquals(expectedMessageTimestamp,timeStampOfCurrentSample); + assertEquals(expectedCreationTime,timeObjectWasCreated); + assertEquals(expectedDeletionTime,timeObjectWasDeleted); + assertEquals(expectedObjectId,objectId); + assertEquals(expectedBody,new Binary(contentData)); + } + + @Override + void removeObjectInstance (String packageName, String className, Binary classHash, Binary objectId) + { + fail("The object shouldn't be deleted because deletion time was set to 0!"); + } + }; + mockHandler.setDomainModel(TestConstants.DOMAIN_MODEL); + + ByteBuffer buffer = ByteBuffer.allocate(1000); + ManagementEncoder encoder = new ManagementEncoder(buffer); + + encoder.writeStr8(expectedPackageName); + encoder.writeStr8(expectedClassName); + expectedClassHash.encode(encoder); + encoder.writeDatetime(expectedMessageTimestamp); + encoder.writeDatetime(expectedCreationTime); + encoder.writeDatetime(expectedDeletionTime); + expectedObjectId.encode(encoder); + expectedBody.encode(encoder); + + buffer.flip(); + ManagementDecoder decoder = new ManagementDecoder(); + decoder.init(buffer); + + mockHandler.process(decoder, 1); + } + + /** + * Tests the behaviour of the objectHasBeenRemoved method(). + */ + public void testObjectHasBeenRemoved() + { + ContentIndicationMessageHandler mockHandler = new ContentIndicationMessageHandler() + { + @Override + protected void updateDomainModel (String packageName, String className, Binary classHash, Binary objectId, + long timeStampOfCurrentSample, long timeObjectWasCreated, long timeObjectWasDeleted, byte[] contentData) + { + } + }; + + long deletionTimestamp = 0; + long now = System.currentTimeMillis(); + + assertFalse(mockHandler.objectHasBeenRemoved(deletionTimestamp, now)); + + deletionTimestamp = now + 1000; + assertFalse(mockHandler.objectHasBeenRemoved(deletionTimestamp, now)); + + deletionTimestamp = now - 1000; + assertTrue(mockHandler.objectHasBeenRemoved(deletionTimestamp, now)); + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/domain/model/BaseDomainModelTestCase.java b/java/client/src/test/java/org/apache/qpid/management/domain/model/BaseDomainModelTestCase.java new file mode 100644 index 0000000000..0c67811621 --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/domain/model/BaseDomainModelTestCase.java @@ -0,0 +1,44 @@ +/* + * + * 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.domain.model; + +import org.apache.qpid.management.configuration.Configurator; + +import junit.framework.TestCase;; + +/** + * Layer supertype for all domain model related test cases. + * + * @author Andrea Gazzarini + */ +public class BaseDomainModelTestCase extends TestCase +{ + /** + * Set up fixture for this test case. + * In order to execute tests on domain model we need to build the configuration. + */ + @Override + protected void setUp () throws Exception + { + Configurator configurator = new Configurator(); + configurator.configure(); + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/domain/model/BaseQpidFeatureBuilderTestCase.java b/java/client/src/test/java/org/apache/qpid/management/domain/model/BaseQpidFeatureBuilderTestCase.java new file mode 100644 index 0000000000..43793e588a --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/domain/model/BaseQpidFeatureBuilderTestCase.java @@ -0,0 +1,102 @@ +/* + * + * 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.domain.model; + +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.desc; +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.name; + +import java.util.HashMap; +import java.util.Map; + +import junit.framework.TestCase; + +import org.apache.qpid.management.configuration.StubConfigurator; +import org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute; +import org.apache.qpid.management.domain.model.type.Uint16; + +/** + * Layer supertype for feature builder test cases. + * + * @author Andrea Gazzarini + */ +public abstract class BaseQpidFeatureBuilderTestCase extends TestCase +{ + protected final static String NAME = "aName"; + + protected final static String DESCRIPTION = "A description."; + protected Integer _type; + + protected Map <String,Object> _featureDefinition; + protected QpidFeatureBuilder _builder; + + protected StubConfigurator configurator; + + /** + * Set up fixture for all concrete builder test cases. + */ + @Override + protected void setUp () throws Exception + { + _type = 1; + configurator = new StubConfigurator(); + configurator.addTypeMapping(_type.toString(),Uint16.class.getName()); + + _featureDefinition = new HashMap<String, Object>(); + _featureDefinition.put(name.name(),NAME); + _featureDefinition.put(desc.name(), DESCRIPTION); + } + + // Internal test used to avoid code duplication. + protected void internalTestForMissingMandatoryAttribute(Attribute ...toBeRemoved) + { + try + { + for (Attribute attribute : toBeRemoved) + { + _featureDefinition.remove(attribute.name()); + } + _builder.build(); + fail("If a mandatory attribute is missing an exception must be thrown!"); + } catch (UnableToBuildFeatureException expected) + { + assertTrue(expected instanceof MissingFeatureAttributesException); + for (Attribute attribute : toBeRemoved) + { + assertTrue(expected.getMessage().contains(attribute.name())); + } + } + } + + // Internal test used to avoid code duplication. + protected void internalTestForMissingOptionalAttribute(Attribute ...toBeRemoved) throws UnableToBuildFeatureException + { + for (Attribute attribute : toBeRemoved) + { + _featureDefinition.remove(attribute.name()); + } + _builder.build(); + + assertNotNull(_builder.getQpidFeature()); + assertNotNull(_builder.getManagementFeature()); + } + + +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/domain/model/DomainModelTest.java b/java/client/src/test/java/org/apache/qpid/management/domain/model/DomainModelTest.java new file mode 100644 index 0000000000..185302c182 --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/domain/model/DomainModelTest.java @@ -0,0 +1,56 @@ +/* + * + * 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.domain.model; + +import java.util.UUID; + +import org.apache.qpid.management.TestConstants; + +/** + * Test case for domain model entity. + * + * @author Andrea Gazzarini + */ +public class DomainModelTest extends BaseDomainModelTestCase +{ + private DomainModel _model; + + @Override + protected void setUp () throws Exception + { + super.setUp(); + _model = new DomainModel(UUID.randomUUID()); + } + + /** + * Tests the execution of the getPackage() method. + */ + public void testGetPackage() + { + assertFalse(_model.containsPackage(TestConstants.QPID_PACKAGE_NAME)); + + QpidPackage qpidPackage = _model.getPackageByName(TestConstants.QPID_PACKAGE_NAME); + assertEquals(TestConstants.QPID_PACKAGE_NAME,qpidPackage.getName()); + + QpidPackage theSameAsPreviousOne = _model.getPackageByName(TestConstants.QPID_PACKAGE_NAME); + assertSame(qpidPackage, theSameAsPreviousOne); + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/domain/model/OptionalPropertiesTest.java b/java/client/src/test/java/org/apache/qpid/management/domain/model/OptionalPropertiesTest.java new file mode 100644 index 0000000000..a4e1e24ff3 --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/domain/model/OptionalPropertiesTest.java @@ -0,0 +1,187 @@ +/* + * + * 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.domain.model; + +import java.nio.ByteBuffer; +import java.util.LinkedList; +import java.util.List; + +import junit.framework.TestCase; + +import org.apache.qpid.management.domain.model.type.Uint64; +import org.apache.qpid.transport.codec.ManagementDecoder; + +public class OptionalPropertiesTest extends TestCase +{ + public void testDecoderStateChange() + { + QpidProperty property = new QpidProperty(); + assertSame( + "Default decoder for properties is the one for mandatory properties.", + property._mandatoryPropertyDecoder, + property._decoder); + + property.markAsOptional(1); + assertSame( + "After a property has been marked as optional the corresponding decoder must be installed.", + property._optionalPropertyDecoder, + property._decoder); + } + + /** + * Tests the execution of the decode() method when the current property is optional but in the presence bitmask + * there's no the corresponding bit set. + * + * <br>precondition : property is optional and corresponding presence bit is not set. + * <br>postcondition : result must be null. + */ + public void testDecodeValueWithOptionalPropertyAndMissingValue() + { + byte [] presenceBytes = {2}; + + QpidProperty property = new QpidProperty(); + + // We don't need a decoder so in order to be sure that it won't be invoked set it to null. + ManagementDecoder nullDecoder = null; + + for (int i = 0; i < 8; i++) + { + // Property number 1 is declaring a value so skip it! + if (i != 1) + { + property.markAsOptional(i); + assertNull(property.decodeValue(nullDecoder, presenceBytes)); + } + } + } + + /** + * Tests the execution of the decode() method when the current property is optional but in the presence bitmask + * there's no the corresponding bit set. + * + * <br>precondition : property is optional and corresponding presence bit is not set. + * <br>postcondition : result must be null. + */ + public void testDecodeValueWithOptionalPropertyAndDeclaredValue() + { + byte [] presenceBytes = {4}; + Long _44 = new Long(44); + + QpidProperty property = new QpidProperty(); + property.setType(new Uint64()); + property.markAsOptional(2); + + ByteBuffer buffer = ByteBuffer.allocate(8); + buffer.putLong(_44); + buffer.rewind(); + ManagementDecoder decoder = new ManagementDecoder(); + + decoder.init(buffer); + assertEquals(_44,property.decodeValue(decoder, presenceBytes)); + } + + /** + * Tests the execution of the decode() method with a real scenario where there are mandatory and optional + * properties. + */ + public void testDecodeValueWithOptionalAndMandatoryProperties() + { + // With this bitset : + // + // 1th opt property is null; + // 2th opt property is null; + // 3th opt property is not null; + // 4th opt property is null; + // 5th opt propertyis null; + // 6th opt property is null; + // 7th opt property is null; + // 8th opt property is not null; + byte [] presenceBytes = {4,1}; + + List<QpidProperty> properties = new LinkedList<QpidProperty>(); + + properties.add(createProperty(false, -1)); + properties.add(createProperty(false, -1)); + properties.add(createProperty(true, 0)); + properties.add(createProperty(false, -1)); + properties.add(createProperty(false, -1)); + properties.add(createProperty(true, 1)); + properties.add(createProperty(false, -1)); + properties.add(createProperty(false, -1)); + properties.add(createProperty(true, 2)); + properties.add(createProperty(true, 3)); + properties.add(createProperty(true, 4)); + properties.add(createProperty(true, 5)); + properties.add(createProperty(true, 6)); + properties.add(createProperty(true, 7)); + properties.add(createProperty(false, -1)); + properties.add(createProperty(true, 8)); + + Long expectedResults [] = { + 1L, // p1 + 22L, // p2 + null, // p3 + 232L, // p4 + 211L, // p5 + null, // p6 + 232L, // p7 + 211L, // p8 + 999L, // p9 + null, // p10 + null, // p11 + null, // p12 + null, // p13 + null, // p14 + 626L, // p15 + 969L // p16 + }; + + + ByteBuffer buffer = ByteBuffer.allocate(expectedResults.length * 8); + for (Long expected : expectedResults) + { + if (expected != null) + { + buffer.putLong(expected); + } + } + buffer.rewind(); + ManagementDecoder decoder = new ManagementDecoder(); + + decoder.init(buffer); + int index = 0; + for (QpidProperty property : properties) + { + assertEquals(expectedResults[index++],property.decodeValue(decoder, presenceBytes)); + } + } + + private QpidProperty createProperty(boolean isOptional, int optionalIndex) + { + QpidProperty property = new QpidProperty(); + property.setType(new Uint64()); + if (isOptional) + { + property.markAsOptional(optionalIndex); + } + return property; + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidMethodBuilderTest.java b/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidMethodBuilderTest.java new file mode 100644 index 0000000000..6032721d1b --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidMethodBuilderTest.java @@ -0,0 +1,166 @@ +/* + * + * 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.domain.model; + +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.dir; +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.name; +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.type; +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.unit; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.management.MBeanOperationInfo; + +import org.apache.qpid.management.Names; +import org.apache.qpid.management.domain.handler.impl.MethodOrEventDataTransferObject; +import org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute; +import org.apache.qpid.transport.codec.ManagementEncoder; + +/** + * Test case for Qpid Statistic builder. + * + * @author Andrea Gazzarini + */ +public class QpidMethodBuilderTest extends BaseQpidFeatureBuilderTestCase +{ + private final static Integer ARG_COUNT = 3; + private MethodOrEventDataTransferObject _methodDefinition; + + private List<Map<String,Object>> _argumentsDefinitons = new ArrayList<Map<String, Object>>(); + + @Override + protected void setUp () throws Exception + { + super.setUp(); + _featureDefinition.put(Names.ARG_COUNT_PARAM_NAME, ARG_COUNT); + + Map<String,Object> arg1 = new HashMap<String,Object>(); + arg1.put(name.name(), "arg1"); + arg1.put(type.name(),_type); + arg1.put(dir.name(),Direction.I.name()); + arg1.put(unit.name(), "bytes"); + + Map<String,Object> arg2 = new HashMap<String,Object>(); + arg2.put(name.name(), "arg2"); + arg2.put(type.name(),_type); + arg2.put(dir.name(),Direction.O.name()); + arg2.put(unit.name(), "bytes"); + + Map<String,Object> arg3 = new HashMap<String,Object>(); + arg3.put(name.name(), "arg3"); + arg3.put(type.name(),_type); + arg3.put(dir.name(),Direction.IO.name()); + arg3.put(unit.name(), "bytes"); + + /* + dir yes no yes Direction code for method arguments + unit yes yes yes Units for numeric values (i.e. seconds, bytes, etc.) + min yes no yes Minimum value for numerics + max yes no yes Maximum value for numerics + maxlen yes no yes Maximum length for strings + desc yes yes yes Description of the argument + default yes no yes Default value for the argument + */ + _argumentsDefinitons.add(arg1); + _argumentsDefinitons.add(arg2); + + _methodDefinition = new MethodOrEventDataTransferObject(_featureDefinition,_argumentsDefinitons); + _builder = QpidFeatureBuilder.createMethodBuilder(_methodDefinition); + } + + /** + * Tests the build process for a statistic when the definition map doesn't contains type attribute. + * + * <br>precondition: definition map doesn't contains type attribute. + * <br>postcondition : an exception should be thrown indicating the failure. That exception must contain the name of the + * missing attribute. + */ + public void testMethodBuilderKO_WithMissingName() + { + internalTestForMissingMandatoryAttribute(Attribute.name); + } + + /** + * Tests the build process for a statistic when the definition map doesn't contain type, name, index & optional attributes. + * + * <br>precondition: definition map doesn't contain type, name, index & optional attributes. + * <br>postcondition : an exception should be thrown indicating the failure. That exception must contain the name of the + * missing attributes. + */ + public void testMethodBuilderOK_WithMissingUnit() throws UnableToBuildFeatureException + { + internalTestForMissingOptionalAttribute(Attribute.unit); + } + + /** + * Tests the build process for a statistic when the definition map doesn't unit attribute. + * Note that this attribute is optional and therefore the build must succeed. + * + * <br>precondition: definition map doesn't contain unit attribute. + * <br>postcondition : no exception is thrown and the statistic is built. + */ + public void testMethodBuilderOK_WithMissingDescription() throws UnableToBuildFeatureException + { + internalTestForMissingOptionalAttribute(Attribute.desc); + } + + /** + * Tests the build process for a statistic when the definition map contains valid values. + * + * <br>precondition : the statistic definiton map contains valid values. + * <br>postcondition : no exception is thrown and the statistisc is built as expected. + */ + public void testMethodBuilderOK() throws UnableToBuildFeatureException + { + _builder.build(); + + QpidMethod method = (QpidMethod) _builder.getQpidFeature(); + MBeanOperationInfo info = (MBeanOperationInfo) _builder.getManagementFeature(); + + assertEquals(NAME,method.getName()); + + assertEquals(DESCRIPTION,method.getDescription()); + + assertEquals(method.getDescription(),info.getDescription()); + assertEquals(method.getName(),info.getName()); + } + + public void testEncodeParameters() throws ValidationException, UnableToBuildFeatureException { + _builder.build(); + + Object [] parameters = new Object[]{new Integer(1), new Integer(2),new Integer(3)}; + + ManagementEncoder encoder = new ManagementEncoder(ByteBuffer.allocate(1)){ + @Override + public void writeUint16 (int s) + { + assertTrue(s == 1 || s == 2); + } + }; + + QpidMethod method = (QpidMethod) _builder.getQpidFeature(); + method.encodeParameters(parameters, encoder); + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidNumberPropertyTest.java b/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidNumberPropertyTest.java new file mode 100644 index 0000000000..2611923f71 --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidNumberPropertyTest.java @@ -0,0 +1,167 @@ +/* + * + * 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.domain.model; + +import org.apache.qpid.management.domain.model.type.Uint64; + +public class QpidNumberPropertyTest extends BaseDomainModelTestCase +{ + private QpidProperty _property; + private Long _value = 55432L; + + @Override + protected void setUp () throws Exception + { + super.setUp(); + _property = new QpidProperty(); + _property.setName("average"); + _property.setAccessMode(AccessMode.RW); + _property.setType(new Uint64()); + } + + /** + * Tests the validation of a qpid property when the type is a number and no constraint has been set. + * + * <br>precondition : property type is a string, no constraint has been set. + * <br>postcondition : no exception is thrown and the validation succeeds. + */ + public void testValidationWithoutConstraints() { + try + { + _property.validate(_value); + } catch (ValidationException notExpected) + { + fail("If no constraint has been set on this property why the validation is failing?"); + } + } + + /** + * Tests the validation of a qpid property when the type is a number and a max value constraint has been set. + * + * <br>precondition : property type is a number, max value has been set and property value is greater than max value. + * <br>postcondition : an exception is thrown indicating the validation failure. + */ + public void testValidationKO_withMaxValue() { + int maxValue = (int)(_value-1); + _property.setMaxValue(maxValue); + + try + { + _property.validate(_value); + fail("The given value is violating the installed constraint so an exception must be thrown."); + } catch (ValidationException expected) + { + assertEquals(ValidationException.MAX_VALUE,expected.getConstraintName()); + assertEquals(maxValue,expected.getConstraintValue()); + assertEquals((double)_value,expected.getFeatureValue()); + assertEquals(_property.getName(),expected.getFeatureName()); + } + } + + /** + * Tests the validation of a qpid property when the type is a number and a min value constraint has been set. + * + * <br>precondition : property type is a number, min value has been set and property value is lesser than min value. + * <br>postcondition : an exception is thrown indicating the validation failure. + */ + public void testValidationKO_withMinValue() { + int minValue = (int)(_value+1); + _property.setMinValue(minValue); + + try + { + _property.validate(_value); + fail("The given value is violating the installed constraint so an exception must be thrown."); + } catch (ValidationException expected) + { + assertEquals(ValidationException.MIN_VALUE,expected.getConstraintName()); + assertEquals(minValue,expected.getConstraintValue()); + assertEquals((double)_value,expected.getFeatureValue()); + assertEquals(_property.getName(),expected.getFeatureName()); + } + } + + + /** + * Tests the validation of a qpid property when the number is a string and the property value is null. + * + * <br>precondition : property type is a number and property value is null.. + * <br>postcondition : no exception is thrown. That is : the validation succeeds. + */ + public void testValidationOK_withNullValue() { + try + { + _property.validate(null); + } catch (ValidationException notExpected) + { + fail("No constraint has been violated so validate() shouldn't raise an exception."); + } + + _property.setMinValue(1); + _property.setMaxValue(10); + + try + { + _property.validate(null); + } catch (ValidationException notExpected) + { + fail("No constraint has been violated so validate() shouldn't raise an exception."); + } + } + + /** + * Tests the validation of a qpid property when the type is a number and a max / min constraints have been set. + * + * <br>precondition : property type is a number, max / min constraint have been set and property value is wrong. + * <br>postcondition : an exception is thrown indicating the validation failure. + */ + public void testValidationOK_withMinAndMaxConstraint() { + int minValue = (int)(_value+1); + int maxValue = (int)(_value-1); + _property.setMinValue(minValue); + _property.setMaxValue(maxValue); + + try + { + _property.validate(_value); + fail("The given value is violating the installed constraint so an exception must be thrown."); + } catch (ValidationException expected) + { + assertEquals(ValidationException.MIN_VALUE,expected.getConstraintName()); + assertEquals(minValue,expected.getConstraintValue()); + assertEquals((double)_value,expected.getFeatureValue()); + assertEquals(_property.getName(),expected.getFeatureName()); + } + + _property.setMinValue(0); + try + { + _property.validate(_value); + fail("The given value is violating the installed constraint so an exception must be thrown."); + } catch (ValidationException expected) + { + assertEquals(ValidationException.MAX_VALUE,expected.getConstraintName()); + assertEquals(maxValue,expected.getConstraintValue()); + assertEquals((double)_value,expected.getFeatureValue()); + assertEquals(_property.getName(),expected.getFeatureName()); + } + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidPackageTest.java b/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidPackageTest.java new file mode 100644 index 0000000000..530b526bec --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidPackageTest.java @@ -0,0 +1,54 @@ +/* + * + * 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.domain.model; + +import org.apache.qpid.management.TestConstants; + +/** + * Test case for Qpid package entity. + * + * @author Andrea Gazzarini + */ +public class QpidPackageTest extends BaseDomainModelTestCase +{ + private QpidPackage _qpidPackage; + + @Override + protected void setUp () throws Exception + { + super.setUp(); + _qpidPackage = new QpidPackage(TestConstants.QPID_PACKAGE_NAME, TestConstants.DOMAIN_MODEL); + } + + /** + * Tests the association of a new class with a qpid package. + * + * <br>precondition : the package is not associated with any class. + * <br>postcondition : the package is now associated with the given class. + */ + public void testAddClass() throws UnableToBuildFeatureException { + assertFalse(_qpidPackage.alreadyContainsClassDefinition(TestConstants.EXCHANGE_CLASS_NAME, TestConstants.HASH)); + + _qpidPackage.getQpidClass(TestConstants.EXCHANGE_CLASS_NAME, TestConstants.HASH, true); + + assertTrue(_qpidPackage.alreadyContainsClassDefinition(TestConstants.EXCHANGE_CLASS_NAME, TestConstants.HASH)); + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidPropertyBuilderTest.java b/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidPropertyBuilderTest.java new file mode 100644 index 0000000000..4ac399def0 --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidPropertyBuilderTest.java @@ -0,0 +1,271 @@ +/* + * + * 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.domain.model; + +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.access; +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.index; +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.max; +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.min; +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.optional; +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.type; +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.unit; + +import javax.management.MBeanAttributeInfo; + +import org.apache.qpid.management.configuration.UnknownTypeCodeException; +import org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute; + +/** + * Test case for Qpid Property builder. + * + * @author Andrea Gazzarini + */ +public class QpidPropertyBuilderTest extends BaseQpidFeatureBuilderTestCase +{ + private final static Integer MIN = 0; + private final static Integer MAX = 120; + private final static String UNIT = "bytes"; + + private Integer _access; + + @Override + protected void setUp () throws Exception + { + super.setUp(); + + _access = 1; + configurator.addAccessModeMapping(_access.toString(), AccessMode.RW.name()); + + _featureDefinition.put(access.name(), _access); + _featureDefinition.put(unit.name(),UNIT); + _featureDefinition.put(min.name(), MIN); + _featureDefinition.put(max.name(),MAX); + + _featureDefinition.put(type.name(), _type); + _featureDefinition.put(optional.name(),0); + _featureDefinition.put(index.name(), 0); + + _builder = QpidFeatureBuilder.createPropertyBuilder(_featureDefinition); + } + + /** + * Tests the build process for a statistic when the definition map contains an unknown type code. + * + * <br>precondition : the statistic definiton map contains an unknown type code. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testStatisticBuilderKO_WithUnknownType() + { + int unknownTypeCode =999; + try + { + _featureDefinition.put(type.name(), unknownTypeCode); + _builder.build(); + fail("An unknown type code should raise an exception to indicate a failure."); + } catch (UnableToBuildFeatureException expected) + { + assertEquals(unknownTypeCode,((UnknownTypeCodeException)expected.getCause()).getCode()); + } + } + + /** + * Tests the build process for a statistic when the definition map contains a null value for a metadata attribute. + * + * <br>precondition : the statistic definiton map contains a null value for a metadata attribute. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testMethodBuilderKO_WithNullMetadataValue() + { + try + { + _featureDefinition.put(type.name(), null); + _builder.build(); + fail("An null value for a metadata attribute should raise an exception to indicate a failure."); + } catch (UnableToBuildFeatureException expected) + { + assertTrue(expected.getCause() instanceof NullPointerException); + } + } + + /** + * Tests the build process for a property when the definition map contains an invalid metadata type. + * + * <br>precondition : the property definiton map contains a wrong type for a metadata attribute. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testPropertyBuilderKO_WithClassCastException() + { + try + { + _featureDefinition.put(access.name(), new String("a")); + _builder.build(); + fail("A wrong metadata attribute type should raise an exception to indicate a failure."); + } catch (UnableToBuildFeatureException expected) + { + assertTrue(expected.getCause() instanceof ClassCastException); + } + } + + /** + * Tests the build process for a property when the definition map contains an unknown type code. + * + * <br>precondition : the property definiton map contains an unknown type code. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testPropertyBuilderKO_WithUnknownType() + { + int unknownTypeCode = 999; + try + { + _featureDefinition.put(type.name(), unknownTypeCode); + _builder.build(); + fail("An unknown type code should raise an exception to indicate a failure."); + } catch (UnableToBuildFeatureException expected) + { + assertEquals(unknownTypeCode,((UnknownTypeCodeException)expected.getCause()).getCode()); + } + } + + /** + * Tests the build process for a property when the definition map doesn't contains type attribute. + * + * <br>precondition: definition map doesn't contains type attribute. + * <br>postcondition : an exception should be thrown indicating the failure. That exception must contain the name of the + * missing attribute. + */ + public void testPropertyBuilderKO_WithMissingType() + { + internalTestForMissingMandatoryAttribute(Attribute.type); + } + + /** + * Tests the build process for a property when the definition map doesn't contain type & name attributes. + * + * <br>precondition: definition map doesn't contain type & name attributes. + * <br>postcondition : an exception should be thrown indicating the failure. That exception must contain the name of the + * missing attributes. + */ + public void testPropertyBuilderKO_WithMissingTypeAndName() + { + internalTestForMissingMandatoryAttribute(Attribute.type, Attribute.name); + } + + /** + * Tests the build process for a property when the definition map doesn't contain type & name & index attributes. + * + * <br>precondition: definition map doesn't contain type & name & index attributes. + * <br>postcondition : an exception should be thrown indicating the failure. That exception must contain the name of the + * missing attributes. + */ + public void testPropertyBuilderKO_WithMissingTypeAndNameAndIndex() + { + internalTestForMissingMandatoryAttribute(Attribute.type, Attribute.name,Attribute.index); + } + + /** + * Tests the build process for a property when the definition map doesn't contain type, name, index & optional attributes. + * + * <br>precondition: definition map doesn't contain type, name, index & optional attributes. + * <br>postcondition : an exception should be thrown indicating the failure. That exception must contain the name of the + * missing attributes. + */ + public void testPropertyBuilderKO_WithMissingTypeAndNameAndIndexAndOptional() + { + internalTestForMissingMandatoryAttribute(Attribute.type, Attribute.name,Attribute.index,Attribute.optional); + } + + /** + * Tests the build process for a property when the definition map doesn't contain type, name, index, optional and access + * attributes. + * + * <br>precondition: definition map doesn't contain type, name, index, optional and access attributes. + * <br>postcondition : an exception should be thrown indicating the failure. That exception must contain the name of the + * missing attributes. + */ + public void testPropertyBuilderKO_WithMissingTypeAndNameAndIndexAndOptionalAndAccess() + { + internalTestForMissingMandatoryAttribute(Attribute.type, Attribute.name,Attribute.index,Attribute.optional,Attribute.access); + } + + /** + * Tests the build process for a property when the definition map doesn't unit attribute. + * Note that this attribute is optional and therefore the build must succeed. + * + * <br>precondition: definition map doesn't contain unit attribute. + * <br>postcondition : no exception is thrown and the property is built. + */ + public void testBuilderOK_WithMissingUnit() throws UnableToBuildFeatureException + { + internalTestForMissingOptionalAttribute(Attribute.unit); + } + + /** + * Tests the build process for a property when the definition map doesn't min and max attributes. + * Note that those attributes are optional and therefore the build must succeed. + * + * <br>precondition: definition map doesn't contain min and max attributes. + * <br>postcondition : no exception is thrown and the property is built. + */ + public void testBuilderOK_WithMissingMinAndMax() throws UnableToBuildFeatureException + { + internalTestForMissingOptionalAttribute(Attribute.min,Attribute.max); + } + + /** + * Tests the build process for a property when the definition map doesn't description attribute. + * Note that this attribute is optional and therefore the build must succeed. + * + * <br>precondition: definition map doesn't contain description attribute. + * <br>postcondition : no exception is thrown and the property is built. + */ + public void testBuilderOK_WithMissingDescription() throws UnableToBuildFeatureException + { + internalTestForMissingOptionalAttribute(Attribute.desc); + } + + /** + * Tests the build process for a property when the definition map contains valid values. + * + * <br>precondition : the property definiton map contains valid values. + * <br>postcondition : no exception is thrown and the property is built as expected. + */ + public void testPropertyBuilderOK() throws UnableToBuildFeatureException + { + _builder.build(); + + QpidProperty property = (QpidProperty) _builder.getQpidFeature(); + MBeanAttributeInfo info = (MBeanAttributeInfo) _builder.getManagementFeature(); + + assertEquals(NAME,property.getName()); + assertEquals(AccessMode.RW,property.getAccessMode()); + assertEquals(UNIT,property.getUnit()); + assertEquals(MIN.intValue(),property.getMinValue()); + assertEquals(MAX.intValue(),property.getMaxValue()); + assertEquals(Integer.MIN_VALUE,property.getMaxLength()); + assertEquals(DESCRIPTION,property.getDescription()); + assertEquals(Integer.class,property.getJavaType()); + assertFalse(property.isOptional()); + + assertEquals(property.getDescription(),info.getDescription()); + assertEquals(property.getName(),info.getName()); + assertEquals(property.getJavaType().getName(),info.getType()); + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidStatisticBuilderTest.java b/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidStatisticBuilderTest.java new file mode 100644 index 0000000000..7f4cf72895 --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidStatisticBuilderTest.java @@ -0,0 +1,159 @@ +/* + * + * 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.domain.model; + +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.type; +import static org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute.unit; + +import javax.management.MBeanAttributeInfo; + +import org.apache.qpid.management.configuration.UnknownTypeCodeException; +import org.apache.qpid.management.domain.model.QpidFeatureBuilder.Attribute; + +/** + * Test case for Qpid Statistic builder. + * + * @author Andrea Gazzarini + */ +public class QpidStatisticBuilderTest extends BaseQpidFeatureBuilderTestCase +{ + private final static String UNIT = "bytes"; + + @Override + protected void setUp () throws Exception + { + super.setUp(); + _featureDefinition.put(unit.name(),UNIT); + _featureDefinition.put(type.name(), _type); + + _builder = QpidFeatureBuilder.createStatisticBuilder(_featureDefinition); + } + + /** + * Tests the build process for a statistic when the definition map contains an unknown type code. + * + * <br>precondition : the statistic definiton map contains an unknown type code. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testStatisticBuilderKO_WithUnknownType() + { + int unknownTypeCode = 999; + try + { + _featureDefinition.put(type.name(), unknownTypeCode); + _builder.build(); + fail("An unknown type code should raise an exception to indicate a failure."); + } catch (UnableToBuildFeatureException expected) + { + assertEquals(unknownTypeCode,((UnknownTypeCodeException)expected.getCause()).getCode()); + } + } + + /** + * Tests the build process for a statistic when the definition map contains a null value for a metadata attribute. + * + * <br>precondition : the statistic definiton map contains a null value for a metadata attribute. + * <br>postcondition : an exception is thrown indicating the failure. + */ + public void testMethodBuilderKO_WithNullMetadataValue() + { + try + { + _featureDefinition.put(type.name(), null); + _builder.build(); + fail("An null value for a metadata attribute should raise an exception to indicate a failure."); + } catch (UnableToBuildFeatureException expected) + { + assertTrue(expected.getCause() instanceof NullPointerException); + } + } + + /** + * Tests the build process for a statistic when the definition map doesn't contains type attribute. + * + * <br>precondition: definition map doesn't contains type attribute. + * <br>postcondition : an exception should be thrown indicating the failure. That exception must contain the name of the + * missing attribute. + */ + public void testStatisticBuilderKO_WithMissingType() + { + internalTestForMissingMandatoryAttribute(Attribute.type); + } + + /** + * Tests the build process for a statistic when the definition map doesn't contain type & name attributes. + * + * <br>precondition: definition map doesn't contain type & name attributes. + * <br>postcondition : an exception should be thrown indicating the failure. That exception must contain the name of the + * missing attributes. + */ + public void testStatisticBuilderKO_WithMissingTypeAndName() + { + internalTestForMissingMandatoryAttribute(Attribute.type, Attribute.name); + } + + /** + * Tests the build process for a statistic when the definition map doesn't contain type, name, index & optional attributes. + * + * <br>precondition: definition map doesn't contain type, name, index & optional attributes. + * <br>postcondition : an exception should be thrown indicating the failure. That exception must contain the name of the + * missing attributes. + */ + public void testStatisticBuilderOK_WithMissingUnit() throws UnableToBuildFeatureException + { + internalTestForMissingOptionalAttribute(Attribute.unit); + } + + /** + * Tests the build process for a statistic when the definition map doesn't unit attribute. + * Note that this attribute is optional and therefore the build must succeed. + * + * <br>precondition: definition map doesn't contain unit attribute. + * <br>postcondition : no exception is thrown and the statistic is built. + */ + public void testBuilderOK_WithMissingDescription() throws UnableToBuildFeatureException + { + internalTestForMissingOptionalAttribute(Attribute.desc); + } + + /** + * Tests the build process for a statistic when the definition map contains valid values. + * + * <br>precondition : the statistic definiton map contains valid values. + * <br>postcondition : no exception is thrown and the statistisc is built as expected. + */ + public void testStatisticBuilderOK() throws UnableToBuildFeatureException + { + _builder.build(); + + QpidStatistic statistic= (QpidStatistic) _builder.getQpidFeature(); + MBeanAttributeInfo info = (MBeanAttributeInfo) _builder.getManagementFeature(); + + assertEquals(NAME,statistic.getName()); + assertEquals(UNIT,statistic.getUnit()); + assertEquals(DESCRIPTION,statistic.getDescription()); + assertEquals(Integer.class,statistic.getJavaType()); + + assertEquals(statistic.getDescription(),info.getDescription()); + assertEquals(statistic.getName(),info.getName()); + assertEquals(statistic.getJavaType().getName(),info.getType()); + } +}
\ No newline at end of file diff --git a/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidStringPropertyTest.java b/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidStringPropertyTest.java new file mode 100644 index 0000000000..263e4209a6 --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/domain/model/QpidStringPropertyTest.java @@ -0,0 +1,123 @@ +/* + * + * 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.domain.model; + +import org.apache.qpid.management.domain.model.type.Str16; + +public class QpidStringPropertyTest extends BaseDomainModelTestCase +{ + private QpidProperty _property; + private final String _5LettersString = "12345"; + + @Override + protected void setUp () throws Exception + { + super.setUp(); + _property = new QpidProperty(); + _property.setName("name"); + _property.setAccessMode(AccessMode.RW); + _property.setType(new Str16()); + } + + /** + * Tests the validation of a qpid property when the type is a string and a max length constraint hasn't been set. + * + * <br>precondition : property type is a string, max length hasn't been set. + * <br>postcondition : no exception is thrown. That is : the validation succeeds. + */ + public void testValidationWithoutMaxLength() { + try + { + _property.validate(_5LettersString); + } catch (ValidationException notExpected) + { + fail("No max length has been set on property so validation must succeed."); + } + } + + /** + * Tests the validation of a qpid property when the type is a string and a max length constraint has been set. + * + * <br>precondition : property type is a string, max length has been set and property value is longer than max length. + * <br>postcondition : an exception is thrown indicating the validation failure. + */ + public void testValidationKO_withMaxLength() { + int maxLength = 2; + _property.setMaxLength(maxLength); + + try + { + _property.validate(_5LettersString); + fail("No max length has been set on property so validation must proceed."); + } catch (ValidationException expected) + { + assertEquals(ValidationException.MAX_LENGTH,expected.getConstraintName()); + assertEquals(maxLength,expected.getConstraintValue()); + assertEquals(_5LettersString.length(),expected.getFeatureValue()); + assertEquals(_property.getName(),expected.getFeatureName()); + } + } + + /** + * Tests the validation of a qpid property when the type is a string and the property value is null. + * + * <br>precondition : property type is a string and property value is null.. + * <br>postcondition : no exception is thrown. That is : the validation succeeds. + */ + public void testValidationOK_withNullValue() { + try + { + _property.validate(null); + } catch (ValidationException notExpected) + { + fail("No constraint has been violated so validate() shouldn't raise an exception."); + } + + _property.setMaxLength(1); + + try + { + _property.validate(null); + } catch (ValidationException notExpected) + { + fail("No constraint has been violated so validate() shouldn't raise an exception."); + } + } + + /** + * Tests the validation of a qpid property when the type is a string and a max length constraint has been set. + * + * <br>precondition : property type is a string, max length has been set and property value is not violating that. + * <br>postcondition : no exception is thrown. That is : the validation succeeds. + */ + public void testValidationOK_withMaxLength() { + int maxLength = (_5LettersString.length()+1); + _property.setMaxLength(maxLength); + + try + { + _property.validate(_5LettersString); + } catch (ValidationException notExpected) + { + fail("No constraint has been violated so validate() shouldn't raise an exception."); + } + } +} diff --git a/java/client/src/test/java/org/apache/qpid/management/domain/model/type/BinaryTest.java b/java/client/src/test/java/org/apache/qpid/management/domain/model/type/BinaryTest.java new file mode 100644 index 0000000000..6636c08710 --- /dev/null +++ b/java/client/src/test/java/org/apache/qpid/management/domain/model/type/BinaryTest.java @@ -0,0 +1,59 @@ +/* + * + * 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.domain.model.type; + +import junit.framework.TestCase; + +/** + * Test case for "Binary" type. + * + * @author Andrea Gazzarini + */ +public class BinaryTest extends TestCase +{ + /** + * Tests the lazy & once hash code computation behaviour of the binary type. + */ + public void testHashCodeComputation(){ + Binary binary = new Binary(new byte[]{1,2,3,4,5,6,7,6,3,3}); + assertSame(binary.state,binary.hashCodeNotYetComputed); + + int firstResult = binary.hashCode(); + assertSame(binary.state,binary.hashCodeAlreadyComputed); + + int secondResult = binary.hashCode(); + assertSame(binary.state,binary.hashCodeAlreadyComputed); + assertEquals(firstResult,secondResult); + } + + /** + * Tests the equals() method of the binary class. + * Two binary must be equals only if they contain the same array (that is, two arrays with the same size & content) + */ + public void testIdentity() { + Binary binary = new Binary(new byte[]{1,2,3,4,5,6,7,6,3,3}); + Binary theSame= new Binary(new byte[]{1,2,3,4,5,6,7,6,3,3}); + Binary aDifferentOne = new Binary(new byte[]{4,2,3,3,4,4,5,3,3,2}); + + assertTrue(binary.equals(theSame)); + assertFalse(binary.equals(aDifferentOne)); + } +}
\ No newline at end of file |
