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.content.ContentResolver; 20963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport android.net.Uri; 21963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport android.test.AndroidTestCase; 22963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport android.test.suitebuilder.annotation.MediumTest; 23963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 24963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport java.io.InputStream; 25963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertimport java.util.Arrays; 26963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 27963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert/** 28963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * Tests reading a MemoryFile-based AssestFile from a ContentProvider running 29963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert * in a different process. 30963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert */ 31963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringertpublic class MemoryFileProviderTest extends AndroidTestCase { 32963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 33963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert // reads from a cross-process AssetFileDescriptor for a MemoryFile 34963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert @MediumTest 35963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert public void testRead() throws Exception { 36963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert ContentResolver resolver = getContext().getContentResolver(); 371a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Uri uri = Uri.parse("content://android.content.MemoryFileProvider/data/1/blob"); 38963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert byte[] buf = new byte[MemoryFileProvider.TEST_BLOB.length]; 39963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert InputStream in = resolver.openInputStream(uri); 40963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertNotNull(in); 41963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert int count = in.read(buf); 42963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertEquals(buf.length, count); 43c1823701cc76790494fb622fe58f0942236cd7d0Bjorn Bringert assertEquals(-1, in.read()); 44963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert in.close(); 45963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertTrue(Arrays.equals(MemoryFileProvider.TEST_BLOB, buf)); 46963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert } 47963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert 48963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert // tests that we don't leak file descriptors or virtual address space 49963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert @MediumTest 50963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert public void testClose() throws Exception { 51963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert ContentResolver resolver = getContext().getContentResolver(); 52963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert // open enough file descriptors that we will crash something if we leak FDs 53963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert // or address space 54963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert for (int i = 0; i < 1025; i++) { 551a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Uri uri = Uri.parse("content://android.content.MemoryFileProvider/huge"); 56963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert InputStream in = resolver.openInputStream(uri); 57963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertNotNull("Failed to open stream number " + i, in); 58963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert assertEquals(1000000, in.skip(1000000)); 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. 68963cd006c45716b034f656bf7e7179e6476f7e4dBjorn Bringert @MediumTest 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