1 /* 2 * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 #include <stdio.h> 25 #include <string.h> 26 #include "jni_tools.h" 27 #include "agent_common.h" 28 #include "jvmti_tools.h" 29 30 extern "C" { 31 32 #define CAPABILITY can_get_source_file_name 33 #define CAPABILITY_STR "can_get_source_file_name" 34 35 /* The test checks capability can_get_source_file_name 36 * and correspondent functions: 37 * GetSourceFileName 38 * 39 * Testcases: 40 * 1. Check if GetPotentialCapabilities returns the capability 41 * 2. Add the capability during Onload phase 42 * 3. Check if GetCapabilities returns the capability 43 * 4. Relinquish the capability during Onload phase 44 * 5. Check if GetCapabilities does not return the capability 45 * 6. Add back the capability and check with GetCapabilities 46 * 7. Check that only correspondent function work and functions of 47 * other capabilities return JVMTI_ERROR_MUST_POSSESS_CAPABILITY 48 * 8. Check if VM exits well with the capability has not been relinquished 49 */ 50 51 /* ========================================================================== */ 52 53 /* scaffold objects */ 54 static JNIEnv* jni = NULL; 55 static jvmtiEnv *jvmti = NULL; 56 static jlong timeout = 0; 57 58 /* test objects */ 59 static jthread thread = NULL; 60 static jclass klass = NULL; 61 static jmethodID method = NULL; 62 static jfieldID field = NULL; 63 64 /* ========================================================================== */ 65 66 static int prepare() { 67 const char* THREAD_NAME = "Debuggee Thread"; 68 jvmtiThreadInfo info; 69 jthread *threads = NULL; 70 jint threads_count = 0; 71 int i; 72 73 NSK_DISPLAY0("Prepare: find tested thread\n"); 74 75 /* get all live threads */ 76 if (!NSK_JVMTI_VERIFY(jvmti->GetAllThreads(&threads_count, &threads))) 77 return NSK_FALSE; 78 79 if (!NSK_VERIFY(threads_count > 0 && threads != NULL)) 80 return NSK_FALSE; 81 82 /* find tested thread */ 83 for (i = 0; i < threads_count; i++) { 84 if (!NSK_VERIFY(threads[i] != NULL)) 85 return NSK_FALSE; 86 87 /* get thread information */ 88 if (!NSK_JVMTI_VERIFY(jvmti->GetThreadInfo(threads[i], &info))) 89 return NSK_FALSE; 90 91 NSK_DISPLAY3(" thread #%d (%s): %p\n", i, info.name, threads[i]); 92 93 /* find by name */ 94 if (info.name != NULL && (strcmp(info.name, THREAD_NAME) == 0)) { 95 thread = threads[i]; 96 } 97 } 98 99 /* deallocate threads list */ 100 if (!NSK_JVMTI_VERIFY(jvmti->Deallocate((unsigned char*)threads))) 101 return NSK_FALSE; 102 103 /* get tested thread class */ 104 if (!NSK_JNI_VERIFY(jni, (klass = jni->GetObjectClass(thread)) != NULL)) 105 return NSK_FALSE; 106 107 /* get tested thread method 'run' */ 108 if (!NSK_JNI_VERIFY(jni, (method = jni->GetMethodID(klass, "run", "()V")) != NULL)) 109 return NSK_FALSE; 110 111 /* get tested thread field 'waitingMonitor' */ 112 if (!NSK_JNI_VERIFY(jni, (field = 113 jni->GetFieldID(klass, "waitingMonitor", "Ljava/lang/Object;")) != NULL)) 114 return NSK_FALSE; 115 116 return NSK_TRUE; 117 } 118 119 /* ========================================================================== */ 120 121 /* Check "can_suspend" functions 122 */ 123 static int checkSuspend() { 124 jvmtiError err; 125 126 NSK_DISPLAY0("Checking negative: SuspendThread\n"); 127 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY,jvmti->SuspendThread(thread))) 128 return NSK_FALSE; 129 130 NSK_DISPLAY0("Checking negative: ResumeThread\n"); 131 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY,jvmti->ResumeThread(thread))) 132 return NSK_FALSE; 133 134 NSK_DISPLAY0("Checking negative: SuspendThreadList\n"); 135 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 136 jvmti->SuspendThreadList(1, &thread, &err))) 137 return NSK_FALSE; 138 139 NSK_DISPLAY0("Checking negative: ResumeThreadList\n"); 140 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 141 jvmti->ResumeThreadList(1, &thread, &err))) 142 return NSK_FALSE; 143 144 return NSK_TRUE; 145 } 146 147 /* Check "can_signal_thread" functions 148 */ 149 static int checkSignalThread() { 150 const char* THREAD_DEATH_CLASS_NAME = "java/lang/ThreadDeath"; 151 const char* THREAD_DEATH_CTOR_NAME = "<init>"; 152 const char* THREAD_DEATH_CTOR_SIGNATURE = "()V"; 153 jclass cls = NULL; 154 jmethodID ctor = NULL; 155 jobject exception = NULL; 156 157 if (!NSK_JNI_VERIFY(jni, (cls = jni->FindClass(THREAD_DEATH_CLASS_NAME)) != NULL)) 158 return NSK_FALSE; 159 160 if (!NSK_JNI_VERIFY(jni, (ctor = 161 jni->GetMethodID(cls, THREAD_DEATH_CTOR_NAME, THREAD_DEATH_CTOR_SIGNATURE)) != NULL)) 162 return NSK_FALSE; 163 164 if (!NSK_JNI_VERIFY(jni, (exception = jni->NewObject(cls, ctor)) != NULL)) 165 return NSK_FALSE; 166 167 NSK_DISPLAY0("Checking negative: StopThread\n"); 168 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 169 jvmti->StopThread(thread, exception))) 170 return NSK_FALSE; 171 172 NSK_DISPLAY0("Checking negative: InterruptThread\n"); 173 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY,jvmti->InterruptThread(thread))) 174 return NSK_FALSE; 175 176 return NSK_TRUE; 177 } 178 179 /* Check "can_get_owned_monitor_info" function 180 */ 181 static int checkGetOwnedMonitorInfo() { 182 jint count; 183 jobject *monitors = NULL; 184 185 NSK_DISPLAY0("Checking negative: GetOwnedMonitorInfo\n"); 186 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 187 jvmti->GetOwnedMonitorInfo(thread, &count, &monitors))) 188 return NSK_FALSE; 189 190 return NSK_TRUE; 191 } 192 193 /* Check "can_get_current_contended_monitor" function 194 */ 195 static int checkGetCurrentContendedMonitor() { 196 jobject monitor = NULL; 197 198 NSK_DISPLAY0("Checking negative: GetCurrentContendedMonitor\n"); 199 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 200 jvmti->GetCurrentContendedMonitor(thread, &monitor))) 201 return NSK_FALSE; 202 203 return NSK_TRUE; 204 } 205 206 /* Check "can_pop_frame" function 207 */ 208 static int checkPopFrame() { 209 NSK_DISPLAY0("Checking negative: PopFrame\n"); 210 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY,jvmti->PopFrame(thread))) 211 return NSK_FALSE; 212 213 return NSK_TRUE; 214 } 215 216 /* Check "can_tag_objects" functions 217 */ 218 219 static jvmtiIterationControl JNICALL 220 HeapObject(jlong class_tag, jlong size, jlong *tag_ptr, void *user_data) { 221 return JVMTI_ITERATION_ABORT; 222 } 223 224 static jvmtiIterationControl JNICALL 225 HeapRoot(jvmtiHeapRootKind root_kind, jlong class_tag, jlong size, 226 jlong *tag_ptr, void *user_data) { 227 return JVMTI_ITERATION_ABORT; 228 } 229 230 static jvmtiIterationControl JNICALL 231 StackReference(jvmtiHeapRootKind root_kind, jlong class_tag, jlong size, 232 jlong *tag_ptr, jlong thread_tag, jint depth, jmethodID method, 233 jint slot, void *user_data) { 234 return JVMTI_ITERATION_ABORT; 235 } 236 237 static jvmtiIterationControl JNICALL 238 ObjectReference(jvmtiObjectReferenceKind reference_kind, jlong class_tag, 239 jlong size, jlong *tag_ptr, jlong referrer_tag, 240 jint referrer_index, void *user_data) { 241 return JVMTI_ITERATION_ABORT; 242 } 243 244 static int checkHeapFunctions() { 245 const jlong TAG_VALUE = (123456789L); 246 jlong tag; 247 jint count; 248 jobject *res_objects = NULL; 249 jlong *res_tags = NULL; 250 jint dummy_user_data = 0; 251 252 NSK_DISPLAY0("Checking negative: SetTag\n"); 253 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 254 jvmti->SetTag(thread, TAG_VALUE))) 255 return NSK_FALSE; 256 257 NSK_DISPLAY0("Checking negative: GetTag\n"); 258 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY,jvmti->GetTag(thread, &tag))) 259 return NSK_FALSE; 260 261 NSK_DISPLAY0("Checking negative: GetObjectsWithTags\n"); 262 tag = TAG_VALUE; 263 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 264 jvmti->GetObjectsWithTags(1, &tag, &count, &res_objects, &res_tags))) 265 return NSK_FALSE; 266 267 NSK_DISPLAY0("Checking negative: IterateOverHeap\n"); 268 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 269 jvmti->IterateOverHeap(JVMTI_HEAP_OBJECT_TAGGED, HeapObject, &dummy_user_data))) 270 return NSK_FALSE; 271 272 NSK_DISPLAY0("Checking negative: IterateOverInstancesOfClass\n"); 273 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 274 jvmti->IterateOverInstancesOfClass(klass, 275 JVMTI_HEAP_OBJECT_UNTAGGED, 276 HeapObject, 277 &dummy_user_data))) 278 return NSK_FALSE; 279 280 NSK_DISPLAY0("Checking negative: IterateOverObjectsReachableFromObject\n"); 281 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 282 jvmti->IterateOverObjectsReachableFromObject(thread, 283 ObjectReference, 284 &dummy_user_data))) 285 return NSK_FALSE; 286 287 NSK_DISPLAY0("Checking negative: IterateOverReachableObjects\n"); 288 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 289 jvmti->IterateOverReachableObjects(HeapRoot, 290 StackReference, 291 ObjectReference, 292 &dummy_user_data))) 293 return NSK_FALSE; 294 295 return NSK_TRUE; 296 } 297 298 /* Check "can_access_local_variables" functions 299 */ 300 static int checkLocalVariableFunctions() { 301 jint count; 302 jvmtiLocalVariableEntry *local_variable_table = NULL; 303 jobject object_value; 304 jint int_value; 305 jlong long_value; 306 jfloat float_value; 307 jdouble double_value; 308 309 NSK_DISPLAY0("Checking negative: GetLocalVariableTable\n"); 310 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 311 jvmti->GetLocalVariableTable(method, &count, &local_variable_table))) 312 return NSK_FALSE; 313 314 NSK_DISPLAY0("Checking negative: GetLocalObject\n"); 315 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 316 jvmti->GetLocalObject(thread, 0, 0, &object_value))) 317 return NSK_FALSE; 318 319 NSK_DISPLAY0("Checking negative: GetLocalInt\n"); 320 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 321 jvmti->GetLocalInt(thread, 0, 0, &int_value))) 322 return NSK_FALSE; 323 324 NSK_DISPLAY0("Checking negative: GetLocalLong\n"); 325 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 326 jvmti->GetLocalLong(thread, 0, 0, &long_value))) 327 return NSK_FALSE; 328 329 NSK_DISPLAY0("Checking negative: GetLocalFloat\n"); 330 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 331 jvmti->GetLocalFloat(thread, 0, 0, &float_value))) 332 return NSK_FALSE; 333 334 NSK_DISPLAY0("Checking negative: GetLocalDouble\n"); 335 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 336 jvmti->GetLocalDouble(thread, 0, 0, &double_value))) 337 return NSK_FALSE; 338 339 NSK_DISPLAY0("Checking negative: SetLocalObject\n"); 340 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 341 jvmti->SetLocalObject(thread, 0, 0, thread))) 342 return NSK_FALSE; 343 344 NSK_DISPLAY0("Checking negative: SetLocalInt\n"); 345 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 346 jvmti->SetLocalInt(thread, 0, 0, (jint)0))) 347 return NSK_FALSE; 348 349 NSK_DISPLAY0("Checking negative: SetLocalLong\n"); 350 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 351 jvmti->SetLocalLong(thread, 0, 0, (jlong)0))) 352 return NSK_FALSE; 353 354 NSK_DISPLAY0("Checking negative: SetLocalFloat\n"); 355 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 356 jvmti->SetLocalFloat(thread, 0, 0, (jfloat)0.0))) 357 return NSK_FALSE; 358 359 NSK_DISPLAY0("Checking negative: SetLocalDouble\n"); 360 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 361 jvmti->SetLocalDouble(thread, 0, 0, (jdouble)0.0))) 362 return NSK_FALSE; 363 364 return NSK_TRUE; 365 } 366 367 /* Check "can_get_source_info" functions 368 */ 369 static int checkSourceInfoFunctions() { 370 char *name; 371 jint count; 372 jvmtiLineNumberEntry *line_number_table = NULL; 373 374 NSK_DISPLAY0("Checking positive: GetSourceFileName\n"); 375 if (!NSK_JVMTI_VERIFY(jvmti->GetSourceFileName(klass, &name))) 376 return NSK_FALSE; 377 378 NSK_DISPLAY0("Checking negative: GetSourceDebugExtension\n"); 379 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 380 jvmti->GetSourceDebugExtension(klass, &name))) 381 return NSK_FALSE; 382 383 NSK_DISPLAY0("Checking negative: GetLineNumberTable\n"); 384 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 385 jvmti->GetLineNumberTable(method, &count, &line_number_table))) 386 return NSK_FALSE; 387 388 return NSK_TRUE; 389 } 390 391 /* Check "can_redefine_classes" functions 392 */ 393 static int checkRedefineClasses() { 394 jvmtiClassDefinition class_def; 395 396 NSK_DISPLAY0("Checking negative: RedefineClasses\n"); 397 class_def.klass = klass; 398 class_def.class_byte_count = 0; 399 class_def.class_bytes = NULL; 400 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 401 jvmti->RedefineClasses(1, &class_def))) 402 return NSK_FALSE; 403 404 return NSK_TRUE; 405 } 406 407 /* Check "can_get_monitor_info" function 408 */ 409 static int checkGetObjectMonitorUsage() { 410 jvmtiMonitorUsage monitor_info; 411 412 NSK_DISPLAY0("Checking negative: GetObjectMonitorUsage\n"); 413 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 414 jvmti->GetObjectMonitorUsage(thread, &monitor_info))) 415 return NSK_FALSE; 416 417 return NSK_TRUE; 418 } 419 420 /* Check "can_get_synthetic_attribute" functions 421 */ 422 static int checkIsSyntheticFunctions() { 423 jboolean is_synthetic; 424 425 NSK_DISPLAY0("Checking negative: IsFieldSynthetic\n"); 426 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 427 jvmti->IsFieldSynthetic(klass, field, &is_synthetic))) 428 return NSK_FALSE; 429 430 NSK_DISPLAY0("Checking negative: IsMethodSynthetic\n"); 431 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 432 jvmti->IsMethodSynthetic(method, &is_synthetic))) 433 return NSK_FALSE; 434 435 return NSK_TRUE; 436 } 437 438 /* Check "can_get_bytecodes" function 439 */ 440 static int checkGetBytecodes() { 441 jint count; 442 unsigned char *bytecodes; 443 444 NSK_DISPLAY0("Checking negative: GetBytecodes\n"); 445 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 446 jvmti->GetBytecodes(method, &count, &bytecodes))) 447 return NSK_FALSE; 448 449 return NSK_TRUE; 450 } 451 452 /* Check "can_get_current_thread_cpu_time" function 453 */ 454 static int checkGetCurrentThreadCpuTime() { 455 jvmtiTimerInfo info; 456 jlong nanos; 457 458 NSK_DISPLAY0("Checking negative: GetCurrentThreadCpuTimerInfo\n"); 459 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 460 jvmti->GetCurrentThreadCpuTimerInfo(&info))) 461 return NSK_FALSE; 462 463 NSK_DISPLAY0("Checking negative: GetCurrentThreadCpuTime\n"); 464 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 465 jvmti->GetCurrentThreadCpuTime(&nanos))) 466 return NSK_FALSE; 467 468 return NSK_TRUE; 469 } 470 471 /* Check "can_get_thread_cpu_time" function 472 */ 473 static int checkGetThreadCpuTime() { 474 jvmtiTimerInfo info; 475 jlong nanos; 476 477 NSK_DISPLAY0("Checking negative: GetThreadCpuTimerInfo\n"); 478 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 479 jvmti->GetThreadCpuTimerInfo(&info))) 480 return NSK_FALSE; 481 482 NSK_DISPLAY0("Checking negative: GetThreadCpuTime\n"); 483 if (!NSK_JVMTI_VERIFY_CODE(JVMTI_ERROR_MUST_POSSESS_CAPABILITY, 484 jvmti->GetThreadCpuTime(thread, &nanos))) 485 return NSK_FALSE; 486 487 return NSK_TRUE; 488 } 489 490 /* ========================================================================== */ 491 492 /* agent algorithm */ 493 static void JNICALL 494 agentProc(jvmtiEnv* jvmti, JNIEnv* agentJNI, void* arg) { 495 jni = agentJNI; 496 497 /* wait for initial sync */ 498 if (!nsk_jvmti_waitForSync(timeout)) 499 return; 500 501 if (!prepare()) { 502 nsk_jvmti_setFailStatus(); 503 return; 504 } 505 506 /* testcase #7: check that only correspondent function work */ 507 NSK_DISPLAY0("Testcase #7: check that only correspondent function work but not others\n"); 508 if (!checkSuspend()) 509 nsk_jvmti_setFailStatus(); 510 if (!checkSignalThread()) 511 nsk_jvmti_setFailStatus(); 512 if (!checkGetOwnedMonitorInfo()) 513 nsk_jvmti_setFailStatus(); 514 if (!checkGetCurrentContendedMonitor()) 515 nsk_jvmti_setFailStatus(); 516 if (!checkPopFrame()) 517 nsk_jvmti_setFailStatus(); 518 if (!checkHeapFunctions()) 519 nsk_jvmti_setFailStatus(); 520 if (!checkLocalVariableFunctions()) 521 nsk_jvmti_setFailStatus(); 522 if (!checkSourceInfoFunctions()) 523 nsk_jvmti_setFailStatus(); 524 if (!checkRedefineClasses()) 525 nsk_jvmti_setFailStatus(); 526 if (!checkGetObjectMonitorUsage()) 527 nsk_jvmti_setFailStatus(); 528 if (!checkIsSyntheticFunctions()) 529 nsk_jvmti_setFailStatus(); 530 if (!checkGetBytecodes()) 531 nsk_jvmti_setFailStatus(); 532 if (!checkGetCurrentThreadCpuTime()) 533 nsk_jvmti_setFailStatus(); 534 if (!checkGetThreadCpuTime()) 535 nsk_jvmti_setFailStatus(); 536 537 /* testcase #8: exits with the capability has not been relinquished */ 538 NSK_DISPLAY0("Testcase #8: check if VM exits well with the capability has not been relinquished\n"); 539 540 /* resume debugee after last sync */ 541 if (!nsk_jvmti_resumeSync()) 542 return; 543 } 544 545 /* ========================================================================== */ 546 547 /* agent library initialization */ 548 #ifdef STATIC_BUILD 549 JNIEXPORT jint JNICALL Agent_OnLoad_cm01t010(JavaVM *jvm, char *options, void *reserved) { 550 return Agent_Initialize(jvm, options, reserved); 551 } 552 JNIEXPORT jint JNICALL Agent_OnAttach_cm01t010(JavaVM *jvm, char *options, void *reserved) { 553 return Agent_Initialize(jvm, options, reserved); 554 } 555 JNIEXPORT jint JNI_OnLoad_cm01t010(JavaVM *jvm, char *options, void *reserved) { 556 return JNI_VERSION_1_8; 557 } 558 #endif 559 jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) { 560 jvmtiCapabilities caps; 561 562 /* init framework and parse options */ 563 if (!NSK_VERIFY(nsk_jvmti_parseOptions(options))) 564 return JNI_ERR; 565 566 timeout = nsk_jvmti_getWaitTime() * 60000; 567 NSK_DISPLAY1("Timeout: %d msc\n", (int)timeout); 568 569 /* create JVMTI environment */ 570 if (!NSK_VERIFY((jvmti = 571 nsk_jvmti_createJVMTIEnv(jvm, reserved)) != NULL)) 572 return JNI_ERR; 573 574 /* register agent proc and arg */ 575 if (!NSK_VERIFY(nsk_jvmti_setAgentProc(agentProc, NULL))) 576 return JNI_ERR; 577 578 /* testcase #1: check GetPotentialCapabilities */ 579 NSK_DISPLAY0("Testcase #1: check if GetPotentialCapabilities returns the capability\n"); 580 if (!NSK_JVMTI_VERIFY(jvmti->GetPotentialCapabilities(&caps))) 581 return JNI_ERR; 582 if (!caps.CAPABILITY) { 583 NSK_COMPLAIN1("GetPotentialCapabilities does not return \"%s\" capability\n", 584 CAPABILITY_STR); 585 return JNI_ERR; 586 } 587 588 /* testcase #2: add the capability during Onload phase */ 589 NSK_DISPLAY0("Testcase #2: add the capability during Onload phase\n"); 590 memset(&caps, 0, sizeof(caps)); 591 caps.CAPABILITY = 1; 592 if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps))) 593 return JNI_ERR; 594 595 /* testcase #3: check if GetCapabilities returns the capability */ 596 NSK_DISPLAY0("Testcase #3: check if GetCapabilities returns the capability\n"); 597 memset(&caps, 0, sizeof(caps)); 598 if (!NSK_JVMTI_VERIFY(jvmti->GetCapabilities(&caps))) 599 return JNI_ERR; 600 if (!caps.CAPABILITY) { 601 NSK_COMPLAIN1("GetCapabilities does not return \"%s\" capability\n", 602 CAPABILITY_STR); 603 return JNI_ERR; 604 } 605 606 /* testcase #4: relinquish the capability during Onload phase */ 607 NSK_DISPLAY0("Testcase #4: relinquish the capability during Onload phase\n"); 608 memset(&caps, 0, sizeof(caps)); 609 caps.CAPABILITY = 1; 610 if (!NSK_JVMTI_VERIFY(jvmti->RelinquishCapabilities(&caps))) 611 return JNI_ERR; 612 613 /* testcase #5: check if GetCapabilities does not return the capability */ 614 NSK_DISPLAY0("Testcase #5: check if GetCapabilities does not return the capability\n"); 615 memset(&caps, 0, sizeof(caps)); 616 if (!NSK_JVMTI_VERIFY(jvmti->GetCapabilities(&caps))) 617 return JNI_ERR; 618 if (caps.CAPABILITY) { 619 NSK_COMPLAIN1("GetCapabilities returns relinquished \"%s\" capability\n", 620 CAPABILITY_STR); 621 return JNI_ERR; 622 } 623 624 /* testcase #6: add back the capability and check with GetCapabilities */ 625 NSK_DISPLAY0("Testcase #6: add back the capability and check with GetCapabilities\n"); 626 memset(&caps, 0, sizeof(caps)); 627 caps.CAPABILITY = 1; 628 if (!NSK_JVMTI_VERIFY(jvmti->AddCapabilities(&caps))) 629 return JNI_ERR; 630 memset(&caps, 0, sizeof(caps)); 631 if (!NSK_JVMTI_VERIFY(jvmti->GetCapabilities(&caps))) 632 return JNI_ERR; 633 if (!caps.CAPABILITY) { 634 NSK_COMPLAIN1("GetCapabilities does not return \"%s\" capability\n", 635 CAPABILITY_STR); 636 return JNI_ERR; 637 } 638 639 return JNI_OK; 640 } 641 642 /* ========================================================================== */ 643 644 }