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