diff options
author | Jim Hahn <jrh3@att.com> | 2018-02-05 12:05:26 -0500 |
---|---|---|
committer | Jim Hahn <jrh3@att.com> | 2018-02-05 13:21:06 -0500 |
commit | 82bc8f543e578f32201d07a23b42d8539b89a4f1 (patch) | |
tree | e96a904c5a181faac3c16a1587fbe60fe9393fcb | |
parent | 4aadab035016ebc675698961f410583eee86ebc7 (diff) |
Add utils-test project
Added utils-test project to policy/common.
Modified integrity-audit and integrity-monitor to use the new
utils-test project to test the Exception subclasses.
Change-Id: If4a27cdb2351b7c49b084dbf287950172fa059cf
Issue-ID: POLICY-582
Signed-off-by: Jim Hahn <jrh3@att.com>
12 files changed, 1030 insertions, 165 deletions
diff --git a/integrity-audit/pom.xml b/integrity-audit/pom.xml index 7f20620f..d261340f 100644 --- a/integrity-audit/pom.xml +++ b/integrity-audit/pom.xml @@ -48,6 +48,12 @@ <scope>test</scope> </dependency> <dependency> + <groupId>org.onap.policy.common</groupId> + <artifactId>utils-test</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>javax.persistence</artifactId> <version>2.1.0</version> diff --git a/integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditExceptionTest.java b/integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditExceptionTest.java deleted file mode 100644 index 005a9f15..00000000 --- a/integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditExceptionTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * Integrity Audit - * ================================================================================ - * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed 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. - * ============LICENSE_END========================================================= - */ -package org.onap.policy.common.ia; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class DbAuditExceptionTest { - - @Test - public void test() { - DbAuditException e = new DbAuditException(); - assertNull(e.getMessage()); - e = new DbAuditException(""); - assertNotNull(e.getMessage()); - e = new DbAuditException(new Throwable()); - assertNotNull(e.getCause()); - e = new DbAuditException("", new Throwable()); - assertNotNull(e.getMessage()); - assertNotNull(e.getCause()); - } - -} diff --git a/integrity-audit/src/test/java/org/onap/policy/common/ia/DbDaoTransactionExceptionTest.java b/integrity-audit/src/test/java/org/onap/policy/common/ia/DbDaoTransactionExceptionTest.java deleted file mode 100644 index d93576e0..00000000 --- a/integrity-audit/src/test/java/org/onap/policy/common/ia/DbDaoTransactionExceptionTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * Integrity Audit - * ================================================================================ - * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed 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. - * ============LICENSE_END========================================================= - */ -package org.onap.policy.common.ia; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class DbDaoTransactionExceptionTest { - - @Test - public void test() { - DbDaoTransactionException e = new DbDaoTransactionException(); - assertNull(e.getMessage()); - e = new DbDaoTransactionException(""); - assertNotNull(e.getMessage()); - e = new DbDaoTransactionException(new Throwable()); - assertNotNull(e.getCause()); - e = new DbDaoTransactionException("", new Throwable()); - assertNotNull(e.getMessage()); - assertNotNull(e.getCause()); - } - -} diff --git a/integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditExceptionTest.java b/integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditExceptionTest.java deleted file mode 100644 index b39e3986..00000000 --- a/integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditExceptionTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * Integrity Audit - * ================================================================================ - * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed 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. - * ============LICENSE_END========================================================= - */ -package org.onap.policy.common.ia; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class IntegrityAuditExceptionTest { - - @Test - public void test() { - IntegrityAuditException e = new IntegrityAuditException(); - assertNull(e.getMessage()); - e = new IntegrityAuditException(""); - assertNotNull(e.getMessage()); - e = new IntegrityAuditException(new Throwable()); - assertNotNull(e.getCause()); - e = new IntegrityAuditException("", new Throwable()); - assertNotNull(e.getMessage()); - assertNotNull(e.getCause()); - } - -} diff --git a/integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditPropertiesExceptionTest.java b/integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditPropertiesExceptionTest.java deleted file mode 100644 index 9c2b1196..00000000 --- a/integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditPropertiesExceptionTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * Integrity Audit - * ================================================================================ - * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Licensed 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. - * ============LICENSE_END========================================================= - */ -package org.onap.policy.common.ia; - -import static org.junit.Assert.*; - -import org.junit.Test; - -public class IntegrityAuditPropertiesExceptionTest { - - @Test - public void test() { - IntegrityAuditPropertiesException e = new IntegrityAuditPropertiesException(); - assertNull(e.getMessage()); - e = new IntegrityAuditPropertiesException(""); - assertNotNull(e.getMessage()); - e = new IntegrityAuditPropertiesException(new Throwable()); - assertNotNull(e.getCause()); - e = new IntegrityAuditPropertiesException("", new Throwable()); - assertNotNull(e.getMessage()); - assertNotNull(e.getCause()); - } - -} diff --git a/integrity-audit/src/test/java/org/onap/policy/common/ia/test/ExceptionsTest.java b/integrity-audit/src/test/java/org/onap/policy/common/ia/test/ExceptionsTest.java new file mode 100644 index 00000000..af4a8ceb --- /dev/null +++ b/integrity-audit/src/test/java/org/onap/policy/common/ia/test/ExceptionsTest.java @@ -0,0 +1,56 @@ +/* + * ============LICENSE_START======================================================= + * Integrity Monitor + * ================================================================================ + * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.common.ia.test; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.onap.policy.common.ia.DbAuditException; +import org.onap.policy.common.ia.DbDaoTransactionException; +import org.onap.policy.common.ia.IntegrityAuditException; +import org.onap.policy.common.ia.IntegrityAuditPropertiesException; +import org.onap.policy.common.utils.test.ExceptionsTester; + +/** + * Tests various Exception subclasses. + */ +public class ExceptionsTest extends ExceptionsTester { + + @Test + public void testDbAuditException() throws Exception { + assertEquals(4, test(DbAuditException.class)); + } + + @Test + public void testDbDaoTransactionException() throws Exception { + assertEquals(4, test(DbDaoTransactionException.class)); + } + + @Test + public void testIntegrityAuditException() throws Exception { + assertEquals(4, test(IntegrityAuditException.class)); + } + + @Test + public void testIntegrityAuditPropertiesException() throws Exception { + assertEquals(4, test(IntegrityAuditPropertiesException.class)); + } +} diff --git a/integrity-monitor/pom.xml b/integrity-monitor/pom.xml index 3ee95c71..67b035aa 100644 --- a/integrity-monitor/pom.xml +++ b/integrity-monitor/pom.xml @@ -46,7 +46,13 @@ <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> - </dependency> + </dependency> + <dependency> + <groupId>org.onap.policy.common</groupId> + <artifactId>utils-test</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> diff --git a/integrity-monitor/src/test/java/org/onap/policy/common/im/test/ExceptionsTest.java b/integrity-monitor/src/test/java/org/onap/policy/common/im/test/ExceptionsTest.java new file mode 100644 index 00000000..a5c5c910 --- /dev/null +++ b/integrity-monitor/src/test/java/org/onap/policy/common/im/test/ExceptionsTest.java @@ -0,0 +1,86 @@ +/* + * ============LICENSE_START======================================================= + * Integrity Monitor + * ================================================================================ + * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.common.im.test; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.onap.policy.common.im.AdministrativeStateException; +import org.onap.policy.common.im.AllSeemsWellException; +import org.onap.policy.common.im.ForwardProgressException; +import org.onap.policy.common.im.IntegrityMonitorException; +import org.onap.policy.common.im.IntegrityMonitorPropertiesException; +import org.onap.policy.common.im.StandbyStatusException; +import org.onap.policy.common.im.StateManagementException; +import org.onap.policy.common.im.StateTransitionException; +import org.onap.policy.common.im.jmx.ComponentAdminException; +import org.onap.policy.common.utils.test.ExceptionsTester; + +/** + * Tests various Exception subclasses. + */ +public class ExceptionsTest extends ExceptionsTester { + + @Test + public void testStateTransitionException() throws Exception { + assertEquals(4, test(StateTransitionException.class)); + } + + @Test + public void testStateManagementException() throws Exception { + assertEquals(4, test(StateManagementException.class)); + } + + @Test + public void testStandbyStatusException() throws Exception { + assertEquals(5, test(StandbyStatusException.class)); + } + + @Test + public void testIntegrityMonitorPropertiesException() throws Exception { + assertEquals(4, test(IntegrityMonitorPropertiesException.class)); + } + + @Test + public void testIntegrityMonitorException() throws Exception { + assertEquals(4, test(IntegrityMonitorException.class)); + } + + @Test + public void testForwardProgressException() throws Exception { + assertEquals(4, test(ForwardProgressException.class)); + } + + @Test + public void testAllSeemsWellException() throws Exception { + assertEquals(4, test(AllSeemsWellException.class)); + } + + @Test + public void testAdministrativeStateException() throws Exception { + assertEquals(4, test(AdministrativeStateException.class)); + } + + @Test + public void testComponentAdminException() throws Exception { + assertEquals(4, test(ComponentAdminException.class)); + } +} @@ -51,6 +51,7 @@ <modules> + <module>utils-test</module> <module>common-logging</module> <module>integrity-audit</module> <module>integrity-monitor</module> diff --git a/utils-test/pom.xml b/utils-test/pom.xml new file mode 100644 index 00000000..f9b314f6 --- /dev/null +++ b/utils-test/pom.xml @@ -0,0 +1,79 @@ +<!-- + ============LICENSE_START======================================================= + ONAP Policy Engine - Common Modules + ================================================================================ + Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. + ================================================================================ + Licensed 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. + ============LICENSE_END========================================================= + --> + +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.onap.policy.common</groupId> + <artifactId>common-modules</artifactId> + <version>1.2.0-SNAPSHOT</version> + </parent> + + <artifactId>utils-test</artifactId> + <description>Common Utilities to facilitate testing via JUnit</description> + <packaging>jar</packaging> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.11</version> + </dependency> + </dependencies> + + <build> + <pluginManagement> + <plugins> + <!--This plugin's configuration is used to store Eclipse m2e settings + only. It has no influence on the Maven build itself. --> + <plugin> + <groupId>org.eclipse.m2e</groupId> + <artifactId>lifecycle-mapping</artifactId> + <version>1.0.0</version> + <configuration> + <lifecycleMappingMetadata> + <pluginExecutions> + <pluginExecution> + <pluginExecutionFilter> + <groupId>org.jacoco</groupId> + <artifactId> + jacoco-maven-plugin + </artifactId> + <versionRange> + [0.7.1.201405082137,) + </versionRange> + <goals> + <goal>prepare-agent</goal> + </goals> + </pluginExecutionFilter> + <action> + <ignore></ignore> + </action> + </pluginExecution> + </pluginExecutions> + </lifecycleMappingMetadata> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> +</project> diff --git a/utils-test/src/main/java/org/onap/policy/common/utils/test/ExceptionsTester.java b/utils-test/src/main/java/org/onap/policy/common/utils/test/ExceptionsTester.java new file mode 100644 index 00000000..8705c48c --- /dev/null +++ b/utils-test/src/main/java/org/onap/policy/common/utils/test/ExceptionsTester.java @@ -0,0 +1,588 @@ +/* + * ============LICENSE_START======================================================= + * Integrity Monitor + * ================================================================================ + * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.common.utils.test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.lang.reflect.Constructor; + +/** + * Used to test various Exception subclasses. Uses reflection to identify the + * constructors that the subclass supports. + */ +public class ExceptionsTester { + + /** + * Runs tests, on an Exception subclass, for all of the standard + * constructors. If the Exception subclass does not support a given type of + * constructor, then it skips that test. + * + * @param claz + * subclass to be tested + * @return the number of constructors that the test found/tested + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> int test(Class<T> claz) throws Exception { + int ncons = 0; + + ncons += testDefault(claz); + ncons += testString(claz); + ncons += testThrowable(claz); + ncons += testException(claz); + ncons += testStringThrowable(claz); + ncons += testStringException(claz); + ncons += testStringThrowableBooleanBoolean(claz); + ncons += testStringExceptionBooleanBoolean(claz); + + assertTrue(ncons > 0); + + return ncons; + } + + /** + * Tests exceptions created via the default constructor. Verifies that: + * <ul> + * <li><i>toString()</i> returns a non-null value</li> + * <li><i>getMessage()</i> returns null</li> + * <li><i>getCause()</i> returns null</li> + * </ul> + * + * If the Exception subclass does not support this type of constructor, then + * this method simply returns. + * + * @param claz + * subclass to be tested + * @return {@code 1}, if the subclass supports this type of constructor, + * {@code 0} otherwise + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> int testDefault(Class<T> claz) throws Exception { + Constructor<T> cons; + + try { + cons = claz.getConstructor(); + + } catch (NoSuchMethodException | SecurityException e) { + // this constructor is not defined so nothing to test + return 0; + } + + T ex = cons.newInstance(); + + assertNotNull(ex.toString()); + assertNull(ex.getMessage()); + assertNull(ex.getCause()); + + return 1; + } + + /** + * Tests exceptions created via the constructor that takes just a String. + * Verifies that: + * <ul> + * <li><i>toString()</i> returns a non-null value</li> + * <li><i>getMessage()</i> returns the original message passed to the + * constructor</li> + * <li><i>getCause()</i> returns null</li> + * </ul> + * + * If the Exception subclass does not support this type of constructor, then + * this method simply returns. + * + * @param claz + * subclass to be tested + * @return {@code 1}, if the subclass supports this type of constructor, + * {@code 0} otherwise + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> int testString(Class<T> claz) throws Exception { + Constructor<T> cons; + + try { + cons = claz.getConstructor(String.class); + + } catch (NoSuchMethodException | SecurityException e) { + // this constructor is not defined so nothing to test + return 0; + } + + T ex = cons.newInstance("hello"); + + assertNotNull(ex.toString()); + assertEquals("hello", ex.getMessage()); + assertNull(ex.getCause()); + + return 1; + } + + /** + * Tests exceptions created via the constructor that takes just a Throwable. + * Verifies that: + * <ul> + * <li><i>toString()</i> returns a non-null value</li> + * <li><i>getMessage()</i> returns the cause's message</li> + * <li><i>getCause()</i> returns the original cause passed to the + * constructor</li> + * </ul> + * + * If the Exception subclass does not support this type of constructor, then + * this method simply returns. + * + * @param claz + * subclass to be tested + * @return {@code 1}, if the subclass supports this type of constructor, + * {@code 0} otherwise + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> int testThrowable(Class<T> claz) throws Exception { + Constructor<T> cons; + + try { + cons = claz.getConstructor(Throwable.class); + + } catch (NoSuchMethodException | SecurityException e) { + // this constructor is not defined so nothing to test + return 0; + } + + Throwable cause = new Throwable("expected exception"); + T ex = cons.newInstance(cause); + + assertEquals(ex.getMessage(), ex.getMessage()); + assertNotNull(ex.toString()); + assertEquals(cause, ex.getCause()); + + return 1; + } + + /** + * Tests exceptions created via the constructor that takes just an + * Exception. Verifies that: + * <ul> + * <li><i>toString()</i> returns a non-null value</li> + * <li><i>getMessage()</i> returns the cause's message</li> + * <li><i>getCause()</i> returns the original cause passed to the + * constructor</li> + * </ul> + * + * If the Exception subclass does not support this type of constructor, then + * this method simply returns. + * + * @param claz + * subclass to be tested + * @return {@code 1}, if the subclass supports this type of constructor, + * {@code 0} otherwise + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> int testException(Class<T> claz) throws Exception { + Constructor<T> cons; + + try { + cons = claz.getConstructor(Exception.class); + + } catch (NoSuchMethodException | SecurityException e) { + // this constructor is not defined so nothing to test + return 0; + } + + Exception cause = new Exception("expected exception"); + T ex = cons.newInstance(cause); + + assertNotNull(ex.toString()); + assertEquals(ex.getMessage(), ex.getMessage()); + assertEquals(cause, ex.getCause()); + + return 1; + } + + /** + * Tests exceptions created via the constructor that takes a String and a + * Throwable. Verifies that: + * <ul> + * <li><i>toString()</i> returns a non-null value</li> + * <li><i>getMessage()</i> returns the original message passed to the + * constructor</li> + * <li><i>getCause()</i> returns the original cause passed to the + * constructor</li> + * </ul> + * + * If the Exception subclass does not support this type of constructor, then + * this method simply returns. + * + * @param claz + * subclass to be tested + * @return {@code 1}, if the subclass supports this type of constructor, + * {@code 0} otherwise + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> int testStringThrowable(Class<T> claz) throws Exception { + Constructor<T> cons; + + try { + cons = claz.getConstructor(String.class, Throwable.class); + + } catch (NoSuchMethodException | SecurityException e) { + // this constructor is not defined so nothing to test + return 0; + } + + Throwable cause = new Throwable("expected exception"); + T ex = cons.newInstance("world", cause); + + assertNotNull(ex.toString()); + assertEquals("world", ex.getMessage()); + assertEquals(cause, ex.getCause()); + + return 1; + } + + /** + * Tests exceptions created via the constructor that takes a String and an + * Exception. Verifies that: + * <ul> + * <li><i>toString()</i> returns a non-null value</li> + * <li><i>getMessage()</i> returns the original message passed to the + * constructor</li> + * <li><i>getCause()</i> returns the original cause passed to the + * constructor</li> + * </ul> + * + * If the Exception subclass does not support this type of constructor, then + * this method simply returns. + * + * @param claz + * subclass to be tested + * @return {@code 1}, if the subclass supports this type of constructor, + * {@code 0} otherwise + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> int testStringException(Class<T> claz) throws Exception { + Constructor<T> cons; + + try { + cons = claz.getConstructor(String.class, Exception.class); + + } catch (NoSuchMethodException | SecurityException e) { + // this constructor is not defined so nothing to test + return 0; + } + + Exception cause = new Exception("expected exception"); + T ex = cons.newInstance("world", cause); + + assertNotNull(ex.toString()); + assertEquals("world", ex.getMessage()); + assertEquals(cause, ex.getCause()); + + return 1; + } + + /** + * Tests exceptions created via the constructor that takes a String, a + * Throwable, and two booleans. Verifies that: + * <ul> + * <li><i>toString()</i> returns a non-null value</li> + * <li><i>getMessage()</i> returns the original message passed to the + * constructor</li> + * <li><i>getCause()</i> returns the original cause passed to the + * constructor</li> + * <li>suppressed exceptions can be added, if enabled</li> + * <li>the stack trace can be added, if enabled</li> + * </ul> + * + * If the Exception subclass does not support this type of constructor, then + * this method simply returns. + * + * @param claz + * subclass to be tested + * @return {@code 1}, if the subclass supports this type of constructor, + * {@code 0} otherwise + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> int testStringThrowableBooleanBoolean(Class<T> claz) throws Exception { + Constructor<T> cons; + + try { + cons = claz.getConstructor(String.class, Throwable.class, Boolean.TYPE, Boolean.TYPE); + + } catch (NoSuchMethodException | SecurityException e) { + // this constructor is not defined so nothing to test + return 0; + } + + // test each combination of "message" and "cause" + testMessageCauseCombos(cons); + + // test each combination of the boolean flags + testSuppressStack(cons); + testSuppressNoStack(cons); + testNoSuppressStack(cons); + testNoSuppressNoStack(cons); + + return 1; + } + + /** + * Tests exceptions created via the constructor that takes a String, an + * Exception, and two booleans. Verifies that: + * <ul> + * <li><i>toString()</i> returns a non-null value</li> + * <li><i>getMessage()</i> returns the original message passed to the + * constructor</li> + * <li><i>getCause()</i> returns the original cause passed to the + * constructor</li> + * <li>suppressed exceptions can be added, if enabled</li> + * <li>the stack trace can be added, if enabled</li> + * </ul> + * + * If the Exception subclass does not support this type of constructor, then + * this method simply returns. + * + * @param claz + * subclass to be tested + * @return {@code 1}, if the subclass supports this type of constructor, + * {@code 0} otherwise + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> int testStringExceptionBooleanBoolean(Class<T> claz) throws Exception { + Constructor<T> cons; + + try { + cons = claz.getConstructor(String.class, Exception.class, Boolean.TYPE, Boolean.TYPE); + + } catch (NoSuchMethodException | SecurityException e) { + // this constructor is not defined so nothing to test + return 0; + } + + // test each combination of "message" and "cause" + testMessageCauseCombos(cons); + + // test each combination of the boolean flags + testFlagCombos(cons); + + return 1; + } + + /** + * Tests each combination of values for the "message" and the "cause" when + * using the constructor that takes a String, a Throwable/Exception, and two + * booleans. Verifies that expected values are returned by <i>toString()/i>, + * <i>getMessage()</i>, and <i>getCause()</i>. + * </ul> + * + * @param cons + * constructor to be invoked + * @throws Exception + * if the Exception cannot be constructed + */ + private <T extends Exception> void testMessageCauseCombos(Constructor<T> cons) throws Exception { + T ex; + Exception cause = new Exception("expected throwable"); + + ex = cons.newInstance(null, null, true, true); + assertNotNull(ex.toString()); + assertNull(ex.getMessage()); + assertNull(ex.getCause()); + + ex = cons.newInstance("abc", null, true, true); + assertNotNull(ex.toString()); + assertEquals("abc", ex.getMessage()); + assertNull(ex.getCause()); + + ex = cons.newInstance(null, cause, true, true); + assertNotNull(ex.toString()); + assertNull(ex.getMessage()); + assertEquals(cause, ex.getCause()); + + ex = cons.newInstance("xyz", cause, true, true); + assertNotNull(ex.toString()); + assertEquals("xyz", ex.getMessage()); + assertEquals(cause, ex.getCause()); + } + + /** + * Tests each combination of values for the "message" and the "cause" when + * using the constructor that takes a String, a Throwable/Exception, and two + * booleans. Verifies that expected values are returned by <i>toString()/i>, + * <i>getMessage()</i>, and <i>getCause()</i>. + * </ul> + * + * @param cons + * constructor to be invoked + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> void testFlagCombos(Constructor<T> cons) throws Exception { + testSuppressStack(cons); + testSuppressNoStack(cons); + testNoSuppressStack(cons); + testNoSuppressNoStack(cons); + } + + /** + * Tests exceptions constructed with {@code enableSuppression=true} and + * {@code writableStackTrace=true}. Verifies that: + * <ul> + * <li><i>toString()</i> returns a non-null value</li> + * <li><i>getMessage()</i> returns the original message passed to the + * constructor</li> + * <li><i>getCause()</i> returns the original cause passed to the + * constructor</li> + * <li>suppressed exceptions are added</li> + * <li>the stack trace is added</li> + * </ul> + * + * @param cons + * the exception's class constructor + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> void testSuppressStack(Constructor<T> cons) throws Exception { + Exception cause = new Exception("expected exception"); + Throwable supr = new Throwable("expected suppressed exception"); + T ex = cons.newInstance("yes,yes", cause, true, true); + + ex.addSuppressed(supr); + + assertNotNull(ex.toString()); + assertEquals("yes,yes", ex.getMessage()); + assertEquals(cause, ex.getCause()); + + assertEquals(1, ex.getSuppressed().length); + assertEquals(supr, ex.getSuppressed()[0]); + + assertTrue(ex.getStackTrace().length > 0); + } + + /** + * Tests exceptions constructed with {@code enableSuppression=true} and + * {@code writableStackTrace=false}. Verifies that: + * <ul> + * <li><i>toString()</i> returns a non-null value</li> + * <li><i>getMessage()</i> returns the original message passed to the + * constructor</li> + * <li><i>getCause()</i> returns the original cause passed to the + * constructor</li> + * <li>suppressed exceptions are added</li> + * <li>the stack trace is <i>not</i> added</li> + * </ul> + * + * @param cons + * the exception's class constructor + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> void testSuppressNoStack(Constructor<T> cons) throws Exception { + Exception cause = new Exception("expected exception"); + Throwable supr = new Throwable("expected suppressed exception"); + T ex = cons.newInstance("yes,no", cause, true, false); + + ex.addSuppressed(supr); + + assertNotNull(ex.toString()); + assertEquals("yes,no", ex.getMessage()); + assertEquals(cause, ex.getCause()); + + assertEquals(1, ex.getSuppressed().length); + assertEquals(supr, ex.getSuppressed()[0]); + + assertEquals(0, ex.getStackTrace().length); + } + + /** + * Tests exceptions constructed with {@code enableSuppression=false} and + * {@code writableStackTrace=true}. Verifies that: + * <ul> + * <li><i>toString()</i> returns a non-null value</li> + * <li><i>getMessage()</i> returns the original message passed to the + * constructor</li> + * <li><i>getCause()</i> returns the original cause passed to the + * constructor</li> + * <li>suppressed exceptions are <i>not</i> added</li> + * <li>the stack trace is added</li> + * </ul> + * + * @param cons + * the exception's class constructor + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> void testNoSuppressStack(Constructor<T> cons) throws Exception { + Exception cause = new Exception("expected exception"); + Throwable supr = new Throwable("expected suppressed exception"); + T ex = cons.newInstance("no,yes", cause, false, true); + + ex.addSuppressed(supr); + + assertNotNull(ex.toString()); + assertEquals("no,yes", ex.getMessage()); + assertEquals(cause, ex.getCause()); + + assertEquals(0, ex.getSuppressed().length); + + assertTrue(ex.getStackTrace().length > 0); + } + + /** + * Tests exceptions constructed with {@code enableSuppression=false} and + * {@code writableStackTrace=false}. Verifies that: + * <ul> + * <li><i>toString()</i> returns a non-null value</li> + * <li><i>getMessage()</i> returns the original message passed to the + * constructor</li> + * <li><i>getCause()</i> returns the original cause passed to the + * constructor</li> + * <li>suppressed exceptions are <i>not</i> added</li> + * <li>the stack trace is <i>not</i> added</li> + * + * @param cons + * the exception's class constructor + * @throws Exception + * if the Exception cannot be constructed + */ + public <T extends Exception> void testNoSuppressNoStack(Constructor<T> cons) throws Exception { + Exception cause = new Exception("expected exception"); + Throwable supr = new Throwable("expected suppressed exception"); + T ex = cons.newInstance("no,no", cause, false, false); + + ex.addSuppressed(supr); + + assertNotNull(ex.toString()); + assertEquals("no,no", ex.getMessage()); + assertEquals(cause, ex.getCause()); + + assertEquals(0, ex.getSuppressed().length); + assertEquals(0, ex.getStackTrace().length); + } +} diff --git a/utils-test/src/test/java/org/onap/policy/common/utils/test/ExceptionsTesterTest.java b/utils-test/src/test/java/org/onap/policy/common/utils/test/ExceptionsTesterTest.java new file mode 100644 index 00000000..c6af77a2 --- /dev/null +++ b/utils-test/src/test/java/org/onap/policy/common/utils/test/ExceptionsTesterTest.java @@ -0,0 +1,207 @@ +/* + * ============LICENSE_START======================================================= + * Integrity Monitor + * ================================================================================ + * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.common.utils.test; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class ExceptionsTesterTest { + + @Test + public void test() throws Exception { + assertEquals(2, new ExceptionsTester().test(SimpleException.class)); + assertEquals(8, new ExceptionsTester().test(StaticException.class)); + } + + @Test(expected = AssertionError.class) + public void testIgnoreMessageException() throws Exception { + new ExceptionsTester().test(IgnoreMessageException.class); + } + + @Test(expected = AssertionError.class) + public void testIgnoreCauseException() throws Exception { + new ExceptionsTester().test(IgnoreCauseException.class); + } + + @Test(expected = AssertionError.class) + public void testNonStaticException() throws Exception { + new ExceptionsTester().test(NoConstructorsException.class); + } + + @Test(expected = AssertionError.class) + public void testAlwaysSuppressException() throws Exception { + new ExceptionsTester().test(AlwaysSuppressException.class); + } + + @Test(expected = AssertionError.class) + public void testNeverSuppressException() throws Exception { + new ExceptionsTester().test(NeverSuppressException.class); + } + + @Test(expected = AssertionError.class) + public void testAlwaysWritableException() throws Exception { + new ExceptionsTester().test(AlwaysWritableException.class); + } + + @Test(expected = AssertionError.class) + public void testNeverWritableException() throws Exception { + new ExceptionsTester().test(NeverWritableException.class); + } + + /** + * Used to test a failure case - message text is ignored. + */ + public static class IgnoreMessageException extends Exception { + private static final long serialVersionUID = 1L; + + public IgnoreMessageException(String message) { + super("bogus"); + } + } + + /** + * Used to test a failure case - cause is ignored. + */ + public static class IgnoreCauseException extends Exception { + private static final long serialVersionUID = 1L; + + public IgnoreCauseException(Throwable cause) { + super(new Exception("another cause")); + } + } + + /** + * Used to test a failure case - this has no standard constructions. + */ + public static class NoConstructorsException extends Exception { + private static final long serialVersionUID = 1L; + + public NoConstructorsException(int value) { + super(String.valueOf(value)); + } + } + + /** + * Used to test a failure case - always suppresses. + */ + public static class AlwaysSuppressException extends Exception { + private static final long serialVersionUID = 1L; + + public AlwaysSuppressException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, true, writableStackTrace); + } + } + + /** + * Used to test a failure case - never suppresses. + */ + public static class NeverSuppressException extends Exception { + private static final long serialVersionUID = 1L; + + public NeverSuppressException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, false, writableStackTrace); + } + } + + /** + * Used to test a failure case - always allows stack writes. + */ + public static class AlwaysWritableException extends Exception { + private static final long serialVersionUID = 1L; + + public AlwaysWritableException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, true); + } + } + + /** + * Used to test a failure case - never allows stack writes. + */ + public static class NeverWritableException extends Exception { + private static final long serialVersionUID = 1L; + + public NeverWritableException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, false); + } + } + + /** + * Used to test a simple success case. + */ + public static class SimpleException extends Exception { + private static final long serialVersionUID = 1L; + + public SimpleException() { + super(); + } + + public SimpleException(String message) { + super(message); + } + } + + /** + * Used to test the exhaustive success case. + */ + public static class StaticException extends Exception { + private static final long serialVersionUID = 1L; + + public StaticException() { + super(); + } + + public StaticException(String message) { + super(message); + } + + public StaticException(Throwable cause) { + super(cause); + } + + public StaticException(String message, Throwable cause) { + super(message, cause); + } + + public StaticException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + // same as above, but with Exceptions substituted for Throwables + + public StaticException(Exception cause) { + super(cause); + } + + public StaticException(String message, Exception cause) { + super(message, cause); + } + + public StaticException(String message, Exception cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + } + +} |