1dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes/*
2dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  this work for additional information regarding copyright ownership.
5dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  (the "License"); you may not use this file except in compliance with
7dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  the License.  You may obtain a copy of the License at
8dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *
9dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *
11dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  Unless required by applicable law or agreed to in writing, software
12dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  See the License for the specific language governing permissions and
15dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes *  limitations under the License.
16dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes */
17dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
18e5fea3d504609d22337a5311d3ce0e72314bceeeNarayan Kamathpackage org.apache.harmony.tests.java.nio.channels;
19dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
20dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.IOException;
21dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.InputStream;
22dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.io.OutputStream;
23dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.net.BindException;
24dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.net.ConnectException;
25dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.net.InetAddress;
26dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.net.InetSocketAddress;
27dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.net.ServerSocket;
28dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.net.Socket;
29dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.net.SocketAddress;
303d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebskiimport java.net.SocketOption;
31dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.net.SocketException;
32dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.Buffer;
33dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.ByteBuffer;
342808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamathimport java.nio.channels.AlreadyBoundException;
35dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.AlreadyConnectedException;
36dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.ClosedChannelException;
37dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.ConnectionPendingException;
38dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.IllegalBlockingModeException;
39dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.NoConnectionPendingException;
40dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.NotYetConnectedException;
41dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.ServerSocketChannel;
42dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.SocketChannel;
43dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.UnresolvedAddressException;
44dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.UnsupportedAddressTypeException;
45dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.spi.SelectorProvider;
463d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebskiimport java.util.Set;
47dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport junit.framework.TestCase;
48dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
49dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes/**
50dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * Tests for SocketChannel and its default implementation.
51dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes */
52dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughespublic class SocketChannelTest extends TestCase {
53dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
54dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private static final int CAPACITY_NORMAL = 200;
55dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
56dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private InetSocketAddress localAddr1;
57dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private InetSocketAddress localAddr2;
58dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
59dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private SocketChannel channel1;
60dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
61dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private SocketChannel channel2;
62dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
63dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private ServerSocket server1;
64dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
65dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private ServerSocket server2;
66dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
67dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private final static int TIMEOUT = 60000;
68dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
69dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private final static int EOF = -1;
70dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
71dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    protected void setUp() throws Exception {
72dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        super.setUp();
73dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1 = SocketChannel.open();
74dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel2 = SocketChannel.open();
7582c642531ba3c9ad29cb3125f7547a226b661b11Narayan Kamath        this.server1 = new ServerSocket(0);
7682c642531ba3c9ad29cb3125f7547a226b661b11Narayan Kamath        this.localAddr1 = new InetSocketAddress("127.0.0.1", server1.getLocalPort());
7782c642531ba3c9ad29cb3125f7547a226b661b11Narayan Kamath
7882c642531ba3c9ad29cb3125f7547a226b661b11Narayan Kamath        this.server2 = new ServerSocket(0);
7982c642531ba3c9ad29cb3125f7547a226b661b11Narayan Kamath        this.localAddr2 = new InetSocketAddress("127.0.0.1", server2.getLocalPort());
80dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
81dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
82dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    protected void tearDown() throws Exception {
83dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        super.tearDown();
84dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (null != this.channel1) {
85dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
86dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.close();
87dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (Exception e) {
88dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                //ignore
89dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
90dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
91dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (null != this.channel2) {
92dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
93dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel2.close();
94dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (Exception e) {
95dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                //ignore
96dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
97dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
98dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (null != this.server1) {
99dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
100dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.server1.close();
101dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (Exception e) {
102dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                //ignore
103dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
104dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
105dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (null != this.server2) {
106dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
107dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.server2.close();
108dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (Exception e) {
109dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                //ignore
110dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
111dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
112dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
113dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
114dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
115dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // Test for methods in abstract class.
116dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
117dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
118dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'java.nio.channels.SocketChannel.validOps()'
119dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
120dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testValidOps() {
121dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel testMSChannel = new MockSocketChannel(null);
122dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(13, this.channel1.validOps());
123dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(13, testMSChannel.validOps());
124dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
125dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
126dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
127dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'java.nio.channels.SocketChannel.open()'
128dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
129dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testOpen() throws IOException {
130dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] buf = new java.nio.ByteBuffer[1];
131dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buf[0] = java.nio.ByteBuffer.allocateDirect(CAPACITY_NORMAL);
132dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel testMSChannel = new MockSocketChannel(null);
133dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel testMSChannelnotnull = new MockSocketChannel(
134dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectorProvider.provider());
135dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNull(testMSChannel.provider());
136dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(testMSChannelnotnull.provider());
137dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(this.channel1);
138dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(this.channel1.provider(), testMSChannelnotnull.provider());
139dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
140dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(buf);
141dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NotYetConnectedException");
142dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NotYetConnectedException e) {
143dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
144dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
145dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
146dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
147dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
148dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'java.nio.channels.SocketChannel.open(SocketAddress)'
149dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
150dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testOpenSocketAddress_Null() throws IOException {
151dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
152933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            SocketChannel.open(null);
153dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an IllegalArgumentException");
154dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalArgumentException e) {
155dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
156dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
157dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
158dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
15947ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller    public void testBind_Null() throws Exception {
16063744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        assertNull(channel1.socket().getLocalSocketAddress());
16147ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
16263744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        channel1.socket().bind(null);
16347ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
16463744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        InetSocketAddress localAddress = (InetSocketAddress) channel1.socket().getLocalSocketAddress();
16547ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        assertTrue(localAddress.getAddress().isAnyLocalAddress());
16647ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        assertTrue(localAddress.getPort() > 0);
16747ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller    }
16847ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
16947ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller    public void testBind_Failure() throws Exception {
17063744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        assertNull(channel1.socket().getLocalSocketAddress());
17147ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
17247ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        try {
17347ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller            // Bind to a local address that is in use
17463744c884dd4b4f4307f2b021fb894af164972afElliott Hughes            channel1.socket().bind(localAddr1);
17547ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller            fail();
17647ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        } catch (IOException expected) {
17747ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        }
17847ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller    }
17947ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
18047ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller    public void testBind_Closed() throws Exception {
18147ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        channel1.close();
18247ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
18347ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        try {
18463744c884dd4b4f4307f2b021fb894af164972afElliott Hughes            channel1.socket().bind(null);
18547ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller            fail();
18663744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        } catch (IOException expected) {
18747ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        }
18847ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller    }
18947ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
19047ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller    public void testBind_explicitPort() throws Exception {
19147ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        ServerSocketChannel portPickingChannel = ServerSocketChannel.open();
19247ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        // Have the OS find a free port.
19363744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        portPickingChannel.socket().bind(null);
19463744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        InetSocketAddress address = (InetSocketAddress) portPickingChannel.socket().getLocalSocketAddress();
19547ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        assertTrue(address.getPort() > 0);
19647ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        portPickingChannel.close();
19747ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
19847ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        // There is a risk of flakiness here if the port is allocated to something else between
19947ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        // close() and bind().
20047ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        InetSocketAddress bindAddress = new InetSocketAddress("localhost", address.getPort());
20147ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        // Allow the socket to bind to a port we know is already in use.
20247ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        channel1.socket().setReuseAddress(true);
20363744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        channel1.socket().bind(bindAddress);
20447ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
20563744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        InetSocketAddress boundAddress = (InetSocketAddress) channel1.socket().getLocalSocketAddress();
20647ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        assertEquals(bindAddress.getHostName(), boundAddress.getHostName());
20747ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        assertEquals(bindAddress.getPort(), boundAddress.getPort());
20847ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller    }
20947ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
21047ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller    public void test_getLocalSocketAddress_afterClose() throws IOException {
21147ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        SocketChannel sc = SocketChannel.open();
21263744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        assertNull(sc.socket().getLocalSocketAddress());
21347ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
21447ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
21563744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        sc.socket().bind(bindAddr);
21647ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
21763744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        assertNotNull(sc.socket().getLocalSocketAddress());
21847ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
21947ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        sc.close();
22047ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
22147ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        assertFalse(sc.isOpen());
22247ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
22363744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        sc.socket().getLocalSocketAddress();
22447ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller    }
22547ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller
226dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
227dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'java.nio.channels.SocketChannel.read(ByteBuffer[])'
228dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
229dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testReadByteBufferArray() throws IOException {
230dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] byteBuf = null;
231dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel testMSChannelnull = new MockSocketChannel(null);
232dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel testMSChannel = new MockSocketChannel(
233dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectorProvider.provider());
23482c642531ba3c9ad29cb3125f7547a226b661b11Narayan Kamath        ServerSocket testServer = new ServerSocket(0);
235dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
236dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
237dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.read(byteBuf);
238dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw NPE");
239dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (NullPointerException e) {
240dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // correct
241dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
242dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            byteBuf = new java.nio.ByteBuffer[CAPACITY_NORMAL];
243dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
244dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.read(byteBuf);
245dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw NotYetConnectedException");
246dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (NotYetConnectedException e) {
247dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // correct
248dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
249933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            long readNum = testMSChannel.read(byteBuf);
250dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(0, readNum);
251dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            readNum = CAPACITY_NORMAL;
252dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            readNum = testMSChannelnull.read(byteBuf);
253dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(0, readNum);
254dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
255dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testServer.close();
256dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
257dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
258dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
259dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
260dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'java.nio.channels.SocketChannel.read(ByteBuffer[])'
261dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
262dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testReadByteBufferArray_BufNull() throws IOException {
263dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] byteBuf = null;
264dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel testMSChannelnull = new MockSocketChannel(null);
265dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel testMSChannel = new MockSocketChannel(
266dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectorProvider.provider());
267dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
268dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.read(byteBuf);
269dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
270dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
271dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
272dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
273dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
274dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testMSChannel.read(byteBuf);
275dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
276dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
277dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
278dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
279dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
280dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testMSChannelnull.read(byteBuf);
281dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
282dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
283dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
284dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
285dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
286dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
287dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
288dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'java.nio.channels.SocketChannel.write(ByteBuffer[])'
289dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
290dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testWriteByteBufferArray() throws IOException {
291dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] byteBuf = null;
292dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel testMSChannelnull = new MockSocketChannel(null);
293dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel testMSChannel = new MockSocketChannel(
294dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectorProvider.provider());
295dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
296dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(byteBuf);
297dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
298dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
299dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
300dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
301dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byteBuf = new java.nio.ByteBuffer[CAPACITY_NORMAL];
302dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
303dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(byteBuf);
304dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NotYetConnectedException");
305dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NotYetConnectedException e) {
306dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
307dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
308dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        testMSChannel.write(byteBuf);
309dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        testMSChannelnull.write(byteBuf);
310dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
311dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
312dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
313dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'java.nio.channels.SocketChannel.write(ByteBuffer[])'
314dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
315dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testWriteByteBufferArray_BufNull() throws IOException {
316dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] byteBuf = null;
317dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel testMSChannelnull = new MockSocketChannel(null);
318dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel testMSChannel = new MockSocketChannel(
319dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectorProvider.provider());
320dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
321dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(byteBuf);
322dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
323dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
324dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
325dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
326dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
327dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testMSChannel.write(byteBuf);
328dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
329dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
330dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
331dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
332dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
333dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            testMSChannelnull.write(byteBuf);
334dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
335dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
336dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
337dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
338dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
339dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
340dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_BasicStatusBeforeConnect() throws IOException {
341dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());// not connected
342dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket s1 = this.channel1.socket();
343933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        assertSocketBeforeBind(s1);
344dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSocketBeforeConnect(s1);
345dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket s2 = this.channel1.socket();
346dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // same
347dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSame(s1, s2);
348dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
349dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
350dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_Block_BasicStatusAfterConnect() throws IOException {
351dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());// not connected
352dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.connect(localAddr1));
353dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
354dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnected());
355dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket s1 = this.channel1.socket();
356dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
357dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSocketAfterConnect(s1, localAddr1);
358dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket s2 = this.channel1.socket();
359dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // same
360dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSame(s1, s2);
361dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
362dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
363dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_NonBlock_BasicStatusAfterConnect() throws Exception {
364dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());// not connected
365dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
366dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = channel1.connect(localAddr1);
367933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        Socket s1;
368933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        Socket s2;
369dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
370dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isConnected());
371dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isConnectionPending());
372dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            s1 = this.channel1.socket();
373933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // A connect() causes an implicit bind()
374933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            assertSocketAfterImplicitBind(s1);
375933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
376dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // status of not connected
377dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertSocketBeforeConnect(s1);
378dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            s2 = this.channel1.socket();
379dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // same
380dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertSame(s1, s2);
381dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
382dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
383dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (tryFinish()) {
384dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isConnected());
385dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            s1 = this.channel1.socket();
386dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertSocketAfterConnect(s1, localAddr1);
387dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            s2 = this.channel1.socket();
388dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // same
389dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertSame(s1, s2);
390dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
391dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
392dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
393dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_Block_ActionsBeforeConnect() throws IOException {
394dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());// not connected
395dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket s = this.channel1.socket();
396dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSocketAction_Block_BeforeConnect(s);
397dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
398dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
399dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_Block_ActionsAfterConnect() throws IOException {
400dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());// not connected
401dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.connect(localAddr1));
402dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnected());
403dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket s = this.channel1.socket();
404dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSocketAction_Block_AfterConnect(s);
405dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
406dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
407dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
408dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_NonBlock_ActionsAfterConnectBeforeFinish()
409dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws IOException {
410dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());// not connected
411dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
412dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = channel1.connect(localAddr1);
413dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
414dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isConnected());
415dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isConnectionPending());
416dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            Socket s1 = this.channel1.socket();
417dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // Action of not connected
418dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertSocketAction_NonBlock_BeforeConnect(s1);
419dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            Socket s2 = this.channel1.socket();
420dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // same
421dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertSame(s1, s2);
422dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
423dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
424dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
425dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_NonBlock_ActionsAfterConnectAfterFinish()
426dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws Exception {
427dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());// not connected
428dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
429dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
430dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (tryFinish()) {
431dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            Socket s1 = this.channel1.socket();
432dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertSocketAction_NonBlock_AfterConnect(s1);
433dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            Socket s2 = this.channel1.socket();
434dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // same
435dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertSame(s1, s2);
436dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
437dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
438dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
439dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_getInetAddress() throws Exception {
440dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = channel1.socket();
441dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNull(socket.getInetAddress());
442dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
443dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
444dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
445dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(socket.getInetAddress());
446dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(localAddr1.getAddress(), socket.getInetAddress());
447dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
448dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
449dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_getRemoteSocketAddress() throws Exception {
450dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = channel1.socket();
451dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNull(socket.getRemoteSocketAddress());
452dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
453dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
454dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
455dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(socket.getRemoteSocketAddress());
456dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(localAddr1, socket.getRemoteSocketAddress());
457dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
458dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
459dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_getPort() throws Exception {
460dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = channel1.socket();
461dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(0, socket.getPort());
462dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
463dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
464dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
465dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(localAddr1.getPort(), socket.getPort());
466dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
467dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
468dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_getLocalAddress() throws Exception {
469dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = channel1.socket();
470dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
471dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
472dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
47363744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        assertNotNull(socket.getLocalSocketAddress());
474dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
475dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
476dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_getLocalSocketAddress() throws Exception {
477dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = channel1.socket();
478dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNull(socket.getLocalSocketAddress());
479dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
480dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
481dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
482dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(socket.getLocalSocketAddress());
483dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
484dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
485dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_getLocalPort() throws Exception {
486dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = channel1.socket();
487dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(-1, socket.getLocalPort());
488dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
489dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
490dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
491dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(-1 != socket.getLocalPort());
492dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(0 != socket.getLocalPort());
493dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
494dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
495dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_bind() throws Exception {
496dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = channel1.socket();
497dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        socket.bind(new InetSocketAddress("127.0.0.1", 0));
498dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals("127.0.0.1", socket.getLocalAddress().getHostAddress());
499dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(socket.getLocalPort() != -1);
500dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
501dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
502933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    private void assertSocketBeforeBind(Socket s) {
503dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.isBound());
504933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        assertTrue(s.getLocalAddress().isAnyLocalAddress());
505933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        // RI fails here. RI returns 0 while spec says unbound socket should
506933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        // return -1.
507933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        assertEquals(-1, s.getLocalPort());
508933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        assertNull(s.getLocalSocketAddress());
509933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    }
510933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
511933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    private void assertSocketAfterImplicitBind(Socket s) throws IOException {
512933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        assertTrue(s.isBound());
513933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        assertTrue(s.getLocalAddress().isLoopbackAddress());
514933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        assertTrue(s.getLocalPort() > 0);
515933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
516933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        InetSocketAddress localSocketAddress = (InetSocketAddress) s.getLocalSocketAddress();
517933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        assertTrue(localSocketAddress.getAddress().isLoopbackAddress());
518933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        assertEquals(s.getLocalPort(), localSocketAddress.getPort());
519933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    }
520933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
521933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    private void assertSocketBeforeConnect(Socket s) throws IOException {
522dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.isClosed());
523dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.isConnected());
524dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.getKeepAlive());
525dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
526dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            s.getInputStream();
527dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw SocketException.");
528dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (SocketException e) {
529dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
530dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
531dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.getOOBInline());
532dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
533dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            s.getOutputStream();
534dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw SocketException.");
535dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (SocketException e) {
536dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
537dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
538dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(-1, s.getSoLinger());
539dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.getTcpNoDelay());
540dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
541dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.isInputShutdown());
542dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.isOutputShutdown());
543dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
544dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNull(s.getInetAddress());
545dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.getReuseAddress());
546dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
547dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // not connected
548dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(0, s.getPort());
549dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.getReceiveBufferSize() >= 8192);
550dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNull(s.getRemoteSocketAddress());
551dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.getSendBufferSize() >= 8192);
552dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(0, s.getSoTimeout());
553dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(0, s.getTrafficClass());
554dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
555dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
556dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
557dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void assertSocketAfterConnect(Socket s, InetSocketAddress address)
558dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws IOException {
559dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.isBound());
560dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.isClosed());
561dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.isConnected());
562dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.getKeepAlive());
563dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
564dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(s.getInputStream());
565dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(s.getOutputStream());
566dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
567dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.getOOBInline());
568dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(-1, s.getSoLinger());
569dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.getTcpNoDelay());
570dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
571dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.isInputShutdown());
572dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.isOutputShutdown());
573dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
574dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSame(s.getInetAddress(), address.getAddress());
575dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
576dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(s.getLocalAddress(), this.localAddr1.getAddress());
577dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(s.getPort(), address.getPort());
578dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(s.getLocalSocketAddress());
579dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.getReceiveBufferSize() >= 8192);
580dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(s.getRemoteSocketAddress(), (SocketAddress) address);
581dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // assertFalse(s.getReuseAddress());
582dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.getSendBufferSize() >= 8192);
583dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(0, s.getSoTimeout());
584dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(0, s.getTrafficClass());
585dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
586dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
587dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void assertSocketAction_Block_BeforeConnect(Socket s)
588dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws IOException {
589dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
590dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        s.connect(localAddr2);
591dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnected());
592dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.isConnected());
593dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
594dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSocketAfterConnect(s, localAddr2);
595dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
596dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
597dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            s.bind(localAddr2);
5982808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath            fail("Should throw SocketException");
5992808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath        } catch (SocketException e) {
600dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
601dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
602dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
603dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        s.close();
604dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.isClosed());
605dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isOpen());
606dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
607dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
608dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void assertSocketAction_NonBlock_BeforeConnect(Socket s)
609dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws IOException {
610dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
611dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
612dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            s.connect(localAddr2);
613dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw IllegalBlockingModeException");
614dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException e1) {
615dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
616dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
617dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
618dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (this.channel1.isConnectionPending()) {
619dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
620dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                s.bind(localAddr2);
621dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw ConnectionPendingException");
622dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (ConnectionPendingException e1) {
623dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // OK.
624dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
625dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } else {
626dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
627dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                s.bind(localAddr2);
628dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw BindException");
629dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (BindException e1) {
630dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // OK.
631dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
632dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
633dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
634dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
635dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.isConnected());
636dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
637dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        s.close();
638dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.isClosed());
639dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isOpen());
640dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
641dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
642dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void assertSocketAction_Block_AfterConnect(Socket s)
643dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws IOException {
644dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(s.getPort(), localAddr1.getPort());
645dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnected());
646dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.isConnected());
647dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
648dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            s.connect(localAddr2);
6492808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath            fail("Should throw SocketException");
6502808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath        } catch (SocketException e) {
651dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
652dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
653dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
654dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
655dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            s.bind(localAddr2);
6562808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath            fail("Should throw SocketException");
6572808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath        } catch (SocketException e) {
658dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
659dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
660dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
661dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        s.close();
662dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.isClosed());
663dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isOpen());
664dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
665dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
666dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void assertSocketAction_NonBlock_AfterConnect(Socket s)
667dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws IOException {
668dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(s.getPort(), localAddr1.getPort());
669dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnected());
670dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.isConnected());
671dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
672dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (this.channel1.isConnectionPending()) {
673dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
674dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                s.connect(localAddr2);
6752808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath                fail("Should throw SocketException");
6762808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath            } catch (SocketException e) {
677dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // OK.
678dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
679dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } else {
680dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
681dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                s.connect(localAddr2);
682dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw IllegalBlockingModeException");
683dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (IllegalBlockingModeException e) {
684dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // OK.
685dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
686dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
687dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
688dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
689dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            s.bind(localAddr2);
6902808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath            fail("Should throw SocketException");
6912808d7d77be71a40b9724172fc6be4c3db68d507Narayan Kamath        } catch (SocketException e) {
692dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
693dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
694dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
695dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        s.close();
696dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s.isClosed());
697dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isOpen());
698dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
699dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
700dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
701dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // Tests for connect(), finishConnect(),isConnected(),isConnectionPending()
702dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // These methods are very close, so we test them together, call them "CFII".
703dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
704dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
705dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->close
706dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
707dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_Norml_NoServer_Block() throws Exception {
708dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
709dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
710dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
711dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
712dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
713dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
714dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
715dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ConnectException here.");
716dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
717dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
718dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
719dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
720dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
721dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
722dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ClosedChannelException here.");
723dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
724dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
725dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
726dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
727dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
728dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
729dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->close
730dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
731dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_Norml_NoServer_NonBlock() throws Exception {
732dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        connectNoServerNonBlock();
733dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
734dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
735dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
736dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
737dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
738dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
739dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->close
740dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
741dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_Norml_Server_Block() throws Exception {
742dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        connectServerBlock();
743dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
744dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
745dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
746dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
747dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
748dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
749dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
750dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->close
751dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
752dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_Norml_Server_NonBlock() throws Exception {
753dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        connectServerNonBlock();
754dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
755dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
756dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
757dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
758dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
759dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
760dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->server closed-->finish-->close
761dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
762dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ServerClosed_Block() throws Exception {
763dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
764dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
765dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
766dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
767dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
768dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.connect(localAddr1));
769dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
770dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
771dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
772dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
773dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
774dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
775dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
776dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
777dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
778dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
779dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
780dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
781dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->server closed-->finish-->close
782dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
783dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ServerClosed_NonBlock() throws Exception {
784dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
785dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
786dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
787dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
788dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
789dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = channel1.connect(localAddr1);
790dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
791dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
792dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
793dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
794dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
795dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
796dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
797dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
798dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
799dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
800dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
801dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
802dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->server closed-->close
803dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
804dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ServerClosedAfterFinish_Block() throws Exception {
805dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        connectServerBlock();
806dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
807dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
808dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
809dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
810dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
811dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
812dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
813dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
814dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
815dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->server closed-->close
816dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
817dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ServerClosedAfterFinish_NonBlock() throws Exception {
818dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        connectServerNonBlock();
819dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
820dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
821dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
822dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
823dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
824dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
825dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
826dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
827dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * no server-->connect-->server open-->finish-->close
828dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
829dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ServerStartLater_Block() throws Exception {
830dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
831dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
832dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
833dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
834dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
835dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
836dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
837dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ConnectException here.");
838dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
839dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
840dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
841dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
842dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
843dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
844dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
845dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ClosedChannelException here.");
846dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
847dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
848dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
849dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
850dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
851dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
852dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * no server-->connect-->server open-->finish-->close
853dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
854dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ServerStartLater_NonBlock() throws Exception {
855dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
856dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
857dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
858dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
859dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
860dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.connect(localAddr1));
861dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_Pending();
862dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
863dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
864dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
865dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
866dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.finishConnect());
867dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
868dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.close();
869dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
870dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // FIXME: assertEquals(e.getMessage(), "Connection refused");
871dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
872dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
873dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
874dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
875dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->finish-->close
876dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
877dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_FinishTwice_NoServer_NonBlock() throws Exception {
878dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
879dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
880dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
881dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
882dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
883dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.connect(localAddr1));
884dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_Pending();
885dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
886dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.finishConnect());
887dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
888dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.finishConnect());
889dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
890dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.close();
891dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
892dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes          // FIXME: assertEquals(e.getMessage(), "Connection refused");
893dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
894dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
895dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
896dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
897dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
898dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->finish-->close
899dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
900dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_FinishTwice_Server_Block() throws Exception {
901dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        connectServerBlock();
902dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
903dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
904dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
905dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
906dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
907dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
908dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
909dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->finish-->close
910dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
911dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_FinishTwice_Server_NonBlock() throws Exception {
912dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        connectServerNonBlock();
913dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
914dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
915dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
916dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
917dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
918dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
919dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->connect-->close
920dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
921dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ConnectAfterFinish_NoServer_Block() throws Exception {
922dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
923dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
924dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
925dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
926dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
927dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
928dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
929dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ConnectException here.");
930dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
931dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
932dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
933dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
934dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
935dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
936dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ClosedChannelException here.");
937dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
938dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
939dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
940dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
941dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
942dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
943dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ClosedChannelException here.");
944dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
945dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
946dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
947dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
948dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
949dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
950dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
951dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->connect-->close
952dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
953dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ConnectAfterFinish_NoServer_NonBlock()
954dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws Exception {
955dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
956dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
957dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
958dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
959dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
960dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.connect(localAddr1));
961dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_Pending();
962dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
963dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.finishConnect());
964dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
965dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
966dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // FIXME: assertEquals(e.getMessage(), "Connection refused");
967dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
968dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
969dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (this.channel1.isOpen()) {
970dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
971dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
972dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr1);
973dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw a ConnectionPendingException here.");
974dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (ConnectionPendingException e) {
975dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // OK.
976dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
977dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
978dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
979dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // connect another addr
980dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
981dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr2);
982dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw a ConnectionPendingException here.");
983dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (ConnectionPendingException e) {
984dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // OK.
985dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
986dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
987dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
988dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // connect if server closed
989dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            ensureServerClosed();
990dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
991dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
992dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr1);
993dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw a ConnectionPendingException here.");
994dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (ConnectionPendingException e) {
995dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // OK.
996dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
997dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
998dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
999dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.close();
1000dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1001dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1002dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1003dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1004dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1005dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->connect-->close
1006dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1007dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ConnectAfterFinish_Server_Block() throws Exception {
1008dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        connectServerBlock();
1009dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1010dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!this.channel1.isConnected()) {
1011dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            System.err
1012dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                    .println("Connection fail, testCFII_ConnectAfterFinish_Server_Block is not finished.");
1013dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            return;
1014dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1015dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1016dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1017dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
1018dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an AlreadyConnectedException here.");
1019dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (AlreadyConnectedException e) {
1020dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1021dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1022dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1023dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1024dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect another addr
1025dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1026dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr2);
1027dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an AlreadyConnectedException here.");
1028dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (AlreadyConnectedException e) {
1029dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1030dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1031dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1032dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1033dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect if server closed
1034dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
1035dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1036dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1037dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
1038dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an AlreadyConnectedException here.");
1039dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (AlreadyConnectedException e) {
1040dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1041dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1042dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1043dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1044dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
1045dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1046dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1047dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1048dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1049dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1050dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->finish-->connect-->close
1051dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1052dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ConnectAfterFinish_Server_NonBlock() throws Exception {
1053dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        connectServerNonBlock();
1054dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1055dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!this.channel1.isConnected()) {
1056dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            System.err
1057dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                    .println("Connection fail, testCFII_ConnectAfterFinish_Server_Block is not finished.");
1058dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            return;
1059dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1060dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1061dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
1062dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an AlreadyConnectedException or a ConnectionPendingException here.");
1063dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (AlreadyConnectedException e) {
1064dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1065dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1066dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1067dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1068dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1069dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect another addr
1070dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1071dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr2);
1072dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an AlreadyConnectedException here.");
1073dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (AlreadyConnectedException e) {
1074dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1075dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1076dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1077dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1078dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect if server closed
1079dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
1080dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1081dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1082dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
1083dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an AlreadyConnectedException here.");
1084dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (AlreadyConnectedException e) {
1085dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1086dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1087dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1088dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1089dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
1090dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1091dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1092dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1093dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1094dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->connect-->finish-->close
1095dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1096dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ConnectTwice_NoServer_NonBlock() throws Exception {
1097dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
1098dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
1099dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1100dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1101dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
1102dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.connect(localAddr1));
1103dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_Pending();
1104dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1105dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1106dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
1107dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ConnectionPendingException here.");
1108dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectionPendingException e) {
1109dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1110dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1111dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_Pending();
1112dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1113dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect another addr
1114dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1115dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr2);
1116dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ConnectionPendingException here.");
1117dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectionPendingException e) {
1118dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1119dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1120dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_Pending();
1121dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1122dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect if server closed
1123dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
1124dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1125dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1126dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
1127dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ConnectionPendingException here.");
1128dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectionPendingException e) {
1129dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1130dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1131dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_Pending();
1132dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1133dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1134dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.finishConnect());
1135dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
1136dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.close();
1137dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
1138dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // FIXME: assertEquals(e.getMessage(), "Connection refused");
1139dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1140dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1141dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1142dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1143dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1144dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1145dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->connect-->finish-->close
1146dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1147dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ConnectTwice_Server_Block() throws Exception {
1148dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
1149dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1150dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
1151dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1152dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
1153dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.connect(localAddr1));
1154dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1155dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1156dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1157dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
1158dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an AlreadyConnectedException here.");
1159dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (AlreadyConnectedException e) {
1160dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1161dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1162dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1163dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1164dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect another addr
1165dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1166dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr2);
1167dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an AlreadyConnectedException here.");
1168dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (AlreadyConnectedException e) {
1169dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1170dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1171dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1172dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1173dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect if server closed
1174dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
1175dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1176dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1177dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
1178dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an AlreadyConnectedException here.");
1179dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (AlreadyConnectedException e) {
1180dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1181dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1182dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1183dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1184dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
1185dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1186dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
1187dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1188dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1189dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1190dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1191dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1192dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * connect-->connect-->finish-->close
1193dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1194dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_ConnectTwice_Server_NonBlock() throws Exception {
1195dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
1196dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1197dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1198dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1199dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
1200dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = channel1.connect(localAddr1);
1201dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
1202dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
1203dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1204dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
1205dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr1);
1206dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw a ConnectionPendingException here.");
1207dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (ConnectionPendingException e) {
1208dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // OK.
1209dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1210dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
1211dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1212dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // connect another addr
1213dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
1214dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr2);
1215dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw a ConnectionPendingException here.");
1216dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (ConnectionPendingException e) {
1217dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // OK.
1218dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1219dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
1220dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1221dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // connect if server closed
1222dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            ensureServerClosed();
1223dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1224dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
1225dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr1);
1226dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw a ConnectionPendingException here.");
1227dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (ConnectionPendingException e) {
1228dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // OK.
1229dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1230dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
1231dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1232dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
1233dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1234dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
1235dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1236dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1237dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1238dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1239dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * finish-->connect-->finish-->close
1240dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1241dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_FinishFirst_NoServer_Block() throws Exception {
1242dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
1243dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
1244dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
1245dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1246dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // finish
1247dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1248dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
1249dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NoConnectionPendingException");
1250dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NoConnectionPendingException e) {
1251dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1252dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1253dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1254dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
1255dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1256dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
1257dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ConnectException here.");
1258dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
1259dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1260dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1261dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1262dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1263dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
1264dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ClosedChannelException here.");
1265dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
1266dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1267dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1268dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1269dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1270dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1271dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1272dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * finish-->connect-->finish-->close
1273dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1274dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_FinishFirst_NoServer_NonBlock() throws Exception {
1275dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
1276dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
1277dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1278dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1279dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // finish
1280dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1281dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
1282dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NoConnectionPendingException");
1283dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NoConnectionPendingException e) {
1284dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1285dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1286dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1287dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
1288dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.connect(localAddr1));
1289dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_Pending();
1290dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1291dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1292dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.finishConnect());
1293dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
1294dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.close();
1295dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
1296dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // FIXME: assertEquals(e.getMessage(), "Connection refused");
1297dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1298dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1299dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1300dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1301dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1302dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1303dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * finish-->connect-->finish-->close
1304dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1305dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_FinishFirst_Server_Block() throws Exception {
1306dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
1307dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1308dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
1309dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1310dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // finish
1311dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1312dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
1313dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NoConnectionPendingException");
1314dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NoConnectionPendingException e) {
1315dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1316dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1317dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1318dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
1319dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.connect(localAddr1));
1320dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1321dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1322dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
1323dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1324dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
1325dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1326dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1327dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1328dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1329dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1330dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * finish-->connect-->finish-->close
1331dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1332dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_FinishFirst_Server_NonBlock() throws Exception {
1333dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
1334dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1335dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1336dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1337dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // finish
1338dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1339dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
1340dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NoConnectionPendingException");
1341dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NoConnectionPendingException e) {
1342dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1343dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1344dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1345dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
1346dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = channel1.connect(localAddr1);
1347dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
1348dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
1349dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1350dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
1351dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1352dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
1353dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1354dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1355dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1356dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_Null() throws Exception {
1357dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1358dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1359dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(null);
1360dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an IllegalArgumentException here.");
1361dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalArgumentException e) {
1362dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1363dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1364dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1365dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1366dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_UnsupportedType() throws Exception {
1367dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        class SubSocketAddress extends SocketAddress {
1368dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            private static final long serialVersionUID = 1L;
1369dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1370dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            //empty
1371dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            public SubSocketAddress() {
1372dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                super();
1373dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1374dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1375dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1376dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketAddress newTypeAddress = new SubSocketAddress();
1377dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1378dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(newTypeAddress);
1379dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an UnsupportedAddressTypeException here.");
1380dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (UnsupportedAddressTypeException e) {
1381dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1382dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1383dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1384dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1385dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_Unresolved() throws IOException {
1386dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1387dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        InetSocketAddress unresolved = new InetSocketAddress(
1388dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                "unresolved address", 1080);
1389dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1390dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(unresolved);
1391dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an UnresolvedAddressException here.");
1392dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (UnresolvedAddressException e) {
1393dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1394dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1395dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1396dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1397dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_EmptyHost() throws Exception {
1398dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1399dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket server = new ServerSocket(0);
1400dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int port = server.getLocalPort();
1401dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        server.close();
1402dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1403dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(new InetSocketAddress("", port));
1404dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ConnectException");
1405dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
1406dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
1407dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1408dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1409dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1410dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_CloseFirst() throws Exception {
1411dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
1412dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1413dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1414dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1415dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
1416dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException.");
1417dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
1418dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1419dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1420dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1421dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1422dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
1423dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException.");
1424dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
1425dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1426dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1427dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1428dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1429dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.configureBlocking(false);
1430dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException.");
1431dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
1432dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1433dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1434dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusChannelClosed();
1435dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1436dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1437dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_StatusAfterFinish() throws Exception {
1438dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // 1. close server, finish must return false, check the status
1439dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
1440dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1441dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // 1.1 block mode
1442dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
1443dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1444dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.connect(localAddr1);
1445dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ConnectException");
1446dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
1447dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
1448dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1449dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isOpen());
1450dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1451dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isOpen());
1452dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
1453dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
1454dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1455dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // 1.2 non block mode
1456dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1 = SocketChannel.open();
1457dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1458dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.connect(localAddr1));
1459dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1460dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.finishConnect());
1461dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
1462dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.close();
1463dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
1464dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            System.out.println(e.getMessage());
1465dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1466dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1467dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // 2. start server, finish usually return true, check the status
1468dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1469dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1470dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // 2.1 block mode
1471dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1 = SocketChannel.open();
1472dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
1473dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.connect(localAddr1));
1474dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.finishConnect());
1475dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1476dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
1477dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1478dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // 2.2 non block mode
1479dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1 = SocketChannel.open();
1480dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1481dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.connect(localAddr1));
1482dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
1483dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
1484dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1485dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1486dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void ensureServerClosed() throws IOException {
1487dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (null != this.server1) {
1488dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.server1.close();
1489dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.server1.isClosed());
1490dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1491dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (null != this.server2) {
1492dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.server2.close();
1493dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.server2.isClosed());
1494dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1495dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1496dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1497dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void ensureServerOpen() throws IOException {
1498dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
149982c642531ba3c9ad29cb3125f7547a226b661b11Narayan Kamath        this.server1 = new ServerSocket(0);
150082c642531ba3c9ad29cb3125f7547a226b661b11Narayan Kamath        this.localAddr1 = new InetSocketAddress("127.0.0.1", server1.getLocalPort());
150182c642531ba3c9ad29cb3125f7547a226b661b11Narayan Kamath        this.server2 = new ServerSocket(0);
150282c642531ba3c9ad29cb3125f7547a226b661b11Narayan Kamath        this.localAddr2 = new InetSocketAddress("127.0.0.1", server2.getLocalPort());
1503dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.server1.isBound());
1504dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.server2.isBound());
1505dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1506dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1507dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void connectNoServerNonBlock() throws Exception {
1508dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
1509dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
1510dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1511dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1512dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
1513dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.connect(localAddr1));
1514dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_Pending();
1515dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1516dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.finishConnect());
1517dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
1518dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
1519dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // FIXME: assertEquals(e.getMessage(), "Connection refused");
1520dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1521dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1522dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1523dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void connectServerNonBlock() throws Exception {
1524dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
1525dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1526dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1527dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1528dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
1529dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = channel1.connect(localAddr1);
1530dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
1531dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusNotConnected_Pending();
1532dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1533dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
1534dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1535dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1536dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void connectServerBlock() throws Exception {
1537dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // ensure
1538dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1539dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
1540dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusNotConnected_NotPending();
1541dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // connect
1542dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.connect(localAddr1));
1543dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        statusConnected_NotPending();
1544dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
1545dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1546dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1547dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void statusChannelClosed() {
1548dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
1549dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
1550dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isOpen());
1551dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1552dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1553dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void statusNotConnected_NotPending() {
1554dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
1555dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
1556dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
1557dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1558dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1559dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void statusNotConnected_Pending() {
1560dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
1561dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnectionPending());
1562dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
1563dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1564dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1565dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void statusConnected_NotPending() {
1566dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnected());
1567dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
1568dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
1569dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1570dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1571dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private boolean tryFinish() throws IOException {
1572dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        /*
1573dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes         * the result of finish will be asserted in multi-thread tests.
1574dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes         */
1575dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = false;
1576dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
1577dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1578dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            connected = this.channel1.finishConnect();
1579dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (SocketException e) {
1580dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // Finish connection failed, probably due to reset by peer error.
1581dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1582dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (connected) {
1583dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            statusConnected_NotPending();
1584dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1585dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        return connected;
1586dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1587dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1588dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
1589dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // Original tests. Test method for CFII with real data.
1590dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
1591dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1592dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1593dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     *
1594dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * 'SocketChannelImpl.connect(SocketAddress)'
1595dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1596dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_Data_ConnectWithServer() throws Exception {
1597dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1598dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer
1599dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .allocate(CAPACITY_NORMAL);
1600dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] writeBufArr = new java.nio.ByteBuffer[1];
1601dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBufArr[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL);
1602dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
1603dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
1604dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1605dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
1606dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1607dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
1608dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnected());
1609dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
1610dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
1611dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf));
1612dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBufArr, 0, 1));
1613dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1614dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1615dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1616dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
1617dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw AlreadyConnectedException");
1618dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (AlreadyConnectedException e) {
1619dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
1620dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1621dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1622dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
1623dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
1624dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1625dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1626dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
1627dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'SocketChannelImpl.connect(SocketAddress)'
1628dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1629dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_Data_ConnectWithServer_nonBlocking() throws Exception {
1630dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1631dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer
1632dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .allocate(CAPACITY_NORMAL);
1633dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] writeBufArr = new java.nio.ByteBuffer[1];
1634dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBufArr[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL);
1635dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
1636dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
1637dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1638dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
1639dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1640dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isBlocking());
1641dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = channel1.isConnected();
1642dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
1643dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isConnectionPending());
1644dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isOpen());
1645dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1646dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (tryFinish()) {
1647dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf));
1648dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBufArr, 0, 1));
1649dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1650dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.configureBlocking(false);
1651dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
1652dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr1);
1653dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw AlreadyConnectedException");
1654dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (AlreadyConnectedException e) {
1655dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // correct
1656dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1657dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1658dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1659dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
1660dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
1661dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1662dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1663dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
1664dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'SocketChannelImpl.finishConnect()'
1665dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1666dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_Data_FinishConnect_nonBlocking() throws IOException {
1667dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1668dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1669dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer
1670dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .allocate(CAPACITY_NORMAL);
1671dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] writeBufArr = new java.nio.ByteBuffer[1];
1672dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBufArr[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL);
1673dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1674dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1675dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1676dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
1677dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NoConnectionPendingException");
1678dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NoConnectionPendingException e) {
1679dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
1680dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1681dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = channel1.connect(localAddr1);
1682dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
1683dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isBlocking());
1684dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isConnected());
1685dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isConnectionPending());
1686dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isOpen());
1687dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1688dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.server1.accept();
1689dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (tryFinish()) {
1690dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf));
1691dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBufArr, 0, 1));
1692dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
1693dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr1);
1694dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw AlreadyConnectedException");
1695dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (AlreadyConnectedException e) {
1696dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // correct
1697dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1698dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1699dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
1700dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
1701dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1702dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1703dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_Data_FinishConnect_AddrSetServerStartLater()
1704dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws IOException, InterruptedException {
1705dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
1706dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1707dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1708dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            SocketChannel.open(localAddr1);
1709dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ConnectException");
1710dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
1711dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
1712dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1713dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
1714dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isBlocking());
1715dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
1716dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(true);
1717dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1718dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
1719dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NoConnectionPendingException");
1720dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NoConnectionPendingException e) {
1721dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
1722dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1723dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1724dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr2);
1725dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ConnectException");
1726dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
1727dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
1728dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1729dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1730dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
1731dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1732dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
1733dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException");
1734dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
1735dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
1736dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1737dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
1738dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // finish after finish OK
1739dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
1740dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1 = SocketChannel.open();
1741dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1742dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
1743dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
1744dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1745dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // cannot connect?
1746dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1747dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.finishConnect());
1748dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isBlocking());
1749dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isConnected());
1750dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isConnectionPending());
1751dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isOpen());
1752dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
1753dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr1);
1754dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw ConnectionPendingException");
1755dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (ConnectionPendingException e) {
1756dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // correct
1757dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1758dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.configureBlocking(true);
1759dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
1760dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr1);
1761dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw ConnectionPendingException");
1762dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (ConnectionPendingException e) {
1763dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // correct
1764dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1765dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            tryFinish();
1766dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
1767dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // FIXME: assertEquals(e.getMessage(), "Connection refused");
1768dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1769dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1770dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1771dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_Data_FinishConnect_ServerStartLater()
1772dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws IOException {
1773dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerClosed();
1774dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(true);
1775dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1776dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
1777dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NoConnectionPendingException");
1778dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NoConnectionPendingException e) {
1779dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
1780dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1781dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1782dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.connect(localAddr1);
1783dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ConnectException");
1784dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
1785dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
1786dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1787dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1788dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1789dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
1790dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException");
1791dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
1792dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
1793dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1794dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
1795dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // finish after finish OK
1796dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
1797dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1 = SocketChannel.open();
1798dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
1799dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
1800dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
1801dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1802dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // cannot connect?
1803dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1804dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.finishConnect());
1805dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isBlocking());
1806dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isConnected());
1807dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isConnectionPending());
1808dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isOpen());
1809dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
1810dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr1);
1811dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw ConnectionPendingException");
1812dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (ConnectionPendingException e) {
1813dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // correct
1814dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1815dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.configureBlocking(true);
1816dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
1817dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr1);
1818dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw ConnectionPendingException");
1819dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (ConnectionPendingException e) {
1820dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // correct
1821dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1822dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            tryFinish();
1823dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ConnectException e) {
1824dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // FIXME: assertEquals(e.getMessage(), "Connection refused");
1825dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1826dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1827dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1828dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testCFII_Data_FinishConnect_Blocking() throws IOException {
1829dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ensureServerOpen();
1830dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer
1831dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .allocate(CAPACITY_NORMAL);
1832dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] writeBufArr = new java.nio.ByteBuffer[1];
1833dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBufArr[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL);
1834dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(true);
1835dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
1836dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.finishConnect();
1837dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NoConnectionPendingException");
1838dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NoConnectionPendingException e) {
1839dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
1840dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1841dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1842dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
1843dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1844dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnected());
1845dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
1846dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
1847dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (tryFinish()) {
1848dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf));
1849dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBufArr, 0, 1));
1850dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1851dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
1852dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.connect(localAddr1);
1853dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw AlreadyConnectedException");
1854dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (AlreadyConnectedException e) {
1855dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // correct
1856dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1857dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1858dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
1859dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        tryFinish();
1860dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1861dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1862dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1863dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Regression test for Harmony-1947.
1864dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1865dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_finishConnect() throws Exception {
1866dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketAddress address = new InetSocketAddress("localhost", 0);
1867dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1868dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel theServerChannel = ServerSocketChannel.open();
1869dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket serversocket = theServerChannel.socket();
1870dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serversocket.setReuseAddress(true);
1871dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Bind the socket
187263744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        theServerChannel.socket().bind(address);
1873dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1874dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean doneNonBlockingConnect = false;
1875dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Loop so that we make sure we're definitely testing finishConnect()
1876dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        while (!doneNonBlockingConnect) {
1877dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1 = SocketChannel.open();
1878dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1879dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // Set the SocketChannel to non-blocking so that connect(..) does
1880dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // not block
1881dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.configureBlocking(false);
1882dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            boolean connected = channel1.connect(new InetSocketAddress("localhost",serversocket.getLocalPort()));
1883dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if (!connected) {
1884dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // Now set the SocketChannel back to blocking so that
1885dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // finishConnect() blocks.
1886dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                channel1.configureBlocking(true);
1887dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                doneNonBlockingConnect = channel1.finishConnect();
1888dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1889dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if (doneNonBlockingConnect) {
1890dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                tryFinish();
1891dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1892dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.close();
1893dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1894dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!serversocket.isClosed()) {
1895dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            serversocket.close();
1896dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1897dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1898dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1899dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
1900dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // End of original tests. Test method for CFII with real data.
1901dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
1902dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1903dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1904dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#read(ByteBuffer)
1905dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1906dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_readLjava_nio_ByteBuffer_Blocking() throws IOException {
1907dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // initialize write content
1908dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] writeContent = new byte[CAPACITY_NORMAL];
1909dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < writeContent.length; i++) {
1910dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeContent[i] = (byte) i;
1911dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1912dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // establish connection
1913dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
1914dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket acceptedSocket = server1.accept();
1915dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1916dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use OutputStream.write to send CAPACITY_NORMAL bytes data
1917dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        OutputStream out = acceptedSocket.getOutputStream();
1918dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        out.write(writeContent);
1919dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use close to guarantee all data is sent
1920dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        acceptedSocket.close();
1921dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1922dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer readContent = ByteBuffer.allocate(CAPACITY_NORMAL + 1);
1923dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int totalCount = 0;
1924933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        int count;
1925dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        long startTime = System.currentTimeMillis();
1926dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use SocketChannel.read to read data
1927dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        while (totalCount <= CAPACITY_NORMAL) {
1928dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            count = channel1.read(readContent);
1929dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if (EOF == count) {
1930dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                break;
1931dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1932dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            totalCount += count;
1933dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // if the channel could not finish reading in TIMEOUT ms, the
1934dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // test fails. It is used to guarantee the test never hangs even
1935dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // if there are bugs of SocketChannel implementation. For
1936dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // blocking read, it possibly returns 0 in some cases.
1937dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTimeout(startTime, TIMEOUT);
1938dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1939dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, totalCount);
1940dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readContent.flip();
1941dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
1942dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(writeContent[i], readContent.get());
1943dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1944dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1945dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1946dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1947dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#read(ByteBuffer)
1948dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1949dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_readLjava_nio_ByteBuffer_Nonblocking() throws IOException {
1950dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // initialize write content
1951dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] writeContent = new byte[CAPACITY_NORMAL];
1952dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < writeContent.length; i++) {
1953dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeContent[i] = (byte) i;
1954dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1955dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1956dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // establish connection
1957dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
1958dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket acceptedSocket = server1.accept();
1959dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use OutputStream.write to write CAPACITY_NORMAL bytes data.
1960dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        OutputStream out = acceptedSocket.getOutputStream();
1961dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        out.write(writeContent);
1962dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use close to guarantee all data is sent
1963dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        acceptedSocket.close();
1964dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1965dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.configureBlocking(false);
1966dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer readContent = ByteBuffer.allocate(CAPACITY_NORMAL + 1);
1967dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int totalCount = 0;
1968933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        int count;
1969dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        long startTime = System.currentTimeMillis();
1970dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use SocketChannel.read to read data
1971dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        while (totalCount <= CAPACITY_NORMAL) {
1972dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            count = channel1.read(readContent);
1973dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if (EOF == count) {
1974dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                break;
1975dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
1976dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            totalCount += count;
1977dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // if the channel could not finish reading in TIMEOUT ms, the
1978dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // test fails. It is used to guarantee the test never hangs even
1979dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // if there are bugs of SocketChannel implementation.
1980dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTimeout(startTime, TIMEOUT);
1981dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1982dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1983dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // assert read content
1984dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, totalCount);
1985dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, readContent.position());
1986dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readContent.flip();
1987dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
1988dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(writeContent[i], readContent.get());
1989dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
1990dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
1991dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
1992dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
1993dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#write(ByteBuffer)
1994dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
1995dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_writeLjava_nio_ByteBuffer_Blocking() throws IOException {
1996dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // initialize write content
1997dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer writeContent = ByteBuffer.allocate(CAPACITY_NORMAL);
1998dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
1999dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeContent.put((byte) i);
2000dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2001dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeContent.flip();
2002dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // establish connection
2003dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
2004dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket acceptedSocket = server1.accept();
2005dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2006dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use SocketChannel.write(ByteBuffer) to write CAPACITY_NORMAL bytes
2007dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // data
2008dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int writtenCount = channel1.write(writeContent);
2009dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // assert written count and ByteBuffer position
2010dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, writtenCount);
2011dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, writeContent.position());
2012dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use close to guarantee all data is sent
2013dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.close();
2014dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2015dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        InputStream in = acceptedSocket.getInputStream();
2016dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int totalCount = 0;
2017dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int count = 0;
2018dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] readContent = new byte[CAPACITY_NORMAL + 1];
2019dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // if the channel could not finish reading in TIMEOUT ms, the test
2020dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // fails. It is used to guarantee the test never hangs even if there
2021dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // are bugs of SocketChannel implementation.
2022dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        acceptedSocket.setSoTimeout(TIMEOUT);
2023dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2024dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use InputStream.read to read data.
2025dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        while (totalCount <= CAPACITY_NORMAL) {
2026dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            count = in.read(readContent, totalCount, readContent.length
2027dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                    - totalCount);
2028dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if (EOF == count) {
2029dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                break;
2030dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
2031dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            totalCount += count;
2032dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2033dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2034dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // assert read content
2035dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, totalCount);
2036dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeContent.flip();
2037dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
2038dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(writeContent.get(), readContent[i]);
2039dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2040dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2041dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2042dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2043dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#write(ByteBuffer)
2044dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2045dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_writeLjava_nio_ByteBuffer_NonBlocking() throws Exception {
2046dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // initialize write content
2047dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer writeContent = ByteBuffer.allocate(CAPACITY_NORMAL);
2048dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
2049dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeContent.put((byte) i);
2050dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2051dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeContent.flip();
2052dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2053dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // establish connection
2054dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
2055dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket acceptedSocket = server1.accept();
2056dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2057dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.configureBlocking(false);
2058dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int writtenTotalCount = 0;
2059dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int writtenCount = 0;
2060dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        long startTime = System.currentTimeMillis();
2061dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use SocketChannel.write(ByteBuffer) to write CAPACITY_NORMAL bytes
2062dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        while (writtenTotalCount < CAPACITY_NORMAL) {
2063dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writtenCount = channel1.write(writeContent);
2064dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writtenTotalCount += writtenCount;
2065dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // if the channel could not finish writing in TIMEOUT ms, the
2066dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // test fails. It is used to guarantee the test never hangs even
2067dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // if there are bugs of SocketChannel implementation.
2068dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTimeout(startTime, TIMEOUT);
2069dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2070dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // assert written count and ByteBuffer position
2071dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, writtenTotalCount);
2072dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, writeContent.position());
2073dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use close to guarantee all data is sent
2074dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.close();
2075dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2076dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        InputStream in = acceptedSocket.getInputStream();
2077dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] readContent = new byte[CAPACITY_NORMAL + 1];
2078dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int totalCount = 0;
2079dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int count = 0;
2080dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // if the channel could not finish reading in TIMEOUT ms, the test
2081dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // fails. It is used to guarantee the test never hangs even if there
2082dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // are bugs of SocketChannel implementation.
2083dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        acceptedSocket.setSoTimeout(TIMEOUT);
2084dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use InputStream.read to read data.
2085dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        while (totalCount <= CAPACITY_NORMAL) {
2086dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            count = in.read(readContent, totalCount, readContent.length
2087dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                    - totalCount);
2088dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if (EOF == count) {
2089dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                break;
2090dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
2091dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            totalCount += count;
2092dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2093dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // assert read content
2094dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, totalCount);
2095dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeContent.flip();
2096dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
2097dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(writeContent.get(), readContent[i]);
2098dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2099dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2100dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2101dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
2102dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Fails if the difference between current time and start time is greater
2103dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * than timeout.
2104dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2105dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void assertTimeout(long startTime, long timeout) {
2106dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        long currentTime = System.currentTimeMillis();
2107dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if ((currentTime - startTime) > timeout) {
2108dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Timeout");
2109dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2110dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2111dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2112dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------
2113dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // Test for read/write but no real data expressed
2114dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------
2115dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2116dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testReadByteBuffer() throws Exception {
2117dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.server1.isBound());
2118dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer readBuf = java.nio.ByteBuffer
2119dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .allocate(CAPACITY_NORMAL);
2120dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
2121dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2122dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
2123dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2124dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2125dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // note: blocking-mode will make the read process endless!
2126dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
2127dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2128dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read(readBuf);
2129dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NotYetConnectedException");
2130dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NotYetConnectedException e) {
2131dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2132dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2133dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = this.channel1.connect(localAddr1);
2134dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
2135dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isBlocking());
2136dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isConnectionPending());
2137dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isConnected());
2138dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2139dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (tryFinish()) {
2140dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(0, this.channel1.read(readBuf));
2141dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2142dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2143dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
2144dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2145dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read(readBuf);
2146dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException");
2147dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
2148dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2149dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2150dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2151dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2152dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testReadByteBuffer_Direct() throws Exception {
2153dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.server1.isBound());
2154dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer readBuf = java.nio.ByteBuffer
2155dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .allocateDirect(CAPACITY_NORMAL);
2156dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
2157dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2158dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
2159dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2160dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2161dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // note: blocking-mode will make the read process endless!
2162dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
2163dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2164dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read(readBuf);
2165dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NotYetConnectedException");
2166dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NotYetConnectedException e) {
2167dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2168dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2169dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = this.channel1.connect(localAddr1);
2170dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
2171dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isBlocking());
2172dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isConnectionPending());
2173dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isConnected());
2174dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2175dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (tryFinish()) {
2176dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(0, this.channel1.read(readBuf));
2177dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2178dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2179dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
2180dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2181dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read(readBuf);
2182dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException");
2183dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
2184dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2185dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2186dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2187dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2188dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testReadByteBuffer_Direct2() throws IOException {
2189dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] request = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
2190dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer buffer = ByteBuffer.allocateDirect(128);
2191dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2192dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel server = ServerSocketChannel.open();
219363744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        server.socket().bind(new InetSocketAddress(InetAddress.getLocalHost(), 0), 5);
2194dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket client = new Socket(InetAddress.getLocalHost(), server.socket()
2195dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .getLocalPort());
2196dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.setTcpNoDelay(false);
2197dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket worker = server.socket().accept();
2198dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel workerChannel = worker.getChannel();
2199dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2200dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        OutputStream out = client.getOutputStream();
2201dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        out.write(request);
2202dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        out.close();
2203dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2204dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffer.limit(5);
2205dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int bytesRead = workerChannel.read(buffer);
2206dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(5, bytesRead);
2207dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(5, buffer.position());
2208dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2209dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffer.limit(request.length);
2210dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        bytesRead = workerChannel.read(buffer);
2211dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(6, bytesRead);
2212dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2213dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffer.flip();
2214dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(request.length, buffer.limit());
2215dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2216dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(ByteBuffer.wrap(request), buffer);
2217dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2218dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.close();
2219dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        worker.close();
2220dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        server.close();
2221dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2222dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2223dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testReadByteBuffer_BufNull() throws Exception {
2224dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.server1.isBound());
2225dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer readBuf = java.nio.ByteBuffer.allocate(0);
2226dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // note: blocking-mode will make the read process endless!
2227dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
2228dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2229dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read((java.nio.ByteBuffer) null);
2230dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
2231dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
2232dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2233dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2234dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
2235dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (tryFinish()) {
2236dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
2237dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.channel1.read((java.nio.ByteBuffer) null);
2238dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw NPE");
2239dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (NullPointerException e) {
2240dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // correct
2241dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
2242dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(0, this.channel1.read(readBuf));
2243dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2244dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.server1.close();
2245dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2246dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read((java.nio.ByteBuffer) null);
2247dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
2248dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
2249dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2250dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2251dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2252dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2253dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
2254dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * SocketChannelImpl.read(ByteBuffer[], int, int)'
2255dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2256dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testReadByteBufferArrayIntInt() throws Exception {
2257dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.server1.isBound());
2258dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] readBuf = new java.nio.ByteBuffer[2];
2259dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readBuf[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL);
2260dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readBuf[1] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL);
2261dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
2262dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2263dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
2264dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2265dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2266dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // note: blocking-mode will make the read process endless!
2267dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
2268dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2269dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read(readBuf, 0, 1);
2270dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NotYetConnectedException");
2271dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NotYetConnectedException e) {
2272dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2273dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2274dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = this.channel1.connect(localAddr1);
2275dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
2276dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isBlocking());
2277dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isConnectionPending());
2278dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isConnected());
2279dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2280dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (tryFinish()) {
2281dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(0, this.channel1.read(readBuf, 0, 1));
2282dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(0, this.channel1.read(readBuf, 0, 2));
2283dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2284dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2285dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
2286dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2287dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read(readBuf, 0, 1);
2288dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException");
2289dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
2290dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2291dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2292dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2293dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2294dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
2295dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * SocketChannelImpl.read(ByteBuffer[], int, int)'
2296dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2297dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testReadByteBufferArrayIntInt_Direct() throws Exception {
2298dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.server1.isBound());
2299dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] readBuf = new java.nio.ByteBuffer[2];
2300dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readBuf[0] = java.nio.ByteBuffer.allocateDirect(CAPACITY_NORMAL);
2301dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readBuf[1] = java.nio.ByteBuffer.allocateDirect(CAPACITY_NORMAL);
2302dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
2303dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2304dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
2305dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2306dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2307dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // note: blocking-mode will make the read process endless!
2308dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
2309dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2310dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read(readBuf, 0, 1);
2311dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NotYetConnectedException");
2312dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NotYetConnectedException e) {
2313dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2314dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2315dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        boolean connected = this.channel1.connect(localAddr1);
2316dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
2317dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isBlocking());
2318dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(this.channel1.isConnectionPending());
2319dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertFalse(this.channel1.isConnected());
2320dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2321dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (tryFinish()) {
2322dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(0, this.channel1.read(readBuf, 0, 1));
2323dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(0, this.channel1.read(readBuf, 0, 2));
2324dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2325dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2326dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
2327dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2328dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read(readBuf, 0, 1);
2329dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException");
2330dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
2331dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2332dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2333dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2334dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2335dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testReadByteBufferArrayIntInt_BufNull() throws Exception {
2336dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.server1.isBound());
2337dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] readBuf = new java.nio.ByteBuffer[2];
2338dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readBuf[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL);
2339dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
2340dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2341dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
2342dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2343dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2344dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // note: blocking-mode will make the read process endless!
2345dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.configureBlocking(false);
2346dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2347933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            channel1.read(null, 0, 1);
2348dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
2349dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
2350dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2351dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2352dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
2353dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (tryFinish()) {
2354dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2355dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
2356933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller                channel1.read(null, 0, 1);
2357dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw NPE");
2358dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (NullPointerException e) {
2359dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // correct
2360dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
2361dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
2362dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                channel1.read(readBuf, 0, 2);
2363dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                fail("Should throw NPE");
2364dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (NullPointerException e) {
2365dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // correct
2366dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
2367dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2368dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(0, this.channel1.read(readBuf, 0, 1));
2369dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2370dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
2371dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2372dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read(null, 0, 1);
2373dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
2374dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
2375dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2376dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2377dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2378dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2379dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testWriteByteBuffer() throws IOException {
2380dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.server1.isBound());
2381dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer
2382dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .allocate(CAPACITY_NORMAL);
2383dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
2384dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2385dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
2386dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2387dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2388dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2389dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.write(writeBuf);
2390dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NotYetConnectedException");
2391dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NotYetConnectedException e) {
2392dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2393dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2394dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
2395dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2396dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnected());
2397dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2398dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2399dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf));
2400dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2401dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
2402dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2403dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.write(writeBuf);
2404dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException");
2405dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
2406dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2407dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2408dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2409dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2410dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testWriteByteBuffer_Direct() throws IOException {
2411dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.server1.isBound());
2412dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer
2413dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .allocateDirect(CAPACITY_NORMAL);
2414dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
2415dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2416dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
2417dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2418dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2419dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2420dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.write(writeBuf);
2421dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NotYetConnectedException");
2422dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NotYetConnectedException e) {
2423dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2424dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2425dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
2426dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2427dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnected());
2428dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2429dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2430dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf));
2431dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2432dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
2433dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2434dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.write(writeBuf);
2435dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException");
2436dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
2437dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2438dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2439dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2440dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2441dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testWriteByteBuffer_BufNull() throws IOException {
2442dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.server1.isBound());
2443dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer.allocate(0);
2444dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
2445dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(this.channel1.write(writeBuf), 0);
2446dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2447dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write((java.nio.ByteBuffer) null);
2448dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
2449dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
2450dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2451dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2452dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2453dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2454dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
2455dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * SocketChannelImpl.write(ByteBuffer[], int, int)'
2456dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2457dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testWriteByteBufferArrayIntInt() throws IOException {
2458dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] writeBuf = new java.nio.ByteBuffer[2];
2459dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBuf[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL);
2460dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBuf[1] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL);
2461dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
2462dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2463dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
2464dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2465dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2466dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2467dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.write(writeBuf, 0, 1);
2468dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NotYetConnectedException");
2469dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NotYetConnectedException e) {
2470dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2471dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2472dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
2473dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2474dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnected());
2475dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2476dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2477dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf, 0, 1));
2478dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // still writes the same size as above
2479dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf, 0, 2));
2480dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBuf[0].flip();
2481dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBuf[1].flip();
2482dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL * 2, this.channel1.write(writeBuf, 0, 2));
2483dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
2484dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2485dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.write(writeBuf);
2486dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException");
2487dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
2488dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2489dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2490dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2491dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2492dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
2493dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * SocketChannelImpl.write(ByteBuffer[], int, int)'
2494dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2495dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testWriteByteBufferArrayIntInt_Direct() throws IOException {
2496dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] writeBuf = new java.nio.ByteBuffer[2];
2497dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBuf[0] = java.nio.ByteBuffer.allocateDirect(CAPACITY_NORMAL);
2498dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBuf[1] = java.nio.ByteBuffer.allocateDirect(CAPACITY_NORMAL);
2499dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isRegistered());
2500dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2501dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnected());
2502dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2503dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2504dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2505dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.write(writeBuf, 0, 1);
2506dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NotYetConnectedException");
2507dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NotYetConnectedException e) {
2508dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2509dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2510dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
2511dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isBlocking());
2512dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isConnected());
2513dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.channel1.isConnectionPending());
2514dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.channel1.isOpen());
2515dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf, 0, 1));
2516dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // still writes the same size as above
2517dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf, 0, 2));
2518dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBuf[0].flip();
2519dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBuf[1].flip();
2520dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL * 2, this.channel1.write(writeBuf, 0, 2));
2521dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.close();
2522dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2523dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.write(writeBuf);
2524dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException");
2525dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
2526dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2527dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2528dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2529dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2530dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testWriteByteBufferArrayIntInt_BufNull() throws IOException {
2531dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] writeBuf = new java.nio.ByteBuffer[0];
2532dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2533dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
2534dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2535dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(null, 0, 1);
2536dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
2537dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
2538dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2539dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2540dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(0, this.channel1.write(writeBuf, 0, 0));
2541dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2542dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(writeBuf, 0, 1);
2543dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw IndexOutOfBoundsException");
2544dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException e) {
2545dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2546dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2547dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeBuf = new java.nio.ByteBuffer[1];
2548dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2549dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(writeBuf, 0, 1);
2550dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
2551dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
2552dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2553dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2554dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2555dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(writeBuf, 0, 2);
2556dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw IndexOutOfBoundsException");
2557dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException e) {
2558dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2559dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2560dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.server1.close();
2561dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2562dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read(null, 0, 1);
2563dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NPE");
2564dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException e) {
2565dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
2566dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2567dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2568dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2569dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testWriteByteBufferArrayIntInt_SizeError() throws IOException {
2570dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] buf = new java.nio.ByteBuffer[1];
2571dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
2572dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(0, this.channel1.write(buf, 0, 0));
2573dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2574dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(buf, -1, 1);
2575dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
2576dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
2577dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2578dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2579dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(buf, 0, -1);
2580dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
2581dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
2582dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2583dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2584dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(buf, 0, 2);
2585dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
2586dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
2587dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2588dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2589dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(buf, 2, 0);
2590dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
2591dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
2592dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2593dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2594dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.write(null, 0, 0);
2595dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
2596dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
2597dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2598dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.server1.close();
2599dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2600dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2601dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testReadByteBufferArrayIntInt_SizeError() throws IOException {
2602dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer[] buf = new java.nio.ByteBuffer[1];
2603dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.channel1.connect(localAddr1);
2604dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(0, this.channel1.read(buf, 0, 0));
2605dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2606dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.read(buf, -1, 1);
2607dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
2608dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
2609dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2610dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2611dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.read(buf, 0, -1);
2612dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
2613dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
2614dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2615dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2616dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.read(buf, 0, 2);
2617dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
2618dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
2619dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2620dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2621dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.read(buf, 2, 0);
2622dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
2623dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
2624dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2625dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2626dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel1.read(null, 0, 0);
2627dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
2628dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
2629dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2630dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.server1.close();
2631dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2632dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2633dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
2634dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * ==========================================================================
2635dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Tests for read/write real data
2636dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * ==========================================================================
2637dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2638dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2639dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2640dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2641dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#read(ByteBuffer[])
2642dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2643dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_read$LByteBuffer() throws IOException {
2644dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel sc = new MockSocketChannel(null);
2645dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer [] byteBufferArray = { ByteBuffer.allocate(1), ByteBuffer.allocate(1)};
2646dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Verify that calling read(ByteBuffer[]) leads to the method
2647dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // read(ByteBuffer[], int, int) being called with a 0 for the
2648dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // second parameter and targets.length as the third parameter.
2649dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sc.read(byteBufferArray);
2650dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(sc.isReadCalled);
2651dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2652dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2653dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#read(ByteBuffer[],int,int)
2654dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2655dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_read$LByteBufferII_blocking() throws Exception {
2656dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assert_read$LByteBuffer(true);
2657dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2658dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2659dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2660dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#read(ByteBuffer[],int,int)
2661dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2662dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_read$LByteBufferII_nonblocking() throws Exception {
2663dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assert_read$LByteBuffer(false);
2664dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2665dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2666dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void assert_read$LByteBuffer(boolean isBlocking) throws IOException {
2667dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // initialize write content
2668dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] writeContent = new byte[CAPACITY_NORMAL * 2];
2669dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL * 2; i++) {
2670dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeContent[i] = (byte) i;
2671dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2672dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer[] readContents = new ByteBuffer[2];
2673dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readContents[0] = ByteBuffer.allocate(CAPACITY_NORMAL);
2674dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readContents[1] = ByteBuffer.allocate(CAPACITY_NORMAL + 1);
2675dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // establish connection
2676dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
2677dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket acceptedSocket = server1.accept();
2678dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use OutputStream.write to send CAPACITY_NORMAL * 2 bytes data
2679dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        OutputStream out = acceptedSocket.getOutputStream();
2680dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        out.write(writeContent);
2681dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use close to guarantee all data is sent
2682dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        acceptedSocket.close();
2683dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // configure block/nonblock mode
2684dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.configureBlocking(isBlocking);
2685dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        long startTime = System.currentTimeMillis();
2686dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        long totalRead = 0;
2687933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        long countRead;
2688dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2689dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        while (totalRead <= CAPACITY_NORMAL * 2) {
2690dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            countRead = channel1.read(readContents, 0, 2);
2691dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if (0 == countRead && !readContents[1].hasRemaining()) {
2692dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                // read returns 0 because readContents is full
2693dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                break;
2694dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
2695dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if (EOF == countRead) {
2696dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                break;
2697dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
2698dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            totalRead += countRead;
2699dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // if the channel could not finish reading in TIMEOUT ms, the
2700dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // test fails. It is used to guarantee the test never hangs even
2701dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // if there are bugs of SocketChannel implementation. For
2702dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // blocking read, it possibly returns 0 in some cases.
2703dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTimeout(startTime, TIMEOUT);
2704dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2705dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2706dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // assert total bytes read and the position of ByteBuffers
2707dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL * 2, totalRead);
2708dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, readContents[0].position());
2709dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, readContents[1].position());
2710dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // assert read content
2711dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readContents[0].flip();
2712dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readContents[1].flip();
2713dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
2714dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(writeContent[i], readContents[0].get());
2715dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2716dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = CAPACITY_NORMAL; i < CAPACITY_NORMAL * 2; i++) {
2717dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(writeContent[i], readContents[1].get());
2718dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2719dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2720dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2721dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2722dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#write(ByteBuffer[],int,int)
2723dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2724dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_write$LByteBufferII_blocking() throws Exception {
2725dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assert_write$LByteBuffer(true);
2726dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2727dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2728dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2729dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#write(ByteBuffer[],int,int)
2730dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2731dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_write$LByteBufferII_nonblocking()
2732dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws Exception {
2733dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assert_write$LByteBuffer(false);
2734dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2735dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2736dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void assert_write$LByteBuffer(boolean isBlocking)
2737dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws IOException {
2738dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // initialize write contents
2739dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer writeContents[] = new ByteBuffer[2];
2740dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeContents[0] = ByteBuffer.allocate(CAPACITY_NORMAL);
2741dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeContents[1] = ByteBuffer.allocate(CAPACITY_NORMAL);
2742dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
2743dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeContents[0].put((byte) i);
2744dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2745dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = CAPACITY_NORMAL; i < CAPACITY_NORMAL * 2; i++) {
2746dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeContents[1].put((byte) i);
2747dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2748dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeContents[0].flip();
2749dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeContents[1].flip();
2750dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // establish connection
2751dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
2752dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket acceptedSocket = server1.accept();
2753dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // set blocking/nonblocking mode
2754dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.configureBlocking(isBlocking);
2755dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2756dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, channel1.write(writeContents, 0, 1));
2757dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, channel1.write(writeContents, 1, 1));
2758dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2759dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // assert written count and ByteBuffer position
2760dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, writeContents[0].position());
2761dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL, writeContents[1].position());
2762dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use close to guarantee all data is sent
2763dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.close();
2764dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        InputStream in = acceptedSocket.getInputStream();
2765dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] readContent = new byte[CAPACITY_NORMAL * 2 + 1];
2766dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int totalCount = 0;
2767933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        int count;
2768dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // if the channel could not finish reading in TIMEOUT ms, the test
2769dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // fails. It is used to guarantee the test never hangs even if there
2770dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // are bugs of SocketChannel implementation.
2771dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        acceptedSocket.setSoTimeout(TIMEOUT);
2772dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // use InputStream.read to read data.
2773dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        while (totalCount <= CAPACITY_NORMAL) {
2774dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            count = in.read(readContent, totalCount, readContent.length
2775dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                    - totalCount);
2776dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if (EOF == count) {
2777dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                break;
2778dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
2779dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            totalCount += count;
2780dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2781dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // assert read content
2782dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(CAPACITY_NORMAL * 2, totalCount);
2783dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeContents[0].flip();
2784dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeContents[1].flip();
2785dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
2786dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(writeContents[0].get(), readContent[i]);
2787dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2788dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = CAPACITY_NORMAL; i < CAPACITY_NORMAL * 2; i++) {
2789dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(writeContents[1].get(), readContent[i]);
2790dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2791dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2792dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2793dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2794dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#write(ByteBuffer[])
2795dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2796dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_write$LByteBuffer() throws IOException {
2797dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockSocketChannel sc = new MockSocketChannel(null);
2798dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer [] byteBufferArray = { ByteBuffer.allocate(1), ByteBuffer.allocate(1)};
2799dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Verify that calling write(ByteBuffer[]) leads to the method
2800dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // write(ByteBuffer[], int, int) being called with a 0 for the
2801dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // second parameter and sources.length as the third parameter.
2802dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sc.write(byteBufferArray);
2803dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(sc.isWriteCalled);
2804dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2805dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2806dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2807dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#write(ByteBuffer[])
2808dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2809dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_writev() throws Exception {
2810dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel ssc = ServerSocketChannel.open();
281163744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        ssc.socket().bind(null);
2812dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sc = SocketChannel.open();
281363744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        sc.connect(ssc.socket().getLocalSocketAddress());
2814dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sock = ssc.accept();
2815dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer[] buf = { ByteBuffer.allocate(10), ByteBuffer.allocateDirect(20) };
2816dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2817dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        while (buf[0].remaining() != 0 && buf[1].remaining() !=0) {
2818dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(sc.write(buf, 0, 2) >= 0);
2819dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2820dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2821dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer target = ByteBuffer.allocate(30);
2822dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2823dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        while (target.remaining() != 0) {
2824dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertTrue(sock.read(target) >=0);
2825dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2826dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2827dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.close();
2828dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sc.close();
2829dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sock.close();
2830dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2831dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2832dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2833dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#write(ByteBuffer[])
2834dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2835dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_writev2() throws Exception {
2836dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel ssc = ServerSocketChannel.open();
2837dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.configureBlocking(false);
283863744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        ssc.socket().bind(null);
2839dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sc = SocketChannel.open();
2840dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sc.configureBlocking(false);
284163744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        boolean connected = sc.connect(ssc.socket().getLocalSocketAddress());
2842dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sock = ssc.accept();
2843dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
2844dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            sc.finishConnect();
2845dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2846dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2847dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer buf1 = ByteBuffer.allocate(10);
2848dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sc.socket().setSendBufferSize(512);
2849dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int bufSize = sc.socket().getSendBufferSize();
2850dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer buf2 = ByteBuffer.allocate(bufSize * 10);
2851dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2852dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer[] sent = new ByteBuffer[2];
2853dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sent[0] = buf1;
2854dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sent[1] = buf2;
2855dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2856dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        long whole = buf1.remaining() + buf2.remaining();
2857dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2858dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        long write = sc.write(sent);
2859dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.close();
2860dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sc.close();
2861dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sock.close();
2862dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2863dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(whole == (write + buf1.remaining() + buf2.remaining()));
2864dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2865dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2866dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2867dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#write(ByteBuffer[])
2868dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     *
2869dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * In non-blocking mode, the native system call will return EAGAIN/EWOULDBLOCK error
2870dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * code on Linux/Unix and return WSATRY_AGAIN/WSAEWOULDBLOCK error code on Windows.
2871dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * These error code means try again but not fatal error, so we should not throw exception.
2872dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2873dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_write$NonBlockingException() throws Exception {
2874dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel ssc = ServerSocketChannel.open();
2875dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.configureBlocking(false);
287663744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        ssc.socket().bind(null);
2877dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sc = SocketChannel.open();
2878dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sc.configureBlocking(false);
287963744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        boolean connected = sc.connect(ssc.socket().getLocalSocketAddress());
2880dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sock = ssc.accept();
2881dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (!connected) {
2882dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            sc.finishConnect();
2883dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2884dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2885dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
2886dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            for (int i = 0; i < 100; i++) {
2887dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                ByteBuffer buf1 = ByteBuffer.allocate(10);
2888dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                sc.socket().setSendBufferSize(512);
2889dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                int bufSize = sc.socket().getSendBufferSize();
2890dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                ByteBuffer buf2 = ByteBuffer.allocate(bufSize * 10);
2891dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2892dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                ByteBuffer[] sent = new ByteBuffer[2];
2893dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                sent[0] = buf1;
2894dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                sent[1] = buf2;
2895dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2896dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                sc.write(sent);
2897dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
2898dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
2899dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            ssc.close();
2900dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            sc.close();
2901dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            sock.close();
2902dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
2903dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2904dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2905dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2906dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2907dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#write(ByteBuffer[])
2908dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2909dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_write$LByteBuffer2() throws IOException {
2910dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Set-up
2911dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel server = ServerSocketChannel.open();
291263744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        server.socket().bind(null);
2913dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel client = SocketChannel.open();
291463744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        client.connect(server.socket().getLocalSocketAddress());
2915dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel worker = server.accept();
2916dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2917dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Test overlapping buffers
2918dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] data = "Hello world!".getBytes("UTF-8");
2919dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer[] buffers = new ByteBuffer[3];
2920dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffers[0] = ByteBuffer.wrap(data, 0, 6);
2921dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffers[1] = ByteBuffer.wrap(data, 6, data.length - 6);
2922dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffers[2] = ByteBuffer.wrap(data);
2923dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2924dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Write them out, read what we wrote and check it
2925dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.write(buffers);
2926dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.close();
2927dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer readBuffer = ByteBuffer.allocate(1024);
2928933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        while (EOF != worker.read(readBuffer)) {}
2929dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readBuffer.flip();
2930dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Buffer expected = ByteBuffer.allocate(1024).put(data).put(data).flip();
2931dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(expected, readBuffer);
2932dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2933dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Tidy-up
2934dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        worker.close();
2935dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        server.close();
2936dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2937dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2938dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2939dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#write(ByteBuffer[])
2940dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2941dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_write$LByteBuffer_buffers() throws IOException {
2942dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Set-up
2943dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel server = ServerSocketChannel.open();
294463744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        server.socket().bind(null);
2945dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel client = SocketChannel.open();
294663744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        client.connect(server.socket().getLocalSocketAddress());
2947dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel worker = server.accept();
2948dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2949dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // A variety of buffer types to write
2950dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] data = "Hello world!".getBytes("UTF-8");
2951dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer[] buffers = new ByteBuffer[3];
2952dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffers[0] = ByteBuffer.wrap(data, 0, 2);
2953dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(buffers[0].isDirect());
2954dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(buffers[0].hasArray());
2955dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2956dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffers[1] = ByteBuffer.wrap(data, 2, 4).asReadOnlyBuffer();
2957dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(buffers[1].isDirect());
2958dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(buffers[1].hasArray());
2959dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2960dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffers[2] = ByteBuffer.allocateDirect(42);
2961dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffers[2].put(data, 6, data.length - 6);
2962dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffers[2].flip();
2963dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(buffers[2].isDirect());
2964dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2965dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Write them out, read what we wrote and check it
2966dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.write(buffers);
2967dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.close();
2968dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer readBuffer = ByteBuffer.allocate(1024);
2969933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        while (EOF != worker.read(readBuffer)) {}
2970dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readBuffer.flip();
2971dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(ByteBuffer.wrap(data), readBuffer);
2972dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2973dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Tidy-up
2974dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        worker.close();
2975dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        server.close();
2976dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
2977dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2978dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
2979dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#write(ByteBuffer[])
2980dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
2981dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_write$LByteBuffer_writes() throws IOException {
2982dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Set-up
2983dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel server = ServerSocketChannel.open();
298463744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        server.socket().bind(null);
2985dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel client = SocketChannel.open();
298663744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        client.connect(server.socket().getLocalSocketAddress());
2987dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel worker = server.accept();
2988dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2989dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Data to write
2990dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] data = "Hello world!".getBytes("UTF-8");
2991dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer[] buffers = new ByteBuffer[3];
2992dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffers[0] = ByteBuffer.wrap(data, 0, 6);
2993dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffers[1] = ByteBuffer.wrap("world!".getBytes("UTF-8"));
2994dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffers[2] = buffers[0];
2995dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(buffers[0].hasArray());
2996dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
2997dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Test a sequence of write calls
2998dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.write(buffers, 0, 0); // write nothing
2999dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.write(buffers, 1, 0); // write nothing
3000dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.write(buffers, 0, 1); // write "Hello "
3001dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals("Failed to drain buffer 0", 0, buffers[0].remaining());
3002dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals("Shouldn't touch buffer 1", buffers[1].limit(), buffers[1]
3003dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .remaining());
3004dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.write(buffers, 0, 2); // writes "world!"
3005dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals("Failed to drain buffer 1", 0, buffers[1].remaining());
3006dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.write(buffers, 0, 3); // write nothing
3007dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.close();
3008dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3009dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Read what we wrote and check it
3010dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer readBuffer = ByteBuffer.allocate(1024);
301147ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        while (EOF != worker.read(readBuffer)) {}
3012dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readBuffer.flip();
3013dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(ByteBuffer.wrap(data), readBuffer);
3014dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3015dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Tidy-up
3016dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        worker.close();
3017dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        server.close();
3018dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3019dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3020dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
3021dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests java.nio.channels.SocketChannel#write(ByteBuffer[])
3022dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
3023dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_write$LByteBuffer_invalid() throws IOException {
3024dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Set-up
3025dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel server = ServerSocketChannel.open();
302663744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        server.socket().bind(null);
3027dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3028dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel client = SocketChannel.open();
302963744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        client.connect(server.socket().getLocalSocketAddress());
3030dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3031dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel worker = server.accept();
3032dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3033dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Do some stuff
3034dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3035dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            client.write((ByteBuffer[]) null);
3036dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a NPE");
303747ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        } catch (NullPointerException expected) {
3038dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3039dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3040dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            client.write((ByteBuffer[]) null, 0, 0);
3041dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a NPE");
304247ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        } catch (NullPointerException expected) {
3043dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3044dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3045dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            client.write((ByteBuffer[]) null, 1, 0);
3046dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a NPE");
304747ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        } catch (NullPointerException expected) {
3048dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3049dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3050dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            client.write((ByteBuffer[]) null, 0, 1);
3051dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a NPE");
305247ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        } catch (NullPointerException expected) {
3053dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3054dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3055dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            client.write((ByteBuffer[]) null, 1, 1);
3056dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a NPE");
305747ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        } catch (NullPointerException expected) {
3058dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3059dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3060dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer[] buffers = new ByteBuffer[1];
3061dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buffers[0] = ByteBuffer.wrap("Hello ".getBytes("UTF-8"));
3062dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3063dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3064dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            client.write(buffers, -1, 1);
3065dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3066dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3067dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3068dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3069dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            client.write(buffers, 0, -1);
3070dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3071dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3072dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3073dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3074dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            client.write(buffers, 0, 2);
3075dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3076dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3077dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3078dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3079dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            client.write(buffers, 2, 0);
3080dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3081dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3082dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3083dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3084dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            client.write(null, 0, 0);
3085dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3086dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3087dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3088dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3089dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Tidy-up
3090dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        worker.close();
3091dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        client.close();
3092dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        server.close();
3093dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3094dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3095dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_configureblocking() throws IOException {
3096dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] serverWBuf = new byte[CAPACITY_NORMAL];
3097dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < serverWBuf.length; i++) {
3098dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            serverWBuf[i] = (byte) i;
3099dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3100dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        java.nio.ByteBuffer buf = java.nio.ByteBuffer
3101dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .allocate(CAPACITY_NORMAL + 1);
3102dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
3103dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        server1.accept();
3104dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket sock = this.channel1.socket();
3105dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.configureBlocking(false);
3106dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(channel1.isBlocking());
3107dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        OutputStream channelSocketOut = sock.getOutputStream();
3108dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3109dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // write operation is not allowed in non-blocking mode
3110dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channelSocketOut.write(buf.array());
3111dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Non-Blocking mode should cause IllegalBlockingModeException");
3112dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException e) {
3113dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
3114dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3115dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.configureBlocking(true);
3116dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(channel1.isBlocking());
3117dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // write operation is allowed in blocking mode
3118dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channelSocketOut.write(buf.array());
3119dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3120dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3121dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
3122dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests SocketChannel#read(ByteBuffer[], int, int) when remote server
3123dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     *        closed
3124dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
3125dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socketChannel_read_ByteBufferII_remoteClosed()
3126dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws Exception {
3127dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // regression 1 for HARMONY-549
3128dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel ssc = ServerSocketChannel.open();
312963744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        ssc.socket().bind(null);
3130dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sc = SocketChannel.open();
313163744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        sc.connect(ssc.socket().getLocalSocketAddress());
3132dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.accept().close();
3133dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer[] buf = { ByteBuffer.allocate(10) };
3134dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(-1, sc.read(buf, 0, 1));
3135dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.close();
3136dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sc.close();
3137dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3138dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3139dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
3140dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests SocketChannel#write(ByteBuffer[], int, int)
3141dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
3142dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socketChannel_write_ByteBufferII() throws Exception {
3143dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // regression 2 for HARMONY-549
3144dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel ssc = ServerSocketChannel.open();
314563744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        ssc.socket().bind(null);
3146dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sc = SocketChannel.open();
314763744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        sc.connect(ssc.socket().getLocalSocketAddress());
3148dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sock = ssc.accept();
3149dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer[] buf = { ByteBuffer.allocate(10), null };
3150dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3151dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            sc.write(buf, 0, 2);
3152dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("should throw NPE");
315347ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        } catch (NullPointerException expected) {
3154dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3155dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.close();
3156dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sc.close();
3157dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer target = ByteBuffer.allocate(10);
3158dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(-1, sock.read(target));
3159dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3160dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3161dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
3162dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests SocketChannel#read(ByteBuffer[], int, int) with a null ByteBuffer
3163dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
3164dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socketChannel_read_ByteBufferII_bufNULL() throws Exception {
3165dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // regression 3 for HARMONY-549
3166dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel ssc = ServerSocketChannel.open();
316763744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        ssc.socket().bind(null);
3168dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sc = SocketChannel.open();
316963744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        sc.connect(ssc.socket().getLocalSocketAddress());
3170dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.accept();
3171dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer[] buf = new ByteBuffer[2];
3172dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buf[0] = ByteBuffer.allocate(1);
3173dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // let buf[1] be null
3174dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3175dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            sc.read(buf, 0, 2);
3176dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("should throw NullPointerException");
317747ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        } catch (NullPointerException expected) {
3178dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3179dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.close();
3180dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sc.close();
3181dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3182dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3183dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
3184dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests SocketChannel#write(ByteBuffer) after close
3185dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
3186dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socketChannel_write_close() throws Exception {
3187dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // regression 4 for HARMONY-549
3188dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel ssc = ServerSocketChannel.open();
318963744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        ssc.socket().bind(null);
3190dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sc = SocketChannel.open();
319163744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        sc.connect(ssc.socket().getLocalSocketAddress());
3192dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sock = ssc.accept();
3193dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer buf = null;
3194dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.close();
3195dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sc.close();
3196dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3197dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            sc.write(buf);
3198dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("should throw NPE");
319947ae0b5a1d96c8030e0963ccc5b44c3ee66aaec3Neil Fuller        } catch (NullPointerException expected) {
3200dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3201dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        sock.close();
3202dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3203dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3204dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
3205dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests SocketChannel#write(ByteBuffer) if position is not zero
3206dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
3207dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socketChannel_write_ByteBuffer_posNotZero()
3208dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws Exception {
3209dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // regression 5 for HARMONY-549
3210dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        final String testStr = "Hello World";
3211dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer readBuf = ByteBuffer.allocate(11);
3212dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer buf = ByteBuffer.wrap(testStr.getBytes());
3213dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel ssc = ServerSocketChannel.open();
321463744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        ssc.socket().bind(null);
3215dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel sc = SocketChannel.open();
321663744c884dd4b4f4307f2b021fb894af164972afElliott Hughes        sc.connect(ssc.socket().getLocalSocketAddress());
3217dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buf.position(2);
3218dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ssc.accept().write(buf);
3219dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(9, sc.read(readBuf));
3220dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buf.flip();
3221dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readBuf.flip();
3222dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] read = new byte[9];
3223dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] write = new byte[11];
3224dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buf.get(write);
3225dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        readBuf.get(read);
3226dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < 9; i++) {
3227dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(read[i], write[i + 2]);
3228dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3229dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3230dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3231dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
3232dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests SocketChannelImpl#read(ByteBuffer[])
3233dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
3234dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_read_$ByteBuffer_Blocking() throws IOException {
3235dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // regression test for Harmony-728
3236dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] data = new byte[CAPACITY_NORMAL];
3237dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
3238dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            data[i] = (byte) i;
3239dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3240dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer[] buf = new ByteBuffer[2];
3241dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buf[0] = ByteBuffer.allocate(CAPACITY_NORMAL);
3242dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buf[1] = ByteBuffer.allocate(CAPACITY_NORMAL);
3243dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
3244dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = null;
3245dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3246dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            socket = server1.accept();
3247dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            OutputStream out = socket.getOutputStream();
3248dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            out.write(data);
3249dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // should not block here
3250dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            channel1.read(buf);
3251dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
3252dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if (null != socket) {
3253dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                socket.close();
3254dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
3255dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3256dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3257dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3258dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socket_getOutputStream_nonBlocking_read_Exception() throws IOException {
3259dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] buf = new byte[1];
3260dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(this.localAddr1);
3261dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        InputStream is = channel1.socket().getInputStream();
3262dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.configureBlocking(false);
3263dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3264dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read();
3265dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3266dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException expected) {
3267dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3268933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3269dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3270dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(null);
3271dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3272dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3273933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3274933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3275933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3276dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3277933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3278dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3279dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, -1, 1);
3280dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3281dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3282933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3283933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3284933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3285dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3286933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3287dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3288dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, 0, -1);
3289dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3290dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3291933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3292933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3293933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3294dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3295933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3296dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3297dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, 0, 2);
3298dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3299dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3300933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3301933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3302933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3303dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3304933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3305dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3306dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, 2, 0);
3307dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3308dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3309933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3310933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3311933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3312dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3313933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3314dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3315dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(null, 0, 0);
3316dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3317dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3318933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3319933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3320933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3321dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3322dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3323dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        is.close();
3324dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3325dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3326dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read();
3327dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3328dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException expected) {
3329933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3330933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IOException expected) {
3331933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3332dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3333933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3334dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3335dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(null);
3336dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3337dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3338933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3339933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3340933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3341933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IOException expected) {
3342933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3343dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3344933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3345dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3346dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, -1, 1);
3347dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3348dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3349933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3350933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3351933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3352933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IOException expected) {
3353933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3354dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3355933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3356dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3357dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, 0, -1);
3358dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3359dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3360933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3361933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3362933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3363933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IOException expected) {
3364933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3365dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3366933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3367dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3368dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, 0, 2);
3369dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3370dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3371933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3372933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3373933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3374933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IOException expected) {
3375933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3376dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3377933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3378dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3379dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, 2, 0);
3380dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3381dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3382933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3383933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3384933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3385933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IOException expected) {
3386933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3387dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3388933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3389dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3390dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(null, 0, 0);
3391dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3392dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3393933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3394933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3395933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3396933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IOException expected) {
3397933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3398dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3399dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3400dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3401dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socket_getOutputStream_blocking_read_Exception() throws IOException {
3402dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] buf = new byte[1];
3403dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(this.localAddr1);
3404dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        InputStream is = channel1.socket().getInputStream();
3405dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3406dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(null);
3407dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3408dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3409dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3410dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3411dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, -1, 1);
3412dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3413dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3414dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3415dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3416dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, 0, -1);
3417dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3418dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3419dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3420dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3421dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, 0, 2);
3422dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3423dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3424dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3425dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3426933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            is.read(buf, 2, 1);
3427dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3428dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3429dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3430dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3431933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            is.read(null, 0, 1);
3432dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3433dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3434dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3435dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3436dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        is.close();
3437dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3438dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3439dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(null);
3440dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3441dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3442dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3443dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3444dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, -1, 1);
3445dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3446dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3447dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3448dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3449dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, 0, -1);
3450dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3451dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3452dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3453dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3454dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            is.read(buf, 0, 2);
3455dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3456dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3457dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3458dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3459933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            is.read(buf, 2, 1);
3460dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3461dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3462dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3463dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3464933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            is.read(null, 0, 1);
3465dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3466dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3467dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3468dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3469dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3470dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socket_getOutputStream_nonBlocking_write_Exception() throws IOException {
3471dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] buf = new byte[1];
3472dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(this.localAddr1);
3473dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        OutputStream os = channel1.socket().getOutputStream();
3474dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.configureBlocking(false);
3475dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3476dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3477dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(1);
3478dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3479dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException expected) {
3480dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3481dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3482dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(null);
3483dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3484933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3485933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3486dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3487933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3488dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3489933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3490dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3491dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, -1, 1);
3492dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3493933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3494933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3495dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3496933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3497dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3498933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3499dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3500dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, 0, -1);
3501dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3502933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3503933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3504dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3505933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3506dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3507933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3508dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3509dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, 0, 2);
3510dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3511933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3512933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3513dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3514933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3515dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3516933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3517dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3518933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            os.write(buf, 2, 1);
3519dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3520933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3521933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3522dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3523933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3524dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3525933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3526dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3527933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            os.write(null, 0, 1);
3528dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3529933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3530933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3531dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3532933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3533dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3534dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3535dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        os.close();
3536dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3537dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3538dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(1);
3539dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3540dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException expected) {
3541dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3542933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3543dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3544dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(null);
3545dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3546933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3547933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3548dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3549933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3550dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3551933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3552dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3553dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, -1, 1);
3554dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3555933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3556933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3557dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3558933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3559dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3560933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3561dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3562dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, 0, -1);
3563dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3564933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3565933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3566dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3567933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3568dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3569933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3570dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3571dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, 0, 2);
3572dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3573933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3574933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3575dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3576933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3577dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3578933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3579dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3580dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, 2, 0);
3581dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3582933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3583933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3584dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3585933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3586dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3587933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
3588dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3589dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(null, 0, 0);
3590dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3591933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        } catch (IllegalBlockingModeException expected) {
3592933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3593dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3594933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller            // Any of these exceptions are possible.
3595dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3596dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3597dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3598dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socket_getOutputStream_blocking_write_Exception() throws IOException {
3599dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] buf = new byte[1];
3600dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(this.localAddr1);
3601dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        OutputStream os = channel1.socket().getOutputStream();
3602dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3603dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(null);
3604dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3605dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3606dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3607dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3608dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, -1, 1);
3609dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3610dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3611dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3612dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3613dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, 0, -1);
3614dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3615dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3616dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3617dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3618dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, 0, 2);
3619dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3620dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3621dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3622dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3623dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, 2, 0);
3624dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3625dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3626dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3627dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3628dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(null, 0, 0);
3629dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3630dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3631dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3632dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3633dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        os.close();
3634dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3635dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3636dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(null);
3637dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3638dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3639dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3640dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3641dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, -1, 1);
3642dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3643dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3644dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3645dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3646dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, 0, -1);
3647dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3648dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3649dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3650dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3651dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, 0, 2);
3652dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3653dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3654dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3655dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3656dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(buf, 2, 0);
3657dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3658dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IndexOutOfBoundsException expected) {
3659dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3660dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
3661dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            os.write(null, 0, 0);
3662dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail();
3663dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NullPointerException expected) {
3664dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3665dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3666dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3667dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
3668dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests SocketChannelImpl#socket().getOutputStream().write(int)
3669dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
3670dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socket_getOutputStream_write_oneByte()
3671dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws IOException {
3672dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3673dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // Regression test for Harmony-3475
3674dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3675dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int MAGIC = 123;
3676dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3677dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(this.localAddr1);
3678dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3679dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        OutputStream os = channel1.socket().getOutputStream();
3680dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3681dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket acceptedSocket = server1.accept();
3682dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3683dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        InputStream in = acceptedSocket.getInputStream();
3684dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3685dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        os.write(MAGIC);
3686dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.close();
3687dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3688dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int lastByte =  in.read();
3689dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (lastByte == -1) {
3690dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Server received nothing. Expected 1 byte.");
3691dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } else if (lastByte != MAGIC) {
3692dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Server received wrong single byte: " + lastByte +
3693dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                 ", expected: " + MAGIC);
3694dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3695dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3696dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        lastByte = in.read();
3697dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (lastByte != -1) {
3698dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Server received too long sequence. Expected 1 byte.");
3699dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3700dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3701dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3702dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_setOptions() throws IOException {
3703dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.connect(localAddr1);
3704dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = channel1.socket();
3705dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3706dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer buffer = ByteBuffer.wrap(new byte[] {1, 2, 3});
3707dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        socket.setKeepAlive(true);
3708dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.write(buffer);
3709dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3710dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        socket.setOOBInline(true);
3711dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.write(buffer);
3712dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3713dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        socket.setReceiveBufferSize(100);
3714dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.write(buffer);
3715dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3716dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        socket.setReuseAddress(true);
3717dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.write(buffer);
3718dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3719dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        socket.setSendBufferSize(100);
3720dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.write(buffer);
3721dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3722dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        socket.setSoLinger(true, 100);
3723dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.write(buffer);
3724dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3725dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        socket.setSoTimeout(1000);
3726dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.write(buffer);
3727dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3728dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        socket.setTcpNoDelay(true);
3729dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.write(buffer);
3730dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3731dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        socket.setTrafficClass(10);
3732dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        channel1.write(buffer);
3733dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3734dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3735933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    class MockSocketChannel extends SocketChannel {
3736dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3737dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        private boolean isWriteCalled = false;
3738dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3739dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        private boolean isReadCalled = false;
3740dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3741933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        public MockSocketChannel(SelectorProvider provider) {
3742dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            super(provider);
3743dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3744dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3745933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        @Override
3746dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public Socket socket() {
3747dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            return null;
3748dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3749dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3750933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        @Override
3751dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public boolean isConnected() {
3752dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            return false;
3753dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3754dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3755933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        @Override
3756dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public boolean isConnectionPending() {
3757dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            return false;
3758dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3759dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3760933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        @Override
3761dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public boolean connect(SocketAddress address) throws IOException {
3762dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            return false;
3763dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3764dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3765933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        @Override
3766dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public boolean finishConnect() throws IOException {
3767dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            return false;
3768dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3769dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3770933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        @Override
3771dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public int read(ByteBuffer target) throws IOException {
3772dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            return 0;
3773dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3774dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3775933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        @Override
3776dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public long read(ByteBuffer[] targets, int offset, int length) throws IOException {
3777dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // Verify that calling read(ByteBuffer[]) leads to the method
3778dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // read(ByteBuffer[], int, int) being called with a 0 for the
3779dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // second parameter and targets.length as the third parameter.
3780dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if(0 == offset && length == targets.length){
3781dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                isReadCalled = true;
3782dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
3783dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            return 0;
3784dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3785dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3786933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        @Override
3787dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public int write(ByteBuffer source) throws IOException {
3788dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            return 0;
3789dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3790dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3791933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        @Override
3792dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public long write(ByteBuffer[] sources, int offset, int length) throws IOException {
3793dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // Verify that calling write(ByteBuffer[]) leads to the method
3794dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // write(ByteBuffer[], int, int) being called with a 0 for the
3795dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // second parameter and sources.length as the third parameter.
3796dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if(0 == offset && length == sources.length){
3797dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                isWriteCalled = true;
3798dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
3799dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            return 0;
3800dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3801dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3802933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        @Override
3803dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        protected void implCloseSelectableChannel() throws IOException {
3804dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // empty
3805dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3806dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
3807933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        @Override
3808dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        protected void implConfigureBlocking(boolean blockingMode) throws IOException {
3809dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // empty
3810dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
3811dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
38123d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        @Override
38133d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        public SocketAddress getRemoteAddress() throws IOException {
38143d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski            return null;
38153d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        }
38163d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski
38173d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        @Override
38183d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        public SocketChannel shutdownOutput() throws IOException {
38193d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski            return null;
38203d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        }
38213d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski
38223d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        @Override
38233d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        public SocketChannel shutdownInput() throws IOException {
38243d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski            return null;
38253d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        }
38263d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski
38273d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        @Override
38283d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        public <T> SocketChannel setOption(SocketOption<T> name, T value)
38293d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski            throws IOException {
38303d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski            return null;
38313d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        }
38323d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski
38333d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        @Override
38343d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        public SocketChannel bind(SocketAddress local) throws IOException {
38353d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski            return null;
38363d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        }
38373d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski
38383d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        @Override
38393d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        public Set<SocketOption<?>> supportedOptions() {
38403d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski            return null;
38413d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        }
38423d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski
38433d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        @Override
38443d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        public <T> T getOption(SocketOption<T> name) throws IOException {
38453d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski            return null;
38463d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        }
38473d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski
38483d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        @Override
38493d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        public SocketAddress getLocalAddress() throws IOException {
38503d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski            return null;
38513d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski        }
3852dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
3853dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes}
3854