/* * Copyright (C) 2010 The Android Open Source Project * * Licensed 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. */ import other.Mutant; /* * Entry point and tests that are expected to succeed. */ public class Main { /** * Drives tests. */ public static void main(String[] args) { // Test static put/get testStaticInt(); testStaticVolatileInt(); testStaticWide(); testStaticVolatileWide(); testStaticObject(); testStaticVolatileObject(); testStaticBoolean(); testStaticByte(); testStaticChar(); testStaticShort(); // Test field put/get JumboField fieldTest = new JumboField(); testFieldInt(fieldTest); testFieldVolatileInt(fieldTest); testFieldWide(fieldTest); testFieldVolatileWide(fieldTest); testFieldObject(fieldTest); testFieldVolatileObject(fieldTest); testFieldBoolean(fieldTest); testFieldByte(fieldTest); testFieldChar(fieldTest); testFieldShort(fieldTest); // Test method invokes JumboMethod methodTest = new JumboMethod(); methodTest.testMethods(); // Test remaining jumbo instructions // const-class/jumbo, check-cast/jumbo, instance-of/jumbo, // new-instance/jumbo, new-array/jumbo, filled-new-array/jumbo // throw-verification-error/jumbo JumboRegister registerTest = new JumboRegister(); registerTest.testRegisters(); } // Test sput/jumbo & sget/jumbo public static void testStaticInt() { int putInt = 0x12345678; JumboStatic.testInt = putInt; int getInt = JumboStatic.testInt; if (putInt != getInt) { System.out.println("Static put int: " + putInt + " does not match static get int: " + getInt); } } // Test sput-wide/jumbo & sget-wide/jumbo public static void testStaticWide() { long putWide = 0xfedcba9876543210l; JumboStatic.testWide = putWide; long getWide = JumboStatic.testWide; if (putWide != getWide) { System.out.println("Static put wide: " + putWide + " does not match static get wide: " + getWide); } } // Test sput-object/jumbo & sget-object/jumbo public static void testStaticObject() { Object putObject = new Object(); JumboStatic.testObject = putObject; Object getObject = JumboStatic.testObject; if (putObject != getObject) { System.out.println("Static put object: " + putObject + " does not match static get object: " + getObject); } } // Test sput-volatile/jumbo & sget-volatile/jumbo public static void testStaticVolatileInt() { int putInt = 0x12345678; JumboStatic.testVolatileInt = putInt; int getInt = JumboStatic.testVolatileInt; if (putInt != getInt) { System.out.println("Static put int: " + putInt + " does not match static get int: " + getInt); } } // Test sput-wide-volatile/jumbo & sget-wide-volatile/jumbo public static void testStaticVolatileWide() { long putWide = 0xfedcba9876543210l; JumboStatic.testVolatileWide = putWide; long getWide = JumboStatic.testVolatileWide; if (putWide != getWide) { System.out.println("Static put wide: " + putWide + " does not match static get wide: " + getWide); } } // Test sput-object-volatile/jumbo & sget-object-volatile/jumbo public static void testStaticVolatileObject() { Object putObject = new Object(); JumboStatic.testVolatileObject = putObject; Object getObject = JumboStatic.testVolatileObject; if (putObject != getObject) { System.out.println("Static put object: " + putObject + " does not match static get object: " + getObject); } } // Test sput-boolean/jumbo & sget-boolean/jumbo public static void testStaticBoolean() { boolean putBoolean = true; JumboStatic.testBoolean = putBoolean; boolean getBoolean = JumboStatic.testBoolean; if (putBoolean != getBoolean) { System.out.println("Static put boolean: " + putBoolean + " does not match static get boolean: " + getBoolean); } } // Test sput-byte/jumbo & sget-byte/jumbo public static void testStaticByte() { byte putByte = 0x6D; JumboStatic.testByte = putByte; byte getByte = JumboStatic.testByte; if (putByte != getByte) { System.out.println("Static put byte: " + putByte + " does not match static get byte: " + getByte); } } // Test sput-char/jumbo & sget-char/jumbo public static void testStaticChar() { char putChar = 0xE5; JumboStatic.testChar = putChar; char getChar = JumboStatic.testChar; if (putChar != getChar) { System.out.println("Static put char: " + putChar + " does not match static get char: " + getChar); } } // Test sput-short/jumbo & sget-short/jumbo public static void testStaticShort() { short putShort = 0x7A3B; JumboStatic.testShort = putShort; short getShort = JumboStatic.testShort; if (putShort != getShort) { System.out.println("Static put short: " + putShort + " does not match static get short: " + getShort); } } // Test iput/jumbo & iget/jumbo public static void testFieldInt(JumboField fieldTest) { int putInt = 0x12345678; fieldTest.testInt = putInt; int getInt = fieldTest.testInt; if (putInt != getInt) { System.out.println("Field put int: " + putInt + " does not match field get int: " + getInt); } } // Test iput-wide/jumbo & iget-wide/jumbo public static void testFieldWide(JumboField fieldTest) { long putWide = 0xfedcba9876543210l; fieldTest.testWide = putWide; long getWide = fieldTest.testWide; if (putWide != getWide) { System.out.println("Field put wide: " + putWide + " does not match field get wide: " + getWide); } } // Test iput-object/jumbo & iget-object/jumbo public static void testFieldObject(JumboField fieldTest) { Object putObject = new Object(); fieldTest.testObject = putObject; Object getObject = fieldTest.testObject; if (putObject != getObject) { System.out.println("Field put object: " + putObject + " does not match field get object: " + getObject); } } // Test iput-volatile/jumbo & iget-volatile/jumbo public static void testFieldVolatileInt(JumboField fieldTest) { int putInt = 0x12345678; fieldTest.testVolatileInt = putInt; int getInt = fieldTest.testVolatileInt; if (putInt != getInt) { System.out.println("Field put int: " + putInt + " does not match field get int: " + getInt); } } // Test iput-wide-volatile/jumbo & iget-wide-volatile/jumbo public static void testFieldVolatileWide(JumboField fieldTest) { long putWide = 0xfedcba9876543210l; fieldTest.testVolatileWide = putWide; long getWide = fieldTest.testVolatileWide; if (putWide != getWide) { System.out.println("Field put wide: " + putWide + " does not match field get wide: " + getWide); } } // Test iput-object-volatile/jumbo & iget-object-volatile/jumbo public static void testFieldVolatileObject(JumboField fieldTest) { Object putObject = new Object(); fieldTest.testVolatileObject = putObject; Object getObject = fieldTest.testVolatileObject; if (putObject != getObject) { System.out.println("Field put object: " + putObject + " does not match field get object: " + getObject); } } // Test iput-boolean/jumbo & iget-boolean/jumbo public static void testFieldBoolean(JumboField fieldTest) { boolean putBoolean = true; fieldTest.testBoolean = putBoolean; boolean getBoolean = fieldTest.testBoolean; if (putBoolean != getBoolean) { System.out.println("Field put boolean: " + putBoolean + " does not match field get boolean: " + getBoolean); } } // Test iput-byte/jumbo & iget-byte/jumbo public static void testFieldByte(JumboField fieldTest) { byte putByte = 0x6D; fieldTest.testByte = putByte; byte getByte = fieldTest.testByte; if (putByte != getByte) { System.out.println("Field put byte: " + putByte + " does not match field get byte: " + getByte); } } // Test iput-char/jumbo & iget-char/jumbo public static void testFieldChar(JumboField fieldTest) { char putChar = 0xE5; fieldTest.testChar = putChar; char getChar = fieldTest.testChar; if (putChar != getChar) { System.out.println("Field put char: " + putChar + " does not match field get char: " + getChar); } } // Test iput-short/jumbo & iget-short/jumbo public static void testFieldShort(JumboField fieldTest) { short putShort = 0x7A3B; fieldTest.testShort = putShort; short getShort = fieldTest.testShort; if (putShort != getShort) { System.out.println("Field put short: " + putShort + " does not match field get short: " + getShort); } } } class JumboStatic { static int staticInt1; static int staticInt2; static int staticInt3; static int staticInt4; static int staticInt5; static int staticInt6; static int staticInt7; static int staticInt8; static int staticInt9; static int staticInt10; static int staticInt11; static int staticInt12; static int staticInt13; static int staticInt14; static int staticInt15; static int staticInt16; static int staticInt17; static int staticInt18; static int staticInt19; static int staticInt20; static int staticInt21; static int staticInt22; static int staticInt23; static int staticInt24; static int staticInt25; static int staticInt26; static int staticInt27; static int staticInt28; static int staticInt29; static int staticInt30; static int staticInt31; static int staticInt32; static int staticInt33; static int staticInt34; static int staticInt35; static int staticInt36; static int staticInt37; static int staticInt38; static int staticInt39; static int staticInt40; static int staticInt41; static int staticInt42; static int staticInt43; static int staticInt44; static int staticInt45; static int staticInt46; static int staticInt47; static int staticInt48; static int staticInt49; static int staticInt50; static int testInt; static long testWide; static Object testObject; static boolean testBoolean; static byte testByte; static char testChar; static short testShort; static volatile int testVolatileInt; static volatile long testVolatileWide; static volatile Object testVolatileObject; } class JumboField { int fieldInt1; int fieldInt2; int fieldInt3; int fieldInt4; int fieldInt5; int fieldInt6; int fieldInt7; int fieldInt8; int fieldInt9; int fieldInt10; int fieldInt11; int fieldInt12; int fieldInt13; int fieldInt14; int fieldInt15; int fieldInt16; int fieldInt17; int fieldInt18; int fieldInt19; int fieldInt20; int fieldInt21; int fieldInt22; int fieldInt23; int fieldInt24; int fieldInt25; int fieldInt26; int fieldInt27; int fieldInt28; int fieldInt29; int fieldInt30; int fieldInt31; int fieldInt32; int fieldInt33; int fieldInt34; int fieldInt35; int fieldInt36; int fieldInt37; int fieldInt38; int fieldInt39; int fieldInt40; int fieldInt41; int fieldInt42; int fieldInt43; int fieldInt44; int fieldInt45; int fieldInt46; int fieldInt47; int fieldInt48; int fieldInt49; int fieldInt50; int testInt; long testWide; Object testObject; boolean testBoolean; byte testByte; char testChar; short testShort; volatile int testVolatileInt; volatile long testVolatileWide; volatile Object testVolatileObject; } class JumboMethodSuper { void testSuper() { System.out.println("Invoked super"); } } interface JumboMethodInterface { void testInterface(); } class JumboMethod extends JumboMethodSuper implements JumboMethodInterface { void meth1() { } void meth2() { } void meth3() { } void meth4() { } void meth5() { } void meth6() { } void meth7() { } void meth8() { } void meth9() { } void meth10() { } void meth11() { } void meth12() { } void meth13() { } void meth14() { } void meth15() { } void meth16() { } void meth17() { } void meth18() { } void meth19() { } void meth20() { } void meth21() { } void meth22() { } void meth23() { } void meth24() { } void meth25() { } void meth26() { } void meth27() { } void meth28() { } void meth29() { } void meth30() { } void meth31() { } void meth32() { } void meth33() { } void meth34() { } void meth35() { } void meth36() { } void meth37() { } void meth38() { } void meth39() { } void meth40() { } void meth41() { } void meth42() { } void meth43() { } void meth44() { } void meth45() { } void meth46() { } void meth47() { } void meth48() { } void meth49() { } void meth50() { } void testMethods() { testVirtual(); super.testSuper(); testDirect(); testStatic(); ((JumboMethodInterface) this).testInterface(); } void testVirtual() { System.out.println("Invoked virtual"); } void testSuper() { System.out.println("Invoked base"); } private void testDirect() { System.out.println("Invoked direct"); } static void testStatic() { System.out.println("Invoked static"); } public void testInterface() { System.out.println("Invoked interface"); } } class JumboRegister { void testRegisters() { // Create a bunch of registers Class c1 = Thread.class; Class c2 = Thread.class; Class c3 = Thread.class; Class c4 = Thread.class; Class c5 = Thread.class; Class c6 = Thread.class; Class c7 = Thread.class; Class c8 = Thread.class; Class c9 = Thread.class; Class c10 = Thread.class; Class c11 = Thread.class; Class c12 = Thread.class; Class c13 = Thread.class; Class c14 = Thread.class; Class c15 = Thread.class; Class c16 = Thread.class; Class c17 = Thread.class; Class c18 = Thread.class; Class c19 = Thread.class; Class c20 = Thread.class; Class c21 = Thread.class; Class c22 = Thread.class; Class c23 = Thread.class; Class c24 = Thread.class; Class c25 = Thread.class; Class c26 = Thread.class; Class c27 = Thread.class; Class c28 = Thread.class; Class c29 = Thread.class; Class c30 = Thread.class; Class c31 = Thread.class; Class c32 = Thread.class; Class c33 = Thread.class; Class c34 = Thread.class; Class c35 = Thread.class; Class c36 = Thread.class; Class c37 = Thread.class; Class c38 = Thread.class; Class c39 = Thread.class; Class c40 = Thread.class; Class c41 = Thread.class; Class c42 = Thread.class; Class c43 = Thread.class; Class c44 = Thread.class; Class c45 = Thread.class; Class c46 = Thread.class; Class c47 = Thread.class; Class c48 = Thread.class; Class c49 = Thread.class; Class c50 = Thread.class; Class c51 = Thread.class; Class c52 = Thread.class; Class c53 = Thread.class; Class c54 = Thread.class; Class c55 = Thread.class; Class c56 = Thread.class; Class c57 = Thread.class; Class c58 = Thread.class; Class c59 = Thread.class; Class c60 = Thread.class; Class c61 = Thread.class; Class c62 = Thread.class; Class c63 = Thread.class; Class c64 = Thread.class; Class c65 = Thread.class; Class c66 = Thread.class; Class c67 = Thread.class; Class c68 = Thread.class; Class c69 = Thread.class; Class c70 = Thread.class; Class c71 = Thread.class; Class c72 = Thread.class; Class c73 = Thread.class; Class c74 = Thread.class; Class c75 = Thread.class; Class c76 = Thread.class; Class c77 = Thread.class; Class c78 = Thread.class; Class c79 = Thread.class; Class c80 = Thread.class; Class c81 = Thread.class; Class c82 = Thread.class; Class c83 = Thread.class; Class c84 = Thread.class; Class c85 = Thread.class; Class c86 = Thread.class; Class c87 = Thread.class; Class c88 = Thread.class; Class c89 = Thread.class; Class c90 = Thread.class; Class c91 = Thread.class; Class c92 = Thread.class; Class c93 = Thread.class; Class c94 = Thread.class; Class c95 = Thread.class; Class c96 = Thread.class; Class c97 = Thread.class; Class c98 = Thread.class; Class c99 = Thread.class; Class c100 = Thread.class; Class c101 = Thread.class; Class c102 = Thread.class; Class c103 = Thread.class; Class c104 = Thread.class; Class c105 = Thread.class; Class c106 = Thread.class; Class c107 = Thread.class; Class c108 = Thread.class; Class c109 = Thread.class; Class c110 = Thread.class; Class c111 = Thread.class; Class c112 = Thread.class; Class c113 = Thread.class; Class c114 = Thread.class; Class c115 = Thread.class; Class c116 = Thread.class; Class c117 = Thread.class; Class c118 = Thread.class; Class c119 = Thread.class; Class c120 = Thread.class; Class c121 = Thread.class; Class c122 = Thread.class; Class c123 = Thread.class; Class c124 = Thread.class; Class c125 = Thread.class; Class c126 = Thread.class; Class c127 = Thread.class; Class c128 = Thread.class; Class c129 = Thread.class; Class c130 = Thread.class; Class c131 = Thread.class; Class c132 = Thread.class; Class c133 = Thread.class; Class c134 = Thread.class; Class c135 = Thread.class; Class c136 = Thread.class; Class c137 = Thread.class; Class c138 = Thread.class; Class c139 = Thread.class; Class c140 = Thread.class; Class c141 = Thread.class; Class c142 = Thread.class; Class c143 = Thread.class; Class c144 = Thread.class; Class c145 = Thread.class; Class c146 = Thread.class; Class c147 = Thread.class; Class c148 = Thread.class; Class c149 = Thread.class; Class c150 = Thread.class; Class c151 = Thread.class; Class c152 = Thread.class; Class c153 = Thread.class; Class c154 = Thread.class; Class c155 = Thread.class; Class c156 = Thread.class; Class c157 = Thread.class; Class c158 = Thread.class; Class c159 = Thread.class; Class c160 = Thread.class; Class c161 = Thread.class; Class c162 = Thread.class; Class c163 = Thread.class; Class c164 = Thread.class; Class c165 = Thread.class; Class c166 = Thread.class; Class c167 = Thread.class; Class c168 = Thread.class; Class c169 = Thread.class; Class c170 = Thread.class; Class c171 = Thread.class; Class c172 = Thread.class; Class c173 = Thread.class; Class c174 = Thread.class; Class c175 = Thread.class; Class c176 = Thread.class; Class c177 = Thread.class; Class c178 = Thread.class; Class c179 = Thread.class; Class c180 = Thread.class; Class c181 = Thread.class; Class c182 = Thread.class; Class c183 = Thread.class; Class c184 = Thread.class; Class c185 = Thread.class; Class c186 = Thread.class; Class c187 = Thread.class; Class c188 = Thread.class; Class c189 = Thread.class; Class c190 = Thread.class; Class c191 = Thread.class; Class c192 = Thread.class; Class c193 = Thread.class; Class c194 = Thread.class; Class c195 = Thread.class; Class c196 = Thread.class; Class c197 = Thread.class; Class c198 = Thread.class; Class c199 = Thread.class; Class c200 = Thread.class; Class c201 = Thread.class; Class c202 = Thread.class; Class c203 = Thread.class; Class c204 = Thread.class; Class c205 = Thread.class; Class c206 = Thread.class; Class c207 = Thread.class; Class c208 = Thread.class; Class c209 = Thread.class; Class c210 = Thread.class; Class c211 = Thread.class; Class c212 = Thread.class; Class c213 = Thread.class; Class c214 = Thread.class; Class c215 = Thread.class; Class c216 = Thread.class; Class c217 = Thread.class; Class c218 = Thread.class; Class c219 = Thread.class; Class c220 = Thread.class; Class c221 = Thread.class; Class c222 = Thread.class; Class c223 = Thread.class; Class c224 = Thread.class; Class c225 = Thread.class; Class c226 = Thread.class; Class c227 = Thread.class; Class c228 = Thread.class; Class c229 = Thread.class; Class c230 = Thread.class; Class c231 = Thread.class; Class c232 = Thread.class; Class c233 = Thread.class; Class c234 = Thread.class; Class c235 = Thread.class; Class c236 = Thread.class; Class c237 = Thread.class; Class c238 = Thread.class; Class c239 = Thread.class; Class c240 = Thread.class; Class c241 = Thread.class; Class c242 = Thread.class; Class c243 = Thread.class; Class c244 = Thread.class; Class c245 = Thread.class; Class c246 = Thread.class; Class c247 = Thread.class; Class c248 = Thread.class; Class c249 = Thread.class; Class c250 = Thread.class; Class c251 = Thread.class; Class c252 = Thread.class; Class c253 = Thread.class; Class c254 = Thread.class; Class c255 = Thread.class; // Test const-class/jumbo Class c256 = Thread.class; // Test check-cast/jumbo // Test instance-of/jumbo boolean b1 = c1 instanceof Object; if (!b1) System.out.println("instance-of/jumbo returned wrong result"); // Test new-instance/jumbo Object o1 = new Object(); // Test new-array/jumbo int[] a1 = new int[10]; a1[0] = 1; a1[1] = 2; a1[2] = 3; a1[3] = 4; a1[4] = 5; a1[5] = 6; a1[6] = 7; a1[7] = 8; a1[8] = 9; a1[9] = 10; // Test filled-new-array/jumbo // Test throw-verification-error/jumbo try { MaybeAbstract ma = new MaybeAbstract(); System.err.println("ERROR: MaybeAbstract succeeded unexpectedly"); } catch (InstantiationError ie) { System.out.println("Got expected InstantationError"); } catch (Exception ex) { System.err.println("Got unexpected MaybeAbstract failure"); } testMissingStuff(); // Do something with those registers to force other ops to be jumbo useRegs(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10); useRegs(c11, c12, c13, c14, c15, c16, c17, c18, c19, c20); useRegs(c21, c22, c23, c24, c25, c26, c27, c28, c29, c30); useRegs(c31, c32, c33, c34, c35, c36, c37, c38, c39, c40); useRegs(c41, c42, c43, c44, c45, c46, c47, c48, c49, c50); useRegs(c51, c52, c53, c54, c55, c56, c57, c58, c59, c60); useRegs(c61, c62, c63, c64, c65, c66, c67, c68, c69, c70); useRegs(c71, c72, c73, c74, c75, c76, c77, c78, c79, c80); useRegs(c81, c82, c83, c84, c85, c86, c87, c88, c89, c90); useRegs(c91, c92, c93, c94, c95, c96, c97, c98, c99, c100); useRegs(c101, c102, c103, c104, c105, c106, c107, c108, c109, c110); useRegs(c111, c112, c113, c114, c115, c116, c117, c118, c119, c120); useRegs(c121, c122, c123, c124, c125, c126, c127, c128, c129, c130); useRegs(c131, c132, c133, c134, c135, c136, c137, c138, c139, c140); useRegs(c141, c142, c143, c144, c145, c146, c147, c148, c149, c150); useRegs(c151, c152, c153, c154, c155, c156, c157, c158, c159, c160); useRegs(c161, c162, c163, c164, c165, c166, c167, c168, c169, c170); useRegs(c171, c172, c173, c174, c175, c176, c177, c178, c179, c180); useRegs(c181, c182, c183, c184, c185, c186, c187, c188, c189, c190); useRegs(c191, c192, c193, c194, c195, c196, c197, c198, c199, c200); useRegs(c201, c202, c203, c204, c205, c206, c207, c208, c209, c210); useRegs(c211, c212, c213, c214, c215, c216, c217, c218, c219, c220); useRegs(c221, c222, c223, c224, c225, c226, c227, c228, c229, c230); useRegs(c231, c232, c233, c234, c235, c236, c237, c238, c239, c240); useRegs(c241, c242, c243, c244, c245, c246, c247, c248, c249, c250); useRegs(c251, c252, c253, c254, c255, c256, c256, c256, c256, c256); useRegs(b1); useRegs(o1); useRegs(a1); } // Trigger more jumbo verification errors static void testMissingStuff() { Mutant mutant = new Mutant(); try { int x = mutant.disappearingField; } catch (NoSuchFieldError nsfe) { System.out.println("Got expected NoSuchFieldError"); } try { int y = Mutant.disappearingStaticField; } catch (NoSuchFieldError nsfe) { System.out.println("Got expected NoSuchFieldError"); } try { mutant.disappearingMethod(); } catch (NoSuchMethodError nsme) { System.out.println("Got expected NoSuchMethodError"); } try { Mutant.disappearingStaticMethod(); } catch (NoSuchMethodError nsme) { System.out.println("Got expected NoSuchMethodError"); } } void useRegs(Object o1, Object o2, Object o3, Object o4, Object o5, Object o6, Object o7, Object o8, Object o9, Object o10) { } void useRegs(Object o1) { } void useRegs(boolean b1) { } }