test/jdk/java/net/URL/RacyHandler.java
author alanb
Tue, 18 Dec 2018 10:26:15 +0000
changeset 53038 9dd0a2fdec24
parent 52638 f39854fffca0
permissions -rw-r--r--
8215449: Several tests failing when jtreg run with -vmoption:--illegal-access=deny Reviewed-by: redestad, mchung, jjg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
52638
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
     1
/*
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
     4
 *
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
     7
 * published by the Free Software Foundation.
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
     8
 *
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    13
 * accompanied this code).
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    14
 *
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    18
 *
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    21
 * questions.
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    22
 */
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    23
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    24
import java.io.IOException;
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    25
import java.lang.reflect.*;
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    26
import java.net.URL;
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    27
import java.net.URLConnection;
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    28
import java.net.URLStreamHandler;
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    29
import java.util.concurrent.CountDownLatch;
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    30
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    31
/*
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    32
 * @test
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    33
 * @bug 8213942
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    34
 * @summary URLStreamHandler initialization race
53038
9dd0a2fdec24 8215449: Several tests failing when jtreg run with -vmoption:--illegal-access=deny
alanb
parents: 52638
diff changeset
    35
 * @modules java.base/java.net:open
52638
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    36
 * @run main/othervm RacyHandler
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    37
 * @run main/othervm RacyHandler
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    38
 * @run main/othervm RacyHandler
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    39
 */
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    40
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    41
/*
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    42
 * This test makes reasonable effort to reproduce the race.
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    43
 * Run repeatedly to ensure correctness.
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    44
 */
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    45
public class RacyHandler {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    46
    static volatile boolean factorySet = false;
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    47
    static int NUM_THREADS = 2;
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    48
    static CountDownLatch cdl = new CountDownLatch(NUM_THREADS + 1);
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    49
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    50
    public static void main(String[] args) {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    51
        RacyHandler tester = new RacyHandler();
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    52
        tester.runTest();
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    53
    }
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    54
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    55
    public void runTest() {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    56
        new Thread(() -> {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    57
            try {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    58
                cdl.await();
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    59
                URL.setURLStreamHandlerFactory(proto -> new CustomHttpHandler());
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    60
                factorySet = true;
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    61
            } catch (Exception ignore) { }
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    62
        }).start();
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    63
        cdl.countDown();
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    64
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    65
        for (int i = 0; i < NUM_THREADS; i++) {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    66
            new Thread(() -> {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    67
                try {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    68
                    cdl.await();
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    69
                    while (!factorySet) {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    70
                        // trigger URL class load
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    71
                        getURLStreamHandler();
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    72
                    }
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    73
                } catch (Exception ignore) { }
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    74
            }).start();
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    75
            cdl.countDown();
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    76
        }
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    77
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    78
        // wait for the factory to be set
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    79
        while (!factorySet) { }
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    80
        // The sleep seems to help trigger the failure
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    81
        try {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    82
            Thread.sleep(500);
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    83
        } catch (InterruptedException ie) {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    84
        }
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    85
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    86
        URLStreamHandler httpHandler = getURLStreamHandler();
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    87
        System.out.println("After setting factory URL handlers: http " + httpHandler);
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    88
        if (!(httpHandler instanceof CustomHttpHandler))
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    89
            throw new RuntimeException("FAILED: Incorrect handler type");
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    90
    }
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    91
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    92
    /*
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    93
     * This is just so we can see what we get for the URLStreamHandler back
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    94
     * from the factory to verify whether it really is using our Handler
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    95
     * or something else...
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    96
     */
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    97
    public URLStreamHandler getURLStreamHandler() {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    98
        try {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
    99
            Method method = URL.class.getDeclaredMethod("getURLStreamHandler",
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   100
                    String.class);
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   101
            method.setAccessible(true);
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   102
            return (URLStreamHandler) method.invoke(null, "http");
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   103
        } catch (Exception e) {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   104
            return null;
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   105
        }
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   106
    }
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   107
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   108
    class CustomHttpHandler extends URLStreamHandler {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   109
        @Override
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   110
        protected URLConnection openConnection(URL u) throws IOException {
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   111
            return null;
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   112
        }
f39854fffca0 8213942: URLStreamHandler initialization race
coffeys
parents:
diff changeset
   113
    }
53038
9dd0a2fdec24 8215449: Several tests failing when jtreg run with -vmoption:--illegal-access=deny
alanb
parents: 52638
diff changeset
   114
}