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