/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim: set shiftwidth=4 tabstop=4 autoindent cindent expandtab: */
package com.sun.midp.ssl;
import com.sun.midp.publickeystore.WebPublicKeyStore;
import gnu.testlet.TestHarness;
import gnu.testlet.MIDletTestlet;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
public class TestSSLStreamConnection implements MIDletTestlet {
public int getExpectedPass() { return 203; }
public int getExpectedFail() { return 0; }
public int getExpectedKnownFail() { return 0; }
static final String SOCKET_URL = "socket://localhost:54443";
static final String HOST = "localhost";
static final int PORT = 54443;
static final String MESSAGE = "I haven't stopped thinking about recreating that pluot sorbet.";
WebPublicKeyStore KEY_STORE;
TestHarness th;
public void test(TestHarness th) {
KEY_STORE = WebPublicKeyStore.getTrustedKeyStore();
this.th = th;
try {
testBasicSSLStreamConnection();
testMultipleSendsReceivesOnSameSocket();
testMultipleSendsReceivesOnMultipleSockets();
testSendOnClosedOutputStream();
testReceiveOnClosedInputStream();
} catch (IOException e) {
th.fail("Unexpected exception: " + e);
e.printStackTrace();
}
}
void send(OutputStream os, String message) throws IOException {
os.write((message + "\n").getBytes());
}
String receive(InputStream is) throws IOException {
byte buf[] = new byte[1024];
int i = 0;
do {
buf[i++] = (byte)is.read();
} while (buf[i-1] != -1 && buf[i-1] != '\n' && i < buf.length);
String message = new String(buf, 0, i-1);
return message;
}
void testBasicSSLStreamConnection() throws IOException {
StreamConnection t = (StreamConnection)Connector.open(SOCKET_URL);
try {
SSLStreamConnection s =
new SSLStreamConnection(HOST, PORT, t.openInputStream(), t.openOutputStream(), KEY_STORE);
OutputStream os = s.openOutputStream();
InputStream is = s.openInputStream();
send(os, MESSAGE);
th.check(receive(is), MESSAGE);
os.close();
is.close();
s.close();
} finally {
t.close();
}
}
void testMultipleSendsReceivesOnSameSocket() throws IOException {
StreamConnection t = (StreamConnection)Connector.open(SOCKET_URL);
try {
SSLStreamConnection s =
new SSLStreamConnection(HOST, PORT, t.openInputStream(), t.openOutputStream(), KEY_STORE);
OutputStream os = s.openOutputStream();
InputStream is = s.openInputStream();
for (int i = 0; i < 100; i++) {
String message = "Message n." + i;
send(os, message);
th.check(receive(is), message);
}
os.close();
is.close();
s.close();
} finally {
t.close();
}
}
void testMultipleSendsReceivesOnMultipleSockets() throws IOException {
for (int i = 0; i < 100; i++) {
StreamConnection t = (StreamConnection)Connector.open(SOCKET_URL);
try {
SSLStreamConnection s =
new SSLStreamConnection(HOST, PORT, t.openInputStream(), t.openOutputStream(), KEY_STORE);
OutputStream os = s.openOutputStream();
InputStream is = s.openInputStream();
String message = "Message n." + i;
send(os, message);
th.check(receive(is), message);
os.close();
is.close();
s.close();
} finally {
t.close();
}
}
}
void testSendOnClosedOutputStream() throws IOException {
StreamConnection t = (StreamConnection)Connector.open(SOCKET_URL);
try {
SSLStreamConnection s =
new SSLStreamConnection(HOST, PORT, t.openInputStream(), t.openOutputStream(), KEY_STORE);
OutputStream os = s.openOutputStream();
InputStream is = s.openInputStream();
os.close();
try {
send(os, MESSAGE);
th.fail("send on closed output stream");
} catch(Exception e) {
th.check(e, "java.io.InterruptedIOException: Stream closed");
}
is.close();
s.close();
} finally {
t.close();
}
}
void testReceiveOnClosedInputStream() throws IOException {
StreamConnection t = (StreamConnection)Connector.open(SOCKET_URL);
try {
SSLStreamConnection s =
new SSLStreamConnection(HOST, PORT, t.openInputStream(), t.openOutputStream(), KEY_STORE);
OutputStream os = s.openOutputStream();
InputStream is = s.openInputStream();
send(os, MESSAGE);
is.close();
try {
receive(is);
th.fail("receive on closed input stream");
} catch(Exception e) {
th.check(e, "java.io.InterruptedIOException: Stream closed");
}
os.close();
s.close();
} finally {
t.close();
}
}
}