Path: blob/master/test/hotspot/jtreg/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.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;5354static jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved);5556JNIEXPORT57jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {58return Agent_Initialize(jvm, options, reserved);59}6061JNIEXPORT62jint JNICALL Agent_OnAttach(JavaVM *jvm, char *options, void *reserved) {63return Agent_Initialize(jvm, options, reserved);64}6566JNIEXPORT67jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {68return JNI_VERSION_1_8;69}7071static72jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) {73jint res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &jvmti),74JVMTI_VERSION_9);75if (res != JNI_OK || jvmti == NULL) {76printf(" Error: wrong result of a valid call to GetEnv!\n");77return JNI_ERR;78}7980return JNI_OK;81}8283static84void throw_exc(JNIEnv *env, char *msg) {85jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME));86jint rt = JNI_OK;8788if (exc_class == NULL) {89printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME);90return;91}92rt = JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg);93if (rt == JNI_ERR) {94printf("throw_exc: Error in JNI ThrowNew(env, %s)\n", msg);95}96}9798static99jclass jlM(JNIEnv *env) {100jclass cls = NULL;101102cls = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, MOD_CNAME));103if (cls == NULL) {104printf(" Error in JNI FindClass: %s\n", MOD_CNAME);105}106return cls;107}108109jmethodID110get_method(JNIEnv *env, jclass clazz, const char * name, const char *sig) {111jmethodID method = NULL;112113method = JNI_ENV_PTR(env)->GetMethodID(JNI_ENV_ARG(env, clazz), name, sig);114if (method == NULL) {115printf(" Error in JNI GetMethodID %s with signature %s", name, sig);116}117return method;118}119120static121jboolean can_use_service(JNIEnv *env, jobject module, jclass service) {122static jmethodID mCanUse = NULL;123jboolean res = JNI_FALSE;124125if (mCanUse == NULL) {126const char* sign = "(Ljava/lang/Class;)Z";127mCanUse = get_method(env, jlM(env), "canUse", sign);128}129res = JNI_ENV_PTR(env)->CallBooleanMethod(JNI_ENV_ARG(env, module),130mCanUse, service);131return res;132}133134JNIEXPORT jint JNICALL135Java_MyPackage_AddModuleUsesAndProvidesTest_checkUses(JNIEnv *env,136jclass cls,137jobject baseModule,138jclass service) {139jvmtiError err = JVMTI_ERROR_NONE;140jboolean used = JNI_FALSE;141142// Add a service to use to NULL module143printf("Check #UN1:\n");144err = (*jvmti)->AddModuleUses(jvmti, NULL, service);145if (err != JVMTI_ERROR_NULL_POINTER) {146printf("#UN1: jvmtiError from AddModuleUses: %d\n", err);147throw_exc(env, "Check #UN1: failed to return JVMTI_ERROR_NULL_POINTER for module==NULL");148return FAILED;149}150151// Add NULL service to use to baseModule152printf("Check #UN2:\n");153err = (*jvmti)->AddModuleUses(jvmti, baseModule, NULL);154if (err != JVMTI_ERROR_NULL_POINTER) {155printf("#UN2: jvmtiError from AddModuleUses: %d\n", err);156throw_exc(env, "Check #UN2: failed to return JVMTI_ERROR_NULL_POINTER for service==NULL");157return FAILED;158}159160// Add service to use to invalid module (cls)161printf("Check #UI1:\n");162err = (*jvmti)->AddModuleUses(jvmti, (jobject)cls, service);163if (err != JVMTI_ERROR_INVALID_MODULE) {164printf("#UI1: jvmtiError from AddModuleUses: %d\n", err);165throw_exc(env, "Check #UI1: did not get expected JVMTI_ERROR_INVALID_MODULE for invalid module");166return FAILED;167}168169// Add invalid service (thisModule) to use to baseModule170printf("Check #UI2:\n");171err = (*jvmti)->AddModuleUses(jvmti, baseModule, baseModule);172if (err != JVMTI_ERROR_INVALID_CLASS) {173printf("#UI2: jvmtiError from AddModuleUses: %d\n", err);174throw_exc(env, "Check #UI2: did not get expected JVMTI_ERROR_INVALID_CLASS for invalid service");175return FAILED;176}177178// Check if the service can not be used179printf("Check #UC1:\n");180used = can_use_service(env, baseModule, service);181if (used != JNI_FALSE) {182throw_exc(env, "Check #UC1: unexpected use of service");183return FAILED;184}185186// Add uses of a correct service187printf("Check #UC2:\n");188err = (*jvmti)->AddModuleUses(jvmti, baseModule, service);189if (err != JVMTI_ERROR_NONE) {190printf("#UC2: jvmtiError from AddModuleUses: %d\n", err);191throw_exc(env, "Check #UC2: got unexpected JVMTI error");192return FAILED;193}194195// Check if the service can not be used196printf("Check #UC3:\n");197used = can_use_service(env, baseModule, service);198if (used == JNI_FALSE) {199throw_exc(env, "Check #UC3: service can not be used unexpectedly");200return FAILED;201}202fflush(0);203return PASSED;204}205206JNIEXPORT jint JNICALL207Java_MyPackage_AddModuleUsesAndProvidesTest_checkProvides(JNIEnv *env,208jclass cls,209jobject baseModule,210jclass service,211jclass serviceImpl) {212jvmtiError err = JVMTI_ERROR_NONE;213jboolean provided = JNI_FALSE;214215// Add provides to NULL module216printf("Check #PN1:\n");217err = (*jvmti)->AddModuleProvides(jvmti, NULL, service, serviceImpl);218if (err != JVMTI_ERROR_NULL_POINTER) {219printf("#PN1: jvmtiError from AddModuleProvides: %d\n", err);220throw_exc(env, "Check #PN1: failed to return JVMTI_ERROR_NULL_POINTER for module==NULL");221return FAILED;222}223224// Add provides with NULL service225printf("Check #PN2:\n");226err = (*jvmti)->AddModuleProvides(jvmti, baseModule, NULL, serviceImpl);227if (err != JVMTI_ERROR_NULL_POINTER) {228printf("#PN2: jvmtiError from AddModuleProvides: %d\n", err);229throw_exc(env, "Check #PN2: failed to return JVMTI_ERROR_NULL_POINTER for service==NULL");230return FAILED;231}232233// Add provides with NULL serviceImpl234printf("Check #PN3:\n");235err = (*jvmti)->AddModuleProvides(jvmti, baseModule, service, NULL);236if (err != JVMTI_ERROR_NULL_POINTER) {237printf("#PN3: jvmtiError from AddModuleProvides: %d\n", err);238throw_exc(env, "Check #PN3: failed to return JVMTI_ERROR_NULL_POINTER for serviceImpl==NULL");239return FAILED;240}241242// Add provides to invalid module (cls)243printf("Check #PI1:\n");244err = (*jvmti)->AddModuleProvides(jvmti, (jobject)cls, service, serviceImpl);245if (err != JVMTI_ERROR_INVALID_MODULE) {246printf("#PI1: jvmtiError from AddModuleProvides: %d\n", err);247throw_exc(env, "Check #PI1: did not get expected JVMTI_ERROR_INVALID_MODULE for invalid module");248return FAILED;249}250251// Add provides with invalid service (baseModule)252printf("Check #PI2:\n");253err = (*jvmti)->AddModuleProvides(jvmti, baseModule, baseModule, serviceImpl);254if (err != JVMTI_ERROR_INVALID_CLASS) {255printf("#PI2: jvmtiError from AddModuleProvides: %d\n", err);256throw_exc(env, "Check #PI2: did not get expected JVMTI_ERROR_INVALID_CLASS for invalid service");257return FAILED;258}259260// Add provides with invalid serviceImpl (baseModule)261printf("Check #PI3:\n");262err = (*jvmti)->AddModuleProvides(jvmti, baseModule, service, baseModule);263if (err != JVMTI_ERROR_INVALID_CLASS) {264printf("#PI3: jvmtiError from AddModuleProvides: %d\n", err);265throw_exc(env, "Check #PI3: did not get expected JVMTI_ERROR_INVALID_CLASS for invalid serviceImpl");266return FAILED;267}268269// Add provides to baseModule with correct service and serviceImpl270printf("Check #PC2:\n");271err = (*jvmti)->AddModuleProvides(jvmti, baseModule, service, serviceImpl);272if (err != JVMTI_ERROR_NONE) {273printf("#PC2: jvmtiError from AddModuleExports: %d\n", err);274throw_exc(env, "Check #PC2: error in add provides to baseModule with correct service and serviceImpl");275return FAILED;276}277fflush(0);278return PASSED;279}280281#ifdef __cplusplus282}283#endif284285286