diff options
author | 2018-02-13 10:09:03 -0800 | |
---|---|---|
committer | 2018-02-15 10:12:09 -0800 | |
commit | 8fd08569ac9c93c17742569965bf72f713998145 (patch) | |
tree | 7e999ee63e12454d044e7b7fc616849b092c7806 | |
parent | d1652d14fbf477b3091eec3764b9890f2c072055 (diff) |
Refactor test 983 to prepare for inclusion in CTS
In order for test 983 to be included in CTS we needed to make changes
to remove its custom Agent_OnLoad and ensure that all printing is done
through System.out.
Test: ./test.py --host -j50
Bug: 73252141
Change-Id: If18e58305a1a4dd7d915fabfbacbe95c8212e801
-rw-r--r-- | test/983-source-transform-verify/source_transform.cc | 56 | ||||
-rw-r--r-- | test/983-source-transform-verify/source_transform.h | 30 | ||||
-rw-r--r-- | test/983-source-transform-verify/src/art/Test983.java | 8 | ||||
-rw-r--r-- | test/Android.bp | 9 | ||||
-rw-r--r-- | test/ti-agent/common_load.cc | 2 |
5 files changed, 42 insertions, 63 deletions
diff --git a/test/983-source-transform-verify/source_transform.cc b/test/983-source-transform-verify/source_transform.cc index dfefce207b..26c5668681 100644 --- a/test/983-source-transform-verify/source_transform.cc +++ b/test/983-source-transform-verify/source_transform.cc @@ -19,25 +19,19 @@ #include <cstdio> #include <cstring> #include <iostream> +#include <sstream> #include <vector> #include "android-base/stringprintf.h" #include "jni.h" #include "jvmti.h" +#include "scoped_local_ref.h" -#include "base/macros.h" -#include "bytecode_utils.h" #include "dex/code_item_accessors-inl.h" -#include "dex/art_dex_file_loader.h" +#include "dex/dex_file_loader.h" #include "dex/dex_file.h" #include "dex/dex_file_loader.h" #include "dex/dex_instruction.h" -#include "jit/jit.h" -#include "native_stack_dump.h" -#include "runtime.h" -#include "scoped_thread_state_change-inl.h" -#include "thread-current-inl.h" -#include "thread_list.h" // Test infrastructure #include "jvmti_helper.h" @@ -48,9 +42,19 @@ namespace Test983SourceTransformVerify { constexpr bool kSkipInitialLoad = true; +static void Println(JNIEnv* env, std::ostringstream msg_stream) { + std::string msg = msg_stream.str(); + ScopedLocalRef<jclass> test_klass(env, env->FindClass("art/Test983")); + jmethodID println_method = env->GetStaticMethodID(test_klass.get(), + "doPrintln", + "(Ljava/lang/String;)V"); + ScopedLocalRef<jstring> data(env, env->NewStringUTF(msg.c_str())); + env->CallStaticVoidMethod(test_klass.get(), println_method, data.get()); +} + // The hook we are using. void JNICALL CheckDexFileHook(jvmtiEnv* jvmti_env ATTRIBUTE_UNUSED, - JNIEnv* jni_env ATTRIBUTE_UNUSED, + JNIEnv* env, jclass class_being_redefined, jobject loader ATTRIBUTE_UNUSED, const char* name, @@ -60,10 +64,11 @@ void JNICALL CheckDexFileHook(jvmtiEnv* jvmti_env ATTRIBUTE_UNUSED, jint* new_class_data_len ATTRIBUTE_UNUSED, unsigned char** new_class_data ATTRIBUTE_UNUSED) { if (kSkipInitialLoad && class_being_redefined == nullptr) { - // Something got loaded concurrently. Just ignore it for now. + // Something got loaded concurrently. Just ignore it for now. To make sure the test is + // repeatable we only care about things that come from RetransformClasses. return; } - std::cout << "Dex file hook for " << name << std::endl; + Println(env, std::ostringstream() << "Dex file hook for " << name); if (IsJVM()) { return; } @@ -75,7 +80,7 @@ void JNICALL CheckDexFileHook(jvmtiEnv* jvmti_env ATTRIBUTE_UNUSED, CHECK_LE(static_cast<jint>(header_file_size), class_data_len); class_data_len = static_cast<jint>(header_file_size); - const ArtDexFileLoader dex_file_loader; + const DexFileLoader dex_file_loader; std::string error; std::unique_ptr<const DexFile> dex(dex_file_loader.Open(class_data, class_data_len, @@ -86,7 +91,8 @@ void JNICALL CheckDexFileHook(jvmtiEnv* jvmti_env ATTRIBUTE_UNUSED, /*verify_checksum*/ true, &error)); if (dex.get() == nullptr) { - std::cout << "Failed to verify dex file for " << name << " because " << error << std::endl; + Println(env, std::ostringstream() << "Failed to verify dex file for " + << name << " because " << error); return; } for (uint32_t i = 0; i < dex->NumClassDefs(); i++) { @@ -105,9 +111,10 @@ void JNICALL CheckDexFileHook(jvmtiEnv* jvmti_env ATTRIBUTE_UNUSED, int forbiden_flags = (Instruction::kVerifyError | Instruction::kVerifyRuntimeOnly); if (inst.Opcode() == Instruction::RETURN_VOID_NO_BARRIER || (inst.GetVerifyExtraFlags() & forbiden_flags) != 0) { - std::cout << "Unexpected instruction found in " << dex->PrettyMethod(it.GetMemberIndex()) - << " [Dex PC: 0x" << std::hex << pair.DexPc() << std::dec << "] : " - << inst.DumpString(dex.get()) << std::endl; + Println(env, std::ostringstream() << "Unexpected instruction found in " + << dex->PrettyMethod(it.GetMemberIndex()) + << " [Dex PC: 0x" << std::hex << pair.DexPc() + << std::dec << "] : " << inst.DumpString(dex.get())); continue; } } @@ -116,22 +123,11 @@ void JNICALL CheckDexFileHook(jvmtiEnv* jvmti_env ATTRIBUTE_UNUSED, } // Get all capabilities except those related to retransformation. -jint OnLoad(JavaVM* vm, - char* options ATTRIBUTE_UNUSED, - void* reserved ATTRIBUTE_UNUSED) { - if (vm->GetEnv(reinterpret_cast<void**>(&jvmti_env), JVMTI_VERSION_1_0)) { - printf("Unable to get jvmti env!\n"); - return 1; - } - SetStandardCapabilities(jvmti_env); +extern "C" JNIEXPORT void JNICALL Java_art_Test983_setupLoadHook(JNIEnv* env, jclass) { jvmtiEventCallbacks cb; memset(&cb, 0, sizeof(cb)); cb.ClassFileLoadHook = CheckDexFileHook; - if (jvmti_env->SetEventCallbacks(&cb, sizeof(cb)) != JVMTI_ERROR_NONE) { - printf("Unable to set class file load hook cb!\n"); - return 1; - } - return 0; + JvmtiErrorToException(env, jvmti_env, jvmti_env->SetEventCallbacks(&cb, sizeof(cb))); } } // namespace Test983SourceTransformVerify diff --git a/test/983-source-transform-verify/source_transform.h b/test/983-source-transform-verify/source_transform.h deleted file mode 100644 index db9415aec1..0000000000 --- a/test/983-source-transform-verify/source_transform.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2017 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. - */ - -#ifndef ART_TEST_983_SOURCE_TRANSFORM_VERIFY_SOURCE_TRANSFORM_H_ -#define ART_TEST_983_SOURCE_TRANSFORM_VERIFY_SOURCE_TRANSFORM_H_ - -#include <jni.h> - -namespace art { -namespace Test983SourceTransformVerify { - -jint OnLoad(JavaVM* vm, char* options, void* reserved); - -} // namespace Test983SourceTransformVerify -} // namespace art - -#endif // ART_TEST_983_SOURCE_TRANSFORM_VERIFY_SOURCE_TRANSFORM_H_ diff --git a/test/983-source-transform-verify/src/art/Test983.java b/test/983-source-transform-verify/src/art/Test983.java index faae96aef6..7dc47ab06a 100644 --- a/test/983-source-transform-verify/src/art/Test983.java +++ b/test/983-source-transform-verify/src/art/Test983.java @@ -27,7 +27,15 @@ public class Test983 { doTest(); } + private native static void setupLoadHook(); + + /* called from JNI */ + public static void doPrintln(String str) { + System.out.println(str); + } + public static void doTest() { + setupLoadHook(); Redefinition.enableCommonRetransformation(true); Redefinition.doCommonClassRetransformation(Transform.class); Redefinition.doCommonClassRetransformation(Object.class); diff --git a/test/Android.bp b/test/Android.bp index 5f39ffefa9..8b88b09f7c 100644 --- a/test/Android.bp +++ b/test/Android.bp @@ -238,6 +238,7 @@ art_cc_defaults { "931-agent-thread/agent_thread.cc", "933-misc-events/misc_events.cc", "945-obsolete-native/obsolete_native.cc", + "983-source-transform-verify/source_transform.cc", "984-obsolete-invoke/obsolete_invoke.cc", "986-native-method-bind/native_bind.cc", "987-agent-bind/agent_bind.cc", @@ -288,7 +289,6 @@ art_cc_defaults { "909-attach-agent/attach.cc", "912-classes/classes_art.cc", "936-search-onload/search_onload.cc", - "983-source-transform-verify/source_transform.cc", "1940-ddms-ext/ddm_ext.cc", "1944-sudden-exit/sudden_exit.cc", ], @@ -329,6 +329,13 @@ art_cc_test_library { shared_libs: [ "liblog", ], + header_libs: [ + // This is needed to resolve the base/ header file in libdexfile. Unfortunately there are + // many problems with how we export headers that are making doing this the 'right' way + // difficult. + // TODO: move those headers to art/ rather than under runtime. + "libart_runtime_headers", + ], export_include_dirs: ["ti-agent"], } diff --git a/test/ti-agent/common_load.cc b/test/ti-agent/common_load.cc index 9a7352e479..bfd165db10 100644 --- a/test/ti-agent/common_load.cc +++ b/test/ti-agent/common_load.cc @@ -28,7 +28,6 @@ #include "901-hello-ti-agent/basics.h" #include "909-attach-agent/attach.h" #include "936-search-onload/search_onload.h" -#include "983-source-transform-verify/source_transform.h" #include "1919-vminit-thread-start-timing/vminit.h" namespace art { @@ -83,7 +82,6 @@ static AgentLib agents[] = { { "939-hello-transformation-bcp", common_redefine::OnLoad, nullptr }, { "941-recursive-obsolete-jit", common_redefine::OnLoad, nullptr }, { "943-private-recursive-jit", common_redefine::OnLoad, nullptr }, - { "983-source-transform-verify", Test983SourceTransformVerify::OnLoad, nullptr }, { "1919-vminit-thread-start-timing", Test1919VMInitThreadStart::OnLoad, nullptr }, }; |