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