1963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert/* 2963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * Copyright (C) 2009 The Android Open Source Project 3963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * 4963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 5963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * you may not use this file except in compliance with the License. 6963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * You may obtain a copy of the License at 7963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * 8963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 9963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * 10963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * Unless required by applicable law or agreed to in writing, software 11963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 12963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * See the License for the specific language governing permissions and 14963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * limitations under the License. 15963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert */ 16963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage android.content; 18963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 19963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport android.net.Uri; 20963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport android.test.AndroidTestCase; 21f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.test.suitebuilder.annotation.LargeTest; 22963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport android.test.suitebuilder.annotation.MediumTest; 23f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.test.suitebuilder.annotation.SmallTest; 24963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 25963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport java.io.InputStream; 26963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport java.util.Arrays; 27963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 28963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert/** 29963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * Tests reading a MemoryFile-based AssestFile from a ContentProvider running 30963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * in a different process. 31963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert */ 32963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertpublic class MemoryFileProviderTest extends AndroidTestCase { 33963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 34963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert // reads from a cross-process AssetFileDescriptor for a MemoryFile 35963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert @MediumTest 36963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert public void testRead() throws Exception { 37963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert ContentResolver resolver = getContext().getContentResolver(); 381a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Uri uri = Uri.parse("content://android.content.MemoryFileProvider/data/1/blob"); 39963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert byte[] buf = new byte[MemoryFileProvider.TEST_BLOB.length]; 40963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert InputStream in = resolver.openInputStream(uri); 41963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertNotNull(in); 42963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert int count = in.read(buf); 43963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertEquals(buf.length, count); 44c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert assertEquals(-1, in.read()); 45963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert in.close(); 46963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertTrue(Arrays.equals(MemoryFileProvider.TEST_BLOB, buf)); 47963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert } 48963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 49963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert // tests that we don't leak file descriptors or virtual address space 50f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 51963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert public void testClose() throws Exception { 52963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert ContentResolver resolver = getContext().getContentResolver(); 53963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert // open enough file descriptors that we will crash something if we leak FDs 54963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert // or address space 55963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert for (int i = 0; i < 1025; i++) { 561a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Uri uri = Uri.parse("content://android.content.MemoryFileProvider/huge"); 57963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert InputStream in = resolver.openInputStream(uri); 58963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertNotNull("Failed to open stream number " + i, in); 59963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert byte[] buf = new byte[MemoryFileProvider.TEST_BLOB.length]; 60963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert int count = in.read(buf); 61963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertEquals(buf.length, count); 62963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertTrue(Arrays.equals(MemoryFileProvider.TEST_BLOB, buf)); 63963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert in.close(); 64963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert } 65963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert } 66963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 67963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert // tests that we haven't broken AssestFileDescriptors for normal files. 68f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @SmallTest 69963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert public void testFile() throws Exception { 70963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert ContentResolver resolver = getContext().getContentResolver(); 711a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Uri uri = Uri.parse("content://android.content.MemoryFileProvider/file"); 72963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert byte[] buf = new byte[MemoryFileProvider.TEST_BLOB.length]; 73963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert InputStream in = resolver.openInputStream(uri); 74963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertNotNull(in); 75963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert int count = in.read(buf); 76963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertEquals(buf.length, count); 77963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertEquals(-1, in.read()); 78963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert in.close(); 79963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertTrue(Arrays.equals(MemoryFileProvider.TEST_BLOB, buf)); 80963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert } 81963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 82963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert} 83