예제 #1
0
  /**
   * This testcase exercises VirtualMachine.DisposeObjects command. <br>
   * At first the test starts HelloWorld debuggee. <br>
   * Then the test performs VirtualMachine.CreateString command for some string and checks that
   * VirtualMachine.DisposeObjects command for returned by CreateString command stringID with
   * refCount = 0 does not dispose that stringID - ObjectReference::ReferenceType command should
   * return some referenceTypeID without any error. <br>
   * Then the test check that repeated VirtualMachine.DisposeObjects command with refCount = 1
   * disposes that stringID - ObjectReference::ReferenceType command should return INVALID_OBJECT
   * error.
   */
  public void testDisposeObjects001() {
    synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);

    CommandPacket packet =
        new CommandPacket(
            JDWPCommands.VirtualMachineCommandSet.CommandSetID,
            JDWPCommands.VirtualMachineCommandSet.CreateStringCommand);
    packet.setNextValueAsString(CHECKED_STRING);
    logWriter.println("\tcreate string: " + CHECKED_STRING);
    ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);

    long stringID = reply.getNextValueAsStringID();
    logWriter.println("\tstring creared: stringID = " + stringID);

    logWriter.println(
        "\tsend DisposeObjects for created string with refCount = 0"
            + " - string should not be disposed...");
    packet =
        new CommandPacket(
            JDWPCommands.VirtualMachineCommandSet.CommandSetID,
            JDWPCommands.VirtualMachineCommandSet.DisposeObjectsCommand);
    packet.setNextValueAsInt(1);
    packet.setNextValueAsObjectID(stringID);
    packet.setNextValueAsInt(0);
    reply = debuggeeWrapper.vmMirror.performCommand(packet);
    checkReplyPacket(reply, "VirtualMachine::DisposeObjects command");

    logWriter.println(
        "\tsend ObjectReference::ReferenceType command for created string"
            + " to make sure that string is not disposed...");
    packet =
        new CommandPacket(
            JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
            JDWPCommands.ObjectReferenceCommandSet.ReferenceTypeCommand);
    packet.setNextValueAsObjectID(stringID);
    reply = debuggeeWrapper.vmMirror.performCommand(packet);
    checkReplyPacket(reply, "ObjectReference::ReferenceType command");

    byte refTypeTag = reply.getNextValueAsByte();
    long refTypeID = reply.getNextValueAsReferenceTypeID();
    logWriter.println(
        "\tReturned refTypeTag = "
            + refTypeTag
            + "("
            + JDWPConstants.TypeTag.getName(refTypeTag)
            + ")");
    logWriter.println("\tReturned ReferenceTypeID for string = " + refTypeID);

    logWriter.println(
        "\tsend DisposeObjects for created string with refCount = 1"
            + " - string should be disposed...");
    packet =
        new CommandPacket(
            JDWPCommands.VirtualMachineCommandSet.CommandSetID,
            JDWPCommands.VirtualMachineCommandSet.DisposeObjectsCommand);
    packet.setNextValueAsInt(1);
    packet.setNextValueAsObjectID(stringID);
    packet.setNextValueAsInt(1);
    reply = debuggeeWrapper.vmMirror.performCommand(packet);
    checkReplyPacket(reply, "VirtualMachine::DisposeObjects command");

    logWriter.println(
        "\tsend ObjectReference::ReferenceType command for disposed string"
            + " - INVALID_OBJECT should be...");
    packet =
        new CommandPacket(
            JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
            JDWPCommands.ObjectReferenceCommandSet.ReferenceTypeCommand);
    packet.setNextValueAsObjectID(stringID);
    reply = debuggeeWrapper.vmMirror.performCommand(packet);

    checkReplyPacket(
        reply, "ObjectReference::ReferenceType command", JDWPConstants.Error.INVALID_OBJECT);

    synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
  }
예제 #2
0
  /**
   * The test checks ClassType.SetValues command for field of Debuggee class with value which has
   * other referenceType than field to set. The test expects the field should not be set.
   */
  public void testSetValues002() {
    String thisTestName = "testSetValues002";
    logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START...");
    synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);

    CommandPacket classesBySignatureCommand =
        new CommandPacket(
            JDWPCommands.VirtualMachineCommandSet.CommandSetID,
            JDWPCommands.VirtualMachineCommandSet.ClassesBySignatureCommand);
    classesBySignatureCommand.setNextValueAsString(debuggeeSignature);
    ReplyPacket classesBySignatureReply =
        debuggeeWrapper.vmMirror.performCommand(classesBySignatureCommand);
    classesBySignatureCommand = null;
    checkReplyPacket(classesBySignatureReply, "VirtualMachine::ClassesBySignature command");

    classesBySignatureReply.getNextValueAsInt();
    // Number of returned reference types - is NOt used here

    classesBySignatureReply.getNextValueAsByte();
    // refTypeTag of class - is NOt used here

    long refTypeID = classesBySignatureReply.getNextValueAsReferenceTypeID();
    classesBySignatureReply = null;

    logWriter.println("=> Debuggee class = " + getDebuggeeClassName());
    logWriter.println("=> referenceTypeID for Debuggee class = " + refTypeID);

    String checkedFieldNames[] = {
      "SetValues002DebuggeeObject", "objectField",
    };
    long checkedFieldIDs[] = checkFields(refTypeID, checkedFieldNames);
    int checkedFieldsNumber = checkedFieldNames.length;

    logWriter.println(
        "=> Send ReferenceType::GetValues command and get ObjectID for value to set...");

    CommandPacket getValuesCommand =
        new CommandPacket(
            JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
            JDWPCommands.ReferenceTypeCommandSet.GetValuesCommand);
    getValuesCommand.setNextValueAsReferenceTypeID(refTypeID);
    getValuesCommand.setNextValueAsInt(1);
    getValuesCommand.setNextValueAsFieldID(checkedFieldIDs[0]);
    ReplyPacket getValuesReply = debuggeeWrapper.vmMirror.performCommand(getValuesCommand);
    getValuesCommand = null;
    checkReplyPacket(getValuesReply, "ReferenceType::GetValues command");

    int returnedValuesNumber = getValuesReply.getNextValueAsInt();
    logWriter.println("=> Returned values number = " + returnedValuesNumber);
    assertEquals(
        "ReferenceType::GetValues returned invalid values number,", 1, returnedValuesNumber);

    Value objectFieldValueToSet = getValuesReply.getNextValueAsValue();
    byte objectFieldValueToSetTag = objectFieldValueToSet.getTag();
    logWriter.println(
        "=> Returned field value tag for checked object= "
            + objectFieldValueToSetTag
            + "("
            + JDWPConstants.Tag.getName(objectFieldValueToSetTag)
            + ")");
    assertEquals(
        "ReferenceType::GetValues returned invalid value tag,",
        JDWPConstants.Tag.OBJECT_TAG,
        objectFieldValueToSetTag,
        JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG),
        JDWPConstants.Tag.getName(objectFieldValueToSetTag));

    long objectFieldID = objectFieldValueToSet.getLongValue();
    logWriter.println("=> Returned ObjectID = " + objectFieldID);
    logWriter.println(
        "=> CHECK: send "
            + thisCommandName
            + " for Debuggee class with value which has other referenceType than field to set...");

    CommandPacket checkedCommand =
        new CommandPacket(
            JDWPCommands.ClassTypeCommandSet.CommandSetID,
            JDWPCommands.ClassTypeCommandSet.SetValuesCommand);
    checkedCommand.setNextValueAsClassID(refTypeID);
    checkedCommand.setNextValueAsInt(checkedFieldsNumber - 1);
    int fieldIndex = 1;
    for (; fieldIndex < checkedFieldsNumber; fieldIndex++) {
      checkedCommand.setNextValueAsFieldID(checkedFieldIDs[fieldIndex]);
      switch (fieldIndex) {
        case 1: // objectField
          checkedCommand.setNextValueAsObjectID(objectFieldID);
          break;
      }
    }
    ReplyPacket checkedReply = debuggeeWrapper.vmMirror.performCommand(checkedCommand);
    checkedCommand = null;

    short errorCode = checkedReply.getErrorCode();
    if (errorCode == JDWPConstants.Error.NONE) {
      logWriter.println("=> " + thisCommandName + " run without any ERROR!");
    } else {
      logWriter.println(
          "=> "
              + thisCommandName
              + " returns ERROR = "
              + errorCode
              + "("
              + JDWPConstants.Error.getName(errorCode)
              + ")");
    }

    logWriter.println("=> Wait for Debuggee's status about check for set field...");
    synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
    boolean debuggeeStatus = synchronizer.receiveMessage("PASSED");
    if (!debuggeeStatus) {
      logWriter.println("## " + thisTestName + ": Debuggee returned status FAILED");
      fail("Debuggee returned status FAILED");
    } else {
      logWriter.println("=> " + thisTestName + ": Debuggee returned status PASSED");
    }

    logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": OK");
  }