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