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