15f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/* 25f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more 35f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * contributor license agreements. See the NOTICE file distributed with 45f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * this work for additional information regarding copyright ownership. 55f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0 65f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * (the "License"); you may not use this file except in compliance with 75f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * the License. You may obtain a copy of the License at 85f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 95f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Unless required by applicable law or agreed to in writing, software 125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * 155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * See the License for the specific language governing permissions and 165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * limitations under the License. 175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @author Anatoly F. Bondarenko 215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Created on 18.02.2005 255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespackage org.apache.harmony.jpda.tests.jdwp.ReferenceType; 275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket; 295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands; 305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket; 315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase; 325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer; 335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/** 365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * JDWP Unit test for ReferenceType.Methods command. 375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic class MethodsTest extends JDWPSyncTestCase { 395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes static final int testStatusPassed = 0; 415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes static final int testStatusFailed = -1; 425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes static final String thisCommandName = "ReferenceType.Methods command"; 435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes static final String debuggeeSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ReferenceType/MethodsDebuggee;"; 445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes protected String getDebuggeeClassName() { 465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes return "org.apache.harmony.jpda.tests.jdwp.ReferenceType.MethodsDebuggee"; 475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes /** 505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * This testcase exercises ReferenceType.Methods command. 515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <BR>The test starts MethodsDebuggee class, requests referenceTypeId 525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * for this class by VirtualMachine.ClassesBySignature command, then 535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * performs ReferenceType.Methods command and checks that returned 545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * list of methods corresponds to expected list of methods with expected attributes. 555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */ 565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes public void testMethods001() { 575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String thisTestName = "testMethods001"; 585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START..."); 595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int testStatus = testStatusPassed; 605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); 615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes long refTypeID = getClassIDBySignature(debuggeeSignature); 635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Debuggee class = " + getDebuggeeClassName()); 655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> referenceTypeID for Debuggee class = " + refTypeID); 665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> CHECK: send " + thisCommandName + " and check reply..."); 675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes CommandPacket methodsCommand = new CommandPacket( 695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes JDWPCommands.ReferenceTypeCommandSet.CommandSetID, 705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes JDWPCommands.ReferenceTypeCommandSet.MethodsCommand); 715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes methodsCommand.setNextValueAsReferenceTypeID(refTypeID); 725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ReplyPacket methodsReply = debuggeeWrapper.vmMirror.performCommand(methodsCommand); 745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes methodsCommand = null; 755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes checkReplyPacket(methodsReply, thisCommandName); 765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int returnedMethodsNumber = methodsReply.getNextValueAsInt(); 785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Returned methods number = " + returnedMethodsNumber); 795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String methodNames[] = { 815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "staticTestMethod", 825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "objectTestMethod", 835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "run", 845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "main", 855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "<init>" 865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes }; 875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String methodSignatures[] = { 895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "(J)I", 905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "(Ljava/lang/Object;)Ljava/lang/Object;", 915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "()V", 925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "([Ljava/lang/String;)V", 935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "()V" 945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes }; 955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int methodModifiers[] = { 975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 0x8, 985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 0x0, 995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 0x1, 1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 0x9, 1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 0x1 1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes }; 1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes boolean methodFound[] = { 1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes false, 1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes false, 1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes false, 1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes false, 1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes false 1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes }; 1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int expectedMetodsNumber = methodNames.length; 1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int methodSyntheticFlag = 0xf0000000; 1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String failMessage = ""; 1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> CHECK for all expected methods..."); 1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes for (int i = 0; i < returnedMethodsNumber; i++) { 1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes long returnedMethodID = methodsReply.getNextValueAsMethodID(); 1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String returnedMethodName = methodsReply.getNextValueAsString(); 1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes String returnedMethodSignature = methodsReply.getNextValueAsString(); 1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int returnedMethodModifiers = methodsReply.getNextValueAsInt(); 1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("\n=> Method ID = " + returnedMethodID); 1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Method name = " + returnedMethodName); 1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Method signature = " + returnedMethodSignature); 1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("=> Method modifiers = 0x" + Integer.toHexString(returnedMethodModifiers)); 1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( (returnedMethodModifiers & methodSyntheticFlag) == methodSyntheticFlag ) { 1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes continue; // do not check synthetic methods 1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes int k = 0; 1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes for (; k < expectedMetodsNumber; k++) { 1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( ! methodNames[k].equals(returnedMethodName)) { 1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes continue; 1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( methodFound[k] ) { 1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("\n## FAILURE: The method is found out repeatedly in the list"); 1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## Method name = " + returnedMethodName); 1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes testStatus = testStatusFailed; 1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes failMessage = failMessage + 1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "The method '" + returnedMethodName + 1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "' is found repeatedly in the list;\n"; 1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes break; 1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes methodFound[k] = true; 1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( ! methodSignatures[k].equals(returnedMethodSignature) ) { 1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("\n## FAILURE: Unexpected method signature is returned:"); 1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## Method name = " + returnedMethodName); 1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## Expected signature = " + methodSignatures[k]); 1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## Returned signature = " + returnedMethodSignature); 1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes testStatus = testStatusFailed; 1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes failMessage = failMessage + 1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "Unexpected signature is returned for method: " + 1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes returnedMethodName + 1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ", Expected: " + methodSignatures[k] + 1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ", Returned: " + returnedMethodSignature + ";\n"; 1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( methodModifiers[k] != returnedMethodModifiers ) { 1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("\n## FAILURE: Unexpected method modifiers are returned:"); 1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## Method name = " + returnedMethodName); 1585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println 1595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ("## Expected modifiers = 0x" + Integer.toHexString(methodModifiers[k])); 1605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println 1615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ("## Returned modifiers = 0x" + Integer.toHexString(returnedMethodModifiers)); 1625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes testStatus = testStatusFailed; 1635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes failMessage = failMessage + 1645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "Unexpected modifiers are returned for method: " + 1655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes returnedMethodName + 1665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ", Expected: 0x" + Integer.toHexString(methodModifiers[k]) + 1675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ", Returned: 0x" + Integer.toHexString(returnedMethodModifiers) + ";\n"; 1685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes break; 1705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( k == expectedMetodsNumber ) { 1725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes // returned method is not found out in the list of expected methods 1735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("\n## FAILURE: It is found out unexpected returned method:"); 1745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## Method name = " + returnedMethodName); 1755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## Method signature = " + returnedMethodSignature); 1765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println 1775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ("## Method modifiers = 0x" + Integer.toHexString(returnedMethodModifiers)); 1785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes testStatus = testStatusFailed; 1795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes failMessage = failMessage + 1805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "Unexpected returned method is found:" + 1815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ", name = " + returnedMethodName + 1825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ", signature = " + returnedMethodSignature + 1835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ", modifiers = 0x" + Integer.toHexString(returnedMethodModifiers) + ";\n"; 1845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes for (int k=0; k < expectedMetodsNumber; k++) { 1875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( ! methodFound[k] ) { 1885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println 1895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ("\n## FAILURE: Expected method is NOT found out in the list of retuned methods:"); 1905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("## Method name = " + methodNames[k]); 1915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes testStatus = testStatusFailed; 1925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes failMessage = failMessage + 1935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes "Expected method is NOT found in the list of retuned methods:" + 1945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes " name = " + methodNames[k]; 1955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 1975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if ( testStatus == testStatusPassed ) { 1985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println 1995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes ("=> CHECK PASSED: All expected methods are found out and have expected attributes"); 2005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes 2025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); 2035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": FINISH"); 2045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes if (testStatus == testStatusFailed) { 2055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes fail(failMessage); 2065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes assertAllDataRead(methodsReply); 2085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes } 2095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes} 210