aboutsummaryrefslogtreecommitdiffstats
path: root/utils-test/src/main/java/org/onap/policy/common/utils/test/ExceptionsTester.java
blob: b4091080997f6b73dcb8b65658db5e3c885f3881 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/*
 * ============LICENSE_START=======================================================
 * Common Utils-Test
 * ================================================================================
 * 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.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 extends ThrowablesTester {

	/**
	 * 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 were found/tested
	 * @throws ConstructionError
	 *             if the Exception subclass cannot be constructed
	 * @throws AssertionError
	 *             if the constructed objects fail to pass various tests
	 */
	public <T extends Exception> int test(Class<T> claz) {
		int ncons = testException(claz);

		assertTrue(ncons > 0);

		return ncons;
	}

	/**
	 * 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. Does <i>not</i> throw an exception
	 * if no standard constructors are found.
	 * 
	 * @param claz
	 *            subclass to be tested
	 * @return the number of constructors that were found/tested
	 * @throws ConstructionError
	 *             if the Exception subclass cannot be constructed
	 * @throws AssertionError
	 *             if the constructed objects fail to pass various tests
	 */
	public <T extends Exception> int testException(Class<T> claz) {
		int ncons = 0;

		ncons += testThrowable(claz);
		ncons += testException_Exception(claz);
		ncons += testException_StringException(claz);
		ncons += testException_StringExceptionBooleanBoolean(claz);

		return ncons;
	}

	/**
	 * 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 ConstructionError
	 *             if the Exception subclass cannot be constructed
	 * @throws AssertionError
	 *             if the constructed objects fail to pass various tests
	 */
	public <T extends Exception> int testException_Exception(Class<T> claz) {
		Constructor<T> cons = getConstructor(claz, "exception", Exception.class);
		if (cons == null) {
			return 0;
		}

		Exception cause = new Exception(EXPECTED_EXCEPTION_MSG);
		T ex = newInstance(cons, 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 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 ConstructionError
	 *             if the Exception subclass cannot be constructed
	 */
	public <T extends Exception> int testException_StringException(Class<T> claz) {
		Constructor<T> cons = getConstructor(claz, "string-exception", String.class, Exception.class);
		if (cons == null) {
			return 0;
		}

		Exception cause = new Exception(EXPECTED_EXCEPTION_MSG);
		T ex = newInstance(cons, "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, 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 ConstructionError
	 *             if the Exception subclass cannot be constructed
	 */
	public <T extends Exception> int testException_StringExceptionBooleanBoolean(Class<T> claz) {
		Constructor<T> cons = getConstructor(claz, "string-exception-flags", String.class, Exception.class,
				Boolean.TYPE, Boolean.TYPE);
		if (cons == null) {
			return 0;
		}

		// test each combination of "message" and "cause"
		testThrowable_MessageCauseCombos(cons);

		// test each combination of the boolean flags
		testThrowable_FlagCombos(cons);

		return 1;
	}
}