1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18package org.apache.harmony.tests.java.lang.reflect;
19
20import java.io.ByteArrayOutputStream;
21import java.io.CharArrayWriter;
22import java.io.PrintStream;
23import java.io.PrintWriter;
24import java.lang.reflect.Constructor;
25import java.lang.reflect.InvocationTargetException;
26import java.lang.reflect.Method;
27import java.lang.reflect.Modifier;
28
29public class InvocationTargetExceptionTest extends junit.framework.TestCase {
30
31    static class TestMethod {
32        public TestMethod() {
33        }
34
35        public void voidMethod() throws IllegalArgumentException {
36        }
37
38        public void parmTest(int x, short y, String s, boolean bool, Object o,
39                long l, byte b, char c, double d, float f) {
40        }
41
42        public int intMethod() {
43            return 1;
44        }
45
46        public static final void printTest(int x, short y, String s,
47                boolean bool, Object o, long l, byte b, char c, double d,
48                float f) {
49        }
50
51        public double doubleMethod() {
52            return 1.0;
53        }
54
55        public short shortMethod() {
56            return (short) 1;
57        }
58
59        public byte byteMethod() {
60            return (byte) 1;
61        }
62
63        public float floatMethod() {
64            return 1.0f;
65        }
66
67        public long longMethod() {
68            return 1l;
69        }
70
71        public char charMethod() {
72            return 'T';
73        }
74
75        public Object objectMethod() {
76            return new Object();
77        }
78
79        private static void prstatic() {
80        }
81
82        public static void pustatic() {
83        }
84
85        public static synchronized void pustatsynch() {
86        }
87
88        public static int invokeStaticTest() {
89            return 1;
90        }
91
92        public int invokeInstanceTest() {
93            return 1;
94        }
95
96        private int privateInvokeTest() {
97            return 1;
98        }
99
100        public int invokeExceptionTest() throws NullPointerException {
101            throw new NullPointerException();
102        }
103
104        public static synchronized native void pustatsynchnat();
105
106    }
107
108    abstract class AbstractTestMethod {
109        public abstract void puabs();
110    }
111
112    class SubInvocationTargetException extends InvocationTargetException {}
113
114    /**
115     * java.lang.reflect.InvocationTargetException#InvocationTargetException()
116     */
117    public void test_Constructor() throws Exception {
118        Constructor<InvocationTargetException> ctor = InvocationTargetException.class
119                .getDeclaredConstructor();
120        assertNotNull("Parameterless constructor does not exist.", ctor);
121        assertTrue("Constructor is not protected", Modifier.isProtected(ctor
122                .getModifiers()));
123        //create an instance of a subtype using this constructor
124        SubInvocationTargetException subException = new SubInvocationTargetException();
125    }
126
127    /**
128     * java.lang.reflect.InvocationTargetException#InvocationTargetException(java.lang.Throwable)
129     */
130    public void test_ConstructorLjava_lang_Throwable() {
131        // Test for method
132        // java.lang.reflect.InvocationTargetException(java.lang.Throwable)
133        try {
134            Method mth = TestMethod.class.getDeclaredMethod(
135                    "invokeExceptionTest", new Class[0]);
136            Object[] args = { Object.class };
137            Object ret = mth.invoke(new TestMethod(), new Object[0]);
138        } catch (InvocationTargetException e) {
139            // Correct behaviour
140            return;
141        } catch (NoSuchMethodException e) {
142        } catch (IllegalAccessException e) {
143        }
144        fail("Failed to throw exception");
145    }
146
147    /**
148     * java.lang.reflect.InvocationTargetException#InvocationTargetException(java.lang.Throwable,
149     *        java.lang.String)
150     */
151    public void test_ConstructorLjava_lang_ThrowableLjava_lang_String() {
152        // Test for method
153        // java.lang.reflect.InvocationTargetException(java.lang.Throwable,
154        // java.lang.String)
155        try {
156            Method mth = TestMethod.class.getDeclaredMethod(
157                    "invokeExceptionTest", new Class[0]);
158            Object[] args = { Object.class };
159            Object ret = mth.invoke(new TestMethod(), new Object[0]);
160        } catch (InvocationTargetException e) {
161            // Correct behaviour
162            return;
163        } catch (NoSuchMethodException e) {
164            ;
165        } catch (IllegalAccessException e) {
166        }
167        fail("Failed to throw exception");
168    }
169
170    /**
171     * java.lang.reflect.InvocationTargetException#getTargetException()
172     */
173    public void test_getTargetException() {
174        // Test for method java.lang.Throwable
175        // java.lang.reflect.InvocationTargetException.getTargetException()
176        try {
177            Method mth = TestMethod.class.getDeclaredMethod(
178                    "invokeExceptionTest", new Class[0]);
179            Object[] args = { Object.class };
180            Object ret = mth.invoke(new TestMethod(), new Object[0]);
181        } catch (InvocationTargetException e) {
182            // Correct behaviour
183            assertTrue("Returned incorrect target exception", e
184                    .getTargetException() instanceof NullPointerException);
185            return;
186        } catch (Exception e) {
187            fail("Exception during constructor test : " + e.getMessage());
188        }
189        fail("Failed to throw exception");
190    }
191
192    /**
193     * java.lang.reflect.InvocationTargetException#getCause()
194     */
195    public void test_getCause() {
196        // java.lang.reflect.InvocationTargetException.getCause()
197        try {
198            Method mth = TestMethod.class.getDeclaredMethod(
199                    "invokeExceptionTest", new Class[0]);
200            Object[] args = {Object.class};
201            Object ret = mth.invoke(new TestMethod(), new Object[0]);
202        } catch (InvocationTargetException e) {
203            // Correct behaviour
204            assertTrue("Returned incorrect cause",
205                    e.getCause() instanceof NullPointerException);
206            return;
207        } catch (Exception e) {
208            fail("Exception during InvocationTargetException test : "
209                    + e.getMessage());
210        }
211        fail("Failed to throw exception");
212    }
213
214    /**
215     * java.lang.reflect.InvocationTargetException#printStackTrace()
216     */
217    public void test_printStackTrace() {
218        // Test for method void
219        // java.lang.reflect.InvocationTargetException.printStackTrace()
220        try {
221            ByteArrayOutputStream bao = new ByteArrayOutputStream();
222            PrintStream ps = new PrintStream(bao);
223            PrintStream oldErr = System.err;
224            System.setErr(ps);
225            InvocationTargetException ite = new InvocationTargetException(null);
226            ite.printStackTrace();
227            System.setErr(oldErr);
228
229            String s = new String(bao.toByteArray());
230
231            assertTrue("Incorrect Stack trace: " + s, s != null
232                    && s.length() > 300);
233        } catch (Exception e) {
234            fail("printStackTrace() caused exception : " + e.getMessage());
235        }
236    }
237
238    /**
239     * java.lang.reflect.InvocationTargetException#printStackTrace(java.io.PrintStream)
240     */
241    public void test_printStackTraceLjava_io_PrintStream() {
242        // Test for method void
243        // java.lang.reflect.InvocationTargetException.printStackTrace(java.io.PrintStream)
244        assertTrue("Tested via test_printStackTrace().", true);
245        ByteArrayOutputStream bao = new ByteArrayOutputStream();
246        PrintStream ps = new PrintStream(bao);
247        InvocationTargetException ite = new InvocationTargetException(
248                new InvocationTargetException(null));
249        ite.printStackTrace(ps);
250        String s = bao.toString();
251        assertTrue("printStackTrace failed." + s.length(), s != null
252                && s.length() > 400);
253    }
254
255    /**
256     * java.lang.reflect.InvocationTargetException#printStackTrace(java.io.PrintWriter)
257     */
258    public void test_printStackTraceLjava_io_PrintWriter() {
259        // Test for method void
260        // java.lang.reflect.InvocationTargetException.printStackTrace(java.io.PrintWriter)
261        try {
262            PrintWriter pw;
263            InvocationTargetException ite;
264            String s;
265            CharArrayWriter caw = new CharArrayWriter();
266            pw = new PrintWriter(caw);
267            ite = new InvocationTargetException(new InvocationTargetException(
268                    null));
269            ite.printStackTrace(pw);
270
271            s = caw.toString();
272            assertTrue("printStackTrace failed." + s.length(), s != null
273                    && s.length() > 400);
274            pw.close();
275
276            ByteArrayOutputStream bao = new ByteArrayOutputStream();
277            pw = new PrintWriter(bao);
278            ite = new InvocationTargetException(new InvocationTargetException(
279                    null));
280            ite.printStackTrace(pw);
281
282            pw.flush(); // Test will fail if this line removed.
283            s = bao.toString();
284            assertTrue("printStackTrace failed." + s.length(), s != null
285                    && s.length() > 400);
286
287        } catch (Exception e) {
288            fail("Exception during test : " + e.getMessage());
289        }
290    }
291
292    /**
293     * Sets up the fixture, for example, open a network connection. This method
294     * is called before a test is executed.
295     */
296    protected void setUp() {
297    }
298
299    /**
300     * Tears down the fixture, for example, close a network connection. This
301     * method is called after a test is executed.
302     */
303    protected void tearDown() {
304    }
305}
306