Package java.lang.reflect

Source Code of java.lang.reflect.MethodTestInvoke$Inner4

/*
*  Licensed to the Apache Software Foundation (ASF) under one or more
*  contributor license agreements.  See the NOTICE file distributed with
*  this work for additional information regarding copyright ownership.
*  The ASF licenses this file to You 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.
*/

/**
* @author Evgueni V. Brevnov
* @version $Revision$
*/
package java.lang.reflect;

import java.lang.reflect.Method;

import org.apache.harmony.lang.C2;
import org.apache.harmony.lang.ProtectedMethod;
import org.apache.harmony.lang.ProtectedSuccessor;
import org.apache.harmony.test.TestResources;

import junit.framework.TestCase;

@SuppressWarnings(value={"all"})
public class MethodTestInvoke extends TestCase {
   
    static class MyException extends RuntimeException {}
   
    public static void doFail() {
        throw new MyException();
    }

    /**
     * Regression test for HARMONY-5179.
     */
    public void testLoaderAccess() throws Throwable {
        ClassLoader l1 = TestResources.createLoader();
        ClassLoader l2 = TestResources.createLoader();
        Class c1 = l1.loadClass("org.apache.harmony.lang.test.resource.DefaultMethodInvoker");
        Class c2 = l2.loadClass("org.apache.harmony.lang.test.resource.DefaultMethodInvoker");
        Method m1 = c1.getMethod("run", new Class[] {Method.class, Object.class, Object[].class});
        Method m2 = c2.getMethod("dummy", new Class[] {});
        try {
            m1.setAccessible(true);
            m1.invoke(null, new Object[] {m2, null, null});
            fail("Access to package methods should be checked with runtime packages");
        } catch (InvocationTargetException expected) {
            Throwable cause = expected.getCause();
            assertTrue("bad cause: " + cause, cause instanceof IllegalAccessException);
        }
    }
   
    /**
     * Tests that correct cause of reflection error is provided.
     */
    public void testInvocationTargetExceptionCause() throws Exception {
        try {
            this.getClass().getMethod("doFail").invoke(null);
        } catch (InvocationTargetException e) {
            Throwable cause = e.getCause();
            assertTrue("Unexpected cause: " + cause,
                    cause instanceof MyException);
        }
    }

    int state = 0;
   
    public void test1() {
        new Inner1().test1();
    }

    public void test2() {
        new Inner2().test2();
    }
   
    public void test3() {
        int status = 0;
        try {
            Method meth = C2.class.getMethod("publicMethod", (Class[])null);
            Field statField = C2.class.getField("stat");
            C2 clazz = new C2();
            assertEquals(0, clazz.stat);
            clazz.publicMethod();
            assertEquals(10, clazz.stat);
            meth.invoke(clazz, (Object[])null);
            status = ((Integer) statField.get(clazz)).intValue();
        } catch (Exception e) {
            fail(e.toString());
        }
        assertEquals(20, status);
    }
   
    public void test4() {
        new Inner3().test4();
    }

    public void test5() {
        new Inner4().test5();
    }
   
    /* PRIVATE SECTION */
   
    private void privateMethod() {
        state += 10;
    }

    // helper class for test1
    class Inner1 extends Object {

        void test1() {
            try {
                assertEquals(0, state);
                privateMethod();
                assertEquals(10, state);
                Method method = MethodTestInvoke.class
                    .getDeclaredMethod("privateMethod", (Class[])null);
                method.invoke(MethodTestInvoke.this, (Object[])null);
                assertEquals(20, state);
            } catch (Exception e) {
                fail(e.toString());
            }
        }
    }
   
    // helper class for test 2
    class Inner2 extends ProtectedMethod {

        public void test2() {
            Inner2 thisInstance = new Inner2();
            ProtectedMethod superInstance = new ProtectedMethod();
            Method m = null;
            try {
                assertEquals(0, status);
                assertEquals(0, thisInstance.status);
                assertEquals(0, superInstance.status);
                m = ProtectedMethod.class.getDeclaredMethod("protectedMethod", new Class[] {});
                m.invoke(thisInstance, (Object[])null);               
            } catch (Exception e) {
                fail(e.toString());
            }
            try {
                assertEquals(0, status);
                assertEquals(10, thisInstance.status);
                assertEquals(0, superInstance.status);
                m.invoke(superInstance, (Object[])null);
            } catch (IllegalAccessException e) {
                assertEquals(0, status);
                assertEquals(10, thisInstance.status);
                assertEquals(0, superInstance.status);
                return;
            } catch (Exception e) {
            }
            fail("IllegalAccessException expected");
        }
    }
   
    // helper class for test4
    class Inner3 {
       
        public void test4() {
            try {
                Method m = ProtectedMethod.class
                    .getDeclaredMethod("protectedMethod", new Class[] {});
                m.invoke(this, (Object[])null);               
            } catch (IllegalArgumentException e) {
                return;
            } catch (Exception e) {
                fail(e.toString());
            }
            fail("IllegalArgumentException expected");
        }
    }
   
    // helper class for test 5
    class Inner4 extends ProtectedSuccessor {

        public void test5() {
            Method m = null;
            try {
                assertEquals(0, status);
                this.protectedMethod();
                assertEquals(10, status);               
                m = ProtectedMethod.class
                    .getDeclaredMethod("protectedMethod", new Class[] {});
                m.invoke(this, (Object[])null);
            } catch (Exception e) {
                fail(e.toString());
            }
            try {
                assertEquals(20, status);               
                ProtectedSuccessor successor = new ProtectedSuccessor();
                m = ProtectedSuccessor.class
                    .getDeclaredMethod("privateMethod", new Class[] {});
                m.invoke(successor, (Object[])null);
            } catch (IllegalAccessException e) {               
            } catch (Exception e) {
                fail(e.toString());
            }
            try {
                assertEquals(20, status);               
                m = ProtectedSuccessor.class
                    .getDeclaredMethod("privateMethod", new Class[] {});
                m.invoke(this, (Object[])null);
            } catch (IllegalAccessException e) {               
            } catch (Exception e) {
                fail(e.toString());
            }
            assertEquals(20, status);               
        }
    }   
}
TOP

Related Classes of java.lang.reflect.MethodTestInvoke$Inner4

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.