summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2013-04-11 17:14:50 -0700
committerElliott Hughes <enh@google.com>2013-04-11 17:14:50 -0700
commit9e11a836e0927e6ea9246b56d99e0482920b81c6 (patch)
tree8c022fbdaa2cea325ecff1f9baa944f2bd69f644 /tests
parent8d02ea426aff289e249ee13d6de2cc3dd85c0fde (diff)
downloadandroid_dalvik-9e11a836e0927e6ea9246b56d99e0482920b81c6.tar.gz
android_dalvik-9e11a836e0927e6ea9246b56d99e0482920b81c6.tar.bz2
android_dalvik-9e11a836e0927e6ea9246b56d99e0482920b81c6.zip
Fix flakiness in test 080-oom-throw.
The problem was that the instance test could potentially fill the heap close enough to the edge that you'd hit a follow-on OOME in the attempt to print the success message, causing the test to fail. I've also made the code a bit clearer while I'm here. Bug: https://code.google.com/p/android/issues/detail?id=54114 Change-Id: I39127c3ea6a99940fa66ad8763bbbf6c01d308ef
Diffstat (limited to 'tests')
-rw-r--r--tests/080-oom-throw/expected.txt4
-rw-r--r--tests/080-oom-throw/src/Main.java61
2 files changed, 31 insertions, 34 deletions
diff --git a/tests/080-oom-throw/expected.txt b/tests/080-oom-throw/expected.txt
index 811f68c95..73cc0d8b3 100644
--- a/tests/080-oom-throw/expected.txt
+++ b/tests/080-oom-throw/expected.txt
@@ -1,2 +1,2 @@
-Array allocation failed
-Instance allocation failed
+NEW_ARRAY correctly threw OOME
+NEW_INSTANCE correctly threw OOME
diff --git a/tests/080-oom-throw/src/Main.java b/tests/080-oom-throw/src/Main.java
index 3d75f3d9a..3ffe2f38a 100644
--- a/tests/080-oom-throw/src/Main.java
+++ b/tests/080-oom-throw/src/Main.java
@@ -16,64 +16,61 @@
public class Main {
static class ArrayMemEater {
- static int blowup(char[][] holder, int size) {
- int i = 0;
+ static boolean sawOome;
+
+ static void blowup(char[][] holder) {
try {
- for ( ; i < size; i++)
- holder[i] = new char[128];
+ for (int i = 0; i < holder.length; ++i) {
+ holder[i] = new char[128 * 1024];
+ }
} catch (OutOfMemoryError oome) {
- return i;
+ ArrayMemEater.sawOome = true;
}
-
- return size;
- }
-
- static void confuseCompilerOptimization(char[][] holder) {
}
}
static class InstanceMemEater {
+ static boolean sawOome;
+
InstanceMemEater next;
- double d1, d2, d3, d4, d5, d6, d7, d8;
+ double d1, d2, d3, d4, d5, d6, d7, d8; // Bloat this object so we fill the heap faster.
- static InstanceMemEater blowup() {
- InstanceMemEater memEater;
+ static InstanceMemEater allocate() {
try {
- memEater = new InstanceMemEater();
+ return new InstanceMemEater();
} catch (OutOfMemoryError e) {
- memEater = null;
+ InstanceMemEater.sawOome = true;
+ return null;
}
- return memEater;
}
- static void confuseCompilerOptimization(InstanceMemEater memEater) {
+ static void confuseCompilerOptimization(InstanceMemEater instance) {
}
}
- static void triggerArrayOOM() {
- int size = 1 * 1024 * 1024;
- char[][] holder = new char[size][];
-
- int count = ArrayMemEater.blowup(holder, size);
- ArrayMemEater.confuseCompilerOptimization(holder);
- if (count < size) {
- System.out.println("Array allocation failed");
- }
+ static boolean triggerArrayOOM() {
+ ArrayMemEater.blowup(new char[1 * 1024 * 1024][]);
+ return ArrayMemEater.sawOome;
}
- static void triggerInstanceOOM() {
- InstanceMemEater memEater = InstanceMemEater.blowup();
+ static boolean triggerInstanceOOM() {
+ InstanceMemEater memEater = InstanceMemEater.allocate();
InstanceMemEater lastMemEater = memEater;
do {
- lastMemEater.next = InstanceMemEater.blowup();
+ lastMemEater.next = InstanceMemEater.allocate();
lastMemEater = lastMemEater.next;
} while (lastMemEater != null);
memEater.confuseCompilerOptimization(memEater);
- System.out.println("Instance allocation failed");
+ return InstanceMemEater.sawOome;
}
public static void main(String[] args) {
- triggerArrayOOM();
- triggerInstanceOOM();
+ if (triggerArrayOOM()) {
+ System.out.println("NEW_ARRAY correctly threw OOME");
+ }
+
+ if (triggerInstanceOOM()) {
+ System.out.println("NEW_INSTANCE correctly threw OOME");
+ }
}
}