1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18package org.apache.harmony.tests.java.nio.channels;
19
20import java.io.IOException;
21import java.io.InputStream;
22import java.io.OutputStream;
23import java.net.InetSocketAddress;
24import java.net.ServerSocket;
25import java.net.Socket;
26import java.nio.ByteBuffer;
27import java.nio.channels.AsynchronousCloseException;
28import java.nio.channels.ClosedChannelException;
29import java.nio.channels.IllegalBlockingModeException;
30import java.nio.channels.NotYetBoundException;
31import java.nio.channels.SelectionKey;
32import java.nio.channels.ServerSocketChannel;
33import java.nio.channels.SocketChannel;
34import java.nio.channels.spi.SelectorProvider;
35import junit.framework.TestCase;
36
37/*
38 * test for ServerSocketChannel
39 */
40public class ServerSocketChannelTest extends TestCase {
41
42    private static final int CAPACITY_NORMAL = 200;
43
44    private static final int CAPACITY_64KB = 65536;
45
46    private static final int TIME_UNIT = 200;
47
48    private ServerSocketChannel serverChannel;
49
50    private SocketChannel clientChannel;
51
52    protected void setUp() throws Exception {
53        super.setUp();
54        this.serverChannel = ServerSocketChannel.open();
55        this.clientChannel = SocketChannel.open();
56    }
57
58    protected void tearDown() throws Exception {
59        if (null != this.serverChannel) {
60            try {
61                this.serverChannel.close();
62            } catch (Exception e) {
63                //ignore
64            }
65
66        }
67        if (null != this.clientChannel) {
68            try {
69                this.clientChannel.close();
70            } catch (Exception e) {
71                //ignore
72            }
73        }
74        super.tearDown();
75    }
76
77    // -------------------------------------------------------------------
78    // Test for methods in abstract class.
79    // -------------------------------------------------------------------
80
81    /*
82     * Test method for 'java.nio.channels.ServerSocketChannel.validOps()'
83     */
84    public void testValidOps() {
85        MockServerSocketChannel testMSChnlnull = new MockServerSocketChannel(
86                null);
87        MockServerSocketChannel testMSChnl = new MockServerSocketChannel(
88                SelectorProvider.provider());
89        assertEquals(SelectionKey.OP_ACCEPT, this.serverChannel.validOps());
90        assertEquals(SelectionKey.OP_ACCEPT, testMSChnl.validOps());
91        assertEquals(SelectionKey.OP_ACCEPT, testMSChnlnull.validOps());
92
93    }
94
95    /*
96     * Test method for 'java.nio.channels.ServerSocketChannel.open()'
97     */
98    public void testOpen() {
99        MockServerSocketChannel testMSChnl = new MockServerSocketChannel(null);
100        MockServerSocketChannel testMSChnlnotnull = new MockServerSocketChannel(
101                SelectorProvider.provider());
102        assertEquals(SelectionKey.OP_ACCEPT, testMSChnlnotnull.validOps());
103        assertNull(testMSChnl.provider());
104        assertNotNull(testMSChnlnotnull.provider());
105        assertNotNull(this.serverChannel.provider());
106        assertEquals(testMSChnlnotnull.provider(), this.serverChannel
107                .provider());
108    }
109
110    // -------------------------------------------------------------------
111    // Tests for bind()
112    // -------------------------------------------------------------------
113
114    public void test_bind_null() throws Exception {
115        ServerSocketChannel ssc = ServerSocketChannel.open();
116        try {
117            assertNull(ssc.socket().getLocalSocketAddress());
118
119            ssc.socket().bind(null);
120
121            InetSocketAddress localAddress = (InetSocketAddress) ssc.socket().getLocalSocketAddress();
122            assertTrue(localAddress.getAddress().isAnyLocalAddress());
123            assertTrue(localAddress.getPort() > 0);
124        } finally {
125            ssc.close();
126        }
127    }
128
129    public void test_bind_failure() throws Exception {
130        ServerSocketChannel portHog = ServerSocketChannel.open();
131        portHog.socket().bind(null);
132
133        ServerSocketChannel ssc = ServerSocketChannel.open();
134        try {
135            // Bind to a local address that is in use
136            ssc.socket().bind(portHog.socket().getLocalSocketAddress());
137            fail();
138        } catch (IOException expected) {
139        } finally {
140            ssc.close();
141            portHog.close();
142        }
143    }
144
145    public void test_bind_closed() throws Exception {
146        ServerSocketChannel ssc = ServerSocketChannel.open();
147        ssc.close();
148
149        try {
150            ssc.socket().bind(null);
151            fail();
152        } catch (IOException expected) {
153        } finally {
154            ssc.close();
155        }
156    }
157
158    public void test_bind_explicitPort() throws Exception {
159        ServerSocketChannel portPickingChannel = ServerSocketChannel.open();
160        // Have the OS find a free port.
161        portPickingChannel.socket().bind(null);
162
163        InetSocketAddress address = (InetSocketAddress) portPickingChannel.socket().getLocalSocketAddress();
164        assertTrue(address.getPort() > 0);
165        portPickingChannel.close();
166
167        // There is a risk of flakiness here if the port is allocated to something else between
168        // close() and bind().
169        ServerSocketChannel ssc = ServerSocketChannel.open();
170        InetSocketAddress bindAddress = new InetSocketAddress("localhost", address.getPort());
171        ssc.socket().bind(bindAddress);
172
173        InetSocketAddress boundAddress = (InetSocketAddress) ssc.socket().getLocalSocketAddress();
174        assertEquals(bindAddress.getHostName(), boundAddress.getHostName());
175        assertEquals(bindAddress.getPort(), boundAddress.getPort());
176
177        ssc.close();
178    }
179
180    public void test_bind_socketSync() throws IOException {
181        ServerSocketChannel ssc = ServerSocketChannel.open();
182        assertNull(ssc.socket().getLocalSocketAddress());
183
184        ServerSocket socket = ssc.socket();
185        assertNull(socket.getLocalSocketAddress());
186        assertFalse(socket.isBound());
187
188        InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
189        ssc.socket().bind(bindAddr);
190
191        InetSocketAddress actualAddr = (InetSocketAddress) ssc.socket().getLocalSocketAddress();
192        assertEquals(actualAddr, socket.getLocalSocketAddress());
193        assertEquals(bindAddr.getHostName(), actualAddr.getHostName());
194        assertTrue(socket.isBound());
195        assertFalse(socket.isClosed());
196
197        ssc.close();
198
199        assertFalse(ssc.isOpen());
200        assertTrue(socket.isClosed());
201    }
202
203    public void test_bind_socketSyncAfterBind() throws IOException {
204        ServerSocketChannel ssc = ServerSocketChannel.open();
205        assertNull(ssc.socket().getLocalSocketAddress());
206
207        InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
208        ssc.socket().bind(bindAddr);
209
210        // Socket creation after bind().
211        ServerSocket socket = ssc.socket();
212        InetSocketAddress actualAddr = (InetSocketAddress) ssc.socket().getLocalSocketAddress();
213        assertEquals(actualAddr, socket.getLocalSocketAddress());
214        assertEquals(bindAddr.getHostName(), actualAddr.getHostName());
215        assertTrue(socket.isBound());
216        assertFalse(socket.isClosed());
217
218        ssc.close();
219
220        assertFalse(ssc.isOpen());
221        assertTrue(socket.isClosed());
222    }
223
224    // -------------------------------------------------------------------
225    // Test for getLocalSocketAddress()
226    // -------------------------------------------------------------------
227
228    public void test_getLocalSocketAddress_afterClose() throws IOException {
229        ServerSocketChannel ssc = ServerSocketChannel.open();
230        assertNull(ssc.socket().getLocalSocketAddress());
231
232        InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0);
233        ssc.socket().bind(bindAddr);
234
235        assertNotNull(ssc.socket().getLocalSocketAddress());
236
237        ssc.close();
238
239        assertFalse(ssc.isOpen());
240
241        ssc.socket().getLocalSocketAddress();
242    }
243
244    // -------------------------------------------------------------------
245    // Test for socket()
246    // -------------------------------------------------------------------
247
248    /*
249     * Test method for 'java.nio.channels.ServerSocketChannel.socket()'
250     */
251    public void testSocket_Block_BeforeClose() throws Exception {
252        assertTrue(this.serverChannel.isOpen());
253        assertTrue(this.serverChannel.isBlocking());
254        ServerSocket s1 = this.serverChannel.socket();
255        assertFalse(s1.isClosed());
256        assertSocketNotAccepted(s1);
257        ServerSocket s2 = this.serverChannel.socket();
258        // same
259        assertSame(s1, s2);
260
261        // socket close makes the channel close
262        s1.close();
263        assertFalse(this.serverChannel.isOpen());
264
265    }
266
267    public void testSocket_NonBlock_BeforeClose() throws Exception {
268        assertTrue(this.serverChannel.isOpen());
269        this.serverChannel.configureBlocking(false);
270        ServerSocket s1 = this.serverChannel.socket();
271        assertFalse(s1.isClosed());
272        assertSocketNotAccepted(s1);
273        ServerSocket s2 = this.serverChannel.socket();
274        // same
275        assertSame(s1, s2);
276
277        // socket close makes the channel close
278        s1.close();
279        assertFalse(this.serverChannel.isOpen());
280
281    }
282
283    public void testSocket_Block_Closed() throws Exception {
284        this.serverChannel.close();
285        assertFalse(this.serverChannel.isOpen());
286        assertTrue(this.serverChannel.isBlocking());
287        ServerSocket s1 = this.serverChannel.socket();
288        assertTrue(s1.isClosed());
289        assertSocketNotAccepted(s1);
290        ServerSocket s2 = this.serverChannel.socket();
291        // same
292        assertSame(s1, s2);
293    }
294
295    public void testSocket_NonBlock_Closed() throws Exception {
296        this.serverChannel.configureBlocking(false);
297        this.serverChannel.close();
298        assertFalse(this.serverChannel.isBlocking());
299        assertFalse(this.serverChannel.isOpen());
300        ServerSocket s1 = this.serverChannel.socket();
301        assertTrue(s1.isClosed());
302        assertSocketNotAccepted(s1);
303        ServerSocket s2 = this.serverChannel.socket();
304        // same
305        assertSame(s1, s2);
306    }
307
308    private void assertSocketNotAccepted(ServerSocket s) throws IOException {
309        assertFalse(s.isBound());
310        assertNull(s.getInetAddress());
311        assertEquals(-1, s.getLocalPort());
312        assertNull(s.getLocalSocketAddress());
313        try {
314            assertEquals(0, s.getSoTimeout());
315        } catch (IOException expected) {
316            // Android doesn't cache the timeout, so the getsockopt(2) fails and throws.
317        }
318    }
319
320    public void testChannelBasicStatus() {
321        ServerSocket gotSocket = this.serverChannel.socket();
322        assertFalse(gotSocket.isClosed());
323        assertTrue(this.serverChannel.isBlocking());
324        assertFalse(this.serverChannel.isRegistered());
325        assertEquals(SelectionKey.OP_ACCEPT, this.serverChannel.validOps());
326        assertEquals(SelectorProvider.provider(), this.serverChannel.provider());
327    }
328
329    // -------------------------------------------------------------------
330    // Test for accept()
331    // -------------------------------------------------------------------
332
333    /*
334     * Test method for 'java.nio.channels.ServerSocketChannel.accept()'
335     */
336
337    public void testAccept_Block_NotYetBound() throws IOException {
338        assertTrue(this.serverChannel.isOpen());
339        assertTrue(this.serverChannel.isBlocking());
340        try {
341            this.serverChannel.accept();
342            fail("Should throw NotYetBoundException");
343        } catch (NotYetBoundException e) {
344            // correct
345        }
346    }
347
348    public void testAccept_NonBlock_NotYetBound() throws IOException {
349        assertTrue(this.serverChannel.isOpen());
350        this.serverChannel.configureBlocking(false);
351        try {
352            this.serverChannel.accept();
353            fail("Should throw NotYetBoundException");
354        } catch (NotYetBoundException e) {
355            // correct
356        }
357    }
358
359    public void testAccept_ClosedChannel() throws Exception {
360        this.serverChannel.close();
361        assertFalse(this.serverChannel.isOpen());
362        try {
363            this.serverChannel.accept();
364            fail("Should throw ClosedChannelException");
365        } catch (ClosedChannelException e) {
366            // OK.
367        }
368    }
369
370    public void testAccept_Block_NoConnect() throws IOException {
371        assertTrue(this.serverChannel.isBlocking());
372        serverChannel.socket().bind(null);
373        // blocking mode , will block and wait for ever...
374        // so must close the server channel with another thread.
375        new Thread() {
376            public void run() {
377                try {
378                    Thread.sleep(TIME_UNIT);
379                    ServerSocketChannelTest.this.serverChannel.close();
380                } catch (Exception e) {
381                    fail("Fail to close the server channel because of"
382                            + e.getClass().getName());
383                }
384            }
385        }.start();
386        try {
387            this.serverChannel.accept();
388            fail("Should throw a AsynchronousCloseException");
389        } catch (AsynchronousCloseException e) {
390            // OK.
391        }
392    }
393
394    public void testAccept_NonBlock_NoConnect() throws IOException {
395        this.serverChannel.socket().bind(null);
396        this.serverChannel.configureBlocking(false);
397        // non-blocking mode , will immediately return
398        assertNull(this.serverChannel.accept());
399    }
400
401    /**
402     * @tests ServerSocketChannel#accept().socket()
403     */
404    public void test_read_Blocking_RealData() throws IOException {
405        serverChannel.socket().bind(null);
406        ByteBuffer buf = ByteBuffer.allocate(CAPACITY_NORMAL);
407
408        for (int i = 0; i < CAPACITY_NORMAL; i++) {
409            buf.put((byte) i);
410        }
411        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
412        Socket serverSocket = serverChannel.accept().socket();
413        InputStream in = serverSocket.getInputStream();
414        buf.flip();
415        clientChannel.write(buf);
416        clientChannel.close();
417        assertReadResult(in,CAPACITY_NORMAL);
418    }
419
420    /**
421     * Asserts read content. The read content should contain <code>size</code>
422     * bytes, and the value should be a sequence from 0 to size-1
423     * ([0,1,...size-1]). Otherwise, the method throws Exception.
424     *
425     */
426    private void assertReadResult(InputStream in, int size) throws IOException{
427        byte[] readContent = new byte[size + 1];
428        int count = 0;
429        int total = 0;
430        while ((count = in.read(readContent, total, size + 1 - total)) != -1) {
431            total = total + count;
432        }
433        assertEquals(size, total);
434        for (int i = 0; i < size; i++) {
435            assertEquals((byte) i, readContent[i]);
436        }
437    }
438
439    /**
440     * @tests ServerSocketChannel#accept().socket()
441     */
442    public void test_read_NonBlocking_RealData() throws Exception {
443        serverChannel.configureBlocking(false);
444        serverChannel.socket().bind(null);
445        ByteBuffer buf = ByteBuffer.allocate(CAPACITY_NORMAL);
446        for (int i = 0; i < CAPACITY_NORMAL; i++) {
447            buf.put((byte) i);
448        }
449        buf.flip();
450        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
451        Socket serverSocket = serverChannel.accept().socket();
452        InputStream in = serverSocket.getInputStream();
453        clientChannel.write(buf);
454        clientChannel.close();
455        assertReadResult(in,CAPACITY_NORMAL);
456    }
457
458    /**
459     * @tests ServerSocketChannel#accept().socket()
460     */
461    public void test_write_Blocking_RealData() throws IOException {
462        assertTrue(serverChannel.isBlocking());
463        serverChannel.socket().bind(null);
464
465        byte[] writeContent = new byte[CAPACITY_NORMAL];
466        for (int i = 0; i < writeContent.length; i++) {
467            writeContent[i] = (byte) i;
468        }
469        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
470        Socket socket = serverChannel.accept().socket();
471        OutputStream out = socket.getOutputStream();
472        out.write(writeContent);
473        out.flush();
474        socket.close();
475        assertWriteResult(CAPACITY_NORMAL);
476    }
477
478
479    /**
480     * @tests ServerSocketChannel#accept().socket()
481     */
482    public void test_write_NonBlocking_RealData() throws Exception {
483        serverChannel.configureBlocking(false);
484        serverChannel.socket().bind(null);
485
486        byte[] writeContent = new byte[CAPACITY_NORMAL];
487        for (int i = 0; i < CAPACITY_NORMAL; i++) {
488            writeContent[i] = (byte) i;
489        }
490        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
491        Socket clientSocket = serverChannel.accept().socket();
492        OutputStream out = clientSocket.getOutputStream();
493        out.write(writeContent);
494        clientSocket.close();
495        assertWriteResult(CAPACITY_NORMAL);
496    }
497
498    /**
499     * @throws InterruptedException
500     * @tests ServerSocketChannel#accept().socket()
501     */
502    public void test_read_LByteBuffer_Blocking_ReadWriteRealLargeData()
503            throws IOException, InterruptedException {
504        serverChannel.socket().bind(null);
505        ByteBuffer buf = ByteBuffer.allocate(CAPACITY_64KB);
506        for (int i = 0; i < CAPACITY_64KB; i++) {
507            buf.put((byte) i);
508        }
509        buf.flip();
510        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
511        WriteChannelThread writeThread = new WriteChannelThread(clientChannel, buf);
512        writeThread.start();
513        Socket socket = serverChannel.accept().socket();
514        InputStream in = socket.getInputStream();
515        assertReadResult(in,CAPACITY_64KB);
516        writeThread.join();
517        // check if the thread threw any exceptions
518        if (writeThread.exception != null) {
519            throw writeThread.exception;
520        }
521    }
522
523    class WriteChannelThread extends Thread {
524        SocketChannel channel;
525        ByteBuffer buffer;
526        IOException exception;
527
528        public WriteChannelThread(SocketChannel channel, ByteBuffer buffer) {
529            this.channel = channel;
530            this.buffer = buffer;
531        }
532
533        public void run() {
534            try {
535                channel.write(buffer);
536                channel.close();
537            } catch (IOException e) {
538                exception = e;
539            }
540        }
541    }
542
543    /**
544     * @tests ServerSocketChannel#accept().socket()
545     */
546    public void test_read_LByteBuffer_NonBlocking_ReadWriteRealLargeData()
547            throws Exception {
548        serverChannel.configureBlocking(false);
549        serverChannel.socket().bind(null);
550        ByteBuffer buf = ByteBuffer.allocate(CAPACITY_64KB);
551        for (int i = 0; i < CAPACITY_64KB; i++) {
552            buf.put((byte) i);
553        }
554        buf.flip();
555        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
556        WriteChannelThread writeThread = new WriteChannelThread(clientChannel, buf);
557        writeThread.start();
558        Socket socket = serverChannel.accept().socket();
559        InputStream in = socket.getInputStream();
560        assertReadResult(in,CAPACITY_64KB);
561        writeThread.join();
562        // check if the thread threw any exceptions
563        if (writeThread.exception != null) {
564            throw writeThread.exception;
565        }
566    }
567
568    /**
569     * @tests ServerSocketChannel#accept().socket()
570     */
571    public void test_write_LByteBuffer_NonBlocking_ReadWriteRealLargeData()
572            throws Exception {
573        serverChannel.configureBlocking(false);
574        serverChannel.socket().bind(null);
575        byte[] writeContent = new byte[CAPACITY_64KB];
576        for (int i = 0; i < writeContent.length; i++) {
577            writeContent[i] = (byte) i;
578        }
579        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
580        Socket socket = serverChannel.accept().socket();
581        WriteSocketThread writeThread = new WriteSocketThread(socket, writeContent);
582        writeThread.start();
583        assertWriteResult(CAPACITY_64KB);
584        writeThread.join();
585        // check if the thread threw any exceptions
586        if (writeThread.exception != null) {
587            throw writeThread.exception;
588        }
589    }
590
591    class WriteSocketThread extends Thread {
592        Socket socket;
593        byte[] buffer;
594        IOException exception;
595
596        public WriteSocketThread(Socket socket, byte[] buffer) {
597            this.socket = socket;
598            this.buffer = buffer;
599        }
600
601        public void run() {
602            try {
603                OutputStream out = socket.getOutputStream();
604                out.write(buffer);
605                socket.close();
606            } catch (IOException e) {
607                exception = e;
608            }
609        }
610    }
611
612    /**
613     * @tests ServerSocketChannel#accept().socket()
614     */
615    public void test_write_LByteBuffer_Blocking_ReadWriteRealLargeData()
616            throws Exception {
617        serverChannel.socket().bind(null);
618        byte[] writeContent = new byte[CAPACITY_64KB];
619        for (int i = 0; i < writeContent.length; i++) {
620            writeContent[i] = (byte) i;
621        }
622        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
623        Socket socket = serverChannel.accept().socket();
624        WriteSocketThread writeThread = new WriteSocketThread(socket, writeContent);
625        writeThread.start();
626        assertWriteResult(CAPACITY_64KB);
627        writeThread.join();
628        // check if the thread threw any exceptions
629        if (writeThread.exception != null) {
630            throw writeThread.exception;
631        }
632    }
633
634    /**
635     * Uses SocketChannel.read(ByteBuffer) to verify write result.
636     */
637    private void assertWriteResult(int size) throws IOException{
638        ByteBuffer buf = ByteBuffer.allocate(size + 1);
639        int count = 0;
640        int total = 0;
641        long beginTime = System.currentTimeMillis();
642        while ((count = clientChannel.read(buf)) != -1) {
643            total = total + count;
644            // 10s timeout to avoid dead loop
645            if (System.currentTimeMillis() - beginTime > 10000){
646                break;
647            }
648        }
649        assertEquals(total, size);
650        buf.flip();
651        for (int i = 0; i < count; i++) {
652            assertEquals((byte) i, buf.get(i));
653        }
654    }
655
656    /**
657     * @tests ServerSocketChannel#socket().getSoTimeout()
658     */
659    public void test_accept_SOTIMEOUT() throws IOException {
660        // Regression test for Harmony-707
661        // The timeout actually used may be different from the one set due to
662        // rounding by the Linux Kernel (see sock_set_timeout() in net/core/sock.c).
663        // getSoTimeout() can return a different value from the one set with
664        // setSoTimeout(). Consequently we do not check for equality with what was
665        // set.
666
667        ServerSocketChannel sc = ServerSocketChannel.open();
668        try {
669            sc.socket().bind(null);
670
671            // Non blocking mode, accept() will return NULL since there are no pending connections.
672            sc.configureBlocking(false);
673
674            ServerSocket ss = sc.socket();
675
676            int defaultTimeout = ss.getSoTimeout();
677            assertEquals(0, defaultTimeout);
678            // The timeout value is unimportant, providing it is large enough to be accepted
679            // by the Kernel as distinct from the default.
680            final int SO_TIMEOUT = 200;
681            ss.setSoTimeout(SO_TIMEOUT);
682            int nonDefaultTimeout = ss.getSoTimeout();
683            assertTrue(nonDefaultTimeout != defaultTimeout);
684
685            SocketChannel client = sc.accept();
686            assertNull(client);
687            // Confirm the timeout was unchanged.
688            assertEquals(nonDefaultTimeout, ss.getSoTimeout());
689        } finally {
690            sc.close();
691        }
692    }
693
694    /**
695     * @tests ServerSocket#socket().accept()
696     */
697    public void test_socket_accept_Blocking_NotBound() throws IOException {
698        // regression test for Harmony-748
699        ServerSocket gotSocket = serverChannel.socket();
700        serverChannel.configureBlocking(true);
701        try {
702            gotSocket.accept();
703            fail("Should throw an IllegalBlockingModeException");
704        } catch (IllegalBlockingModeException expected) {
705        }
706        serverChannel.close();
707        try {
708            gotSocket.accept();
709            fail("Should throw an IllegalBlockingModeException");
710        } catch (IllegalBlockingModeException expected) {
711        }
712    }
713
714    /**
715     * @tests ServerSocket#socket().accept()
716     */
717    public void test_socket_accept_Nonblocking_NotBound() throws IOException {
718        // regression test for Harmony-748
719        ServerSocket gotSocket = serverChannel.socket();
720        serverChannel.configureBlocking(false);
721        try {
722            gotSocket.accept();
723            fail("Should throw an IllegalBlockingModeException");
724        } catch (IllegalBlockingModeException expected) {
725        }
726        serverChannel.close();
727        try {
728            gotSocket.accept();
729            fail("Should throw an IllegalBlockingModeException");
730        } catch (IllegalBlockingModeException expected) {
731        }
732    }
733
734    /**
735     * @tests ServerSocket#socket().accept()
736     */
737    public void test_socket_accept_Nonblocking_Bound() throws IOException {
738        // regression test for Harmony-748
739        serverChannel.configureBlocking(false);
740        serverChannel.socket().bind(null);
741        ServerSocket gotSocket = serverChannel.socket();
742        try {
743            gotSocket.accept();
744            fail("Should throw an IllegalBlockingModeException");
745        } catch (IllegalBlockingModeException expected) {
746        }
747        serverChannel.close();
748        try {
749            gotSocket.accept();
750            fail("Should throw a ClosedChannelException");
751        } catch (ClosedChannelException expected) {
752        }
753    }
754
755    /**
756     * @tests ServerSocket#socket().accept()
757     */
758    public void test_socket_accept_Blocking_Bound() throws IOException {
759        // regression test for Harmony-748
760        serverChannel.configureBlocking(true);
761        serverChannel.socket().bind(null);
762        serverChannel.close();
763        try {
764            serverChannel.socket().accept();
765            fail("Should throw a ClosedChannelException");
766        } catch (ClosedChannelException expected) {
767        }
768    }
769    /**
770     * Regression test for HARMONY-4961
771     */
772    public void test_socket_getLocalPort() throws IOException {
773        serverChannel.socket().bind(null);
774        clientChannel.connect(serverChannel.socket().getLocalSocketAddress());
775        SocketChannel myChannel = serverChannel.accept();
776        int port = myChannel.socket().getLocalPort();
777        assertEquals(serverChannel.socket().getLocalPort(), port);
778        myChannel.close();
779        clientChannel.close();
780        serverChannel.close();
781    }
782
783    /**
784     * Regression test for HARMONY-6375
785     */
786    public void test_accept_configureBlocking() throws Exception {
787        InetSocketAddress localAddr = new InetSocketAddress("localhost", 0);
788        serverChannel.socket().bind(localAddr);
789
790        // configure the channel non-blocking
791        // when it is accepting in main thread
792        new Thread() {
793            public void run() {
794                try {
795                    Thread.sleep(TIME_UNIT);
796                    serverChannel.configureBlocking(false);
797                    serverChannel.close();
798                } catch (Exception e) {
799                    e.printStackTrace();
800                }
801            }
802        }.start();
803
804        try {
805            serverChannel.accept();
806            fail("should throw AsynchronousCloseException");
807        } catch (AsynchronousCloseException expected) {
808        }
809        serverChannel.close();
810    }
811}
812