Fix ConcurrentCloseTest's write test to ensure we're really blocked in write(2).
Bug: 8272932
Change-Id: Id0b9b23176bf179af85bcaf321df5bab05b093be
diff --git a/luni/src/test/java/libcore/java/net/ConcurrentCloseTest.java b/luni/src/test/java/libcore/java/net/ConcurrentCloseTest.java
index 99a479c..a629271 100644
--- a/luni/src/test/java/libcore/java/net/ConcurrentCloseTest.java
+++ b/luni/src/test/java/libcore/java/net/ConcurrentCloseTest.java
@@ -176,19 +176,29 @@
}
public void test_write() throws Exception {
- final SilentServer ss = new SilentServer();
+ final SilentServer ss = new SilentServer(128); // Minimal receive buffer size.
Socket s = new Socket();
+
+ // Set the send buffer size really small, to ensure we block.
+ int sendBufferSize = 1024;
+ s.setSendBufferSize(sendBufferSize);
+ sendBufferSize = s.getSendBufferSize(); // How big is the buffer really, Linux?
+
+ // Linux still seems to accept more than it should.
+ // How much seems to differ from device to device, but I've yet to see anything accept
+ // twice as much again.
+ sendBufferSize *= 2;
+
s.connect(ss.getLocalSocketAddress());
new Killer(s).start();
try {
System.err.println("write...");
- // We just keep writing here until all the buffers are full and we block,
- // waiting for the server to read (which it never will). If the asynchronous close
- // fails, we'll see a test timeout here.
- while (true) {
- byte[] buf = new byte[256*1024];
- s.getOutputStream().write(buf);
- }
+ // Write too much so the buffer is full and we block,
+ // waiting for the server to read (which it never will).
+ // If the asynchronous close fails, we'll see a test timeout here.
+ byte[] buf = new byte[sendBufferSize];
+ s.getOutputStream().write(buf);
+ fail();
} catch (SocketException expected) {
// We throw "Connection reset by peer", which I don't _think_ is a problem.
// assertEquals("Socket closed", expected.getMessage());
@@ -204,7 +214,14 @@
private Socket client;
public SilentServer() throws IOException {
+ this(0);
+ }
+
+ public SilentServer(int receiveBufferSize) throws IOException {
ss = new ServerSocket(0);
+ if (receiveBufferSize != 0) {
+ ss.setReceiveBufferSize(receiveBufferSize);
+ }
new Thread(new Runnable() {
public void run() {
try {