164ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski/*
264ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * Copyright (C) 2015 The Android Open Source Project
364ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski *
464ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * Licensed under the Apache License, Version 2.0 (the "License");
564ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * you may not use this file except in compliance with the License.
664ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * You may obtain a copy of the License at
764ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski *
864ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski *      http://www.apache.org/licenses/LICENSE-2.0
964ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski *
1064ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * Unless required by applicable law or agreed to in writing, software
1164ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * distributed under the License is distributed on an "AS IS" BASIS,
1264ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1364ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * See the License for the specific language governing permissions and
1464ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * limitations under the License.
1564ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski */
1664ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski
1764ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskipackage android.support.provider.tests;
1864ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski
1999ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewskiimport android.content.ContentProviderClient;
2099ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewskiimport android.database.ContentObserver;
2164ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport android.database.Cursor;
2264ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport android.net.Uri;
2364ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport android.os.ParcelFileDescriptor;
2499ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewskiimport android.os.RemoteException;
2564ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport android.provider.DocumentsContract.Document;
2664ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport android.provider.DocumentsContract;
2764ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport android.test.AndroidTestCase;
2864ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport android.util.Log;
2964ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski
3064ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport java.io.File;
3199ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewskiimport java.io.FileNotFoundException;
3264ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport java.io.FileOutputStream;
3364ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport java.io.IOException;
3464ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport java.io.InputStream;
3564ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport java.lang.IllegalArgumentException;
3664ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskiimport java.util.Scanner;
3799ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewskiimport java.util.concurrent.CountDownLatch;
3864ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski
3964ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski/**
4064ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * Integration tests for DocumentsProvider and DocumentArchiveHelper.
4164ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski *
4264ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * <p>Only checks if the provider, then helper are forwarding the calls to the
4364ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * underlying {@code ArchiveDocument} correctly. More detailed output testing is
4464ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski * done in {@code DocumentArchiveTest}.
4564ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski */
4664ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewskipublic class IntegrationTest extends AndroidTestCase {
4799ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski    private ContentProviderClient mClient;
4899ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski
4999ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski    @Override
5099ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski    public void setUp() throws RemoteException {
5199ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        mClient = getContext().getContentResolver().acquireContentProviderClient(
5299ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski                StubProvider.AUTHORITY);
5399ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        assertNotNull(mClient);
5499ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        mClient.call("reset", null, null);
5599ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski    }
5699ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski
5799ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski    @Override
5899ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski    public void tearDown() {
5999ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        if (mClient != null) {
6099ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            mClient.release();
6199ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            mClient = null;
6299ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        }
6399ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski    }
6464ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski
6564ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski    public void testQueryForChildren() throws IOException {
6664ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski        final Cursor cursor = mContext.getContentResolver().query(
6764ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski                DocumentsContract.buildChildDocumentsUri(
6864ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski                        StubProvider.AUTHORITY, StubProvider.DOCUMENT_ID),
6964ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski                        null, null, null, null);
7064ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski        assertEquals(3, cursor.getCount());
7164ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski    }
7264ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski
7399ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski    public void testQueryForDocument_Archive()
7499ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            throws IOException, RemoteException, InterruptedException {
7564ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski        final Cursor cursor = mContext.getContentResolver().query(
7664ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski                DocumentsContract.buildDocumentUri(
7764ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski                        StubProvider.AUTHORITY, StubProvider.DOCUMENT_ID),
7864ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski                        null, null, null, null);
7964ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski        assertEquals(1, cursor.getCount());
8064ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski        assertTrue(cursor.moveToFirst());
8164ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski        assertEquals(Document.FLAG_ARCHIVE,
8264ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski                cursor.getInt(cursor.getColumnIndexOrThrow(Document.COLUMN_FLAGS)));
8364ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski    }
8464ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski
8599ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski    public void testQueryForDocument_ArchiveDescendant()
8699ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            throws IOException, RemoteException, InterruptedException {
8799ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        final Cursor cursor = mContext.getContentResolver().query(
8899ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski                DocumentsContract.buildDocumentUri(
8999ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski                        StubProvider.AUTHORITY, StubProvider.FILE_DOCUMENT_ID),
9099ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski                        null, null, null, null);
9199ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        assertEquals(1, cursor.getCount());
9299ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        assertEquals(StubProvider.NOTIFY_URI, cursor.getNotificationUri());
9399ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski
9499ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        final CountDownLatch changeSignal = new CountDownLatch(1);
9599ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        final ContentObserver observer = new ContentObserver(null) {
9699ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            @Override
9799ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            public void onChange(boolean selfChange) {
9899ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski                changeSignal.countDown();
9999ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            }
10099ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        };
10199ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski
10299ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        try {
10399ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            getContext().getContentResolver().registerContentObserver(
10499ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski                    cursor.getNotificationUri(), false /* notifyForDescendants */, observer);
10599ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski
10699ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            // Simulate deleting the archive file, then confirm that the notification is
10799ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            // propagated and the archive closed.
10899ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            mClient.call("delete", null, null);
10999ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            changeSignal.await();
11099ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski
11199ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            mContext.getContentResolver().query(
11299ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski                    DocumentsContract.buildChildDocumentsUri(
11399ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski                            StubProvider.AUTHORITY, StubProvider.FILE_DOCUMENT_ID),
11499ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski                            null, null, null, null);
11599ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            fail("Expected IllegalStateException, but succeeded.");
11699ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        } catch (IllegalStateException e) {
11799ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            // Expected, as the file is gone.
11899ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        } finally {
11999ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski            getContext().getContentResolver().unregisterContentObserver(observer);
12099ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski        }
12199ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski    }
12299ab90fa578ee7916370fe7c1734c9d62a07818eTomasz Mikolajewski
12364ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski    public void testGetType() throws IOException {
12464ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski        assertEquals("text/plain", mContext.getContentResolver().getType(
12564ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski                DocumentsContract.buildDocumentUri(
12664ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski                        StubProvider.AUTHORITY, StubProvider.FILE_DOCUMENT_ID)));
12764ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski    }
12864ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski
12964ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski    public void testOpenFileDescriptor() throws IOException {
13064ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski        final ParcelFileDescriptor descriptor = mContext.getContentResolver().openFileDescriptor(
13164ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski                DocumentsContract.buildDocumentUri(
13264ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski                        StubProvider.AUTHORITY, StubProvider.FILE_DOCUMENT_ID),
13364ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski                        "r", null);
13464ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski        assertNotNull(descriptor);
13564ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski    }
13664ce8c2e2085a0d5ff3e69ba5520873d41c76af5Tomasz Mikolajewski}
137