DocumentLoaderTest.java revision bb430fa930fa0d0700e46e7b4881de2a252223dd
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; 21bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewskiimport android.mtp.MtpObjectInfo; 226baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport android.net.Uri; 236baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport android.provider.DocumentsContract; 246baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport android.test.AndroidTestCase; 256baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport android.test.suitebuilder.annotation.SmallTest; 266baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 276baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.io.IOException; 286baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.util.Date; 296baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.util.HashMap; 306baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.util.Map; 316baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.util.concurrent.CountDownLatch; 326baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 336baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono@SmallTest 346baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironopublic class DocumentLoaderTest extends AndroidTestCase { 35bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski private BlockableTestMtpManager mManager; 366baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono private TestContentResolver mResolver; 376baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono private DocumentLoader mLoader; 386baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final private Identifier mParentIdentifier = new Identifier(0, 0, 0); 396baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 406baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono @Override 416baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono public void setUp() { 42bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski mManager = new BlockableTestMtpManager(getContext()); 436baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mResolver = new TestContentResolver(); 446baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mLoader = new DocumentLoader(mManager, mResolver); 456baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 466baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 478b9024f0c20b1b79df1f2d0bc2f1a82f726b1176Daichi Hirono public void testBasic() throws Exception { 486baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Uri uri = DocumentsContract.buildChildDocumentsUri( 496baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.AUTHORITY, mParentIdentifier.toDocumentId()); 506baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono setUpDocument(mManager, 40); 516baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.blockDocument(0, 15); 526baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.blockDocument(0, 35); 536baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 546baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono { 556baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Cursor cursor = mLoader.queryChildDocuments( 566baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); 576baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals(DocumentLoader.NUM_INITIAL_ENTRIES, cursor.getCount()); 586baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 596baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 606baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono Thread.sleep(DocumentLoader.NOTIFY_PERIOD_MS); 616baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.unblockDocument(0, 15); 626baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mResolver.waitForNotification(uri, 1); 636baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 646baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono { 656baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Cursor cursor = mLoader.queryChildDocuments( 666baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); 676baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals( 686baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono DocumentLoader.NUM_INITIAL_ENTRIES + DocumentLoader.NUM_LOADING_ENTRIES, 696baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono cursor.getCount()); 706baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 716baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 726baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.unblockDocument(0, 35); 736baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mResolver.waitForNotification(uri, 2); 746baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 756baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono { 766baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Cursor cursor = mLoader.queryChildDocuments( 776baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); 786baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals(40, cursor.getCount()); 796baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 806baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 816baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals(2, mResolver.getChangeCount(uri)); 826baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 836baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 846baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono private void setUpDocument(TestMtpManager manager, int count) { 856baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono int[] childDocuments = new int[count]; 866baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono for (int i = 0; i < childDocuments.length; i++) { 876baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final int objectHandle = i + 1; 886baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono childDocuments[i] = objectHandle; 89bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski manager.setObjectInfo(0, new MtpObjectInfo.Builder() 90bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski .setObjectHandle(objectHandle) 91bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski .build()); 926baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 936baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono manager.setObjectHandles(0, 0, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, childDocuments); 946baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 956baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 96bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski private static class BlockableTestMtpManager extends TestMtpManager { 976baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final private Map<String, CountDownLatch> blockedDocuments = new HashMap<>(); 986baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 99bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski BlockableTestMtpManager(Context context) { 1006baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono super(context); 1016baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1026baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1036baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono void blockDocument(int deviceId, int objectHandle) { 1046baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono blockedDocuments.put(pack(deviceId, objectHandle), new CountDownLatch(1)); 1056baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1066baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1076baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono void unblockDocument(int deviceId, int objectHandle) { 1086baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono blockedDocuments.get(pack(deviceId, objectHandle)).countDown(); 1096baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1106baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1116baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono @Override 112bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski MtpObjectInfo getObjectInfo(int deviceId, int objectHandle) throws IOException { 1136baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final CountDownLatch latch = blockedDocuments.get(pack(deviceId, objectHandle)); 1146baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono if (latch != null) { 1156baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono try { 1166baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono latch.await(); 1176baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } catch(InterruptedException e) { 1186baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono fail(); 1196baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1206baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 121bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski return super.getObjectInfo(deviceId, objectHandle); 1226baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1236baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1246baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono} 125