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
18dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughespackage org.apache.harmony.nio.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.InetSocketAddress;
24dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.net.ServerSocket;
25dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.net.Socket;
26dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.ByteBuffer;
27dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.AsynchronousCloseException;
28dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.ClosedChannelException;
29dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.IllegalBlockingModeException;
30dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.NotYetBoundException;
31dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.SelectionKey;
32dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.ServerSocketChannel;
33dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.SocketChannel;
34dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport java.nio.channels.spi.SelectorProvider;
35dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
36dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport junit.framework.TestCase;
37dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughesimport tests.support.Support_PortManager;
38dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
39dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes/*
40dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes * test for ServerSocketChannel
41dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes */
42dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughespublic class ServerSocketChannelTest extends TestCase {
43dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
44dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private static final int CAPACITY_NORMAL = 200;
45dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
46dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private static final int CAPACITY_64KB = 65536;
47dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
48dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private static final int TIME_UNIT = 200;
49dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
50dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private InetSocketAddress localAddr1;
51dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
52dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private ServerSocketChannel serverChannel;
53dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
54dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private SocketChannel clientChannel;
55dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
56dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    protected void setUp() throws Exception {
57dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        super.setUp();
58dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.localAddr1 = new InetSocketAddress(
59dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                "127.0.0.1", Support_PortManager
60dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                        .getNextPort());
61dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.serverChannel = ServerSocketChannel.open();
62dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.clientChannel = SocketChannel.open();
63dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
64dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
65dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    protected void tearDown() throws Exception {
66dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (null != this.serverChannel) {
67dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
68dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.serverChannel.close();
69dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (Exception e) {
70dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                //ignore
71dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
72dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
73dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
74dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (null != this.clientChannel) {
75dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
76dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                this.clientChannel.close();
77dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (Exception e) {
78dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                //ignore
79dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
80dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
81dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        super.tearDown();
82dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
83dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
84dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
85dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // Test for methods in abstract class.
86dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
87dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
88dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
89dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'java.nio.channels.ServerSocketChannel.validOps()'
90dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
91dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testValidOps() {
92dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockServerSocketChannel testMSChnlnull = new MockServerSocketChannel(
93dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                null);
94dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockServerSocketChannel testMSChnl = new MockServerSocketChannel(
95dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectorProvider.provider());
96dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(SelectionKey.OP_ACCEPT, this.serverChannel.validOps());
97dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(SelectionKey.OP_ACCEPT, testMSChnl.validOps());
98dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(SelectionKey.OP_ACCEPT, testMSChnlnull.validOps());
99dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
100dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
101dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
102dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
103dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'java.nio.channels.ServerSocketChannel.open()'
104dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
105dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testOpen() {
106dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockServerSocketChannel testMSChnl = new MockServerSocketChannel(null);
107dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        MockServerSocketChannel testMSChnlnotnull = new MockServerSocketChannel(
108dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                SelectorProvider.provider());
109dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(SelectionKey.OP_ACCEPT, testMSChnlnotnull.validOps());
110dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNull(testMSChnl.provider());
111dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(testMSChnlnotnull.provider());
112dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNotNull(this.serverChannel.provider());
113dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(testMSChnlnotnull.provider(), this.serverChannel
114dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                .provider());
115dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
116dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
117dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
118dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // Test for socket()
119dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
120dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
121dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
122dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'java.nio.channels.ServerSocketChannel.socket()'
123dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
124dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_Block_BeforeClose() throws Exception {
125dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.serverChannel.isOpen());
126dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.serverChannel.isBlocking());
127dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket s1 = this.serverChannel.socket();
128dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s1.isClosed());
129dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSocketNotAccepted(s1);
130dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket s2 = this.serverChannel.socket();
131dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // same
132dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSame(s1, s2);
133dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
134dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // socket close makes the channel close
135dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        s1.close();
136dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.serverChannel.isOpen());
137dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
138dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
139dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
140dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_NonBlock_BeforeClose() throws Exception {
141dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.serverChannel.isOpen());
142dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.serverChannel.configureBlocking(false);
143dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket s1 = this.serverChannel.socket();
144dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s1.isClosed());
145dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSocketNotAccepted(s1);
146dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket s2 = this.serverChannel.socket();
147dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // same
148dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSame(s1, s2);
149dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
150dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // socket close makes the channel close
151dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        s1.close();
152dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.serverChannel.isOpen());
153dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
154dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
155dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
156dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_Block_Closed() throws Exception {
157dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.serverChannel.close();
158dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.serverChannel.isOpen());
159dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.serverChannel.isBlocking());
160dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket s1 = this.serverChannel.socket();
161dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s1.isClosed());
162dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSocketNotAccepted(s1);
163dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket s2 = this.serverChannel.socket();
164dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // same
165dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSame(s1, s2);
166dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
167dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
168dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testSocket_NonBlock_Closed() throws Exception {
169dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.serverChannel.configureBlocking(false);
170dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.serverChannel.close();
171dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.serverChannel.isBlocking());
172dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.serverChannel.isOpen());
173dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket s1 = this.serverChannel.socket();
174dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(s1.isClosed());
175dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSocketNotAccepted(s1);
176dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket s2 = this.serverChannel.socket();
177dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // same
178dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertSame(s1, s2);
179dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
180dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
181dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void assertSocketNotAccepted(ServerSocket s) throws IOException {
182dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(s.isBound());
183dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNull(s.getInetAddress());
184dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(-1, s.getLocalPort());
185dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNull(s.getLocalSocketAddress());
186dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
187dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(0, s.getSoTimeout());
188dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IOException expected) {
189dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // Android doesn't cache the timeout, so the getsockopt(2) fails and throws.
190dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
191dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
192dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
193dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testChannelBasicStatus() {
194dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket gotSocket = this.serverChannel.socket();
195dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(gotSocket.isClosed());
196dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.serverChannel.isBlocking());
197dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.serverChannel.isRegistered());
198dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(SelectionKey.OP_ACCEPT, this.serverChannel.validOps());
199dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(SelectorProvider.provider(), this.serverChannel.provider());
200dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
201dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
202dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
203dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // Test for accept()
204dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    // -------------------------------------------------------------------
205dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
206dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /*
207dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Test method for 'java.nio.channels.ServerSocketChannel.accept()'
208dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
209dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
210dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testAccept_Block_NotYetBound() throws IOException {
211dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.serverChannel.isOpen());
212dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.serverChannel.isBlocking());
213dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
214dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.serverChannel.accept();
215dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NotYetBoundException");
216dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NotYetBoundException e) {
217dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
218dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
219dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
220dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
221dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testAccept_NonBlock_NotYetBound() throws IOException {
222dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.serverChannel.isOpen());
223dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.serverChannel.configureBlocking(false);
224dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
225dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.serverChannel.accept();
226dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw NotYetBoundException");
227dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (NotYetBoundException e) {
228dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // correct
229dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
230dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
231dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
232dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testAccept_ClosedChannel() throws Exception {
233dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.serverChannel.close();
234dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertFalse(this.serverChannel.isOpen());
235dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
236dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.serverChannel.accept();
237dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw ClosedChannelException");
238dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
239dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
240dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
241dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
242dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
243dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testAccept_Block_NoConnect() throws IOException {
244dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(this.serverChannel.isBlocking());
245dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket gotSocket = this.serverChannel.socket();
246dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        gotSocket.bind(localAddr1);
247dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // blocking mode , will block and wait for ever...
248dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // so must close the server channel with another thread.
249dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        new Thread() {
250dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            public void run() {
251dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                try {
252dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                    Thread.sleep(TIME_UNIT);
253dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                    ServerSocketChannelTest.this.serverChannel.close();
254dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                } catch (Exception e) {
255dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                    fail("Fail to close the server channel because of"
256dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                            + e.getClass().getName());
257dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                }
258dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
259dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }.start();
260dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
261dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.serverChannel.accept();
262dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a AsynchronousCloseException");
263dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (AsynchronousCloseException e) {
264dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // OK.
265dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
266dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
267dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
268dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void testAccept_NonBlock_NoConnect() throws IOException {
269dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket gotSocket = this.serverChannel.socket();
270dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        gotSocket.bind(localAddr1);
271dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        this.serverChannel.configureBlocking(false);
272dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // non-blocking mode , will immediately return
273dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertNull(this.serverChannel.accept());
274dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
275dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
276dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
277dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocketChannel#accept().socket()
278dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
279dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_read_Blocking_RealData() throws IOException {
280dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.socket().bind(localAddr1);
281dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer buf = ByteBuffer.allocate(CAPACITY_NORMAL);
282dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
283dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
284dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            buf.put((byte) i);
285dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
286dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.connect(localAddr1);
287dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket serverSocket = serverChannel.accept().socket();
288dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        InputStream in = serverSocket.getInputStream();
289dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buf.flip();
290dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.write(buf);
291dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.close();
292dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertReadResult(in,CAPACITY_NORMAL);
293dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
294dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
295dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
296dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Asserts read content. The read content should contain <code>size</code>
297dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * bytes, and the value should be a sequence from 0 to size-1
298dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * ([0,1,...size-1]). Otherwise, the method throws Exception.
299dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     *
300dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
301dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void assertReadResult(InputStream in, int size) throws IOException{
302dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] readContent = new byte[size + 1];
303dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int count = 0;
304dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int total = 0;
305dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        while ((count = in.read(readContent, total, size + 1 - total)) != -1) {
306dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            total = total + count;
307dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
308dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(size, total);
309dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < size; i++) {
310dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals((byte) i, readContent[i]);
311dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
312dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
313dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
314dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
315dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocketChannel#accept().socket()
316dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
317dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_read_NonBlocking_RealData() throws Exception {
318dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.configureBlocking(false);
319dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.socket().bind(localAddr1);
320dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer buf = ByteBuffer.allocate(CAPACITY_NORMAL);
321dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
322dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            buf.put((byte) i);
323dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
324dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buf.flip();
325dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.connect(localAddr1);
326dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket serverSocket = serverChannel.accept().socket();
327dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        InputStream in = serverSocket.getInputStream();
328dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.write(buf);
329dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.close();
330dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertReadResult(in,CAPACITY_NORMAL);
331dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
332dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
333dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
334dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocketChannel#accept().socket()
335dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
336dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_write_Blocking_RealData() throws IOException {
337dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertTrue(serverChannel.isBlocking());
338dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket serverSocket = serverChannel.socket();
339dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverSocket.bind(localAddr1);
340dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
341dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] writeContent = new byte[CAPACITY_NORMAL];
342dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < writeContent.length; i++) {
343dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeContent[i] = (byte) i;
344dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
345dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.connect(localAddr1);
346dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = serverChannel.accept().socket();
347dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        OutputStream out = socket.getOutputStream();
348dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        out.write(writeContent);
349dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        out.flush();
350dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        socket.close();
351dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertWriteResult(CAPACITY_NORMAL);
352dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
353dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
354dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
355dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
356dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocketChannel#accept().socket()
357dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
358dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_write_NonBlocking_RealData() throws Exception {
359dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.configureBlocking(false);
360dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket serverSocket = serverChannel.socket();
361dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverSocket.bind(localAddr1);
362dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
363dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] writeContent = new byte[CAPACITY_NORMAL];
364dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_NORMAL; i++) {
365dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeContent[i] = (byte) i;
366dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
367dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.connect(localAddr1);
368dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket clientSocket = serverChannel.accept().socket();
369dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        OutputStream out = clientSocket.getOutputStream();
370dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        out.write(writeContent);
371dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientSocket.close();
372dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertWriteResult(CAPACITY_NORMAL);
373dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
374dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
375dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
376dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @throws InterruptedException
377dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocketChannel#accept().socket()
378dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
379dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_read_LByteBuffer_Blocking_ReadWriteRealLargeData()
380dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws IOException, InterruptedException {
381dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.socket().bind(localAddr1);
382dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer buf = ByteBuffer.allocate(CAPACITY_64KB);
383dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_64KB; i++) {
384dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            buf.put((byte) i);
385dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
386dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buf.flip();
387dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.connect(localAddr1);
388dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        WriteChannelThread writeThread = new WriteChannelThread(clientChannel, buf);
389dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeThread.start();
390dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = serverChannel.accept().socket();
391dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        InputStream in = socket.getInputStream();
392dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertReadResult(in,CAPACITY_64KB);
393dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeThread.join();
394dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // check if the thread threw any exceptions
395dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (writeThread.exception != null) {
396dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throw writeThread.exception;
397dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
398dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
399dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
400dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    class WriteChannelThread extends Thread {
401dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel channel;
402dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer buffer;
403dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        IOException exception;
404dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
405dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public WriteChannelThread(SocketChannel channel, ByteBuffer buffer) {
406dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.channel = channel;
407dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.buffer = buffer;
408dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
409dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
410dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public void run() {
411dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
412dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                channel.write(buffer);
413dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                channel.close();
414dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (IOException e) {
415dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                exception = e;
416dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
417dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
418dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
419dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
420dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
421dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocketChannel#accept().socket()
422dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
423dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_read_LByteBuffer_NonBlocking_ReadWriteRealLargeData()
424dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws Exception {
425dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.configureBlocking(false);
426dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.socket().bind(localAddr1);
427dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer buf = ByteBuffer.allocate(CAPACITY_64KB);
428dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < CAPACITY_64KB; i++) {
429dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            buf.put((byte) i);
430dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
431dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buf.flip();
432dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.connect(localAddr1);
433dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        WriteChannelThread writeThread = new WriteChannelThread(clientChannel, buf);
434dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeThread.start();
435dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = serverChannel.accept().socket();
436dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        InputStream in = socket.getInputStream();
437dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertReadResult(in,CAPACITY_64KB);
438dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeThread.join();
439dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // check if the thread threw any exceptions
440dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (writeThread.exception != null) {
441dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throw writeThread.exception;
442dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
443dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
444dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
445dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
446dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocketChannel#accept().socket()
447dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
448dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_write_LByteBuffer_NonBlocking_ReadWriteRealLargeData()
449dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws Exception {
450dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.configureBlocking(false);
451dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.socket().bind(localAddr1);
452dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] writeContent = new byte[CAPACITY_64KB];
453dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < writeContent.length; i++) {
454dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeContent[i] = (byte) i;
455dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
456dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.connect(localAddr1);
457dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = serverChannel.accept().socket();
458dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        WriteSocketThread writeThread = new WriteSocketThread(socket, writeContent);
459dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeThread.start();
460dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertWriteResult(CAPACITY_64KB);
461dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeThread.join();
462dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // check if the thread threw any exceptions
463dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (writeThread.exception != null) {
464dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throw writeThread.exception;
465dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
466dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
467dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
468dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    class WriteSocketThread extends Thread {
469dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket;
470dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] buffer;
471dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        IOException exception;
472dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
473dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public WriteSocketThread(Socket socket, byte[] buffer) {
474dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.socket = socket;
475dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            this.buffer = buffer;
476dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
477dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
478dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        public void run() {
479dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            try {
480dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                OutputStream out = socket.getOutputStream();
481dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                out.write(buffer);
482dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                socket.close();
483dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            } catch (IOException e) {
484dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                exception = e;
485dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
486dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
487dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
488dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
489dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
490dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocketChannel#accept().socket()
491dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
492dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_write_LByteBuffer_Blocking_ReadWriteRealLargeData()
493dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throws Exception {
494dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.socket().bind(localAddr1);
495dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        byte[] writeContent = new byte[CAPACITY_64KB];
496dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < writeContent.length; i++) {
497dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            writeContent[i] = (byte) i;
498dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
499dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.connect(localAddr1);
500dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        Socket socket = serverChannel.accept().socket();
501dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        WriteSocketThread writeThread = new WriteSocketThread(socket, writeContent);
502dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeThread.start();
503dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertWriteResult(CAPACITY_64KB);
504dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        writeThread.join();
505dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // check if the thread threw any exceptions
506dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        if (writeThread.exception != null) {
507dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            throw writeThread.exception;
508dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
509dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
510dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
511dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
512dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Uses SocketChannel.read(ByteBuffer) to verify write result.
513dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
514dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    private void assertWriteResult(int size) throws IOException{
515dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ByteBuffer buf = ByteBuffer.allocate(size + 1);
516dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int count = 0;
517dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int total = 0;
518dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        long beginTime = System.currentTimeMillis();
519dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        while ((count = clientChannel.read(buf)) != -1) {
520dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            total = total + count;
521dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // 10s timeout to avoid dead loop
522dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            if (System.currentTimeMillis() - beginTime > 10000){
523dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                break;
524dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
525dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
526dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(total, size);
527dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        buf.flip();
528dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        for (int i = 0; i < count; i++) {
529dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals((byte) i, buf.get(i));
530dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
531dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
532dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
533dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
534dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocketChannel#socket().getSoTimeout()
535dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
536dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_accept_SOTIMEOUT() throws IOException {
537dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // regression test for Harmony-707
538dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        final int SO_TIMEOUT = 10;
539dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocketChannel sc = ServerSocketChannel.open();
540dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
541dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            ServerSocket ss = sc.socket();
542dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            ss.bind(localAddr1);
543dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            sc.configureBlocking(false);
544dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            ss.setSoTimeout(SO_TIMEOUT);
545dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            SocketChannel client = sc.accept();
546dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // non blocking mode, returns null since there are no pending connections.
547dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertNull(client);
548dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            int soTimeout = ss.getSoTimeout();
549dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // Harmony fails here.
550dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            assertEquals(SO_TIMEOUT, soTimeout);
551dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } finally {
552dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            sc.close();
553dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
554dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
555dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
556dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
557dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocket#socket().accept()
558dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
559dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socket_accept_Blocking_NotBound() throws IOException {
560dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // regression test for Harmony-748
561dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket gotSocket = serverChannel.socket();
562dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.configureBlocking(true);
563dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
564dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            gotSocket.accept();
565dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an IllegalBlockingModeException");
566dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException e) {
567dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
568dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
569dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.close();
570dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
571dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            gotSocket.accept();
572dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an IllegalBlockingModeException");
573dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException e) {
574dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
575dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
576dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
577dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
578dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
579dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocket#socket().accept()
580dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
581dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socket_accept_Nonblocking_NotBound() throws IOException {
582dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // regression test for Harmony-748
583dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket gotSocket = serverChannel.socket();
584dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.configureBlocking(false);
585dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
586dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            gotSocket.accept();
587dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an IllegalBlockingModeException");
588dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException e) {
589dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
590dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
591dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.close();
592dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
593dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            gotSocket.accept();
594dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an IllegalBlockingModeException");
595dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException e) {
596dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
597dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
598dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
599dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
600dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
601dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocket#socket().accept()
602dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
603dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socket_accept_Nonblocking_Bound() throws IOException {
604dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // regression test for Harmony-748
605dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.configureBlocking(false);
606dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket gotSocket = serverChannel.socket();
607dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        gotSocket.bind(localAddr1);
608dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
609dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            gotSocket.accept();
610dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw an IllegalBlockingModeException");
611dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (IllegalBlockingModeException e) {
612dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
613dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
614dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.close();
615dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
616dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            gotSocket.accept();
617dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ClosedChannelException");
618dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
619dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
620dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
621dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
622dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
623dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
624dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * @tests ServerSocket#socket().accept()
625dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
626dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socket_accept_Blocking_Bound() throws IOException {
627dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // regression test for Harmony-748
628dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.configureBlocking(true);
629dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        ServerSocket gotSocket = serverChannel.socket();
630dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        gotSocket.bind(localAddr1);
631dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.close();
632dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
633dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            gotSocket.accept();
634dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("Should throw a ClosedChannelException");
635dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (ClosedChannelException e) {
636dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
637dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
638dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
639dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
640dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Regression test for HARMONY-4961
641dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
642dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_socket_getLocalPort() throws IOException {
643dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.socket().bind(localAddr1);
644dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.connect(localAddr1);
645dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        SocketChannel myChannel = serverChannel.accept();
646dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        int port = myChannel.socket().getLocalPort();
647dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        assertEquals(localAddr1.getPort(), port);
648dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        myChannel.close();
649dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        clientChannel.close();
650dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.close();
651dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
652dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
653dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    /**
654dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     * Regression test for HARMONY-6375
655dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes     */
656dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    public void test_accept_configureBlocking() throws Exception {
657dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);
658dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.socket().bind(localAddr);
659dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
660dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // configure the channel non-blocking
661dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        // when it is accepting in main thread
662dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        new Thread() {
663dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            public void run() {
664dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                try {
665dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                    Thread.sleep(TIME_UNIT);
666dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                    serverChannel.configureBlocking(false);
667dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                    serverChannel.close();
668dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                } catch (Exception e) {
669dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                    e.printStackTrace();
670dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes                }
671dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            }
672dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }.start();
673dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes
674dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        try {
675dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            serverChannel.accept();
676dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            fail("should throw AsynchronousCloseException");
677dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        } catch (AsynchronousCloseException e) {
678dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes            // expected
679dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        }
680dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes        serverChannel.close();
681dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes    }
682dce2b2fa9d6b26414a8d5a55918e4d7ca2ab1baaElliott Hughes}
683