1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage tests.api.java.lang.reflect;
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.AndroidOnly;
498fd0bafe7f75dce1dff5bd4748d7113f52a023dJorg Pleumannimport dalvik.annotation.SideEffect;
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestLevel;
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetClass;
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetNew;
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.system.DexFile;
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.framework.TestCase;
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.File;
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.FileOutputStream;
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.InputStream;
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.OutputStream;
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.GenericSignatureFormatError;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.TypeVariable;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20ce99bd45811801e932ee79972813a7a57371b2a5Jorg Pleumannimport tests.support.Support_ClassLoader;
21ce99bd45811801e932ee79972813a7a57371b2a5Jorg Pleumann
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@TestTargetClass(GenericSignatureFormatError.class)
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class GenericSignatureFormatErrorTest extends TestCase{
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "GenericSignatureFormatError",
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_Constructor() {
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(new GenericSignatureFormatError());
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "GenericSignatureFormatError",
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_readResource() throws Exception {
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        File tf = File.createTempFile("classes", ".dex");
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // System.out.println("GenericSignatureFormatErrorTest:"
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //         +tf.getAbsolutePath()+", canRead: "+tf.canRead()
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //         +", canWrite: "+tf.canWrite());
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        InputStream is = this.getClass().getResourceAsStream("dex1.bytes");
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(is);
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "GenericSignatureFormatError",
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @AndroidOnly("Uses Android specific class dalvik.system.DexFile " +
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "for loading classes.")
5998fd0bafe7f75dce1dff5bd4748d7113f52a023dJorg Pleumann    @SideEffect("strange issue (exception: 'could not open dex file', " +
6098fd0bafe7f75dce1dff5bd4748d7113f52a023dJorg Pleumann            "dalvikvm: 'waitpid failed' log msg  - only occurs when @SideEffect is removed " +
6198fd0bafe7f75dce1dff5bd4748d7113f52a023dJorg Pleumann            "and this test is run via running tests.luni.AllTestsLang TestSuite")
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_signatureFormatError() throws Exception {
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * dex1.bytes is a jar file with a classes.dex in it.
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * the classes.dex was javac'ed, dx'ed and patched
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * with the following java file:
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * package demo;
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *  public class HelloWorld<U> {
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *      public HelloWorld(U t) {}
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *  }
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * patch:
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * the string constant (class generics signature string)
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *  "<U:" was changed to "<<:"
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         *
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        File tf = File.createTempFile("classes", ".dex");
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // System.out.println("GenericSignatureFormatErrorTest:" +
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //         tf.getAbsolutePath() + ", canRead: " + tf.canRead() +
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //         ", canWrite: "+tf.canWrite());
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        InputStream is = this.getClass().getResourceAsStream("dex1.bytes");
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(is);
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        OutputStream fos = new FileOutputStream(tf);
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        copy(is, fos);
878fc6b356871b0d750c355bb528afdb93011577e4Jorg Pleumann        fos.flush();
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        fos.close();
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // class signature string "<U:" was changed to "<<:"
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        //System.out.println("file length:"+tf.length());
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
94ce99bd45811801e932ee79972813a7a57371b2a5Jorg Pleumann            // Was:
95ce99bd45811801e932ee79972813a7a57371b2a5Jorg Pleumann            // DexFile df = new DexFile(tf);
96ce99bd45811801e932ee79972813a7a57371b2a5Jorg Pleumann            // Class clazz = df.loadClass("demo/HelloWorld", this.getClass().getClassLoader());
97ce99bd45811801e932ee79972813a7a57371b2a5Jorg Pleumann
98ce99bd45811801e932ee79972813a7a57371b2a5Jorg Pleumann            ClassLoader cl = Support_ClassLoader.getInstance(tf.toURL(),
99ce99bd45811801e932ee79972813a7a57371b2a5Jorg Pleumann                    getClass().getClassLoader());
100ce99bd45811801e932ee79972813a7a57371b2a5Jorg Pleumann
101ce99bd45811801e932ee79972813a7a57371b2a5Jorg Pleumann            Class clazz = cl.loadClass("demo/HelloWorld");
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TypeVariable[] tvs = clazz.getTypeParameters();
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("expecting a GenericSignatureFormatError");
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // for (TypeVariable tv : tvs) {
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //     System.out.println("tv:"+tv.toString());
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // }
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (GenericSignatureFormatError gsfe) {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // expected
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private void copy(InputStream is, OutputStream os) {
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int b;
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while ((b = is.read()) != -1) {
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                os.write(b);
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            is.close();
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IOException ex) {
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new RuntimeException("io error", ex);
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
124