test/jdk/com/sun/jdi/InvokeVarArgs.java
author amenkov
Fri, 21 Sep 2018 11:28:14 -0700
changeset 51837 46ca82c15f6c
parent 47216 71c04702a3d5
permissions -rw-r--r--
8210760: [TEST] rewrite com/sun/jdi shell tests to java version - step4 Reviewed-by: jcbeyler, sspitsyn, cjplummer

/*
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/**
 *  @test
 *  @bug 8075331
 *  @summary Verify that we can call varargs methods
 *  @run build TestScaffold VMConnection TargetAdapter TargetListener
 *  @run compile -g InvokeVarArgs.java
 *  @run driver InvokeVarArgs
 */

import com.sun.jdi.*;
import com.sun.jdi.event.*;
import java.util.Arrays;

interface MyInterface {
}

class SomeClass implements MyInterface {
}

class InvokeVarArgsTarg {

    public static void main(String args[]) {
        new InvokeVarArgsTarg().run();
    }

    SomeClass someClass1 = new SomeClass();
    SomeClass someClass2 = new SomeClass();

    MyInterface[] array = new MyInterface[]{someClass1, someClass2};
    SomeClass[] array2 = new SomeClass[]{someClass1, someClass2};

    public void run() {
        System.out.println("size(array) : " + size(array));
        System.out.println("size(array2) : " + size(array2));
    }

    int size(Object... value) {
        return value.length;
    }
}

public class InvokeVarArgs extends TestScaffold {

    public static void main(String args[]) throws Exception {
        new InvokeVarArgs(args).startTests();
    }

    InvokeVarArgs(String args[]) throws Exception {
        super(args);
    }

    protected void runTests() throws Exception {

        BreakpointEvent bpe = startTo("InvokeVarArgsTarg", "run", "()V");
        StackFrame frame = bpe.thread().frame(0);
        ObjectReference targetObj = frame.thisObject();
        ReferenceType targetType = (ReferenceType) targetObj.type();
        Value arrayVal = targetObj.getValue(targetType.fieldByName("array"));
        Value array2Val = targetObj.getValue(targetType.fieldByName("array2"));
        Method sizeMethod = targetType.methodsByName("size", "([Ljava/lang/Object;)I").get(0);

        IntegerValue size = (IntegerValue) targetObj.invokeMethod(bpe.thread(), sizeMethod, Arrays.asList(new Value[]{arrayVal}), 0);
        if (size.value() != 2) {
            throw new Exception("size(array) should be 2, but was " + size.value());
        }

        size = (IntegerValue) targetObj.invokeMethod(bpe.thread(), sizeMethod, Arrays.asList(new Value[]{array2Val}), 0);
        if (size.value() != 2) {
            throw new Exception("size(array2) should be 2, but was " + size.value());
        }

        listenUntilVMDisconnect();
    }
}