/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.harmony.tests.java.nio.channels; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.BindException; import java.net.ConnectException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketAddress; import java.net.SocketException; import java.nio.Buffer; import java.nio.ByteBuffer; import java.nio.channels.AlreadyConnectedException; import java.nio.channels.ClosedChannelException; import java.nio.channels.ConnectionPendingException; import java.nio.channels.IllegalBlockingModeException; import java.nio.channels.NoConnectionPendingException; import java.nio.channels.NotYetConnectedException; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.channels.UnresolvedAddressException; import java.nio.channels.UnsupportedAddressTypeException; import java.nio.channels.spi.SelectorProvider; import junit.framework.TestCase; /** * Tests for SocketChannel and its default implementation. */ public class SocketChannelTest extends TestCase { private static final int CAPACITY_NORMAL = 200; private InetSocketAddress localAddr1; private InetSocketAddress localAddr2; private SocketChannel channel1; private SocketChannel channel2; private ServerSocket server1; private ServerSocket server2; private final static int TIMEOUT = 60000; private final static int EOF = -1; protected void setUp() throws Exception { super.setUp(); this.channel1 = SocketChannel.open(); this.channel2 = SocketChannel.open(); this.server1 = new ServerSocket(0); this.localAddr1 = new InetSocketAddress("127.0.0.1", server1.getLocalPort()); this.server2 = new ServerSocket(0); this.localAddr2 = new InetSocketAddress("127.0.0.1", server2.getLocalPort()); } protected void tearDown() throws Exception { super.tearDown(); if (null != this.channel1) { try { this.channel1.close(); } catch (Exception e) { //ignore } } if (null != this.channel2) { try { this.channel2.close(); } catch (Exception e) { //ignore } } if (null != this.server1) { try { this.server1.close(); } catch (Exception e) { //ignore } } if (null != this.server2) { try { this.server2.close(); } catch (Exception e) { //ignore } } } // ------------------------------------------------------------------- // Test for methods in abstract class. // ------------------------------------------------------------------- /* * Test method for 'java.nio.channels.SocketChannel.validOps()' */ public void testValidOps() { MockSocketChannel testMSChannel = new MockSocketChannel(null); assertEquals(13, this.channel1.validOps()); assertEquals(13, testMSChannel.validOps()); } /* * Test method for 'java.nio.channels.SocketChannel.open()' */ public void testOpen() throws IOException { java.nio.ByteBuffer[] buf = new java.nio.ByteBuffer[1]; buf[0] = java.nio.ByteBuffer.allocateDirect(CAPACITY_NORMAL); MockSocketChannel testMSChannel = new MockSocketChannel(null); MockSocketChannel testMSChannelnotnull = new MockSocketChannel( SelectorProvider.provider()); assertNull(testMSChannel.provider()); assertNotNull(testMSChannelnotnull.provider()); assertNotNull(this.channel1); assertEquals(this.channel1.provider(), testMSChannelnotnull.provider()); try { this.channel1.write(buf); fail("Should throw NotYetConnectedException"); } catch (NotYetConnectedException e) { // correct } } /* * Test method for 'java.nio.channels.SocketChannel.open(SocketAddress)' */ public void testOpenSocketAddress_Null() throws IOException { try { SocketChannel.open(null); fail("Should throw an IllegalArgumentException"); } catch (IllegalArgumentException e) { // correct } } public void testBind_Null() throws Exception { assertNull(channel1.socket().getLocalSocketAddress()); channel1.socket().bind(null); InetSocketAddress localAddress = (InetSocketAddress) channel1.socket().getLocalSocketAddress(); assertTrue(localAddress.getAddress().isAnyLocalAddress()); assertTrue(localAddress.getPort() > 0); } public void testBind_Failure() throws Exception { assertNull(channel1.socket().getLocalSocketAddress()); try { // Bind to a local address that is in use channel1.socket().bind(localAddr1); fail(); } catch (IOException expected) { } } public void testBind_Closed() throws Exception { channel1.close(); try { channel1.socket().bind(null); fail(); } catch (IOException expected) { } } public void testBind_explicitPort() throws Exception { ServerSocketChannel portPickingChannel = ServerSocketChannel.open(); // Have the OS find a free port. portPickingChannel.socket().bind(null); InetSocketAddress address = (InetSocketAddress) portPickingChannel.socket().getLocalSocketAddress(); assertTrue(address.getPort() > 0); portPickingChannel.close(); // There is a risk of flakiness here if the port is allocated to something else between // close() and bind(). InetSocketAddress bindAddress = new InetSocketAddress("localhost", address.getPort()); // Allow the socket to bind to a port we know is already in use. channel1.socket().setReuseAddress(true); channel1.socket().bind(bindAddress); InetSocketAddress boundAddress = (InetSocketAddress) channel1.socket().getLocalSocketAddress(); assertEquals(bindAddress.getHostName(), boundAddress.getHostName()); assertEquals(bindAddress.getPort(), boundAddress.getPort()); } public void test_getLocalSocketAddress_afterClose() throws IOException { SocketChannel sc = SocketChannel.open(); assertNull(sc.socket().getLocalSocketAddress()); InetSocketAddress bindAddr = new InetSocketAddress("localhost", 0); sc.socket().bind(bindAddr); assertNotNull(sc.socket().getLocalSocketAddress()); sc.close(); assertFalse(sc.isOpen()); sc.socket().getLocalSocketAddress(); } /* * Test method for 'java.nio.channels.SocketChannel.read(ByteBuffer[])' */ public void testReadByteBufferArray() throws IOException { java.nio.ByteBuffer[] byteBuf = null; MockSocketChannel testMSChannelnull = new MockSocketChannel(null); MockSocketChannel testMSChannel = new MockSocketChannel( SelectorProvider.provider()); ServerSocket testServer = new ServerSocket(0); try { try { this.channel1.read(byteBuf); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } byteBuf = new java.nio.ByteBuffer[CAPACITY_NORMAL]; try { this.channel1.read(byteBuf); fail("Should throw NotYetConnectedException"); } catch (NotYetConnectedException e) { // correct } long readNum = testMSChannel.read(byteBuf); assertEquals(0, readNum); readNum = CAPACITY_NORMAL; readNum = testMSChannelnull.read(byteBuf); assertEquals(0, readNum); } finally { testServer.close(); } } /* * Test method for 'java.nio.channels.SocketChannel.read(ByteBuffer[])' */ public void testReadByteBufferArray_BufNull() throws IOException { java.nio.ByteBuffer[] byteBuf = null; MockSocketChannel testMSChannelnull = new MockSocketChannel(null); MockSocketChannel testMSChannel = new MockSocketChannel( SelectorProvider.provider()); try { this.channel1.read(byteBuf); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } try { testMSChannel.read(byteBuf); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } try { testMSChannelnull.read(byteBuf); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } } /* * Test method for 'java.nio.channels.SocketChannel.write(ByteBuffer[])' */ public void testWriteByteBufferArray() throws IOException { java.nio.ByteBuffer[] byteBuf = null; MockSocketChannel testMSChannelnull = new MockSocketChannel(null); MockSocketChannel testMSChannel = new MockSocketChannel( SelectorProvider.provider()); try { this.channel1.write(byteBuf); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } byteBuf = new java.nio.ByteBuffer[CAPACITY_NORMAL]; try { this.channel1.write(byteBuf); fail("Should throw NotYetConnectedException"); } catch (NotYetConnectedException e) { // correct } testMSChannel.write(byteBuf); testMSChannelnull.write(byteBuf); } /* * Test method for 'java.nio.channels.SocketChannel.write(ByteBuffer[])' */ public void testWriteByteBufferArray_BufNull() throws IOException { java.nio.ByteBuffer[] byteBuf = null; MockSocketChannel testMSChannelnull = new MockSocketChannel(null); MockSocketChannel testMSChannel = new MockSocketChannel( SelectorProvider.provider()); try { this.channel1.write(byteBuf); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } try { testMSChannel.write(byteBuf); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } try { testMSChannelnull.write(byteBuf); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } } public void testSocket_BasicStatusBeforeConnect() throws IOException { assertFalse(this.channel1.isConnected());// not connected Socket s1 = this.channel1.socket(); assertSocketBeforeBind(s1); assertSocketBeforeConnect(s1); Socket s2 = this.channel1.socket(); // same assertSame(s1, s2); } public void testSocket_Block_BasicStatusAfterConnect() throws IOException { assertFalse(this.channel1.isConnected());// not connected assertTrue(this.channel1.connect(localAddr1)); assertTrue(this.channel1.isConnected()); Socket s1 = this.channel1.socket(); assertSocketAfterConnect(s1, localAddr1); Socket s2 = this.channel1.socket(); // same assertSame(s1, s2); } public void testSocket_NonBlock_BasicStatusAfterConnect() throws Exception { assertFalse(this.channel1.isConnected());// not connected this.channel1.configureBlocking(false); boolean connected = channel1.connect(localAddr1); Socket s1; Socket s2; if (!connected) { assertFalse(this.channel1.isConnected()); assertTrue(this.channel1.isConnectionPending()); s1 = this.channel1.socket(); // A connect() causes an implicit bind() assertSocketAfterImplicitBind(s1); // status of not connected assertSocketBeforeConnect(s1); s2 = this.channel1.socket(); // same assertSame(s1, s2); } if (tryFinish()) { assertTrue(this.channel1.isConnected()); s1 = this.channel1.socket(); assertSocketAfterConnect(s1, localAddr1); s2 = this.channel1.socket(); // same assertSame(s1, s2); } } public void testSocket_Block_ActionsBeforeConnect() throws IOException { assertFalse(this.channel1.isConnected());// not connected Socket s = this.channel1.socket(); assertSocketAction_Block_BeforeConnect(s); } public void testSocket_Block_ActionsAfterConnect() throws IOException { assertFalse(this.channel1.isConnected());// not connected assertTrue(this.channel1.connect(localAddr1)); assertTrue(this.channel1.isConnected()); Socket s = this.channel1.socket(); assertSocketAction_Block_AfterConnect(s); } public void testSocket_NonBlock_ActionsAfterConnectBeforeFinish() throws IOException { assertFalse(this.channel1.isConnected());// not connected this.channel1.configureBlocking(false); boolean connected = channel1.connect(localAddr1); if (!connected) { assertFalse(this.channel1.isConnected()); assertTrue(this.channel1.isConnectionPending()); Socket s1 = this.channel1.socket(); // Action of not connected assertSocketAction_NonBlock_BeforeConnect(s1); Socket s2 = this.channel1.socket(); // same assertSame(s1, s2); } } public void testSocket_NonBlock_ActionsAfterConnectAfterFinish() throws Exception { assertFalse(this.channel1.isConnected());// not connected this.channel1.configureBlocking(false); channel1.connect(localAddr1); if (tryFinish()) { Socket s1 = this.channel1.socket(); assertSocketAction_NonBlock_AfterConnect(s1); Socket s2 = this.channel1.socket(); // same assertSame(s1, s2); } } public void testSocket_getInetAddress() throws Exception { Socket socket = channel1.socket(); assertNull(socket.getInetAddress()); channel1.connect(localAddr1); assertNotNull(socket.getInetAddress()); assertEquals(localAddr1.getAddress(), socket.getInetAddress()); } public void testSocket_getRemoteSocketAddress() throws Exception { Socket socket = channel1.socket(); assertNull(socket.getRemoteSocketAddress()); channel1.connect(localAddr1); assertNotNull(socket.getRemoteSocketAddress()); assertEquals(localAddr1, socket.getRemoteSocketAddress()); } public void testSocket_getPort() throws Exception { Socket socket = channel1.socket(); assertEquals(0, socket.getPort()); channel1.connect(localAddr1); assertEquals(localAddr1.getPort(), socket.getPort()); } public void testSocket_getLocalAddress() throws Exception { Socket socket = channel1.socket(); channel1.connect(localAddr1); assertNotNull(socket.getLocalSocketAddress()); } public void testSocket_getLocalSocketAddress() throws Exception { Socket socket = channel1.socket(); assertNull(socket.getLocalSocketAddress()); channel1.connect(localAddr1); assertNotNull(socket.getLocalSocketAddress()); } public void testSocket_getLocalPort() throws Exception { Socket socket = channel1.socket(); assertEquals(-1, socket.getLocalPort()); channel1.connect(localAddr1); assertTrue(-1 != socket.getLocalPort()); assertTrue(0 != socket.getLocalPort()); } public void testSocket_bind() throws Exception { Socket socket = channel1.socket(); socket.bind(new InetSocketAddress("127.0.0.1", 0)); assertEquals("127.0.0.1", socket.getLocalAddress().getHostAddress()); assertTrue(socket.getLocalPort() != -1); } private void assertSocketBeforeBind(Socket s) { assertFalse(s.isBound()); assertTrue(s.getLocalAddress().isAnyLocalAddress()); // RI fails here. RI returns 0 while spec says unbound socket should // return -1. assertEquals(-1, s.getLocalPort()); assertNull(s.getLocalSocketAddress()); } private void assertSocketAfterImplicitBind(Socket s) throws IOException { assertTrue(s.isBound()); assertTrue(s.getLocalAddress().isLoopbackAddress()); assertTrue(s.getLocalPort() > 0); InetSocketAddress localSocketAddress = (InetSocketAddress) s.getLocalSocketAddress(); assertTrue(localSocketAddress.getAddress().isLoopbackAddress()); assertEquals(s.getLocalPort(), localSocketAddress.getPort()); } private void assertSocketBeforeConnect(Socket s) throws IOException { assertFalse(s.isClosed()); assertFalse(s.isConnected()); assertFalse(s.getKeepAlive()); try { s.getInputStream(); fail("Should throw SocketException."); } catch (SocketException e) { // OK. } assertFalse(s.getOOBInline()); try { s.getOutputStream(); fail("Should throw SocketException."); } catch (SocketException e) { // OK. } assertEquals(-1, s.getSoLinger()); assertFalse(s.getTcpNoDelay()); assertFalse(s.isInputShutdown()); assertFalse(s.isOutputShutdown()); assertNull(s.getInetAddress()); assertFalse(s.getReuseAddress()); // not connected assertEquals(0, s.getPort()); assertTrue(s.getReceiveBufferSize() >= 8192); assertNull(s.getRemoteSocketAddress()); assertTrue(s.getSendBufferSize() >= 8192); assertEquals(0, s.getSoTimeout()); assertEquals(0, s.getTrafficClass()); } private void assertSocketAfterConnect(Socket s, InetSocketAddress address) throws IOException { assertTrue(s.isBound()); assertFalse(s.isClosed()); assertTrue(s.isConnected()); assertFalse(s.getKeepAlive()); assertNotNull(s.getInputStream()); assertNotNull(s.getOutputStream()); assertFalse(s.getOOBInline()); assertEquals(-1, s.getSoLinger()); assertFalse(s.getTcpNoDelay()); assertFalse(s.isInputShutdown()); assertFalse(s.isOutputShutdown()); assertSame(s.getInetAddress(), address.getAddress()); assertEquals(s.getLocalAddress(), this.localAddr1.getAddress()); assertEquals(s.getPort(), address.getPort()); assertNotNull(s.getLocalSocketAddress()); assertTrue(s.getReceiveBufferSize() >= 8192); assertEquals(s.getRemoteSocketAddress(), (SocketAddress) address); // assertFalse(s.getReuseAddress()); assertTrue(s.getSendBufferSize() >= 8192); assertEquals(0, s.getSoTimeout()); assertEquals(0, s.getTrafficClass()); } private void assertSocketAction_Block_BeforeConnect(Socket s) throws IOException { assertFalse(this.channel1.isConnected()); s.connect(localAddr2); assertTrue(this.channel1.isConnected()); assertTrue(s.isConnected()); assertSocketAfterConnect(s, localAddr2); try { s.bind(localAddr2); fail("Should throw AlreadyConnectedException"); } catch (AlreadyConnectedException e) { // OK. } s.close(); assertTrue(s.isClosed()); assertFalse(this.channel1.isOpen()); } private void assertSocketAction_NonBlock_BeforeConnect(Socket s) throws IOException { assertFalse(this.channel1.isConnected()); try { s.connect(localAddr2); fail("Should throw IllegalBlockingModeException"); } catch (IllegalBlockingModeException e1) { // OK. } if (this.channel1.isConnectionPending()) { try { s.bind(localAddr2); fail("Should throw ConnectionPendingException"); } catch (ConnectionPendingException e1) { // OK. } } else { try { s.bind(localAddr2); fail("Should throw BindException"); } catch (BindException e1) { // OK. } } assertFalse(this.channel1.isConnected()); assertFalse(s.isConnected()); s.close(); assertTrue(s.isClosed()); assertFalse(this.channel1.isOpen()); } private void assertSocketAction_Block_AfterConnect(Socket s) throws IOException { assertEquals(s.getPort(), localAddr1.getPort()); assertTrue(this.channel1.isConnected()); assertTrue(s.isConnected()); try { s.connect(localAddr2); fail("Should throw AlreadyConnectedException"); } catch (AlreadyConnectedException e) { // OK. } try { s.bind(localAddr2); fail("Should throw AlreadyConnectedException"); } catch (AlreadyConnectedException e) { // OK. } s.close(); assertTrue(s.isClosed()); assertFalse(this.channel1.isOpen()); } private void assertSocketAction_NonBlock_AfterConnect(Socket s) throws IOException { assertEquals(s.getPort(), localAddr1.getPort()); assertTrue(this.channel1.isConnected()); assertTrue(s.isConnected()); if (this.channel1.isConnectionPending()) { try { s.connect(localAddr2); fail("Should throw AlreadyConnectedException"); } catch (AlreadyConnectedException e) { // OK. } } else { try { s.connect(localAddr2); fail("Should throw IllegalBlockingModeException"); } catch (IllegalBlockingModeException e) { // OK. } } try { s.bind(localAddr2); fail("Should throw AlreadyConnectedException"); } catch (AlreadyConnectedException e) { // OK. } s.close(); assertTrue(s.isClosed()); assertFalse(this.channel1.isOpen()); } // ------------------------------------------------------------------- // Tests for connect(), finishConnect(),isConnected(),isConnectionPending() // These methods are very close, so we test them together, call them "CFII". // ------------------------------------------------------------------- /** * connect-->finish-->close */ public void testCFII_Norml_NoServer_Block() throws Exception { // ensure ensureServerClosed(); assertTrue(this.channel1.isBlocking()); statusNotConnected_NotPending(); // connect try { this.channel1.connect(localAddr1); fail("Should throw a ConnectException here."); } catch (ConnectException e) { // OK. } statusChannelClosed(); try { this.channel1.finishConnect(); fail("Should throw a ClosedChannelException here."); } catch (ClosedChannelException e) { // OK. } } /** * connect-->finish-->close */ public void testCFII_Norml_NoServer_NonBlock() throws Exception { connectNoServerNonBlock(); this.channel1.close(); statusChannelClosed(); } /** * connect-->finish-->close */ public void testCFII_Norml_Server_Block() throws Exception { connectServerBlock(); this.channel1.close(); statusChannelClosed(); } /** * connect-->finish-->close */ public void testCFII_Norml_Server_NonBlock() throws Exception { connectServerNonBlock(); this.channel1.close(); statusChannelClosed(); } /** * connect-->server closed-->finish-->close */ public void testCFII_ServerClosed_Block() throws Exception { // ensure ensureServerOpen(); assertTrue(this.channel1.isBlocking()); statusNotConnected_NotPending(); // connect assertTrue(this.channel1.connect(localAddr1)); statusConnected_NotPending(); ensureServerClosed(); tryFinish(); this.channel1.close(); statusChannelClosed(); } /** * connect-->server closed-->finish-->close */ public void testCFII_ServerClosed_NonBlock() throws Exception { // ensure ensureServerOpen(); this.channel1.configureBlocking(false); statusNotConnected_NotPending(); // connect boolean connected = channel1.connect(localAddr1); if (!connected) { statusNotConnected_Pending(); } ensureServerClosed(); tryFinish(); this.channel1.close(); statusChannelClosed(); } /** * connect-->finish-->server closed-->close */ public void testCFII_ServerClosedAfterFinish_Block() throws Exception { connectServerBlock(); ensureServerClosed(); assertTrue(this.channel1.isOpen()); this.channel1.close(); statusChannelClosed(); } /** * connect-->finish-->server closed-->close */ public void testCFII_ServerClosedAfterFinish_NonBlock() throws Exception { connectServerNonBlock(); ensureServerClosed(); assertTrue(this.channel1.isOpen()); this.channel1.close(); statusChannelClosed(); } /** * no server-->connect-->server open-->finish-->close */ public void testCFII_ServerStartLater_Block() throws Exception { // ensure ensureServerClosed(); assertTrue(this.channel1.isBlocking()); statusNotConnected_NotPending(); // connect try { this.channel1.connect(localAddr1); fail("Should throw a ConnectException here."); } catch (ConnectException e) { // OK. } statusChannelClosed(); ensureServerOpen(); try { this.channel1.finishConnect(); fail("Should throw a ClosedChannelException here."); } catch (ClosedChannelException e) { // OK. } } /** * no server-->connect-->server open-->finish-->close */ public void testCFII_ServerStartLater_NonBlock() throws Exception { // ensure ensureServerClosed(); this.channel1.configureBlocking(false); statusNotConnected_NotPending(); // connect assertFalse(this.channel1.connect(localAddr1)); statusNotConnected_Pending(); ensureServerOpen(); try { assertFalse(this.channel1.finishConnect()); statusNotConnected_Pending(); this.channel1.close(); } catch (ConnectException e) { // FIXME: assertEquals(e.getMessage(), "Connection refused"); } } /** * connect-->finish-->finish-->close */ public void testCFII_FinishTwice_NoServer_NonBlock() throws Exception { // ensure ensureServerClosed(); this.channel1.configureBlocking(false); statusNotConnected_NotPending(); // connect assertFalse(this.channel1.connect(localAddr1)); statusNotConnected_Pending(); try { assertFalse(this.channel1.finishConnect()); statusNotConnected_Pending(); assertFalse(this.channel1.finishConnect()); statusNotConnected_Pending(); this.channel1.close(); } catch (ConnectException e) { // FIXME: assertEquals(e.getMessage(), "Connection refused"); } statusChannelClosed(); } /** * connect-->finish-->finish-->close */ public void testCFII_FinishTwice_Server_Block() throws Exception { connectServerBlock(); tryFinish(); this.channel1.close(); statusChannelClosed(); } /** * connect-->finish-->finish-->close */ public void testCFII_FinishTwice_Server_NonBlock() throws Exception { connectServerNonBlock(); tryFinish(); this.channel1.close(); statusChannelClosed(); } /** * connect-->finish-->connect-->close */ public void testCFII_ConnectAfterFinish_NoServer_Block() throws Exception { // ensure ensureServerClosed(); assertTrue(this.channel1.isBlocking()); statusNotConnected_NotPending(); // connect try { this.channel1.connect(localAddr1); fail("Should throw a ConnectException here."); } catch (ConnectException e) { // OK. } statusChannelClosed(); try { this.channel1.finishConnect(); fail("Should throw a ClosedChannelException here."); } catch (ClosedChannelException e) { // OK. } statusChannelClosed(); try { this.channel1.connect(localAddr1); fail("Should throw a ClosedChannelException here."); } catch (ClosedChannelException e) { // OK. } statusChannelClosed(); } /** * connect-->finish-->connect-->close */ public void testCFII_ConnectAfterFinish_NoServer_NonBlock() throws Exception { // ensure ensureServerClosed(); this.channel1.configureBlocking(false); statusNotConnected_NotPending(); // connect assertFalse(this.channel1.connect(localAddr1)); statusNotConnected_Pending(); try { assertFalse(this.channel1.finishConnect()); statusNotConnected_Pending(); } catch (ConnectException e) { // FIXME: assertEquals(e.getMessage(), "Connection refused"); } if (this.channel1.isOpen()) { try { this.channel1.connect(localAddr1); fail("Should throw a ConnectionPendingException here."); } catch (ConnectionPendingException e) { // OK. } statusNotConnected_Pending(); // connect another addr try { this.channel1.connect(localAddr2); fail("Should throw a ConnectionPendingException here."); } catch (ConnectionPendingException e) { // OK. } statusNotConnected_Pending(); // connect if server closed ensureServerClosed(); try { this.channel1.connect(localAddr1); fail("Should throw a ConnectionPendingException here."); } catch (ConnectionPendingException e) { // OK. } statusNotConnected_Pending(); this.channel1.close(); } statusChannelClosed(); } /** * connect-->finish-->connect-->close */ public void testCFII_ConnectAfterFinish_Server_Block() throws Exception { connectServerBlock(); if (!this.channel1.isConnected()) { System.err .println("Connection fail, testCFII_ConnectAfterFinish_Server_Block is not finished."); return; } try { this.channel1.connect(localAddr1); fail("Should throw an AlreadyConnectedException here."); } catch (AlreadyConnectedException e) { // OK. } statusConnected_NotPending(); // connect another addr try { this.channel1.connect(localAddr2); fail("Should throw an AlreadyConnectedException here."); } catch (AlreadyConnectedException e) { // OK. } statusConnected_NotPending(); // connect if server closed ensureServerClosed(); try { this.channel1.connect(localAddr1); fail("Should throw an AlreadyConnectedException here."); } catch (AlreadyConnectedException e) { // OK. } statusConnected_NotPending(); this.channel1.close(); statusChannelClosed(); } /** * connect-->finish-->connect-->close */ public void testCFII_ConnectAfterFinish_Server_NonBlock() throws Exception { connectServerNonBlock(); if (!this.channel1.isConnected()) { System.err .println("Connection fail, testCFII_ConnectAfterFinish_Server_Block is not finished."); return; } try { this.channel1.connect(localAddr1); fail("Should throw an AlreadyConnectedException or a ConnectionPendingException here."); } catch (AlreadyConnectedException e) { // OK. } statusConnected_NotPending(); // connect another addr try { this.channel1.connect(localAddr2); fail("Should throw an AlreadyConnectedException here."); } catch (AlreadyConnectedException e) { // OK. } statusConnected_NotPending(); // connect if server closed ensureServerClosed(); try { this.channel1.connect(localAddr1); fail("Should throw an AlreadyConnectedException here."); } catch (AlreadyConnectedException e) { // OK. } statusConnected_NotPending(); this.channel1.close(); statusChannelClosed(); } /** * connect-->connect-->finish-->close */ public void testCFII_ConnectTwice_NoServer_NonBlock() throws Exception { // ensure ensureServerClosed(); this.channel1.configureBlocking(false); statusNotConnected_NotPending(); // connect assertFalse(this.channel1.connect(localAddr1)); statusNotConnected_Pending(); try { this.channel1.connect(localAddr1); fail("Should throw a ConnectionPendingException here."); } catch (ConnectionPendingException e) { // OK. } statusNotConnected_Pending(); // connect another addr try { this.channel1.connect(localAddr2); fail("Should throw a ConnectionPendingException here."); } catch (ConnectionPendingException e) { // OK. } statusNotConnected_Pending(); // connect if server closed ensureServerClosed(); try { this.channel1.connect(localAddr1); fail("Should throw a ConnectionPendingException here."); } catch (ConnectionPendingException e) { // OK. } statusNotConnected_Pending(); try { assertFalse(this.channel1.finishConnect()); statusNotConnected_Pending(); this.channel1.close(); } catch (ConnectException e) { // FIXME: assertEquals(e.getMessage(), "Connection refused"); } statusChannelClosed(); } /** * connect-->connect-->finish-->close */ public void testCFII_ConnectTwice_Server_Block() throws Exception { // ensure ensureServerOpen(); assertTrue(this.channel1.isBlocking()); statusNotConnected_NotPending(); // connect assertTrue(this.channel1.connect(localAddr1)); statusConnected_NotPending(); try { this.channel1.connect(localAddr1); fail("Should throw an AlreadyConnectedException here."); } catch (AlreadyConnectedException e) { // OK. } statusConnected_NotPending(); // connect another addr try { this.channel1.connect(localAddr2); fail("Should throw an AlreadyConnectedException here."); } catch (AlreadyConnectedException e) { // OK. } statusConnected_NotPending(); // connect if server closed ensureServerClosed(); try { this.channel1.connect(localAddr1); fail("Should throw an AlreadyConnectedException here."); } catch (AlreadyConnectedException e) { // OK. } statusConnected_NotPending(); tryFinish(); this.channel1.close(); statusChannelClosed(); } /** * connect-->connect-->finish-->close */ public void testCFII_ConnectTwice_Server_NonBlock() throws Exception { // ensure ensureServerOpen(); this.channel1.configureBlocking(false); statusNotConnected_NotPending(); // connect boolean connected = channel1.connect(localAddr1); if (!connected) { statusNotConnected_Pending(); try { this.channel1.connect(localAddr1); fail("Should throw a ConnectionPendingException here."); } catch (ConnectionPendingException e) { // OK. } statusNotConnected_Pending(); // connect another addr try { this.channel1.connect(localAddr2); fail("Should throw a ConnectionPendingException here."); } catch (ConnectionPendingException e) { // OK. } statusNotConnected_Pending(); // connect if server closed ensureServerClosed(); try { this.channel1.connect(localAddr1); fail("Should throw a ConnectionPendingException here."); } catch (ConnectionPendingException e) { // OK. } statusNotConnected_Pending(); } tryFinish(); this.channel1.close(); statusChannelClosed(); } /** * finish-->connect-->finish-->close */ public void testCFII_FinishFirst_NoServer_Block() throws Exception { // ensure ensureServerClosed(); assertTrue(this.channel1.isBlocking()); statusNotConnected_NotPending(); // finish try { this.channel1.finishConnect(); fail("Should throw NoConnectionPendingException"); } catch (NoConnectionPendingException e) { // OK. } statusNotConnected_NotPending(); // connect try { this.channel1.connect(localAddr1); fail("Should throw a ConnectException here."); } catch (ConnectException e) { // OK. } statusChannelClosed(); try { this.channel1.finishConnect(); fail("Should throw a ClosedChannelException here."); } catch (ClosedChannelException e) { // OK. } statusChannelClosed(); } /** * finish-->connect-->finish-->close */ public void testCFII_FinishFirst_NoServer_NonBlock() throws Exception { // ensure ensureServerClosed(); this.channel1.configureBlocking(false); statusNotConnected_NotPending(); // finish try { this.channel1.finishConnect(); fail("Should throw NoConnectionPendingException"); } catch (NoConnectionPendingException e) { // OK. } statusNotConnected_NotPending(); // connect assertFalse(this.channel1.connect(localAddr1)); statusNotConnected_Pending(); try { assertFalse(this.channel1.finishConnect()); statusNotConnected_Pending(); this.channel1.close(); } catch (ConnectException e) { // FIXME: assertEquals(e.getMessage(), "Connection refused"); } statusChannelClosed(); } /** * finish-->connect-->finish-->close */ public void testCFII_FinishFirst_Server_Block() throws Exception { // ensure ensureServerOpen(); assertTrue(this.channel1.isBlocking()); statusNotConnected_NotPending(); // finish try { this.channel1.finishConnect(); fail("Should throw NoConnectionPendingException"); } catch (NoConnectionPendingException e) { // OK. } statusNotConnected_NotPending(); // connect assertTrue(this.channel1.connect(localAddr1)); statusConnected_NotPending(); tryFinish(); this.channel1.close(); statusChannelClosed(); } /** * finish-->connect-->finish-->close */ public void testCFII_FinishFirst_Server_NonBlock() throws Exception { // ensure ensureServerOpen(); this.channel1.configureBlocking(false); statusNotConnected_NotPending(); // finish try { this.channel1.finishConnect(); fail("Should throw NoConnectionPendingException"); } catch (NoConnectionPendingException e) { // OK. } statusNotConnected_NotPending(); // connect boolean connected = channel1.connect(localAddr1); if (!connected) { statusNotConnected_Pending(); } tryFinish(); this.channel1.close(); statusChannelClosed(); } public void testCFII_Null() throws Exception { statusNotConnected_NotPending(); try { this.channel1.connect(null); fail("Should throw an IllegalArgumentException here."); } catch (IllegalArgumentException e) { // OK. } } public void testCFII_UnsupportedType() throws Exception { class SubSocketAddress extends SocketAddress { private static final long serialVersionUID = 1L; //empty public SubSocketAddress() { super(); } } statusNotConnected_NotPending(); SocketAddress newTypeAddress = new SubSocketAddress(); try { this.channel1.connect(newTypeAddress); fail("Should throw an UnsupportedAddressTypeException here."); } catch (UnsupportedAddressTypeException e) { // OK. } } public void testCFII_Unresolved() throws IOException { statusNotConnected_NotPending(); InetSocketAddress unresolved = new InetSocketAddress( "unresolved address", 1080); try { this.channel1.connect(unresolved); fail("Should throw an UnresolvedAddressException here."); } catch (UnresolvedAddressException e) { // OK. } } public void testCFII_EmptyHost() throws Exception { statusNotConnected_NotPending(); ServerSocket server = new ServerSocket(0); int port = server.getLocalPort(); server.close(); try { this.channel1.connect(new InetSocketAddress("", port)); fail("Should throw ConnectException"); } catch (ConnectException e) { // correct } } public void testCFII_CloseFirst() throws Exception { this.channel1.close(); statusChannelClosed(); ensureServerOpen(); try { this.channel1.connect(localAddr1); fail("Should throw ClosedChannelException."); } catch (ClosedChannelException e) { // OK. } statusChannelClosed(); try { this.channel1.finishConnect(); fail("Should throw ClosedChannelException."); } catch (ClosedChannelException e) { // OK. } statusChannelClosed(); try { this.channel1.configureBlocking(false); fail("Should throw ClosedChannelException."); } catch (ClosedChannelException e) { // OK. } statusChannelClosed(); } public void testCFII_StatusAfterFinish() throws Exception { // 1. close server, finish must return false, check the status ensureServerClosed(); // 1.1 block mode assertTrue(this.channel1.isBlocking()); try { channel1.connect(localAddr1); fail("Should throw ConnectException"); } catch (ConnectException e) { // OK. } assertFalse(this.channel1.isOpen()); assertFalse(this.channel1.isOpen()); assertTrue(this.channel1.isBlocking()); assertFalse(this.channel1.isConnectionPending()); // 1.2 non block mode this.channel1 = SocketChannel.open(); this.channel1.configureBlocking(false); assertFalse(this.channel1.connect(localAddr1)); try { assertFalse(this.channel1.finishConnect()); statusNotConnected_Pending(); this.channel1.close(); } catch (ConnectException e) { System.out.println(e.getMessage()); } // 2. start server, finish usually return true, check the status ensureServerOpen(); // 2.1 block mode this.channel1 = SocketChannel.open(); assertTrue(this.channel1.isBlocking()); assertTrue(this.channel1.connect(localAddr1)); assertTrue(this.channel1.finishConnect()); statusConnected_NotPending(); this.channel1.close(); // 2.2 non block mode this.channel1 = SocketChannel.open(); this.channel1.configureBlocking(false); assertFalse(this.channel1.connect(localAddr1)); tryFinish(); this.channel1.close(); } private void ensureServerClosed() throws IOException { if (null != this.server1) { this.server1.close(); assertTrue(this.server1.isClosed()); } if (null != this.server2) { this.server2.close(); assertTrue(this.server2.isClosed()); } } private void ensureServerOpen() throws IOException { ensureServerClosed(); this.server1 = new ServerSocket(0); this.localAddr1 = new InetSocketAddress("127.0.0.1", server1.getLocalPort()); this.server2 = new ServerSocket(0); this.localAddr2 = new InetSocketAddress("127.0.0.1", server2.getLocalPort()); assertTrue(this.server1.isBound()); assertTrue(this.server2.isBound()); } private void connectNoServerNonBlock() throws Exception { // ensure ensureServerClosed(); this.channel1.configureBlocking(false); statusNotConnected_NotPending(); // connect assertFalse(this.channel1.connect(localAddr1)); statusNotConnected_Pending(); try { assertFalse(this.channel1.finishConnect()); statusNotConnected_Pending(); } catch (ConnectException e) { // FIXME: assertEquals(e.getMessage(), "Connection refused"); } } private void connectServerNonBlock() throws Exception { // ensure ensureServerOpen(); this.channel1.configureBlocking(false); statusNotConnected_NotPending(); // connect boolean connected = channel1.connect(localAddr1); if (!connected) { statusNotConnected_Pending(); } tryFinish(); } private void connectServerBlock() throws Exception { // ensure ensureServerOpen(); assertTrue(this.channel1.isBlocking()); statusNotConnected_NotPending(); // connect assertTrue(this.channel1.connect(localAddr1)); statusConnected_NotPending(); tryFinish(); } private void statusChannelClosed() { assertFalse(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertFalse(this.channel1.isOpen()); } private void statusNotConnected_NotPending() { assertFalse(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); } private void statusNotConnected_Pending() { assertFalse(this.channel1.isConnected()); assertTrue(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); } private void statusConnected_NotPending() { assertTrue(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); } private boolean tryFinish() throws IOException { /* * the result of finish will be asserted in multi-thread tests. */ boolean connected = false; assertTrue(this.channel1.isOpen()); try { connected = this.channel1.finishConnect(); } catch (SocketException e) { // Finish connection failed, probably due to reset by peer error. } if (connected) { statusConnected_NotPending(); } return connected; } // ------------------------------------------------------------------- // Original tests. Test method for CFII with real data. // ------------------------------------------------------------------- /** * * 'SocketChannelImpl.connect(SocketAddress)' */ public void testCFII_Data_ConnectWithServer() throws Exception { ensureServerOpen(); java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer .allocate(CAPACITY_NORMAL); java.nio.ByteBuffer[] writeBufArr = new java.nio.ByteBuffer[1]; writeBufArr[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL); assertFalse(this.channel1.isRegistered()); assertTrue(this.channel1.isBlocking()); this.channel1.connect(localAddr1); assertTrue(this.channel1.isBlocking()); assertTrue(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf)); assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBufArr, 0, 1)); this.channel1.configureBlocking(false); try { this.channel1.connect(localAddr1); fail("Should throw AlreadyConnectedException"); } catch (AlreadyConnectedException e) { // correct } assertFalse(this.channel1.isRegistered()); tryFinish(); } /* * Test method for 'SocketChannelImpl.connect(SocketAddress)' */ public void testCFII_Data_ConnectWithServer_nonBlocking() throws Exception { ensureServerOpen(); java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer .allocate(CAPACITY_NORMAL); java.nio.ByteBuffer[] writeBufArr = new java.nio.ByteBuffer[1]; writeBufArr[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL); assertFalse(this.channel1.isRegistered()); assertTrue(this.channel1.isBlocking()); this.channel1.configureBlocking(false); this.channel1.connect(localAddr1); assertFalse(this.channel1.isBlocking()); boolean connected = channel1.isConnected(); if (!connected) { assertTrue(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); } if (tryFinish()) { assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf)); assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBufArr, 0, 1)); this.channel1.configureBlocking(false); try { this.channel1.connect(localAddr1); fail("Should throw AlreadyConnectedException"); } catch (AlreadyConnectedException e) { // correct } } assertFalse(this.channel1.isRegistered()); tryFinish(); } /* * Test method for 'SocketChannelImpl.finishConnect()' */ public void testCFII_Data_FinishConnect_nonBlocking() throws IOException { ensureServerOpen(); java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer .allocate(CAPACITY_NORMAL); java.nio.ByteBuffer[] writeBufArr = new java.nio.ByteBuffer[1]; writeBufArr[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL); this.channel1.configureBlocking(false); try { this.channel1.finishConnect(); fail("Should throw NoConnectionPendingException"); } catch (NoConnectionPendingException e) { // correct } boolean connected = channel1.connect(localAddr1); if (!connected) { assertFalse(this.channel1.isBlocking()); assertFalse(this.channel1.isConnected()); assertTrue(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); } this.server1.accept(); if (tryFinish()) { assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf)); assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBufArr, 0, 1)); try { this.channel1.connect(localAddr1); fail("Should throw AlreadyConnectedException"); } catch (AlreadyConnectedException e) { // correct } } assertFalse(this.channel1.isRegistered()); tryFinish(); } public void testCFII_Data_FinishConnect_AddrSetServerStartLater() throws IOException, InterruptedException { ensureServerClosed(); this.channel1.configureBlocking(false); try { SocketChannel.open(localAddr1); fail("Should throw ConnectException"); } catch (ConnectException e) { // correct } assertTrue(this.channel1.isOpen()); assertFalse(this.channel1.isBlocking()); assertFalse(this.channel1.isConnectionPending()); this.channel1.configureBlocking(true); try { this.channel1.finishConnect(); fail("Should throw NoConnectionPendingException"); } catch (NoConnectionPendingException e) { // correct } try { this.channel1.connect(localAddr2); fail("Should throw ConnectException"); } catch (ConnectException e) { // correct } assertTrue(this.channel1.isBlocking()); try { this.channel1.finishConnect(); fail("Should throw ClosedChannelException"); } catch (ClosedChannelException e) { // correct } assertFalse(this.channel1.isConnected()); // finish after finish OK assertFalse(this.channel1.isConnectionPending()); this.channel1 = SocketChannel.open(); this.channel1.configureBlocking(false); this.channel1.connect(localAddr1); assertFalse(this.channel1.isConnected()); ensureServerOpen(); // cannot connect? try { assertFalse(this.channel1.finishConnect()); assertFalse(this.channel1.isBlocking()); assertFalse(this.channel1.isConnected()); assertTrue(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); try { this.channel1.connect(localAddr1); fail("Should throw ConnectionPendingException"); } catch (ConnectionPendingException e) { // correct } this.channel1.configureBlocking(true); try { this.channel1.connect(localAddr1); fail("Should throw ConnectionPendingException"); } catch (ConnectionPendingException e) { // correct } tryFinish(); } catch (ConnectException e) { // FIXME: assertEquals(e.getMessage(), "Connection refused"); } } public void testCFII_Data_FinishConnect_ServerStartLater() throws IOException { ensureServerClosed(); this.channel1.configureBlocking(true); try { this.channel1.finishConnect(); fail("Should throw NoConnectionPendingException"); } catch (NoConnectionPendingException e) { // correct } try { this.channel1.connect(localAddr1); fail("Should throw ConnectException"); } catch (ConnectException e) { // correct } try { this.channel1.finishConnect(); fail("Should throw ClosedChannelException"); } catch (ClosedChannelException e) { // correct } assertFalse(this.channel1.isConnected()); // finish after finish OK assertFalse(this.channel1.isConnectionPending()); this.channel1 = SocketChannel.open(); this.channel1.configureBlocking(false); this.channel1.connect(localAddr1); assertFalse(this.channel1.isConnected()); ensureServerOpen(); // cannot connect? try { assertFalse(this.channel1.finishConnect()); assertFalse(this.channel1.isBlocking()); assertFalse(this.channel1.isConnected()); assertTrue(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); try { this.channel1.connect(localAddr1); fail("Should throw ConnectionPendingException"); } catch (ConnectionPendingException e) { // correct } this.channel1.configureBlocking(true); try { this.channel1.connect(localAddr1); fail("Should throw ConnectionPendingException"); } catch (ConnectionPendingException e) { // correct } tryFinish(); } catch (ConnectException e) { // FIXME: assertEquals(e.getMessage(), "Connection refused"); } } public void testCFII_Data_FinishConnect_Blocking() throws IOException { ensureServerOpen(); java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer .allocate(CAPACITY_NORMAL); java.nio.ByteBuffer[] writeBufArr = new java.nio.ByteBuffer[1]; writeBufArr[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL); this.channel1.configureBlocking(true); try { this.channel1.finishConnect(); fail("Should throw NoConnectionPendingException"); } catch (NoConnectionPendingException e) { // correct } this.channel1.connect(localAddr1); assertTrue(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); if (tryFinish()) { assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf)); assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBufArr, 0, 1)); try { this.channel1.connect(localAddr1); fail("Should throw AlreadyConnectedException"); } catch (AlreadyConnectedException e) { // correct } } assertFalse(this.channel1.isRegistered()); tryFinish(); } /** * Regression test for Harmony-1947. */ public void test_finishConnect() throws Exception { SocketAddress address = new InetSocketAddress("localhost", 0); ServerSocketChannel theServerChannel = ServerSocketChannel.open(); ServerSocket serversocket = theServerChannel.socket(); serversocket.setReuseAddress(true); // Bind the socket theServerChannel.socket().bind(address); boolean doneNonBlockingConnect = false; // Loop so that we make sure we're definitely testing finishConnect() while (!doneNonBlockingConnect) { channel1 = SocketChannel.open(); // Set the SocketChannel to non-blocking so that connect(..) does // not block channel1.configureBlocking(false); boolean connected = channel1.connect(new InetSocketAddress("localhost",serversocket.getLocalPort())); if (!connected) { // Now set the SocketChannel back to blocking so that // finishConnect() blocks. channel1.configureBlocking(true); doneNonBlockingConnect = channel1.finishConnect(); } if (doneNonBlockingConnect) { tryFinish(); } channel1.close(); } if (!serversocket.isClosed()) { serversocket.close(); } } // ------------------------------------------------------------------- // End of original tests. Test method for CFII with real data. // ------------------------------------------------------------------- /** * @tests java.nio.channels.SocketChannel#read(ByteBuffer) */ public void test_readLjava_nio_ByteBuffer_Blocking() throws IOException { // initialize write content byte[] writeContent = new byte[CAPACITY_NORMAL]; for (int i = 0; i < writeContent.length; i++) { writeContent[i] = (byte) i; } // establish connection channel1.connect(localAddr1); Socket acceptedSocket = server1.accept(); // use OutputStream.write to send CAPACITY_NORMAL bytes data OutputStream out = acceptedSocket.getOutputStream(); out.write(writeContent); // use close to guarantee all data is sent acceptedSocket.close(); ByteBuffer readContent = ByteBuffer.allocate(CAPACITY_NORMAL + 1); int totalCount = 0; int count; long startTime = System.currentTimeMillis(); // use SocketChannel.read to read data while (totalCount <= CAPACITY_NORMAL) { count = channel1.read(readContent); if (EOF == count) { break; } totalCount += count; // if the channel could not finish reading in TIMEOUT ms, the // test fails. It is used to guarantee the test never hangs even // if there are bugs of SocketChannel implementation. For // blocking read, it possibly returns 0 in some cases. assertTimeout(startTime, TIMEOUT); } assertEquals(CAPACITY_NORMAL, totalCount); readContent.flip(); for (int i = 0; i < CAPACITY_NORMAL; i++) { assertEquals(writeContent[i], readContent.get()); } } /** * @tests java.nio.channels.SocketChannel#read(ByteBuffer) */ public void test_readLjava_nio_ByteBuffer_Nonblocking() throws IOException { // initialize write content byte[] writeContent = new byte[CAPACITY_NORMAL]; for (int i = 0; i < writeContent.length; i++) { writeContent[i] = (byte) i; } // establish connection channel1.connect(localAddr1); Socket acceptedSocket = server1.accept(); // use OutputStream.write to write CAPACITY_NORMAL bytes data. OutputStream out = acceptedSocket.getOutputStream(); out.write(writeContent); // use close to guarantee all data is sent acceptedSocket.close(); channel1.configureBlocking(false); ByteBuffer readContent = ByteBuffer.allocate(CAPACITY_NORMAL + 1); int totalCount = 0; int count; long startTime = System.currentTimeMillis(); // use SocketChannel.read to read data while (totalCount <= CAPACITY_NORMAL) { count = channel1.read(readContent); if (EOF == count) { break; } totalCount += count; // if the channel could not finish reading in TIMEOUT ms, the // test fails. It is used to guarantee the test never hangs even // if there are bugs of SocketChannel implementation. assertTimeout(startTime, TIMEOUT); } // assert read content assertEquals(CAPACITY_NORMAL, totalCount); assertEquals(CAPACITY_NORMAL, readContent.position()); readContent.flip(); for (int i = 0; i < CAPACITY_NORMAL; i++) { assertEquals(writeContent[i], readContent.get()); } } /** * @tests java.nio.channels.SocketChannel#write(ByteBuffer) */ public void test_writeLjava_nio_ByteBuffer_Blocking() throws IOException { // initialize write content ByteBuffer writeContent = ByteBuffer.allocate(CAPACITY_NORMAL); for (int i = 0; i < CAPACITY_NORMAL; i++) { writeContent.put((byte) i); } writeContent.flip(); // establish connection channel1.connect(localAddr1); Socket acceptedSocket = server1.accept(); // use SocketChannel.write(ByteBuffer) to write CAPACITY_NORMAL bytes // data int writtenCount = channel1.write(writeContent); // assert written count and ByteBuffer position assertEquals(CAPACITY_NORMAL, writtenCount); assertEquals(CAPACITY_NORMAL, writeContent.position()); // use close to guarantee all data is sent channel1.close(); InputStream in = acceptedSocket.getInputStream(); int totalCount = 0; int count = 0; byte[] readContent = new byte[CAPACITY_NORMAL + 1]; // if the channel could not finish reading in TIMEOUT ms, the test // fails. It is used to guarantee the test never hangs even if there // are bugs of SocketChannel implementation. acceptedSocket.setSoTimeout(TIMEOUT); // use InputStream.read to read data. while (totalCount <= CAPACITY_NORMAL) { count = in.read(readContent, totalCount, readContent.length - totalCount); if (EOF == count) { break; } totalCount += count; } // assert read content assertEquals(CAPACITY_NORMAL, totalCount); writeContent.flip(); for (int i = 0; i < CAPACITY_NORMAL; i++) { assertEquals(writeContent.get(), readContent[i]); } } /** * @tests java.nio.channels.SocketChannel#write(ByteBuffer) */ public void test_writeLjava_nio_ByteBuffer_NonBlocking() throws Exception { // initialize write content ByteBuffer writeContent = ByteBuffer.allocate(CAPACITY_NORMAL); for (int i = 0; i < CAPACITY_NORMAL; i++) { writeContent.put((byte) i); } writeContent.flip(); // establish connection channel1.connect(localAddr1); Socket acceptedSocket = server1.accept(); channel1.configureBlocking(false); int writtenTotalCount = 0; int writtenCount = 0; long startTime = System.currentTimeMillis(); // use SocketChannel.write(ByteBuffer) to write CAPACITY_NORMAL bytes while (writtenTotalCount < CAPACITY_NORMAL) { writtenCount = channel1.write(writeContent); writtenTotalCount += writtenCount; // if the channel could not finish writing in TIMEOUT ms, the // test fails. It is used to guarantee the test never hangs even // if there are bugs of SocketChannel implementation. assertTimeout(startTime, TIMEOUT); } // assert written count and ByteBuffer position assertEquals(CAPACITY_NORMAL, writtenTotalCount); assertEquals(CAPACITY_NORMAL, writeContent.position()); // use close to guarantee all data is sent channel1.close(); InputStream in = acceptedSocket.getInputStream(); byte[] readContent = new byte[CAPACITY_NORMAL + 1]; int totalCount = 0; int count = 0; // if the channel could not finish reading in TIMEOUT ms, the test // fails. It is used to guarantee the test never hangs even if there // are bugs of SocketChannel implementation. acceptedSocket.setSoTimeout(TIMEOUT); // use InputStream.read to read data. while (totalCount <= CAPACITY_NORMAL) { count = in.read(readContent, totalCount, readContent.length - totalCount); if (EOF == count) { break; } totalCount += count; } // assert read content assertEquals(CAPACITY_NORMAL, totalCount); writeContent.flip(); for (int i = 0; i < CAPACITY_NORMAL; i++) { assertEquals(writeContent.get(), readContent[i]); } } /* * Fails if the difference between current time and start time is greater * than timeout. */ private void assertTimeout(long startTime, long timeout) { long currentTime = System.currentTimeMillis(); if ((currentTime - startTime) > timeout) { fail("Timeout"); } } // ------------------------------------------------- // Test for read/write but no real data expressed // ------------------------------------------------- public void testReadByteBuffer() throws Exception { assertTrue(this.server1.isBound()); java.nio.ByteBuffer readBuf = java.nio.ByteBuffer .allocate(CAPACITY_NORMAL); assertFalse(this.channel1.isRegistered()); assertTrue(this.channel1.isBlocking()); assertFalse(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); // note: blocking-mode will make the read process endless! this.channel1.configureBlocking(false); try { channel1.read(readBuf); fail("Should throw NotYetConnectedException"); } catch (NotYetConnectedException e) { // correct } boolean connected = this.channel1.connect(localAddr1); if (!connected) { assertFalse(this.channel1.isBlocking()); assertTrue(this.channel1.isConnectionPending()); assertFalse(this.channel1.isConnected()); } if (tryFinish()) { assertEquals(0, this.channel1.read(readBuf)); } this.channel1.close(); try { channel1.read(readBuf); fail("Should throw ClosedChannelException"); } catch (ClosedChannelException e) { // correct } } public void testReadByteBuffer_Direct() throws Exception { assertTrue(this.server1.isBound()); java.nio.ByteBuffer readBuf = java.nio.ByteBuffer .allocateDirect(CAPACITY_NORMAL); assertFalse(this.channel1.isRegistered()); assertTrue(this.channel1.isBlocking()); assertFalse(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); // note: blocking-mode will make the read process endless! this.channel1.configureBlocking(false); try { channel1.read(readBuf); fail("Should throw NotYetConnectedException"); } catch (NotYetConnectedException e) { // correct } boolean connected = this.channel1.connect(localAddr1); if (!connected) { assertFalse(this.channel1.isBlocking()); assertTrue(this.channel1.isConnectionPending()); assertFalse(this.channel1.isConnected()); } if (tryFinish()) { assertEquals(0, this.channel1.read(readBuf)); } this.channel1.close(); try { channel1.read(readBuf); fail("Should throw ClosedChannelException"); } catch (ClosedChannelException e) { // correct } } public void testReadByteBuffer_Direct2() throws IOException { byte[] request = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; ByteBuffer buffer = ByteBuffer.allocateDirect(128); ServerSocketChannel server = ServerSocketChannel.open(); server.socket().bind(new InetSocketAddress(InetAddress.getLocalHost(), 0), 5); Socket client = new Socket(InetAddress.getLocalHost(), server.socket() .getLocalPort()); client.setTcpNoDelay(false); Socket worker = server.socket().accept(); SocketChannel workerChannel = worker.getChannel(); OutputStream out = client.getOutputStream(); out.write(request); out.close(); buffer.limit(5); int bytesRead = workerChannel.read(buffer); assertEquals(5, bytesRead); assertEquals(5, buffer.position()); buffer.limit(request.length); bytesRead = workerChannel.read(buffer); assertEquals(6, bytesRead); buffer.flip(); assertEquals(request.length, buffer.limit()); assertEquals(ByteBuffer.wrap(request), buffer); client.close(); worker.close(); server.close(); } public void testReadByteBuffer_BufNull() throws Exception { assertTrue(this.server1.isBound()); java.nio.ByteBuffer readBuf = java.nio.ByteBuffer.allocate(0); // note: blocking-mode will make the read process endless! this.channel1.configureBlocking(false); try { channel1.read((java.nio.ByteBuffer) null); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } this.channel1.connect(localAddr1); if (tryFinish()) { try { this.channel1.read((java.nio.ByteBuffer) null); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } assertEquals(0, this.channel1.read(readBuf)); } this.server1.close(); try { channel1.read((java.nio.ByteBuffer) null); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } } /* * SocketChannelImpl.read(ByteBuffer[], int, int)' */ public void testReadByteBufferArrayIntInt() throws Exception { assertTrue(this.server1.isBound()); java.nio.ByteBuffer[] readBuf = new java.nio.ByteBuffer[2]; readBuf[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL); readBuf[1] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL); assertFalse(this.channel1.isRegistered()); assertTrue(this.channel1.isBlocking()); assertFalse(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); // note: blocking-mode will make the read process endless! this.channel1.configureBlocking(false); try { channel1.read(readBuf, 0, 1); fail("Should throw NotYetConnectedException"); } catch (NotYetConnectedException e) { // correct } boolean connected = this.channel1.connect(localAddr1); if (!connected) { assertFalse(this.channel1.isBlocking()); assertTrue(this.channel1.isConnectionPending()); assertFalse(this.channel1.isConnected()); } if (tryFinish()) { assertEquals(0, this.channel1.read(readBuf, 0, 1)); assertEquals(0, this.channel1.read(readBuf, 0, 2)); } this.channel1.close(); try { channel1.read(readBuf, 0, 1); fail("Should throw ClosedChannelException"); } catch (ClosedChannelException e) { // correct } } /* * SocketChannelImpl.read(ByteBuffer[], int, int)' */ public void testReadByteBufferArrayIntInt_Direct() throws Exception { assertTrue(this.server1.isBound()); java.nio.ByteBuffer[] readBuf = new java.nio.ByteBuffer[2]; readBuf[0] = java.nio.ByteBuffer.allocateDirect(CAPACITY_NORMAL); readBuf[1] = java.nio.ByteBuffer.allocateDirect(CAPACITY_NORMAL); assertFalse(this.channel1.isRegistered()); assertTrue(this.channel1.isBlocking()); assertFalse(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); // note: blocking-mode will make the read process endless! this.channel1.configureBlocking(false); try { channel1.read(readBuf, 0, 1); fail("Should throw NotYetConnectedException"); } catch (NotYetConnectedException e) { // correct } boolean connected = this.channel1.connect(localAddr1); if (!connected) { assertFalse(this.channel1.isBlocking()); assertTrue(this.channel1.isConnectionPending()); assertFalse(this.channel1.isConnected()); } if (tryFinish()) { assertEquals(0, this.channel1.read(readBuf, 0, 1)); assertEquals(0, this.channel1.read(readBuf, 0, 2)); } this.channel1.close(); try { channel1.read(readBuf, 0, 1); fail("Should throw ClosedChannelException"); } catch (ClosedChannelException e) { // correct } } public void testReadByteBufferArrayIntInt_BufNull() throws Exception { assertTrue(this.server1.isBound()); java.nio.ByteBuffer[] readBuf = new java.nio.ByteBuffer[2]; readBuf[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL); assertFalse(this.channel1.isRegistered()); assertTrue(this.channel1.isBlocking()); assertFalse(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); // note: blocking-mode will make the read process endless! this.channel1.configureBlocking(false); try { channel1.read(null, 0, 1); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } this.channel1.connect(localAddr1); if (tryFinish()) { try { channel1.read(null, 0, 1); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } try { channel1.read(readBuf, 0, 2); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } assertEquals(0, this.channel1.read(readBuf, 0, 1)); } this.channel1.close(); try { channel1.read(null, 0, 1); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } } public void testWriteByteBuffer() throws IOException { assertTrue(this.server1.isBound()); java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer .allocate(CAPACITY_NORMAL); assertFalse(this.channel1.isRegistered()); assertTrue(this.channel1.isBlocking()); assertFalse(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); try { channel1.write(writeBuf); fail("Should throw NotYetConnectedException"); } catch (NotYetConnectedException e) { // correct } this.channel1.connect(localAddr1); assertTrue(this.channel1.isBlocking()); assertTrue(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf)); this.channel1.close(); try { channel1.write(writeBuf); fail("Should throw ClosedChannelException"); } catch (ClosedChannelException e) { // correct } } public void testWriteByteBuffer_Direct() throws IOException { assertTrue(this.server1.isBound()); java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer .allocateDirect(CAPACITY_NORMAL); assertFalse(this.channel1.isRegistered()); assertTrue(this.channel1.isBlocking()); assertFalse(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); try { channel1.write(writeBuf); fail("Should throw NotYetConnectedException"); } catch (NotYetConnectedException e) { // correct } this.channel1.connect(localAddr1); assertTrue(this.channel1.isBlocking()); assertTrue(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf)); this.channel1.close(); try { channel1.write(writeBuf); fail("Should throw ClosedChannelException"); } catch (ClosedChannelException e) { // correct } } public void testWriteByteBuffer_BufNull() throws IOException { assertTrue(this.server1.isBound()); java.nio.ByteBuffer writeBuf = java.nio.ByteBuffer.allocate(0); this.channel1.connect(localAddr1); assertEquals(this.channel1.write(writeBuf), 0); try { this.channel1.write((java.nio.ByteBuffer) null); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } } /* * SocketChannelImpl.write(ByteBuffer[], int, int)' */ public void testWriteByteBufferArrayIntInt() throws IOException { java.nio.ByteBuffer[] writeBuf = new java.nio.ByteBuffer[2]; writeBuf[0] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL); writeBuf[1] = java.nio.ByteBuffer.allocate(CAPACITY_NORMAL); assertFalse(this.channel1.isRegistered()); assertTrue(this.channel1.isBlocking()); assertFalse(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); try { channel1.write(writeBuf, 0, 1); fail("Should throw NotYetConnectedException"); } catch (NotYetConnectedException e) { // correct } this.channel1.connect(localAddr1); assertTrue(this.channel1.isBlocking()); assertTrue(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf, 0, 1)); // still writes the same size as above assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf, 0, 2)); writeBuf[0].flip(); writeBuf[1].flip(); assertEquals(CAPACITY_NORMAL * 2, this.channel1.write(writeBuf, 0, 2)); this.channel1.close(); try { channel1.write(writeBuf); fail("Should throw ClosedChannelException"); } catch (ClosedChannelException e) { // correct } } /* * SocketChannelImpl.write(ByteBuffer[], int, int)' */ public void testWriteByteBufferArrayIntInt_Direct() throws IOException { java.nio.ByteBuffer[] writeBuf = new java.nio.ByteBuffer[2]; writeBuf[0] = java.nio.ByteBuffer.allocateDirect(CAPACITY_NORMAL); writeBuf[1] = java.nio.ByteBuffer.allocateDirect(CAPACITY_NORMAL); assertFalse(this.channel1.isRegistered()); assertTrue(this.channel1.isBlocking()); assertFalse(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); try { channel1.write(writeBuf, 0, 1); fail("Should throw NotYetConnectedException"); } catch (NotYetConnectedException e) { // correct } this.channel1.connect(localAddr1); assertTrue(this.channel1.isBlocking()); assertTrue(this.channel1.isConnected()); assertFalse(this.channel1.isConnectionPending()); assertTrue(this.channel1.isOpen()); assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf, 0, 1)); // still writes the same size as above assertEquals(CAPACITY_NORMAL, this.channel1.write(writeBuf, 0, 2)); writeBuf[0].flip(); writeBuf[1].flip(); assertEquals(CAPACITY_NORMAL * 2, this.channel1.write(writeBuf, 0, 2)); this.channel1.close(); try { channel1.write(writeBuf); fail("Should throw ClosedChannelException"); } catch (ClosedChannelException e) { // correct } } public void testWriteByteBufferArrayIntInt_BufNull() throws IOException { java.nio.ByteBuffer[] writeBuf = new java.nio.ByteBuffer[0]; this.channel1.connect(localAddr1); try { this.channel1.write(null, 0, 1); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } assertEquals(0, this.channel1.write(writeBuf, 0, 0)); try { this.channel1.write(writeBuf, 0, 1); fail("Should throw IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException e) { // correct } writeBuf = new java.nio.ByteBuffer[1]; try { this.channel1.write(writeBuf, 0, 1); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } try { this.channel1.write(writeBuf, 0, 2); fail("Should throw IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException e) { // correct } this.server1.close(); try { channel1.read(null, 0, 1); fail("Should throw NPE"); } catch (NullPointerException e) { // correct } } public void testWriteByteBufferArrayIntInt_SizeError() throws IOException { java.nio.ByteBuffer[] buf = new java.nio.ByteBuffer[1]; this.channel1.connect(localAddr1); assertEquals(0, this.channel1.write(buf, 0, 0)); try { this.channel1.write(buf, -1, 1); fail(); } catch (IndexOutOfBoundsException expected) { } try { this.channel1.write(buf, 0, -1); fail(); } catch (IndexOutOfBoundsException expected) { } try { this.channel1.write(buf, 0, 2); fail(); } catch (IndexOutOfBoundsException expected) { } try { this.channel1.write(buf, 2, 0); fail(); } catch (IndexOutOfBoundsException expected) { } try { this.channel1.write(null, 0, 0); fail(); } catch (NullPointerException expected) { } this.server1.close(); } public void testReadByteBufferArrayIntInt_SizeError() throws IOException { java.nio.ByteBuffer[] buf = new java.nio.ByteBuffer[1]; this.channel1.connect(localAddr1); assertEquals(0, this.channel1.read(buf, 0, 0)); try { this.channel1.read(buf, -1, 1); fail(); } catch (IndexOutOfBoundsException expected) { } try { this.channel1.read(buf, 0, -1); fail(); } catch (IndexOutOfBoundsException expected) { } try { this.channel1.read(buf, 0, 2); fail(); } catch (IndexOutOfBoundsException expected) { } try { this.channel1.read(buf, 2, 0); fail(); } catch (IndexOutOfBoundsException expected) { } try { this.channel1.read(null, 0, 0); fail(); } catch (NullPointerException expected) { } this.server1.close(); } /* * ========================================================================== * Tests for read/write real data * ========================================================================== */ /** * @tests java.nio.channels.SocketChannel#read(ByteBuffer[]) */ public void test_read$LByteBuffer() throws IOException { MockSocketChannel sc = new MockSocketChannel(null); ByteBuffer [] byteBufferArray = { ByteBuffer.allocate(1), ByteBuffer.allocate(1)}; // Verify that calling read(ByteBuffer[]) leads to the method // read(ByteBuffer[], int, int) being called with a 0 for the // second parameter and targets.length as the third parameter. sc.read(byteBufferArray); assertTrue(sc.isReadCalled); } /** * @tests java.nio.channels.SocketChannel#read(ByteBuffer[],int,int) */ public void test_read$LByteBufferII_blocking() throws Exception { assert_read$LByteBuffer(true); } /** * @tests java.nio.channels.SocketChannel#read(ByteBuffer[],int,int) */ public void test_read$LByteBufferII_nonblocking() throws Exception { assert_read$LByteBuffer(false); } private void assert_read$LByteBuffer(boolean isBlocking) throws IOException { // initialize write content byte[] writeContent = new byte[CAPACITY_NORMAL * 2]; for (int i = 0; i < CAPACITY_NORMAL * 2; i++) { writeContent[i] = (byte) i; } ByteBuffer[] readContents = new ByteBuffer[2]; readContents[0] = ByteBuffer.allocate(CAPACITY_NORMAL); readContents[1] = ByteBuffer.allocate(CAPACITY_NORMAL + 1); // establish connection channel1.connect(localAddr1); Socket acceptedSocket = server1.accept(); // use OutputStream.write to send CAPACITY_NORMAL * 2 bytes data OutputStream out = acceptedSocket.getOutputStream(); out.write(writeContent); // use close to guarantee all data is sent acceptedSocket.close(); // configure block/nonblock mode channel1.configureBlocking(isBlocking); long startTime = System.currentTimeMillis(); long totalRead = 0; long countRead; while (totalRead <= CAPACITY_NORMAL * 2) { countRead = channel1.read(readContents, 0, 2); if (0 == countRead && !readContents[1].hasRemaining()) { // read returns 0 because readContents is full break; } if (EOF == countRead) { break; } totalRead += countRead; // if the channel could not finish reading in TIMEOUT ms, the // test fails. It is used to guarantee the test never hangs even // if there are bugs of SocketChannel implementation. For // blocking read, it possibly returns 0 in some cases. assertTimeout(startTime, TIMEOUT); } // assert total bytes read and the position of ByteBuffers assertEquals(CAPACITY_NORMAL * 2, totalRead); assertEquals(CAPACITY_NORMAL, readContents[0].position()); assertEquals(CAPACITY_NORMAL, readContents[1].position()); // assert read content readContents[0].flip(); readContents[1].flip(); for (int i = 0; i < CAPACITY_NORMAL; i++) { assertEquals(writeContent[i], readContents[0].get()); } for (int i = CAPACITY_NORMAL; i < CAPACITY_NORMAL * 2; i++) { assertEquals(writeContent[i], readContents[1].get()); } } /** * @tests java.nio.channels.SocketChannel#write(ByteBuffer[],int,int) */ public void test_write$LByteBufferII_blocking() throws Exception { assert_write$LByteBuffer(true); } /** * @tests java.nio.channels.SocketChannel#write(ByteBuffer[],int,int) */ public void test_write$LByteBufferII_nonblocking() throws Exception { assert_write$LByteBuffer(false); } private void assert_write$LByteBuffer(boolean isBlocking) throws IOException { // initialize write contents ByteBuffer writeContents[] = new ByteBuffer[2]; writeContents[0] = ByteBuffer.allocate(CAPACITY_NORMAL); writeContents[1] = ByteBuffer.allocate(CAPACITY_NORMAL); for (int i = 0; i < CAPACITY_NORMAL; i++) { writeContents[0].put((byte) i); } for (int i = CAPACITY_NORMAL; i < CAPACITY_NORMAL * 2; i++) { writeContents[1].put((byte) i); } writeContents[0].flip(); writeContents[1].flip(); // establish connection channel1.connect(localAddr1); Socket acceptedSocket = server1.accept(); // set blocking/nonblocking mode channel1.configureBlocking(isBlocking); assertEquals(CAPACITY_NORMAL, channel1.write(writeContents, 0, 1)); assertEquals(CAPACITY_NORMAL, channel1.write(writeContents, 1, 1)); // assert written count and ByteBuffer position assertEquals(CAPACITY_NORMAL, writeContents[0].position()); assertEquals(CAPACITY_NORMAL, writeContents[1].position()); // use close to guarantee all data is sent channel1.close(); InputStream in = acceptedSocket.getInputStream(); byte[] readContent = new byte[CAPACITY_NORMAL * 2 + 1]; int totalCount = 0; int count; // if the channel could not finish reading in TIMEOUT ms, the test // fails. It is used to guarantee the test never hangs even if there // are bugs of SocketChannel implementation. acceptedSocket.setSoTimeout(TIMEOUT); // use InputStream.read to read data. while (totalCount <= CAPACITY_NORMAL) { count = in.read(readContent, totalCount, readContent.length - totalCount); if (EOF == count) { break; } totalCount += count; } // assert read content assertEquals(CAPACITY_NORMAL * 2, totalCount); writeContents[0].flip(); writeContents[1].flip(); for (int i = 0; i < CAPACITY_NORMAL; i++) { assertEquals(writeContents[0].get(), readContent[i]); } for (int i = CAPACITY_NORMAL; i < CAPACITY_NORMAL * 2; i++) { assertEquals(writeContents[1].get(), readContent[i]); } } /** * @tests java.nio.channels.SocketChannel#write(ByteBuffer[]) */ public void test_write$LByteBuffer() throws IOException { MockSocketChannel sc = new MockSocketChannel(null); ByteBuffer [] byteBufferArray = { ByteBuffer.allocate(1), ByteBuffer.allocate(1)}; // Verify that calling write(ByteBuffer[]) leads to the method // write(ByteBuffer[], int, int) being called with a 0 for the // second parameter and sources.length as the third parameter. sc.write(byteBufferArray); assertTrue(sc.isWriteCalled); } /** * @tests java.nio.channels.SocketChannel#write(ByteBuffer[]) */ public void test_writev() throws Exception { ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.socket().bind(null); SocketChannel sc = SocketChannel.open(); sc.connect(ssc.socket().getLocalSocketAddress()); SocketChannel sock = ssc.accept(); ByteBuffer[] buf = { ByteBuffer.allocate(10), ByteBuffer.allocateDirect(20) }; while (buf[0].remaining() != 0 && buf[1].remaining() !=0) { assertTrue(sc.write(buf, 0, 2) >= 0); } ByteBuffer target = ByteBuffer.allocate(30); while (target.remaining() != 0) { assertTrue(sock.read(target) >=0); } ssc.close(); sc.close(); sock.close(); } /** * @tests java.nio.channels.SocketChannel#write(ByteBuffer[]) */ public void test_writev2() throws Exception { ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); ssc.socket().bind(null); SocketChannel sc = SocketChannel.open(); sc.configureBlocking(false); boolean connected = sc.connect(ssc.socket().getLocalSocketAddress()); SocketChannel sock = ssc.accept(); if (!connected) { sc.finishConnect(); } ByteBuffer buf1 = ByteBuffer.allocate(10); sc.socket().setSendBufferSize(512); int bufSize = sc.socket().getSendBufferSize(); ByteBuffer buf2 = ByteBuffer.allocate(bufSize * 10); ByteBuffer[] sent = new ByteBuffer[2]; sent[0] = buf1; sent[1] = buf2; long whole = buf1.remaining() + buf2.remaining(); long write = sc.write(sent); ssc.close(); sc.close(); sock.close(); assertTrue(whole == (write + buf1.remaining() + buf2.remaining())); } /** * @tests java.nio.channels.SocketChannel#write(ByteBuffer[]) * * In non-blocking mode, the native system call will return EAGAIN/EWOULDBLOCK error * code on Linux/Unix and return WSATRY_AGAIN/WSAEWOULDBLOCK error code on Windows. * These error code means try again but not fatal error, so we should not throw exception. */ public void test_write$NonBlockingException() throws Exception { ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); ssc.socket().bind(null); SocketChannel sc = SocketChannel.open(); sc.configureBlocking(false); boolean connected = sc.connect(ssc.socket().getLocalSocketAddress()); SocketChannel sock = ssc.accept(); if (!connected) { sc.finishConnect(); } try { for (int i = 0; i < 100; i++) { ByteBuffer buf1 = ByteBuffer.allocate(10); sc.socket().setSendBufferSize(512); int bufSize = sc.socket().getSendBufferSize(); ByteBuffer buf2 = ByteBuffer.allocate(bufSize * 10); ByteBuffer[] sent = new ByteBuffer[2]; sent[0] = buf1; sent[1] = buf2; sc.write(sent); } } finally { ssc.close(); sc.close(); sock.close(); } } /** * @tests java.nio.channels.SocketChannel#write(ByteBuffer[]) */ public void test_write$LByteBuffer2() throws IOException { // Set-up ServerSocketChannel server = ServerSocketChannel.open(); server.socket().bind(null); SocketChannel client = SocketChannel.open(); client.connect(server.socket().getLocalSocketAddress()); SocketChannel worker = server.accept(); // Test overlapping buffers byte[] data = "Hello world!".getBytes("UTF-8"); ByteBuffer[] buffers = new ByteBuffer[3]; buffers[0] = ByteBuffer.wrap(data, 0, 6); buffers[1] = ByteBuffer.wrap(data, 6, data.length - 6); buffers[2] = ByteBuffer.wrap(data); // Write them out, read what we wrote and check it client.write(buffers); client.close(); ByteBuffer readBuffer = ByteBuffer.allocate(1024); while (EOF != worker.read(readBuffer)) {} readBuffer.flip(); Buffer expected = ByteBuffer.allocate(1024).put(data).put(data).flip(); assertEquals(expected, readBuffer); // Tidy-up worker.close(); server.close(); } /** * @tests java.nio.channels.SocketChannel#write(ByteBuffer[]) */ public void test_write$LByteBuffer_buffers() throws IOException { // Set-up ServerSocketChannel server = ServerSocketChannel.open(); server.socket().bind(null); SocketChannel client = SocketChannel.open(); client.connect(server.socket().getLocalSocketAddress()); SocketChannel worker = server.accept(); // A variety of buffer types to write byte[] data = "Hello world!".getBytes("UTF-8"); ByteBuffer[] buffers = new ByteBuffer[3]; buffers[0] = ByteBuffer.wrap(data, 0, 2); assertFalse(buffers[0].isDirect()); assertTrue(buffers[0].hasArray()); buffers[1] = ByteBuffer.wrap(data, 2, 4).asReadOnlyBuffer(); assertFalse(buffers[1].isDirect()); assertFalse(buffers[1].hasArray()); buffers[2] = ByteBuffer.allocateDirect(42); buffers[2].put(data, 6, data.length - 6); buffers[2].flip(); assertTrue(buffers[2].isDirect()); // Android's direct buffers do have a backing array. assertTrue(buffers[2].hasArray()); // Write them out, read what we wrote and check it client.write(buffers); client.close(); ByteBuffer readBuffer = ByteBuffer.allocate(1024); while (EOF != worker.read(readBuffer)) {} readBuffer.flip(); assertEquals(ByteBuffer.wrap(data), readBuffer); // Tidy-up worker.close(); server.close(); } /** * @tests java.nio.channels.SocketChannel#write(ByteBuffer[]) */ public void test_write$LByteBuffer_writes() throws IOException { // Set-up ServerSocketChannel server = ServerSocketChannel.open(); server.socket().bind(null); SocketChannel client = SocketChannel.open(); client.connect(server.socket().getLocalSocketAddress()); SocketChannel worker = server.accept(); // Data to write byte[] data = "Hello world!".getBytes("UTF-8"); ByteBuffer[] buffers = new ByteBuffer[3]; buffers[0] = ByteBuffer.wrap(data, 0, 6); buffers[1] = ByteBuffer.wrap("world!".getBytes("UTF-8")); buffers[2] = buffers[0]; assertTrue(buffers[0].hasArray()); // Test a sequence of write calls client.write(buffers, 0, 0); // write nothing client.write(buffers, 1, 0); // write nothing client.write(buffers, 0, 1); // write "Hello " assertEquals("Failed to drain buffer 0", 0, buffers[0].remaining()); assertEquals("Shouldn't touch buffer 1", buffers[1].limit(), buffers[1] .remaining()); client.write(buffers, 0, 2); // writes "world!" assertEquals("Failed to drain buffer 1", 0, buffers[1].remaining()); client.write(buffers, 0, 3); // write nothing client.close(); // Read what we wrote and check it ByteBuffer readBuffer = ByteBuffer.allocate(1024); while (EOF != worker.read(readBuffer)) {} readBuffer.flip(); assertEquals(ByteBuffer.wrap(data), readBuffer); // Tidy-up worker.close(); server.close(); } /** * @tests java.nio.channels.SocketChannel#write(ByteBuffer[]) */ public void test_write$LByteBuffer_invalid() throws IOException { // Set-up ServerSocketChannel server = ServerSocketChannel.open(); server.socket().bind(null); SocketChannel client = SocketChannel.open(); client.connect(server.socket().getLocalSocketAddress()); SocketChannel worker = server.accept(); // Do some stuff try { client.write((ByteBuffer[]) null); fail("Should throw a NPE"); } catch (NullPointerException expected) { } try { client.write((ByteBuffer[]) null, 0, 0); fail("Should throw a NPE"); } catch (NullPointerException expected) { } try { client.write((ByteBuffer[]) null, 1, 0); fail("Should throw a NPE"); } catch (NullPointerException expected) { } try { client.write((ByteBuffer[]) null, 0, 1); fail("Should throw a NPE"); } catch (NullPointerException expected) { } try { client.write((ByteBuffer[]) null, 1, 1); fail("Should throw a NPE"); } catch (NullPointerException expected) { } ByteBuffer[] buffers = new ByteBuffer[1]; buffers[0] = ByteBuffer.wrap("Hello ".getBytes("UTF-8")); try { client.write(buffers, -1, 1); fail(); } catch (IndexOutOfBoundsException expected) { } try { client.write(buffers, 0, -1); fail(); } catch (IndexOutOfBoundsException expected) { } try { client.write(buffers, 0, 2); fail(); } catch (IndexOutOfBoundsException expected) { } try { client.write(buffers, 2, 0); fail(); } catch (IndexOutOfBoundsException expected) { } try { client.write(null, 0, 0); fail(); } catch (NullPointerException expected) { } // Tidy-up worker.close(); client.close(); server.close(); } public void testSocket_configureblocking() throws IOException { byte[] serverWBuf = new byte[CAPACITY_NORMAL]; for (int i = 0; i < serverWBuf.length; i++) { serverWBuf[i] = (byte) i; } java.nio.ByteBuffer buf = java.nio.ByteBuffer .allocate(CAPACITY_NORMAL + 1); channel1.connect(localAddr1); server1.accept(); Socket sock = this.channel1.socket(); channel1.configureBlocking(false); assertFalse(channel1.isBlocking()); OutputStream channelSocketOut = sock.getOutputStream(); try { // write operation is not allowed in non-blocking mode channelSocketOut.write(buf.array()); fail("Non-Blocking mode should cause IllegalBlockingModeException"); } catch (IllegalBlockingModeException e) { // correct } channel1.configureBlocking(true); assertTrue(channel1.isBlocking()); // write operation is allowed in blocking mode channelSocketOut.write(buf.array()); } /** * @tests SocketChannel#read(ByteBuffer[], int, int) when remote server * closed */ public void test_socketChannel_read_ByteBufferII_remoteClosed() throws Exception { // regression 1 for HARMONY-549 ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.socket().bind(null); SocketChannel sc = SocketChannel.open(); sc.connect(ssc.socket().getLocalSocketAddress()); ssc.accept().close(); ByteBuffer[] buf = { ByteBuffer.allocate(10) }; assertEquals(-1, sc.read(buf, 0, 1)); ssc.close(); sc.close(); } /** * @tests SocketChannel#write(ByteBuffer[], int, int) */ public void test_socketChannel_write_ByteBufferII() throws Exception { // regression 2 for HARMONY-549 ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.socket().bind(null); SocketChannel sc = SocketChannel.open(); sc.connect(ssc.socket().getLocalSocketAddress()); SocketChannel sock = ssc.accept(); ByteBuffer[] buf = { ByteBuffer.allocate(10), null }; try { sc.write(buf, 0, 2); fail("should throw NPE"); } catch (NullPointerException expected) { } ssc.close(); sc.close(); ByteBuffer target = ByteBuffer.allocate(10); assertEquals(-1, sock.read(target)); } /** * @tests SocketChannel#read(ByteBuffer[], int, int) with a null ByteBuffer */ public void test_socketChannel_read_ByteBufferII_bufNULL() throws Exception { // regression 3 for HARMONY-549 ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.socket().bind(null); SocketChannel sc = SocketChannel.open(); sc.connect(ssc.socket().getLocalSocketAddress()); ssc.accept(); ByteBuffer[] buf = new ByteBuffer[2]; buf[0] = ByteBuffer.allocate(1); // let buf[1] be null try { sc.read(buf, 0, 2); fail("should throw NullPointerException"); } catch (NullPointerException expected) { } ssc.close(); sc.close(); } /** * @tests SocketChannel#write(ByteBuffer) after close */ public void test_socketChannel_write_close() throws Exception { // regression 4 for HARMONY-549 ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.socket().bind(null); SocketChannel sc = SocketChannel.open(); sc.connect(ssc.socket().getLocalSocketAddress()); SocketChannel sock = ssc.accept(); ByteBuffer buf = null; ssc.close(); sc.close(); try { sc.write(buf); fail("should throw NPE"); } catch (NullPointerException expected) { } sock.close(); } /** * @tests SocketChannel#write(ByteBuffer) if position is not zero */ public void test_socketChannel_write_ByteBuffer_posNotZero() throws Exception { // regression 5 for HARMONY-549 final String testStr = "Hello World"; ByteBuffer readBuf = ByteBuffer.allocate(11); ByteBuffer buf = ByteBuffer.wrap(testStr.getBytes()); ServerSocketChannel ssc = ServerSocketChannel.open(); ssc.socket().bind(null); SocketChannel sc = SocketChannel.open(); sc.connect(ssc.socket().getLocalSocketAddress()); buf.position(2); ssc.accept().write(buf); assertEquals(9, sc.read(readBuf)); buf.flip(); readBuf.flip(); byte[] read = new byte[9]; byte[] write = new byte[11]; buf.get(write); readBuf.get(read); for (int i = 0; i < 9; i++) { assertEquals(read[i], write[i + 2]); } } /** * @tests SocketChannelImpl#read(ByteBuffer[]) */ public void test_read_$ByteBuffer_Blocking() throws IOException { // regression test for Harmony-728 byte[] data = new byte[CAPACITY_NORMAL]; for (int i = 0; i < CAPACITY_NORMAL; i++) { data[i] = (byte) i; } ByteBuffer[] buf = new ByteBuffer[2]; buf[0] = ByteBuffer.allocate(CAPACITY_NORMAL); buf[1] = ByteBuffer.allocate(CAPACITY_NORMAL); channel1.connect(localAddr1); Socket socket = null; try { socket = server1.accept(); OutputStream out = socket.getOutputStream(); out.write(data); // should not block here channel1.read(buf); } finally { if (null != socket) { socket.close(); } } } public void test_socket_getOutputStream_nonBlocking_read_Exception() throws IOException { byte[] buf = new byte[1]; channel1.connect(this.localAddr1); InputStream is = channel1.socket().getInputStream(); channel1.configureBlocking(false); try { is.read(); fail(); } catch (IllegalBlockingModeException expected) { } try { is.read(null); fail(); } catch (NullPointerException expected) { // Any of these exceptions are possible. } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } try { is.read(buf, -1, 1); fail(); } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } try { is.read(buf, 0, -1); fail(); } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } try { is.read(buf, 0, 2); fail(); } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } try { is.read(buf, 2, 0); fail(); } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } try { is.read(null, 0, 0); fail(); } catch (NullPointerException expected) { // Any of these exceptions are possible. } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } is.close(); try { is.read(); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IOException expected) { // Any of these exceptions are possible. } try { is.read(null); fail(); } catch (NullPointerException expected) { // Any of these exceptions are possible. } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IOException expected) { // Any of these exceptions are possible. } try { is.read(buf, -1, 1); fail(); } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IOException expected) { // Any of these exceptions are possible. } try { is.read(buf, 0, -1); fail(); } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IOException expected) { // Any of these exceptions are possible. } try { is.read(buf, 0, 2); fail(); } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IOException expected) { // Any of these exceptions are possible. } try { is.read(buf, 2, 0); fail(); } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IOException expected) { // Any of these exceptions are possible. } try { is.read(null, 0, 0); fail(); } catch (NullPointerException expected) { // Any of these exceptions are possible. } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IOException expected) { // Any of these exceptions are possible. } } public void test_socket_getOutputStream_blocking_read_Exception() throws IOException { byte[] buf = new byte[1]; channel1.connect(this.localAddr1); InputStream is = channel1.socket().getInputStream(); try { is.read(null); fail(); } catch (NullPointerException expected) { } try { is.read(buf, -1, 1); fail(); } catch (IndexOutOfBoundsException expected) { } try { is.read(buf, 0, -1); fail(); } catch (IndexOutOfBoundsException expected) { } try { is.read(buf, 0, 2); fail(); } catch (IndexOutOfBoundsException expected) { } try { is.read(buf, 2, 1); fail(); } catch (IndexOutOfBoundsException expected) { } try { is.read(null, 0, 1); fail(); } catch (NullPointerException expected) { } is.close(); try { is.read(null); fail(); } catch (NullPointerException expected) { } try { is.read(buf, -1, 1); fail(); } catch (IndexOutOfBoundsException expected) { } try { is.read(buf, 0, -1); fail(); } catch (IndexOutOfBoundsException expected) { } try { is.read(buf, 0, 2); fail(); } catch (IndexOutOfBoundsException expected) { } try { is.read(buf, 2, 1); fail(); } catch (IndexOutOfBoundsException expected) { } try { is.read(null, 0, 1); fail(); } catch (NullPointerException expected) { } } public void test_socket_getOutputStream_nonBlocking_write_Exception() throws IOException { byte[] buf = new byte[1]; channel1.connect(this.localAddr1); OutputStream os = channel1.socket().getOutputStream(); channel1.configureBlocking(false); try { os.write(1); fail(); } catch (IllegalBlockingModeException expected) { } try { os.write(null); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (NullPointerException expected) { // Any of these exceptions are possible. } try { os.write(buf, -1, 1); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } try { os.write(buf, 0, -1); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } try { os.write(buf, 0, 2); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } try { os.write(buf, 2, 1); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } try { os.write(null, 0, 1); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (NullPointerException expected) { // Any of these exceptions are possible. } os.close(); try { os.write(1); fail(); } catch (IllegalBlockingModeException expected) { } try { os.write(null); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (NullPointerException expected) { // Any of these exceptions are possible. } try { os.write(buf, -1, 1); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } try { os.write(buf, 0, -1); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } try { os.write(buf, 0, 2); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } try { os.write(buf, 2, 0); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (IndexOutOfBoundsException expected) { // Any of these exceptions are possible. } try { os.write(null, 0, 0); fail(); } catch (IllegalBlockingModeException expected) { // Any of these exceptions are possible. } catch (NullPointerException expected) { // Any of these exceptions are possible. } } public void test_socket_getOutputStream_blocking_write_Exception() throws IOException { byte[] buf = new byte[1]; channel1.connect(this.localAddr1); OutputStream os = channel1.socket().getOutputStream(); try { os.write(null); fail(); } catch (NullPointerException expected) { } try { os.write(buf, -1, 1); fail(); } catch (IndexOutOfBoundsException expected) { } try { os.write(buf, 0, -1); fail(); } catch (IndexOutOfBoundsException expected) { } try { os.write(buf, 0, 2); fail(); } catch (IndexOutOfBoundsException expected) { } try { os.write(buf, 2, 0); fail(); } catch (IndexOutOfBoundsException expected) { } try { os.write(null, 0, 0); fail(); } catch (NullPointerException expected) { } os.close(); try { os.write(null); fail(); } catch (NullPointerException expected) { } try { os.write(buf, -1, 1); fail(); } catch (IndexOutOfBoundsException expected) { } try { os.write(buf, 0, -1); fail(); } catch (IndexOutOfBoundsException expected) { } try { os.write(buf, 0, 2); fail(); } catch (IndexOutOfBoundsException expected) { } try { os.write(buf, 2, 0); fail(); } catch (IndexOutOfBoundsException expected) { } try { os.write(null, 0, 0); fail(); } catch (NullPointerException expected) { } } /** * @tests SocketChannelImpl#socket().getOutputStream().write(int) */ public void test_socket_getOutputStream_write_oneByte() throws IOException { // Regression test for Harmony-3475 int MAGIC = 123; channel1.connect(this.localAddr1); OutputStream os = channel1.socket().getOutputStream(); Socket acceptedSocket = server1.accept(); InputStream in = acceptedSocket.getInputStream(); os.write(MAGIC); channel1.close(); int lastByte = in.read(); if (lastByte == -1) { fail("Server received nothing. Expected 1 byte."); } else if (lastByte != MAGIC) { fail("Server received wrong single byte: " + lastByte + ", expected: " + MAGIC); } lastByte = in.read(); if (lastByte != -1) { fail("Server received too long sequence. Expected 1 byte."); } } public void testSocket_setOptions() throws IOException { channel1.connect(localAddr1); Socket socket = channel1.socket(); ByteBuffer buffer = ByteBuffer.wrap(new byte[] {1, 2, 3}); socket.setKeepAlive(true); channel1.write(buffer); socket.setOOBInline(true); channel1.write(buffer); socket.setReceiveBufferSize(100); channel1.write(buffer); socket.setReuseAddress(true); channel1.write(buffer); socket.setSendBufferSize(100); channel1.write(buffer); socket.setSoLinger(true, 100); channel1.write(buffer); socket.setSoTimeout(1000); channel1.write(buffer); socket.setTcpNoDelay(true); channel1.write(buffer); socket.setTrafficClass(10); channel1.write(buffer); } class MockSocketChannel extends SocketChannel { private boolean isWriteCalled = false; private boolean isReadCalled = false; public MockSocketChannel(SelectorProvider provider) { super(provider); } @Override public Socket socket() { return null; } @Override public boolean isConnected() { return false; } @Override public boolean isConnectionPending() { return false; } @Override public boolean connect(SocketAddress address) throws IOException { return false; } @Override public boolean finishConnect() throws IOException { return false; } @Override public int read(ByteBuffer target) throws IOException { return 0; } @Override public long read(ByteBuffer[] targets, int offset, int length) throws IOException { // Verify that calling read(ByteBuffer[]) leads to the method // read(ByteBuffer[], int, int) being called with a 0 for the // second parameter and targets.length as the third parameter. if(0 == offset && length == targets.length){ isReadCalled = true; } return 0; } @Override public int write(ByteBuffer source) throws IOException { return 0; } @Override public long write(ByteBuffer[] sources, int offset, int length) throws IOException { // Verify that calling write(ByteBuffer[]) leads to the method // write(ByteBuffer[], int, int) being called with a 0 for the // second parameter and sources.length as the third parameter. if(0 == offset && length == sources.length){ isWriteCalled = true; } return 0; } @Override protected void implCloseSelectableChannel() throws IOException { // empty } @Override protected void implConfigureBlocking(boolean blockingMode) throws IOException { // empty } } }