diff options
author | Sebastien Hertz <shertz@google.com> | 2013-12-13 15:19:18 +0100 |
---|---|---|
committer | Sebastien Hertz <shertz@google.com> | 2013-12-13 16:23:26 +0100 |
commit | 96f36674d3cb1e0a589b71f386a4bea5e658fc75 (patch) | |
tree | f9ee3835ea2b7c9a4957511ef85378453a6895e4 /test | |
parent | 315ab6c077c4db2031f1ffa40b78722d8269dc9b (diff) | |
download | art-96f36674d3cb1e0a589b71f386a4bea5e658fc75.zip art-96f36674d3cb1e0a589b71f386a4bea5e658fc75.tar.gz art-96f36674d3cb1e0a589b71f386a4bea5e658fc75.tar.bz2 |
Add verification stress test.
This is more a benchmark than a real test. It highlights a pattern where Art's
verifier is currently slower than Dalvik's verifier.
Bug: 12126841
Change-Id: I1ed6466798696b0aa04b94edac2d2b9d0015c6a2
Diffstat (limited to 'test')
-rw-r--r-- | test/303-verification-stress/build | 28 | ||||
-rw-r--r-- | test/303-verification-stress/classes-gen.c | 64 | ||||
-rw-r--r-- | test/303-verification-stress/expected.txt | 12 | ||||
-rw-r--r-- | test/303-verification-stress/info.txt | 7 | ||||
-rw-r--r-- | test/303-verification-stress/src/Main.java | 27 |
5 files changed, 138 insertions, 0 deletions
diff --git a/test/303-verification-stress/build b/test/303-verification-stress/build new file mode 100644 index 0000000..2ef9bea --- /dev/null +++ b/test/303-verification-stress/build @@ -0,0 +1,28 @@ +#!/bin/bash +# +# Copyright (C) 2013 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. + +# Stop if something fails. +set -e + +# Write out a bunch of source files. +gcc -o classes-gen classes-gen.c +./classes-gen + +mkdir classes +${JAVAC} -d classes src/*.java + +${DX} --debug --dex --dump-to=classes.lst --output=classes.dex classes +zip $TEST_NAME.jar classes.dex diff --git a/test/303-verification-stress/classes-gen.c b/test/303-verification-stress/classes-gen.c new file mode 100644 index 0000000..be6cfa7 --- /dev/null +++ b/test/303-verification-stress/classes-gen.c @@ -0,0 +1,64 @@ +/* + * Copyright 2013 The Android Open Source Project + * + * Generate a big pile of classes with big <clinit>. + */ +#include <stdio.h> + +/* + * Create N files. + */ +static int createFiles(int count, int array_size) +{ + FILE* fp; + int i; + int k; + + for (i = 0; i < count; i++) { + char nameBuf[32]; + + snprintf(nameBuf, sizeof(nameBuf), "src/Test%03d.java", i); + fp = fopen(nameBuf, "w"); + if (fp == NULL) { + fprintf(stderr, "ERROR: unable to open %s\n", nameBuf); + return -1; + } + + fprintf(fp, "public class Test%03d {\n", i); + fprintf(fp, " static String[] array = new String[%d];\n", array_size); + fprintf(fp, " static {\n", array_size); + for (k = 0; k < array_size; k++) { + fprintf(fp, " array[%d] = \"string_%04d\";\n", k, k); + } + fprintf(fp, " }\n", array_size); + fprintf(fp, "}\n"); + fclose(fp); + } + + // Create test class. + fp = fopen("src/MainTest.java", "w"); + if (fp == NULL) { + fprintf(stderr, "ERROR: unable to open src/MainTest.java\n"); + return -1; + } + fprintf(fp, "public class MainTest {\n"); + fprintf(fp, " public static void run() {\n"); + for (i = 0; i < count; i++) { + fprintf(fp, " System.out.println(\"Create new Test%03d\");\n", i); + fprintf(fp, " new Test%03d();\n", i); + } + fprintf(fp, " }\n"); + fprintf(fp, "}\n"); + fclose(fp); + + return 0; +} + +int main() +{ + int result; + + result = createFiles(40, 2000); + + return (result != 0); +} diff --git a/test/303-verification-stress/expected.txt b/test/303-verification-stress/expected.txt new file mode 100644 index 0000000..cdfd6cb --- /dev/null +++ b/test/303-verification-stress/expected.txt @@ -0,0 +1,12 @@ +Starting test +Create new Test000 +Create new Test001 +Create new Test002 +Create new Test003 +Create new Test004 +Create new Test005 +Create new Test006 +Create new Test007 +Create new Test008 +Create new Test009 +Done diff --git a/test/303-verification-stress/info.txt b/test/303-verification-stress/info.txt new file mode 100644 index 0000000..131682c --- /dev/null +++ b/test/303-verification-stress/info.txt @@ -0,0 +1,7 @@ +This is more a benchmark for the verifier than a real test. We create many +classes, each one initializing a big array of string in its class initializer. +This generates big <clinit> methods in these classes. The goal is to stress the +verifier on such method. + +Note: these classes are generated automatically. The number of classes and the +size of string array can be modified in the script. diff --git a/test/303-verification-stress/src/Main.java b/test/303-verification-stress/src/Main.java new file mode 100644 index 0000000..d906bae --- /dev/null +++ b/test/303-verification-stress/src/Main.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2013 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. + */ + +public class Main { + + public static void main(String args[]) { + System.out.println("Starting test"); + + // MainTest class is generated automatically. + MainTest.run(); + + System.out.println("Done"); + } +} |