DocumentLoaderTest.java revision 6baa16e9109046661fef8dcc25b8754ac68bcdae
16baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono/* 26baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * Copyright (C) 2015 The Android Open Source Project 36baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * 46baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * Licensed under the Apache License, Version 2.0 (the "License"); 56baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * you may not use this file except in compliance with the License. 66baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * You may obtain a copy of the License at 76baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * 86baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * http://www.apache.org/licenses/LICENSE-2.0 96baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * 106baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * Unless required by applicable law or agreed to in writing, software 116baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * distributed under the License is distributed on an "AS IS" BASIS, 126baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * See the License for the specific language governing permissions and 146baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono * limitations under the License. 156baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono */ 166baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 176baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironopackage com.android.mtp; 186baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 196baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport android.content.Context; 206baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport android.database.Cursor; 216baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport android.net.Uri; 226baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport android.provider.DocumentsContract; 236baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport android.test.AndroidTestCase; 246baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport android.test.suitebuilder.annotation.SmallTest; 256baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 266baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.io.IOException; 276baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.util.Date; 286baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.util.HashMap; 296baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.util.Map; 306baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.util.concurrent.CountDownLatch; 316baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 326baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono@SmallTest 336baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironopublic class DocumentLoaderTest extends AndroidTestCase { 346baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono private BlockableTestMtpMaanger mManager; 356baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono private TestContentResolver mResolver; 366baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono private DocumentLoader mLoader; 376baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final private Identifier mParentIdentifier = new Identifier(0, 0, 0); 386baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 396baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono @Override 406baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono public void setUp() { 416baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager = new BlockableTestMtpMaanger(getContext()); 426baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mResolver = new TestContentResolver(); 436baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mLoader = new DocumentLoader(mManager, mResolver); 446baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 456baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 466baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono public void testBasic() throws IOException, InterruptedException { 476baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Uri uri = DocumentsContract.buildChildDocumentsUri( 486baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.AUTHORITY, mParentIdentifier.toDocumentId()); 496baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono setUpDocument(mManager, 40); 506baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.blockDocument(0, 15); 516baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.blockDocument(0, 35); 526baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 536baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono { 546baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Cursor cursor = mLoader.queryChildDocuments( 556baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); 566baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals(DocumentLoader.NUM_INITIAL_ENTRIES, cursor.getCount()); 576baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 586baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 596baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono Thread.sleep(DocumentLoader.NOTIFY_PERIOD_MS); 606baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.unblockDocument(0, 15); 616baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mResolver.waitForNotification(uri, 1); 626baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 636baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono { 646baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Cursor cursor = mLoader.queryChildDocuments( 656baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); 666baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals( 676baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono DocumentLoader.NUM_INITIAL_ENTRIES + DocumentLoader.NUM_LOADING_ENTRIES, 686baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono cursor.getCount()); 696baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 706baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 716baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.unblockDocument(0, 35); 726baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mResolver.waitForNotification(uri, 2); 736baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 746baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono { 756baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Cursor cursor = mLoader.queryChildDocuments( 766baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); 776baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals(40, cursor.getCount()); 786baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 796baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 806baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals(2, mResolver.getChangeCount(uri)); 816baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 826baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 836baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono private void setUpDocument(TestMtpManager manager, int count) { 846baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono int[] childDocuments = new int[count]; 856baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono for (int i = 0; i < childDocuments.length; i++) { 866baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final int objectHandle = i + 1; 876baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono childDocuments[i] = objectHandle; 886baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono manager.setDocument(0, objectHandle, new MtpDocument( 896baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono objectHandle, 906baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 0 /* format */, 916baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono "file" + objectHandle, 926baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono new Date(), 936baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1024, 946baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 0 /* thumbnail size */)); 956baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 966baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono manager.setObjectHandles(0, 0, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, childDocuments); 976baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 986baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 996baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono private static class BlockableTestMtpMaanger extends TestMtpManager { 1006baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final private Map<String, CountDownLatch> blockedDocuments = new HashMap<>(); 1016baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1026baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono BlockableTestMtpMaanger(Context context) { 1036baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono super(context); 1046baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1056baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1066baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono void blockDocument(int deviceId, int objectHandle) { 1076baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono blockedDocuments.put(pack(deviceId, objectHandle), new CountDownLatch(1)); 1086baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1096baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1106baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono void unblockDocument(int deviceId, int objectHandle) { 1116baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono blockedDocuments.get(pack(deviceId, objectHandle)).countDown(); 1126baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1136baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1146baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono @Override 1156baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocument getDocument(int deviceId, int objectHandle) throws IOException { 1166baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final CountDownLatch latch = blockedDocuments.get(pack(deviceId, objectHandle)); 1176baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono if (latch != null) { 1186baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono try { 1196baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono latch.await(); 1206baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } catch(InterruptedException e) { 1216baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono fail(); 1226baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1236baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1246baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono return super.getDocument(deviceId, objectHandle); 1256baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1266baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1276baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono} 128