diff options
author | 2015-04-15 23:23:51 -0700 | |
---|---|---|
committer | 2015-04-21 21:24:36 +0000 | |
commit | 26684c0fc0c77f057c9c25f15cd42553491ac4a9 (patch) | |
tree | 93b327dde2ed31231c45d2b415a7b70ea9c2c136 | |
parent | 8e8bb8aab6f19ccb5b5869a632d9bc882891e17e (diff) |
ART: Extend run-test 068-classloader
Add code that tries to provoke dex-cache collisions.
Change-Id: I58c7905597a501f3731efe4c6e1e2f7772e3b312
-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 | 57 |
3 files changed, 104 insertions, 0 deletions
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..1b2a4a4ceb 100644 --- a/test/068-classloader/src/Main.java +++ b/test/068-classloader/src/Main.java @@ -58,6 +58,63 @@ public class Main { testAbstract(loader); testImplement(loader); testIfaceImplement(loader); + + testSeparation(); + } + + 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); } /** |