aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJim Hahn <jrh3@att.com>2018-02-05 12:05:26 -0500
committerJim Hahn <jrh3@att.com>2018-02-05 13:21:06 -0500
commit82bc8f543e578f32201d07a23b42d8539b89a4f1 (patch)
treee96a904c5a181faac3c16a1587fbe60fe9393fcb
parent4aadab035016ebc675698961f410583eee86ebc7 (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>
-rw-r--r--integrity-audit/pom.xml6
-rw-r--r--integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditExceptionTest.java41
-rw-r--r--integrity-audit/src/test/java/org/onap/policy/common/ia/DbDaoTransactionExceptionTest.java41
-rw-r--r--integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditExceptionTest.java41
-rw-r--r--integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditPropertiesExceptionTest.java41
-rw-r--r--integrity-audit/src/test/java/org/onap/policy/common/ia/test/ExceptionsTest.java56
-rw-r--r--integrity-monitor/pom.xml8
-rw-r--r--integrity-monitor/src/test/java/org/onap/policy/common/im/test/ExceptionsTest.java86
-rw-r--r--pom.xml1
-rw-r--r--utils-test/pom.xml79
-rw-r--r--utils-test/src/main/java/org/onap/policy/common/utils/test/ExceptionsTester.java588
-rw-r--r--utils-test/src/test/java/org/onap/policy/common/utils/test/ExceptionsTesterTest.java207
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));
+ }
+}
diff --git a/pom.xml b/pom.xml
index 5785b692..67454f39 100644
--- a/pom.xml
+++ b/pom.xml
@@ -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);
+ }
+ }
+
+}