Author: markt
Date: Tue Mar 12 22:35:06 2013
New Revision: 1455737
URL: http://svn.apache.org/r1455737
Log:
Make SSL optional
Try to write data in one large chunk.
Unexpected values for written are now observable.
Modified:
tomcat/trunk/test/org/apache/tomcat/jni/TestSocket.java
Modified: tomcat/trunk/test/org/apache/tomcat/jni/TestSocket.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/jni/TestSocket.java?rev=1455737&r1=1455736&r2=1455737&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/jni/TestSocket.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/jni/TestSocket.java Tue Mar 12 22:35:06
2013
@@ -23,7 +23,7 @@ import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.security.SecureRandom;
-import javax.net.ssl.SSLSocketFactory;
+import javax.net.SocketFactory;
import javax.net.ssl.TrustManager;
import org.junit.Assert;
@@ -35,6 +35,29 @@ public class TestSocket {
private static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
+ // 1,000 Writes all the data in the first write
+ // 100,000 Shows strange return values for written
+ // 10,000,000 Shows strange return values for written more clearly
+ private static final int LIMIT = 100000;
+ private static final byte[] DATA;
+ private static final boolean ENABLE_SSL = true;
+
+ static {
+ int pos = 0;
+ int size = 0;
+ for (int i = 0; i < LIMIT; i++) {
+ String s = Integer.toString(i);
+ size += s.length();
+ }
+ DATA = new byte[size];
+ for (int i = 0; i < LIMIT; i++) {
+ String s = Integer.toString(i);
+ byte[] b = s.getBytes(ISO_8859_1);
+ System.arraycopy(b, 0, DATA, pos, b.length);
+ pos += b.length;
+ }
+ }
+
@Test
public void testNonBlockingEagain() throws Exception {
@@ -57,11 +80,16 @@ public class TestSocket {
// Open a connection to the server
String host = null;
- javax.net.ssl.SSLContext sc =
- javax.net.ssl.SSLContext.getInstance("SSL");
- sc.init(null, new TrustManager[] {new TesterSupport.TrustAllCerts()} ,
- new SecureRandom());
- SSLSocketFactory factory = sc.getSocketFactory();
+ SocketFactory factory;
+ if (ENABLE_SSL) {
+ javax.net.ssl.SSLContext sc =
+ javax.net.ssl.SSLContext.getInstance("SSL");
+ sc.init(null, new TrustManager[] {new
TesterSupport.TrustAllCerts()} ,
+ new SecureRandom());
+ factory = sc.getSocketFactory();
+ } else {
+ factory = SocketFactory.getDefault();
+ }
java.net.Socket socket = factory.createSocket(host, port);
// Infinite timeout
@@ -74,24 +102,26 @@ public class TestSocket {
// Read the first 20 digits.
data = clientRead(is, bb, data, 20);
+ System.out.println("Client read first 20 digits");
// Block until the server fills up it's send buffers and then sleep for
// 5 seconds
int count = 0;
- while (count < 5) {
+ while (count < 3) {
java.lang.Thread.sleep(1000);
if (s.isPolling()) {
count ++;
}
}
- // Read the next 10000 digits
- data = clientRead(is, bb, data, 10000);
+ // Read 30% of the data
+ data = clientRead(is, bb, data, (int) (LIMIT * 0.3));
+ System.out.println("Client read first 30% of digits");
// Block until the server fills up it's send buffers and then sleep for
// 5 seconds
count = 0;
- while (count < 5) {
+ while (count < 3) {
java.lang.Thread.sleep(1000);
if (s.isPolling()) {
count ++;
@@ -99,7 +129,8 @@ public class TestSocket {
}
// Read to the end
- clientRead(is, bb, data, 100000);
+ clientRead(is, bb, data, LIMIT);
+ System.out.println("Client read all digits");
socket.close();
}
@@ -128,6 +159,9 @@ public class TestSocket {
expected = Integer.toString(data);
len = expected.length();
bb.compact();
+ if (data%1000 == 0) {
+ System.out.println("Client read to [" + data + "]");
+ }
}
}
return data;
@@ -168,18 +202,22 @@ public class TestSocket {
}
// Setup SSL
- SSL.randSet("builtin");
- SSL.initialize(null);
- sslContext = SSLContext.make(
- rootPool, SSL.SSL_PROTOCOL_ALL, SSL.SSL_MODE_SERVER);
- SSLContext.setCipherSuite(sslContext, "ALL");
- File certFile = new File(
- "test/org/apache/tomcat/util/net/localhost-cert.pem");
- File keyFile = new File(
- "test/org/apache/tomcat/util/net/localhost-key.pem");
- SSLContext.setCertificate(sslContext, certFile.getAbsolutePath(),
- keyFile.getAbsolutePath(), null, SSL.SSL_AIDX_RSA);
- SSLContext.setVerify(sslContext, SSL.SSL_CVERIFY_NONE, 10);
+ if (ENABLE_SSL) {
+ SSL.randSet("builtin");
+ SSL.initialize(null);
+ sslContext = SSLContext.make(
+ rootPool, SSL.SSL_PROTOCOL_ALL, SSL.SSL_MODE_SERVER);
+ SSLContext.setCipherSuite(sslContext, "ALL");
+ File certFile = new File(
+ "test/org/apache/tomcat/util/net/localhost-cert.pem");
+ File keyFile = new File(
+ "test/org/apache/tomcat/util/net/localhost-key.pem");
+ SSLContext.setCertificate(sslContext,
certFile.getAbsolutePath(),
+ keyFile.getAbsolutePath(), null, SSL.SSL_AIDX_RSA);
+ SSLContext.setVerify(sslContext, SSL.SSL_CVERIFY_NONE, 10);
+ } else {
+ sslContext = 0;
+ }
// Poller
serverSocketPool = Pool.create(rootPool);
@@ -206,73 +244,82 @@ public class TestSocket {
long socket = Socket.accept(serverSocket);
// Configure SSL
- SSLSocket.attach(sslContext, socket);
- if (SSLSocket.handshake(socket) != 0) {
- System.err.println("SSL handshake failed");
+ if (sslContext != 0) {
+ SSLSocket.attach(sslContext, socket);
+ if (SSLSocket.handshake(socket) != 0) {
+ System.err.println("SSL handshake failed");
+ }
}
// Make socket non-blocking
Socket.timeoutSet(socket, 0);
+ int start = 0;
+ int left = DATA.length;
+ int written;
- int data = 0;
+ System.out.println("To write [" + left + "]");
do {
- String s = Integer.toString(data);
- byte[] b = s.getBytes(ISO_8859_1);
+ written = Socket.send(socket, DATA, start, left);
+ if (written < 0) {
+ if (Status.APR_STATUS_IS_EAGAIN(-written)) {
+ System.out.println("EAGAIN");
+ written = 0;
+ } else {
+ System.out.println("Error code [" + -written +
"]");
+ throw new RuntimeException();
+ }
+ }
- int start = 0;
- int len = b.length;
- int written;
-
- do {
- written = Socket.send(socket, b, start, len);
- if (written < 0) {
- if (Status.APR_STATUS_IS_EAGAIN(-written)) {
- // System.out.println("EAGAIN");
- written = 0;
+ start += written;
+ left -= written;
+ System.out.println(
+ "Written: [" +written + "], Left [" + left + "]");
+
+ if (written == 0 && left > 0) {
+ // Write buffer is full. Poll until there is space
+ Poll.add(poller, socket, Poll.APR_POLLOUT);
+ polling = true;
+ int pollCount = 0;
+
+ int rv = 0;
+ long[] desc = new long[2];
+
+ while (rv == 0) {
+ System.out.println("Poll. Left [" + left + "]");
+ rv = Poll.poll(poller, 1000000, desc, true);
+ pollCount++;
+
+ if (rv > 0) {
+ // There is space. Continue to write.
+ } else if (-rv == Status.TIMEUP) {
+ rv = 0;
+ // Poll timed out. Poll again.
+ } else if (rv < 0) {
+ // Something went wrong
+ System.err.println(
+ "Poller failure [" + -rv + "]");
} else {
- System.out.println("Error code [" + -written +
"]");
- throw new RuntimeException();
+ // rv == 0. Poll again.
}
- }
- start += written;
- len -= written;
-
- if (written == 0 && len > 0) {
- // Write buffer is full. Poll until there is space
- Poll.add(poller, socket, Poll.APR_POLLOUT);
- polling = true;
-
- int rv = 0;
- long[] desc = new long[2];
-
- while (rv == 0) {
- System.out.println("Poll");
- rv = Poll.poll(poller, 1000000, desc, true);
- if (rv > 0) {
- // There is space. Continue to write.
- } else if (-rv == Status.TIMEUP) {
- // Poll timed out. Poll again.
- } else if (rv < 0) {
- // Something went wrong
- System.err.println(
- "Poller failure [" + -rv + "]");
- } else {
- // rv == 0. Poll again.
- }
+ if (pollCount > 10) {
+ // Should never get stuck in a polling loop
+ // for this long.
+ System.err.println(
+ "Polling loop [" + pollCount + "]");
}
- polling = false;
}
- } while (len > 0);
-
- data++;
- } while (data < 100000);
-
+ polling = false;
+ }
+ } while (left > 0);
} catch (Exception e) {
// May need to do something here
e.printStackTrace();
}
+ // If this finishes early, let the client think it is polling so
the
+ // client can complete
+ polling = true;
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]