19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.core;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.MediumTest;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.SmallTest;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.Button;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport junit.framework.TestCase;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Constructor;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Field;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Method;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Modifier;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ClassWithPrivateConstructor {
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ClassWithPrivateConstructor() {
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ClassTest extends TestCase {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testClass() throws Exception {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Now, never mind the fact that most of this stuff has to work
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // for the test harness to get this far....
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Class.forName()");
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Class helloClass = Class.forName(ClassTest.class.getName());
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Class.newInstance()");
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object instance = helloClass.newInstance();
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(instance);
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Class.forName() nonexisting class");
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Class.forName("this.class.DoesNotExist");
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("unexpected success");
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (ClassNotFoundException ex) {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // expected
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Class.newInstance() private constructor");
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Class.forName("android.core.ClassWithPrivateConstructor").newInstance();
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("unexpected success");
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IllegalAccessException ex) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // this is expected
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Class.getDeclaredMethod()");
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Method method = helloClass.getDeclaredMethod("method", (Class[]) null);
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        method.invoke(new ClassTest(), (Object[]) null);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Class.getDeclaredMethod() w/ args");
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        method = helloClass.getDeclaredMethod("methodWithArgs", Object.class);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object invokeArgs[] = new Object[1];
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invokeArgs[0] = "Hello";
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object ret = method.invoke(new ClassTest(), invokeArgs);
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(ret, invokeArgs[0]);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Class.getDeclaredMethod() -- private");
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        method = helloClass.getDeclaredMethod("privateMethod", (Class[]) null);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        method.invoke(new ClassTest(), (Object[]) null);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //fail("unexpected success");
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // TODO: I think this actually *should* succeed, because the
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // call to the private method is being made from the same class.
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This needs to be replaced with a private call to a different
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // class.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Class.getSuperclass");
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Class objectClass = Class.forName("java.lang.Object");
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals(helloClass.getSuperclass().getSuperclass().getSuperclass(), objectClass);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Class.isAssignableFrom");
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(objectClass.isAssignableFrom(helloClass));
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse(helloClass.isAssignableFrom(objectClass));
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Class.getConstructor");
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Constructor constructor = helloClass.getConstructor((Class[]) null);
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull(constructor);
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Class.getModifiers");
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue(Modifier.isPublic(helloClass.getModifiers()));
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Modifiers: " + Modifier.toString(helloClass.getModifiers()));
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Class.getMethod");
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        helloClass.getMethod("method", (Class[]) null);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Class[] argTypes = new Class[1];
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            argTypes[0] = helloClass;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            helloClass.getMethod("method", argTypes);
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fail("unexpected success");
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (NoSuchMethodException ex) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // exception expected
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Test for public tracker issue 14
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SimpleClass obj = new SimpleClass();
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Field field = obj.getClass().getDeclaredField("str");
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        field.set(obj, null);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public class SimpleClass {
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public String str;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object methodWithArgs(Object o) {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return o;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean methodInvoked;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void method() {
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        methodInvoked = true;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean privateMethodInvoked;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void privateMethod() {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        privateMethodInvoked = true;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Regression for 1018067: Class.getMethods() returns the same method over
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // and over again from all base classes
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @MediumTest
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testClassGetMethodsNoDupes() {
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Method[] methods = Button.class.getMethods();
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Set<String> set = new HashSet<String>();
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < methods.length; i++) {
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String signature = methods[i].toString();
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int par = signature.indexOf('(');
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int dot = signature.lastIndexOf('.', par);
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            signature = signature.substring(dot + 1);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            assertFalse("Duplicate " + signature, set.contains(signature));
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            set.add(signature);
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interface MyInterface {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void foo();
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    interface MyOtherInterface extends MyInterface {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void bar();
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    abstract class MyClass implements MyOtherInterface {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void gabba() {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void hey() {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Check if we also reflect methods from interfaces
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testGetMethodsInterfaces() {
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Method[] methods = MyInterface.class.getMethods();
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("Interface method must be there", hasMethod(methods, ".foo("));
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        methods = MyOtherInterface.class.getMethods();
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("Interface method must be there", hasMethod(methods, ".foo("));
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("Interface method must be there", hasMethod(methods, ".bar("));
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        methods = MyClass.class.getMethods();
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("Interface method must be there", hasMethod(methods, ".foo("));
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("Interface method must be there", hasMethod(methods, ".bar("));
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("Declared method must be there", hasMethod(methods, ".gabba("));
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("Declared method must be there", hasMethod(methods, ".hey("));
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("Inherited method must be there", hasMethod(methods, ".toString("));
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean hasMethod(Method[] methods, String signature) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < methods.length; i++) {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (methods[i].toString().contains(signature)) {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Test for Class.getPackage();
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testClassGetPackage() {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull("Package must be non-null", getClass().getPackage());
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Package must have expected name", "android.core", getClass().getPackage().getName());
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Package must have expected title", "Unknown", getClass().getPackage().getSpecificationTitle());
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Package p = java.lang.Object.class.getPackage();
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNotNull("Package must be non-null", p);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Package must have expected name", "java.lang", p.getName());
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertSame("Package object must be same for each call", p, java.lang.Object.class.getPackage());
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Regression test for #1123708: Problem with getCanonicalName(),
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // getSimpleName(), and getPackage().
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A couple of interesting cases need to be checked: Top-level classes,
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // member classes, local classes, and anonymous classes. Also, boundary
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // cases with '$' in the class names are checked, since the '$' is used
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // as the separator between outer and inner class, so this might lead
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // to problems (it did in the previous implementation).
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Caution: Adding local or anonymous classes elsewhere in this
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // file might affect the test.
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private class MemberClass {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This space intentionally left blank.
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private class Mi$o$oup {
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This space intentionally left blank.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testVariousClassNames() {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Class<?> clazz = this.getClass();
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkg = (clazz.getPackage() == null ? "" : clazz.getPackage().getName() + ".");
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Simple, top-level class
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Top-level class name must be correct", pkg + "ClassTest", clazz.getName());
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Top-level class simple name must be correct", "ClassTest", clazz.getSimpleName());
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Top-level class canonical name must be correct", pkg + "ClassTest", clazz.getCanonicalName());
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        clazz = MemberClass.class;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Member class name must be correct", pkg + "ClassTest$MemberClass", clazz.getName());
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Member class simple name must be correct", "MemberClass", clazz.getSimpleName());
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Member class canonical name must be correct", pkg + "ClassTest.MemberClass", clazz.getCanonicalName());
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class LocalClass {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This space intentionally left blank.
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        clazz = LocalClass.class;
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Local class name must be correct", pkg + "ClassTest$1LocalClass", clazz.getName());
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Local class simple name must be correct", "LocalClass", clazz.getSimpleName());
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNull("Local class canonical name must be null", clazz.getCanonicalName());
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        clazz = new Object() { }.getClass();
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Anonymous class name must be correct", pkg + "ClassTest$1", clazz.getName());
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Anonymous class simple name must be empty", "", clazz.getSimpleName());
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNull("Anonymous class canonical name must be null", clazz.getCanonicalName());
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Weird special cases with dollar in name.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        clazz = Mou$$aka.class;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Top-level class name must be correct", pkg + "Mou$$aka", clazz.getName());
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Top-level class simple name must be correct", "Mou$$aka", clazz.getSimpleName());
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Top-level class canonical name must be correct", pkg + "Mou$$aka", clazz.getCanonicalName());
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        clazz = Mi$o$oup.class;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Member class name must be correct", pkg + "ClassTest$Mi$o$oup", clazz.getName());
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Member class simple name must be correct", "Mi$o$oup", clazz.getSimpleName());
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Member class canonical name must be correct", pkg + "ClassTest.Mi$o$oup", clazz.getCanonicalName());
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class Ma$hedPotatoe$ {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This space intentionally left blank.
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        clazz = Ma$hedPotatoe$.class;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Member class name must be correct", pkg + "ClassTest$1Ma$hedPotatoe$", clazz.getName());
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertEquals("Member class simple name must be correct", "Ma$hedPotatoe$", clazz.getSimpleName());
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertNull("Member class canonical name must be null", clazz.getCanonicalName());
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SmallTest
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void testLocalMemberClass() {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Class<?> clazz = this.getClass();
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("Class must not be member", clazz.isMemberClass());
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("Class must not be local", clazz.isLocalClass());
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        clazz = MemberClass.class;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("Class must be member", clazz.isMemberClass());
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("Class must not be local", clazz.isLocalClass());
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        class OtherLocalClass {
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // This space intentionally left blank.
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        clazz = OtherLocalClass.class;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("Class must not be member", clazz.isMemberClass());
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertTrue("Class must be local", clazz.isLocalClass());
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        clazz = new Object() { }.getClass();
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("Class must not be member", clazz.isMemberClass());
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        assertFalse("Class must not be local", clazz.isLocalClass());
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Mou$$aka {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This space intentionally left blank.
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
338