FileInputStreamTest.java revision 0f524004b71b732c888d10eab57008bc65d8a3e0
10f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin/*
20f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin * Copyright (C) 2010 The Android Open Source Project
30f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin *
40f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin * Licensed under the Apache License, Version 2.0 (the "License");
50f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin * you may not use this file except in compliance with the License.
60f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin * You may obtain a copy of the License at
70f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin *
80f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin *      http://www.apache.org/licenses/LICENSE-2.0
90f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin *
100f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin * Unless required by applicable law or agreed to in writing, software
110f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin * distributed under the License is distributed on an "AS IS" BASIS,
120f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin * See the License for the specific language governing permissions and
140f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin * limitations under the License.
150f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin */
160f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin
170f524004b71b732c888d10eab57008bc65d8a3e0Owen Linpackage libcore.java.io;
180f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin
190f524004b71b732c888d10eab57008bc65d8a3e0Owen Linimport java.io.FileDescriptor;
200f524004b71b732c888d10eab57008bc65d8a3e0Owen Linimport java.io.FileInputStream;
210f524004b71b732c888d10eab57008bc65d8a3e0Owen Linimport java.io.FileOutputStream;
220f524004b71b732c888d10eab57008bc65d8a3e0Owen Linimport java.io.IOException;
230f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin
240f524004b71b732c888d10eab57008bc65d8a3e0Owen Linimport junit.framework.TestCase;
250f524004b71b732c888d10eab57008bc65d8a3e0Owen Linimport libcore.io.IoUtils;
260f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin
270f524004b71b732c888d10eab57008bc65d8a3e0Owen Linpublic final class FileInputStreamTest extends TestCase {
280f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin    private static final int TOTAL_SIZE = 1024;
290f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin    private static final int SKIP_SIZE = 100;
300f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin
310f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin    private static void createPipes(FileDescriptor pipe[]) throws IOException {
320f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        int fds[] = new int[2];
330f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        IoUtils.pipe(fds);
340f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        pipe[0] = IoUtils.newFileDescriptor(fds[0]);
350f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        pipe[1] = IoUtils.newFileDescriptor(fds[1]);
360f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin    }
370f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin
380f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin    private static class DataFeeder extends Thread {
390f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        private FileDescriptor mOutFd;
400f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin
410f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        public DataFeeder(FileDescriptor fd) {
420f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            mOutFd = fd;
430f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        }
440f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin
450f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        @Override
460f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        public void run() {
470f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            try {
480f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin                FileOutputStream fos = new FileOutputStream(mOutFd);
490f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin                try {
500f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin                    byte[] buffer = new byte[TOTAL_SIZE];
510f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin                    for (int i = 0; i < buffer.length; ++i) {
520f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin                        buffer[i] = (byte) i;
530f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin                    }
540f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin                    fos.write(buffer);
550f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin                } finally {
560f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin                    IoUtils.closeQuietly(fos);
570f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin                    IoUtils.close(mOutFd);
580f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin                }
590f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            } catch (IOException e) {
600f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin                throw new RuntimeException(e);
610f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            }
620f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        }
630f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin    }
640f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin
650f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin    private void verifyData(FileInputStream is, int start, int count)
660f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            throws IOException {
670f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        byte buffer[] = new byte[count];
680f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        assertEquals(count, is.read(buffer));
690f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        for (int i = 0; i < count; ++i) {
700f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            assertEquals((byte) (i + start), buffer[i]);
710f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        }
720f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin    }
730f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin
740f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin    private static void closeQuietly(FileDescriptor fd) {
750f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        try {
760f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            if (fd != null) IoUtils.close(fd);
770f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        } catch (Throwable t) {}
780f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin    }
790f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin
800f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin    public void testSkipInPipes() throws Exception {
810f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        FileDescriptor pipe[] = new FileDescriptor[2];
820f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        createPipes(pipe);
830f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        DataFeeder feeder = new DataFeeder(pipe[1]);
840f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        try {
850f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            feeder.start();
860f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            FileInputStream fis = new FileInputStream(pipe[0]);
870f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            fis.skip(SKIP_SIZE);
880f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            verifyData(fis, SKIP_SIZE, TOTAL_SIZE - SKIP_SIZE);
890f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            assertEquals(-1, fis.read());
900f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            feeder.join(1000);
910f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            assertFalse(feeder.isAlive());
920f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        } finally {
930f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin            closeQuietly(pipe[0]);
940f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin        }
950f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin    }
960f524004b71b732c888d10eab57008bc65d8a3e0Owen Lin}
97