Path: blob/master/test/hotspot/jtreg/serviceability/jvmti/GetNamedModule/libGetNamedModuleTest.c
41153 views
/*1* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223#include <stdio.h>24#include <string.h>25#include "jvmti.h"2627#ifdef __cplusplus28extern "C" {29#endif3031#ifndef JNI_ENV_ARG3233#ifdef __cplusplus34#define JNI_ENV_ARG(x, y) y35#define JNI_ENV_PTR(x) x36#else37#define JNI_ENV_ARG(x,y) x, y38#define JNI_ENV_PTR(x) (*x)39#endif4041#endif4243#define TranslateError(err) "JVMTI error"4445#define PASSED 046#define FAILED 24748static const char *EXC_CNAME = "java/lang/Exception";49static const char* MOD_CNAME = "Ljava/lang/Module;";5051static jvmtiEnv *jvmti = NULL;52static jint result = PASSED;53static jboolean printdump = JNI_FALSE;5455static jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved);5657JNIEXPORT58jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {59return Agent_Initialize(jvm, options, reserved);60}6162JNIEXPORT63jint JNICALL Agent_OnAttach(JavaVM *jvm, char *options, void *reserved) {64return Agent_Initialize(jvm, options, reserved);65}6667JNIEXPORT68jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {69return JNI_VERSION_1_8;70}7172static73jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {74jint res;7576if (options != NULL && strcmp(options, "printdump") == 0) {77printdump = JNI_TRUE;78}7980res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &jvmti),81JVMTI_VERSION_9);82if (res != JNI_OK || jvmti == NULL) {83printf(" Error: wrong result of a valid call to GetEnv!\n");84return JNI_ERR;85}8687return JNI_OK;88}8990static91jint throw_exc(JNIEnv *env, char *msg) {92jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME));9394if (exc_class == NULL) {95printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME);96return -1;97}98return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);99}100101static102jobject get_class_loader(jclass cls) {103jvmtiError err = JVMTI_ERROR_NONE;104jobject loader = NULL;105106if (printdump == JNI_TRUE) {107printf(">>> getting class loader ...\n");108}109err = (*jvmti)->GetClassLoader(jvmti, cls, &loader);110if (err != JVMTI_ERROR_NONE) {111printf(" Error in GetClassLoader: %s (%d)\n", TranslateError(err), err);112}113return loader;114}115116static117jclass jlM(JNIEnv *env) {118jclass cls = NULL;119120cls = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, MOD_CNAME));121if (cls == NULL) {122printf(" Error in JNI FindClass: %s\n", MOD_CNAME);123}124return cls;125}126127jmethodID128get_method(JNIEnv *env, jclass clazz, const char * name, const char *sig) {129jmethodID method = NULL;130131method = JNI_ENV_PTR(env)->GetMethodID(JNI_ENV_ARG(env, clazz), name, sig);132if (method == NULL) {133printf(" Error in JNI GetMethodID %s with signature %s", name, sig);134}135return method;136}137138static139jobject get_module_loader(JNIEnv *env, jobject module) {140static jmethodID cl_method = NULL;141jobject loader = NULL;142143if (cl_method == NULL) {144cl_method = get_method(env, jlM(env), "getClassLoader", "()Ljava/lang/ClassLoader;");145}146loader = (jobject)JNI_ENV_PTR(env)->CallObjectMethod(JNI_ENV_ARG(env, module), cl_method);147return loader;148}149150static151const char* get_module_name(JNIEnv *env, jobject module) {152static jmethodID method = NULL;153jobject loader = NULL;154jstring jstr = NULL;155const char *name = NULL;156const char *nstr = NULL;157158if (method == NULL) {159method = get_method(env, jlM(env), "getName", "()Ljava/lang/String;");160}161jstr = (jstring)JNI_ENV_PTR(env)->CallObjectMethod(JNI_ENV_ARG(env, module), method);162if (jstr != NULL) {163name = JNI_ENV_PTR(env)->GetStringUTFChars(JNI_ENV_ARG(env, jstr), NULL);164}165loader = get_module_loader(env, module);166nstr = (name == NULL) ? "<UNNAMED>" : name;167printf(" loader: %p, module: %p, name: %s\n", loader, module, nstr);168return name;169}170171static172jvmtiError get_module(JNIEnv *env,173jobject loader,174const char* pkg_name,175jobject* module_ptr,176const char** mod_name_ptr) {177jvmtiError err = JVMTI_ERROR_NONE;178const char* name = (pkg_name == NULL) ? "<NULL>" : pkg_name;179180printf(">>> getting module by loader %p and package \"%s\"\n", loader, name);181*mod_name_ptr = NULL;182err = (*jvmti)->GetNamedModule(jvmti, loader, pkg_name, module_ptr);183if (err != JVMTI_ERROR_NONE) {184printf(" Error in GetNamedModule for package \"%s\": %s (%d)\n",185name, TranslateError(err), err);186return err;187}188printf(" returned module: %p\n", *module_ptr);189if (*module_ptr == NULL) { // named module was not found190return err;191}192*mod_name_ptr = get_module_name(env, *module_ptr);193return err;194}195196static197jint get_all_modules(JNIEnv *env) {198jvmtiError err;199jint cnt = -1;200jint idx = 0;201jobject* modules;202203printf(">>> Inspecting modules with GetAllModules\n");204err = (*jvmti)->GetAllModules(jvmti, &cnt, &modules);205if (err != JVMTI_ERROR_NONE) {206printf("Error in GetAllModules: %d\n", err);207return -1;208}209for (idx = 0; idx < cnt; ++idx) {210get_module_name(env, modules[idx]);211}212return cnt;213}214215static216jint check_bad_loader(JNIEnv *env, jobject loader) {217jvmtiError err = JVMTI_ERROR_NONE;218jobject module = NULL;219const char* mod_name = NULL;220221err = get_module(env, loader, "", &module, &mod_name);222if (err != JVMTI_ERROR_ILLEGAL_ARGUMENT) {223return FAILED;224}225printf(" got expected JVMTI_ERROR_ILLEGAL_ARGUMENT for bad loader\n");226return PASSED;227}228229static230jint check_system_loader(JNIEnv *env, jobject loader) {231jvmtiError err = JVMTI_ERROR_NONE;232jobject module = NULL;233const char* exp_name = NULL;234const char* mod_name = NULL;235236// NULL pointer for package name237err = get_module(env, loader, NULL, &module, &mod_name);238if (err != JVMTI_ERROR_NULL_POINTER) {239throw_exc(env, "check #SN1: failed to return JVMTI_ERROR_NULL_POINTER for NULL package");240return FAILED;241}242243// NULL pointer for module_ptr244err = (*jvmti)->GetNamedModule(jvmti, loader, "", NULL);245if (err != JVMTI_ERROR_NULL_POINTER) {246throw_exc(env, "check #SN2: failed to return JVMTI_ERROR_NULL_POINTER for NULL module_ptr");247return FAILED;248}249250// Unnamed/default package ""251err = get_module(env, loader, "", &module, &mod_name);252if (err != JVMTI_ERROR_NONE) {253throw_exc(env, "check #S1: failed to return JVMTI_ERROR_NONE for default package");254return FAILED;255}256if (module != NULL || mod_name != NULL) {257throw_exc(env, "check #S2: failed to return NULL-module for default package");258return FAILED;259}260261// Test package: MyPackage262err = get_module(env, loader, "MyPackage", &module, &mod_name);263if (err != JVMTI_ERROR_NONE) {264throw_exc(env, "check #S3: failed to return JVMTI_ERROR_NONE for MyPackage");265return FAILED;266}267if (module != NULL || mod_name != NULL) {268throw_exc(env, "check #S4: failed to return NULL-module for MyPackage");269return FAILED;270}271272// Package: com/sun/jdi273exp_name = "jdk.jdi";274err = get_module(env, loader, "com/sun/jdi", &module, &mod_name);275if (err != JVMTI_ERROR_NONE) {276throw_exc(env, "check #S5: failed to return JVMTI_ERROR_NONE for test package");277return FAILED;278}279if (module == NULL || mod_name == NULL) {280throw_exc(env, "check #S6: failed to return named module for com/sun/jdi package");281return FAILED;282}283if (strcmp(mod_name, exp_name) != 0) {284printf("check #S7: failed to return right module, expected: %s, returned: %s\n",285exp_name, mod_name);286throw_exc(env, "check #S7: failed to return jdk.jdi module for com/sun/jdi package");287return FAILED;288}289290// Non-existing package: "bad/package/name"291err = get_module(env, loader, "bad/package/name", &module, &mod_name);292if (err != JVMTI_ERROR_NONE) {293throw_exc(env, "check #S8: failed to return JVMTI_ERROR_NONE for bad package");294return FAILED;295}296if (module != NULL || mod_name != NULL) {297throw_exc(env, "check #S9: failed to return NULL-module for bad package");298return FAILED;299}300return PASSED;301}302303static304jint check_bootstrap_loader(JNIEnv *env, jobject loader) {305jvmtiError err = JVMTI_ERROR_NONE;306jobject module = NULL;307const char* exp_name = NULL;308const char* mod_name = NULL;309310// NULL pointer for package name311err = get_module(env, loader, NULL, &module, &mod_name);312if (err != JVMTI_ERROR_NULL_POINTER) {313throw_exc(env, "check #BN1: failed to return JVMTI_ERROR_NULL_POINTER for NULL package");314return FAILED;315}316317// NULL pointer for module_ptr318err = (*jvmti)->GetNamedModule(jvmti, loader, "", NULL);319if (err != JVMTI_ERROR_NULL_POINTER) {320throw_exc(env, "check #BN2: failed to return JVMTI_ERROR_NULL_POINTER for NULL module_ptr");321return FAILED;322}323324// Unnamed/default package ""325err = get_module(env, loader, "", &module, &mod_name);326if (err != JVMTI_ERROR_NONE) {327throw_exc(env, "check #B1: failed to return JVMTI_ERROR_NONE for default package");328return FAILED;329}330if (module != NULL || mod_name != NULL) {331throw_exc(env, "check #B2: failed to return NULL-module for default package");332return FAILED;333}334335// Normal package from java.base module: "java/lang"336exp_name = "java.base";337err = get_module(env, loader, "java/lang", &module, &mod_name);338if (err != JVMTI_ERROR_NONE) {339throw_exc(env, "check #B3: failed to return JVMTI_ERROR_NONE for java/lang package");340return FAILED;341}342if (module == NULL || mod_name == NULL) {343throw_exc(env, "check #B4: failed to return named module for java/lang package");344return FAILED;345}346if (strcmp(exp_name, mod_name) != 0) {347printf("check #B5: failed to return right module, expected: %s, returned: %s\n",348exp_name, mod_name);349throw_exc(env, "check #B5: failed to return expected module for java/lang package");350return FAILED;351}352353// Non-existing package: "bad/package/name"354err = get_module(env, loader, "bad/package/name", &module, &mod_name);355if (err != JVMTI_ERROR_NONE) {356throw_exc(env, "check #B6: failed to return JVMTI_ERROR_NONE for bad package");357return FAILED;358}359if (module != NULL || mod_name != NULL) {360throw_exc(env, "check #B7: failed to return NULL-module for bad package");361return FAILED;362}363return PASSED;364}365366JNIEXPORT jint JNICALL367Java_MyPackage_GetNamedModuleTest_check(JNIEnv *env, jclass cls) {368jobject loader = NULL;369370if (jvmti == NULL) {371throw_exc(env, "JVMTI client was not properly loaded!\n");372return FAILED;373}374375get_all_modules(env);376377printf("\n*** Check for bad ClassLoader ***\n\n");378result = check_bad_loader(env, (jobject)cls);379if (result != PASSED) {380throw_exc(env, "check #L1: failed to return JVMTI_ERROR_ILLEGAL_ARGUMENT for bad loader");381return result;382}383384loader = get_class_loader(cls);385if (loader == NULL) {386throw_exc(env, "check #L2: failed to return non-NULL loader for valid test class");387return FAILED;388}389390printf("\n*** Checks for System ClassLoader ***\n\n");391result = check_system_loader(env, loader);392if (result != PASSED) {393return result;394}395396printf("\n*** Checks for Bootstrap ClassLoader ***\n\n");397result = check_bootstrap_loader(env, NULL);398399return result;400}401402#ifdef __cplusplus403}404#endif405406407