1bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson/* 2bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * Copyright (C) 2010 The Android Open Source Project 3bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * 4bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * you may not use this file except in compliance with the License. 6bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * You may obtain a copy of the License at 7bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * 8bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * 10bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * Unless required by applicable law or agreed to in writing, software 11bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * See the License for the specific language governing permissions and 14bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * limitations under the License. 15bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson */ 16bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson 17bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilsonpackage libcore.java.nio.channels; 18bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson 19bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilsonimport java.io.IOException; 20c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniakimport java.io.InputStream; 21c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniakimport java.io.OutputStream; 22bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilsonimport java.nio.ByteBuffer; 23c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniakimport java.nio.channels.AsynchronousByteChannel; 24bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilsonimport java.nio.channels.Channels; 25bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilsonimport java.nio.channels.IllegalBlockingModeException; 26bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilsonimport java.nio.channels.Pipe; 27bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilsonimport java.nio.channels.WritableByteChannel; 28c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniakimport java.util.Arrays; 29c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniakimport java.util.concurrent.Future; 30bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilsonimport junit.framework.TestCase; 31c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniakimport org.mockito.ArgumentCaptor; 32c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniakimport org.mockito.Mockito; 33c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniakimport org.mockito.invocation.InvocationOnMock; 34c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniakimport org.mockito.stubbing.Answer; 35c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniakimport static org.mockito.Mockito.isA; 36c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniakimport static org.mockito.Mockito.mock; 37c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniakimport static org.mockito.Mockito.when; 38c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak 39bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson 40bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilsonpublic final class ChannelsTest extends TestCase { 41bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson 42bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson public void testStreamNonBlocking() throws IOException { 43bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson Pipe.SourceChannel sourceChannel = createNonBlockingChannel("abc".getBytes("UTF-8")); 44bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson try { 45bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson Channels.newInputStream(sourceChannel).read(); 46bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson fail(); 47bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson } catch (IllegalBlockingModeException expected) { 48bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson } 49bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson } 50bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson 51bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson /** 52bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * This fails on the RI which violates its own promise to throw when 53bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson * read in non-blocking mode. 54bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson */ 55bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson public void testReaderNonBlocking() throws IOException { 56bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson Pipe.SourceChannel sourceChannel = createNonBlockingChannel("abc".getBytes("UTF-8")); 57bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson try { 58bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson Channels.newReader(sourceChannel, "UTF-8").read(); 59bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson fail(); 60bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson } catch (IllegalBlockingModeException expected) { 61bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson } 62bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson } 63bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson 64bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson private Pipe.SourceChannel createNonBlockingChannel(byte[] content) throws IOException { 65bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson Pipe pipe = Pipe.open(); 66bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson WritableByteChannel sinkChannel = pipe.sink(); 67bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson sinkChannel.write(ByteBuffer.wrap(content)); 68bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson Pipe.SourceChannel sourceChannel = pipe.source(); 69bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson sourceChannel.configureBlocking(false); 70bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson return sourceChannel; 71bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson } 72bd3fa20df1d41ddb1310bb03d82b2f5aa11e0dfbJesse Wilson 73c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak public void testInputStreamAsynchronousByteChannel() throws Exception { 74c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak AsynchronousByteChannel abc = mock(AsynchronousByteChannel.class); 75c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak InputStream is = Channels.newInputStream(abc); 76c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak Future<Integer> result = mock(Future.class); 77c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak ArgumentCaptor<ByteBuffer> bbCaptor = ArgumentCaptor.forClass(ByteBuffer.class); 78c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak final byte[] bytesRead = new byte[10]; 79c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak 80c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak when(abc.read(bbCaptor.capture())).thenReturn(result); 81c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak when(result.get()).thenAnswer( 82c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak new Answer<Integer>() { 83c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak public Integer answer(InvocationOnMock invocation) { 84c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak ByteBuffer bb = bbCaptor.getValue(); 85c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak assertEquals(bytesRead.length, bb.remaining()); 86c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak // Write '7' bytes 87c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak bb.put(new byte[] {0, 1, 2, 3, 4, 5, 6}); 88c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak return 7; 89c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak } 90c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak }); 91c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak 92c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak assertEquals(7, is.read(bytesRead)); 93c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak // Only 7 bytes of data should be written into the buffer 94c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak byte[] bytesExpected = new byte[] { 0, 1, 2, 3, 4, 5, 6, 0, 0, 0 }; 95c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak assertTrue(Arrays.equals(bytesExpected, bytesRead)); 96c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak 97c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak Mockito.verify(abc).read(isA(ByteBuffer.class)); 98c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak Mockito.verify(result).get(); 99c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak } 100c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak 101c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak public void testOutputStreamAsynchronousByteChannel() throws Exception { 102c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak AsynchronousByteChannel abc = mock(AsynchronousByteChannel.class); 103c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak OutputStream os = Channels.newOutputStream(abc); 104c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak Future<Integer> result = mock(Future.class); 105c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak ArgumentCaptor<ByteBuffer> bbCaptor = ArgumentCaptor.forClass(ByteBuffer.class); 106c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak final byte[] data = "world".getBytes(); 107c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak 108c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak when(abc.write(bbCaptor.capture())).thenReturn(result); 109c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak when(result.get()).thenAnswer( 110c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak new Answer<Integer>() { 111c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak public Integer answer(InvocationOnMock invocation) { 112c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak ByteBuffer bb = bbCaptor.getValue(); 113c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak assertEquals(data.length, bb.remaining()); 114c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak byte[] readData = new byte[data.length]; 115c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak // Read the whole thing 116c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak bb.get(readData); 117c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak assertTrue(Arrays.equals(data, readData)); 118c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak return data.length; 119c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak } 120c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak }); 121c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak 122c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak os.write(data); 123c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak 124c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak Mockito.verify(abc).write(isA(ByteBuffer.class)); 125c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak Mockito.verify(result).get(); 126c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak } 127c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak 128c721818a4895a62d546d284c181df76d4de08ad0Przemyslaw Szczepaniak} 129