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