Add utils-test project 13/30313/3
authorJim Hahn <jrh3@att.com>
Mon, 5 Feb 2018 17:05:26 +0000 (12:05 -0500)
committerJim Hahn <jrh3@att.com>
Mon, 5 Feb 2018 18:21:06 +0000 (13:21 -0500)
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:
integrity-audit/pom.xml
integrity-audit/src/test/java/org/onap/policy/common/ia/DbAuditExceptionTest.java [deleted file]
integrity-audit/src/test/java/org/onap/policy/common/ia/DbDaoTransactionExceptionTest.java [deleted file]
integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditExceptionTest.java [deleted file]
integrity-audit/src/test/java/org/onap/policy/common/ia/IntegrityAuditPropertiesExceptionTest.java [deleted file]
integrity-audit/src/test/java/org/onap/policy/common/ia/test/ExceptionsTest.java [new file with mode: 0644]
integrity-monitor/pom.xml
integrity-monitor/src/test/java/org/onap/policy/common/im/test/ExceptionsTest.java [new file with mode: 0644]
pom.xml
utils-test/pom.xml [new file with mode: 0644]
utils-test/src/main/java/org/onap/policy/common/utils/test/ExceptionsTester.java [new file with mode: 0644]
utils-test/src/test/java/org/onap/policy/common/utils/test/ExceptionsTesterTest.java [new file with mode: 0644]

index 7f20620..d261340 100644 (file)
                        <version>4.11</version>
                        <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>
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 (file)
index 005a9f1..0000000
+++ /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 (file)
index d93576e..0000000
+++ /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 (file)
index b39e398..0000000
+++ /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 (file)
index 9c2b119..0000000
+++ /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 (file)
index 0000000..af4a8ce
--- /dev/null
@@ -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));
+       }
+}
index 3ee95c7..67b035a 100644 (file)
                        <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 (file)
index 0000000..a5c5c91
--- /dev/null
@@ -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 5785b69..67454f3 100644 (file)
--- 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 (file)
index 0000000..f9b314f
--- /dev/null
@@ -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 (file)
index 0000000..8705c48
--- /dev/null
@@ -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 (file)
index 0000000..c6af77a
--- /dev/null
@@ -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);
+               }
+       }
+
+}