diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/068-classloader/expected.txt | 2 | ||||
| -rw-r--r-- | test/068-classloader/src-ex/MutationTarget.java | 22 | ||||
| -rw-r--r-- | test/068-classloader/src-ex/Mutator.java | 25 | ||||
| -rw-r--r-- | test/068-classloader/src/Main.java | 70 |
4 files changed, 118 insertions, 1 deletions
diff --git a/test/068-classloader/expected.txt b/test/068-classloader/expected.txt index bf131eee63..8725799fe1 100644 --- a/test/068-classloader/expected.txt +++ b/test/068-classloader/expected.txt @@ -11,3 +11,5 @@ Ctor: doubled implement, type 1 DoubledImplement one Got LinkageError on DI (early) Got LinkageError on IDI (early) +class Main +Got expected ClassNotFoundException diff --git a/test/068-classloader/src-ex/MutationTarget.java b/test/068-classloader/src-ex/MutationTarget.java new file mode 100644 index 0000000000..b02a236aa0 --- /dev/null +++ b/test/068-classloader/src-ex/MutationTarget.java @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2015 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. + */ + +/** + * Mutator target, see Mutator.java. + */ +public class MutationTarget { + public static int value = 0; +}
\ No newline at end of file diff --git a/test/068-classloader/src-ex/Mutator.java b/test/068-classloader/src-ex/Mutator.java new file mode 100644 index 0000000000..6bcd5b8554 --- /dev/null +++ b/test/068-classloader/src-ex/Mutator.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2015 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. + */ + +/** + * Simple mutator to change a static field of the mutator target. This will require a dex-cache + * access, so this setup allows the correct disambiguation between multiple class-loaders. + */ +public class Mutator { + public static void mutate(int v) { + MutationTarget.value = v; + } +}
\ No newline at end of file diff --git a/test/068-classloader/src/Main.java b/test/068-classloader/src/Main.java index 7dfb6f507d..361e2938e3 100644 --- a/test/068-classloader/src/Main.java +++ b/test/068-classloader/src/Main.java @@ -21,7 +21,7 @@ public class Main { /** * Main entry point. */ - public static void main(String[] args) { + public static void main(String[] args) throws Exception { FancyLoader loader; loader = new FancyLoader(ClassLoader.getSystemClassLoader()); @@ -58,6 +58,65 @@ public class Main { testAbstract(loader); testImplement(loader); testIfaceImplement(loader); + + testSeparation(); + + testClassForName(); + } + + static void testSeparation() { + FancyLoader loader1 = new FancyLoader(ClassLoader.getSystemClassLoader()); + FancyLoader loader2 = new FancyLoader(ClassLoader.getSystemClassLoader()); + + try { + Class target1 = loader1.loadClass("MutationTarget"); + Class target2 = loader2.loadClass("MutationTarget"); + + if (target1 == target2) { + throw new RuntimeException("target1 should not be equal to target2"); + } + + Class mutator1 = loader1.loadClass("Mutator"); + Class mutator2 = loader2.loadClass("Mutator"); + + if (mutator1 == mutator2) { + throw new RuntimeException("mutator1 should not be equal to mutator2"); + } + + runMutator(mutator1, 1); + + int value = getMutationTargetValue(target1); + if (value != 1) { + throw new RuntimeException("target 1 has unexpected value " + value); + } + value = getMutationTargetValue(target2); + if (value != 0) { + throw new RuntimeException("target 2 has unexpected value " + value); + } + + runMutator(mutator2, 2); + + value = getMutationTargetValue(target1); + if (value != 1) { + throw new RuntimeException("target 1 has unexpected value " + value); + } + value = getMutationTargetValue(target2); + if (value != 2) { + throw new RuntimeException("target 2 has unexpected value " + value); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + private static void runMutator(Class c, int v) throws Exception { + java.lang.reflect.Method m = c.getDeclaredMethod("mutate", int.class); + m.invoke(null, v); + } + + private static int getMutationTargetValue(Class c) throws Exception { + java.lang.reflect.Field f = c.getDeclaredField("value"); + return f.getInt(null); } /** @@ -422,4 +481,13 @@ public class Main { DoubledImplement2 di2 = ifaceSuper.getDoubledInstance2(); di2.one(); } + + static void testClassForName() throws Exception { + System.out.println(Class.forName("Main").toString()); + try { + System.out.println(Class.forName("Main", false, null).toString()); + } catch (ClassNotFoundException expected) { + System.out.println("Got expected ClassNotFoundException"); + } + } } |