Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion jdk/test/javax/net/ssl/templates/SSLSocketTemplate.java
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ protected void doServerSide() throws Exception {
/*
* Define the client side of the test.
*/
private void doClientSide() throws Exception {
protected void doClientSide() throws Exception {

// Wait for server to get started.
//
Expand Down
237 changes: 14 additions & 223 deletions jdk/test/sun/security/ssl/SSLSocketImpl/ReuseAddr.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 2018, 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
Expand All @@ -25,240 +25,31 @@
* @test
* @bug 4482446
* @summary java.net.SocketTimeoutException on 98, NT, 2000 for JSSE
* @run main/othervm ReuseAddr
* @library /javax/net/ssl/templates
* @run main ReuseAddr
*
* SunJSSE does not support dynamic system properties, no way to re-use
* system properties in samevm/agentvm mode.
* @author Brad Wetmore
*/

import java.io.*;
import java.net.*;
import javax.net.ssl.*;
import java.net.ServerSocket;

public class ReuseAddr {
public class ReuseAddr extends SSLSocketTemplate {

/*
* =============================================================
* Set the various variables needed for the tests, then
* specify what tests to run on each side.
*/
@Override
protected void doServerSide() throws Exception {
super.doServerSide();

/*
* Should we run the client or server in a separate thread?
* Both sides can throw exceptions, but do you have a preference
* as to which side should be the main thread.
*/
static boolean separateServerThread = true;

/*
* Where do we find the keystores?
*/
private final static String pathToStores = "../../../../javax/net/ssl/etc";
static String keyStoreFile = "keystore";
static String trustStoreFile = "truststore";
static String passwd = "passphrase";

/*
* Is the server ready to serve?
*/
volatile static boolean serverReady = false;

/*
* Turn on SSL debugging?
*/
static boolean debug = false;

/*
* If the client or server is doing some kind of object creation
* that the other side depends on, and that thread prematurely
* exits, you may experience a hang. The test harness will
* terminate all hung threads after its timeout has expired,
* currently 3 minutes by default, but you might try to be
* smart about it....
*/

/*
* Define the server side of the test.
*
* If the server prematurely exits, serverReady will be set to true
* to avoid infinite hangs.
*/
void doServerSide() throws Exception {
SSLServerSocketFactory sslssf =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslServerSocket =
(SSLServerSocket) sslssf.createServerSocket(serverPort);
serverPort = sslServerSocket.getLocalPort();

/*
* Signal Client, we're ready for his connect.
*/
serverReady = true;

SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();
InputStream sslIS = sslSocket.getInputStream();
OutputStream sslOS = sslSocket.getOutputStream();

sslIS.read();
sslOS.write(85);
sslOS.flush();

sslSocket.close();

// Close original server socket
sslServerSocket.close();

// Try rebinding to same port
sslServerSocket =
(SSLServerSocket) sslssf.createServerSocket(serverPort);
sslServerSocket.close();
}

/*
* Define the client side of the test.
*
* If the server prematurely exits, serverReady will be set to true
* to avoid infinite hangs.
*/
void doClientSide() throws Exception {

/*
* Wait for server to get started.
*/
while (!serverReady) {
Thread.sleep(50);
// Note that if this port is already used by another test,
// this test will fail.
System.out.println("Try rebinding to same port: " + serverPort);
try (ServerSocket server = new ServerSocket(serverPort)) {
System.out.println("Server port: " + server.getLocalPort());
}

SSLSocketFactory sslsf =
(SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket)
sslsf.createSocket("localhost", serverPort);

InputStream sslIS = sslSocket.getInputStream();
OutputStream sslOS = sslSocket.getOutputStream();

sslOS.write(280);
sslOS.flush();
sslIS.read();

sslSocket.close();
}

/*
* =============================================================
* The remainder is just support stuff
*/

// use any free port by default
volatile int serverPort = 0;

volatile Exception serverException = null;
volatile Exception clientException = null;

public static void main(String[] args) throws Exception {
String keyFilename =
System.getProperty("test.src", "./") + "/" + pathToStores +
"/" + keyStoreFile;
String trustFilename =
System.getProperty("test.src", "./") + "/" + pathToStores +
"/" + trustStoreFile;

System.setProperty("javax.net.ssl.keyStore", keyFilename);
System.setProperty("javax.net.ssl.keyStorePassword", passwd);
System.setProperty("javax.net.ssl.trustStore", trustFilename);
System.setProperty("javax.net.ssl.trustStorePassword", passwd);

if (debug)
System.setProperty("javax.net.debug", "all");

/*
* Start the tests.
*/
new ReuseAddr();
}

Thread clientThread = null;
Thread serverThread = null;

/*
* Primary constructor, used to drive remainder of the test.
*
* Fork off the other side, then do your work.
*/
ReuseAddr() throws Exception {
if (separateServerThread) {
startServer(true);
startClient(false);
} else {
startClient(true);
startServer(false);
}

/*
* Wait for other side to close down.
*/
if (separateServerThread) {
serverThread.join();
} else {
clientThread.join();
}

/*
* When we get here, the test is pretty much over.
*
* If the main thread excepted, that propagates back
* immediately. If the other thread threw an exception, we
* should report back.
*/
if (serverException != null)
throw serverException;
if (clientException != null)
throw clientException;
}

void startServer(boolean newThread) throws Exception {
if (newThread) {
serverThread = new Thread() {
public void run() {
try {
doServerSide();
} catch (Exception e) {
/*
* Our server thread just died.
*
* Release the client, if not active already...
*/
System.err.println("Server died...");
serverReady = true;
serverException = e;
}
}
};
serverThread.start();
} else {
doServerSide();
}
}

void startClient(boolean newThread) throws Exception {
if (newThread) {
clientThread = new Thread() {
public void run() {
try {
doClientSide();
} catch (Exception e) {
/*
* Our client thread just died.
*/
System.err.println("Client died...");
clientException = e;
}
}
};
clientThread.start();
} else {
doClientSide();
}
new ReuseAddr().run();
}
}