diff options
author | 2019-05-21 16:57:10 -0700 | |
---|---|---|
committer | 2019-05-22 03:23:26 +0000 | |
commit | 098e7a67588f39642567b91ecfab117dbaa84d31 (patch) | |
tree | 6bb9193916b4ee6e7998e7b707d2c326afbafd48 | |
parent | e48fd0b4780efadc6b3433fe7a56aa5be2a84325 (diff) |
Try to make test 1963 pass on fugu
The fugu test device we use seems to be old enough not to have a real
memfd_create syscall and something about the setup (probably the
chroot) is preventing the tmpfile() fallback from working. To make the
bot green have the test check to see if memfd_create should work and
ignore the test results if it's not.
Test: ./test.py --host
Test: Hope
Change-Id: I21f566344047eebb7e1817eea56cc83fd0d77558
-rwxr-xr-x | test/1963-add-to-dex-classloader-in-memory/check | 26 | ||||
-rw-r--r-- | test/1963-add-to-dex-classloader-in-memory/check_memfd_create.cc | 67 | ||||
-rw-r--r-- | test/1963-add-to-dex-classloader-in-memory/src/Main.java | 13 | ||||
-rw-r--r-- | test/Android.bp | 1 |
4 files changed, 106 insertions, 1 deletions
diff --git a/test/1963-add-to-dex-classloader-in-memory/check b/test/1963-add-to-dex-classloader-in-memory/check new file mode 100755 index 0000000000..ae1ebf3cd4 --- /dev/null +++ b/test/1963-add-to-dex-classloader-in-memory/check @@ -0,0 +1,26 @@ +#!/bin/bash +# +# Copyright (C) 2019 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. + +# Some of our test devices are so old that they don't have memfd_create and are setup in such a way +# that tmpfile() doesn't work. In these cases this test cannot complete successfully. + +if grep -q -- '---NO memfd_create---' $@; then + echo "The test device doesn't have memfd_create. Cannot verify test!" >&2 + exit 0 +fi + + +./default-check "$@" diff --git a/test/1963-add-to-dex-classloader-in-memory/check_memfd_create.cc b/test/1963-add-to-dex-classloader-in-memory/check_memfd_create.cc new file mode 100644 index 0000000000..70a64d71ee --- /dev/null +++ b/test/1963-add-to-dex-classloader-in-memory/check_memfd_create.cc @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2019 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. + */ + + +#include <string> +#include <iostream> +#include <sstream> + +#include "jvmti.h" + +#include "base/logging.h" +#include "base/globals.h" +#include "base/memfd.h" + +#ifdef __linux__ +#include <sys/utsname.h> +#endif + +namespace art { +namespace Test1963AddToDexClassLoaderInMemory { + +extern "C" JNIEXPORT jboolean JNICALL Java_Main_hasWorkingMemfdCreate(JNIEnv*, jclass) { + // We should always have a working version if we're on normal buildbots. + if (!art::kIsTargetBuild) { + return true; + } +#ifdef __linux__ + struct utsname name; + if (uname(&name) >= 0) { + std::istringstream version(name.release); + std::string major_str; + std::string minor_str; + std::getline(version, major_str, '.'); + std::getline(version, minor_str, '.'); + int major = std::stoi(major_str); + int minor = std::stoi(minor_str); + if (major >= 4 || (major == 3 && minor >= 17)) { + // memfd_create syscall was added in 3.17 + return true; + } + } +#endif + int res = memfd_create_compat("TEST THAT MEMFD CREATE WORKS", 0); + if (res < 0) { + PLOG(ERROR) << "Unable to call memfd_create_compat successfully!"; + return false; + } else { + close(res); + return true; + } +} + +} // namespace Test1963AddToDexClassLoaderInMemory +} // namespace art diff --git a/test/1963-add-to-dex-classloader-in-memory/src/Main.java b/test/1963-add-to-dex-classloader-in-memory/src/Main.java index 3728b45be6..1825e4faab 100644 --- a/test/1963-add-to-dex-classloader-in-memory/src/Main.java +++ b/test/1963-add-to-dex-classloader-in-memory/src/Main.java @@ -16,6 +16,17 @@ public class Main { public static void main(String[] args) throws Exception { - art.Test1963.run(); + try { + if (!hasWorkingMemfdCreate()) { + System.out.println("---NO memfd_create---"); + } + art.Test1963.run(); + } catch (Throwable t) { + System.out.println(t); + t.printStackTrace(System.out); + return; + } } + + public static native boolean hasWorkingMemfdCreate(); } diff --git a/test/Android.bp b/test/Android.bp index 263c615c0d..76fca0b2bf 100644 --- a/test/Android.bp +++ b/test/Android.bp @@ -328,6 +328,7 @@ art_cc_defaults { "1959-redefine-object-instrument/fake_redef_object.cc", "1960-obsolete-jit-multithread-native/native_say_hi.cc", "1964-add-to-dex-classloader-file/add_to_loader.cc", + "1963-add-to-dex-classloader-in-memory/check_memfd_create.cc", ], static_libs: [ "libz", |