/*
 * Copyright (c) 2016 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.
 */

/**
 * JDK-8150218: Autoconversion SAM adapters sometimes don't get privileges
 *
 * @test
 * @run
 */

function f() {
    java.lang.System.getProperty("user.dir")
}

java.security.AccessController.doPrivileged(new java.security.PrivilegedAction(function () {
    // Control: this used to work even before this improvement
    new java.lang.Runnable(f).run()

    // SAM type explicitly created through an array needs to get the right permissions too
    Java.to([f], Java.type("java.lang.Runnable[]"))[0].run()

    // Even when more deeply nested
    Java.to([[[f]]], Java.type("java.lang.Runnable[][][]"))[0][0][0].run()

    var rt = new (Java.type("jdk.dynalink.test.ArrayRunnableTest"))
    var n = "runnables"

    // Explicit array passed to vararg setter chosen at run time
    rt[n] = [f]
    rt.firstRunnable.run()

    // Automatically packed one-element array passed to vararg setter chosen at run time
    rt[n] = f
    rt.firstRunnable.run()

    // Explicit array passed to vararg method overload chosen at run time
    rt.setRunnablesOverloaded([f])
    rt.firstRunnable.run()

    // Automatically packed one-element array passed to vararg method overload chosen at run time
    rt.setRunnablesOverloaded(f)
    rt.firstRunnable.run()
}))
