DocumentLoaderTest.java revision 47eb192b2704e27272ca94a95680cac40b6bff3f
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; 254604b74603ea951c0f0d0fc2d9b6bd46ae54e245Daichi Hironoimport android.test.suitebuilder.annotation.MediumTest; 266baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 276baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.io.IOException; 286baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.util.HashMap; 296baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.util.Map; 306baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironoimport java.util.concurrent.CountDownLatch; 316baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 324604b74603ea951c0f0d0fc2d9b6bd46ae54e245Daichi Hirono@MediumTest 336baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hironopublic class DocumentLoaderTest extends AndroidTestCase { 3447eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono private MtpDatabase mDatabase; 35bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski private BlockableTestMtpManager mManager; 366baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono private TestContentResolver mResolver; 376baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono private DocumentLoader mLoader; 3847eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono final private Identifier mParentIdentifier = new Identifier(0, 0, 0, "1"); 396baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 406baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono @Override 416baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono public void setUp() { 4247eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono mDatabase = new MtpDatabase(getContext(), MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); 4347eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono mDatabase.startAddingRootDocuments(0); 4447eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono mDatabase.putRootDocuments(0, new TestResources(), new MtpRoot[] { 4547eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono new MtpRoot(0, 0, "Device", "Storage", 1000, 1000, "") 4647eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono }); 4747eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono mDatabase.stopAddingRootDocuments(0); 48bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski mManager = new BlockableTestMtpManager(getContext()); 496baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mResolver = new TestContentResolver(); 5047eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono mLoader = new DocumentLoader(mManager, mResolver, mDatabase); 5147eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono } 5247eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono 5347eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono @Override 5447eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono public void tearDown() { 5547eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono mDatabase.close(); 566baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 576baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 588b9024f0c20b1b79df1f2d0bc2f1a82f726b1176Daichi Hirono public void testBasic() throws Exception { 596baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Uri uri = DocumentsContract.buildChildDocumentsUri( 606baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.AUTHORITY, mParentIdentifier.toDocumentId()); 616baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono setUpDocument(mManager, 40); 626baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.blockDocument(0, 15); 636baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.blockDocument(0, 35); 646baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 656baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono { 666baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Cursor cursor = mLoader.queryChildDocuments( 676baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); 686baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals(DocumentLoader.NUM_INITIAL_ENTRIES, cursor.getCount()); 696baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 706baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 716baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono Thread.sleep(DocumentLoader.NOTIFY_PERIOD_MS); 726baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.unblockDocument(0, 15); 736baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mResolver.waitForNotification(uri, 1); 746baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 756baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono { 766baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Cursor cursor = mLoader.queryChildDocuments( 776baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); 786baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals( 796baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono DocumentLoader.NUM_INITIAL_ENTRIES + DocumentLoader.NUM_LOADING_ENTRIES, 806baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono cursor.getCount()); 816baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 826baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 836baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.unblockDocument(0, 35); 846baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mResolver.waitForNotification(uri, 2); 856baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 866baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono { 876baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Cursor cursor = mLoader.queryChildDocuments( 886baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); 896baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals(40, cursor.getCount()); 906baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 916baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 926baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals(2, mResolver.getChangeCount(uri)); 936baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 946baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 956baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono private void setUpDocument(TestMtpManager manager, int count) { 966baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono int[] childDocuments = new int[count]; 976baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono for (int i = 0; i < childDocuments.length; i++) { 986baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final int objectHandle = i + 1; 996baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono childDocuments[i] = objectHandle; 100bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski manager.setObjectInfo(0, new MtpObjectInfo.Builder() 101bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski .setObjectHandle(objectHandle) 10247eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono .setName(Integer.toString(i)) 103bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski .build()); 1046baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1056baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono manager.setObjectHandles(0, 0, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, childDocuments); 1066baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1076baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 108bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski private static class BlockableTestMtpManager extends TestMtpManager { 1096baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final private Map<String, CountDownLatch> blockedDocuments = new HashMap<>(); 1106baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 111bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski BlockableTestMtpManager(Context context) { 1126baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono super(context); 1136baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1146baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1156baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono void blockDocument(int deviceId, int objectHandle) { 1166baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono blockedDocuments.put(pack(deviceId, objectHandle), new CountDownLatch(1)); 1176baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1186baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1196baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono void unblockDocument(int deviceId, int objectHandle) { 1206baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono blockedDocuments.get(pack(deviceId, objectHandle)).countDown(); 1216baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1226baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1236baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono @Override 124bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski MtpObjectInfo getObjectInfo(int deviceId, int objectHandle) throws IOException { 1256baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final CountDownLatch latch = blockedDocuments.get(pack(deviceId, objectHandle)); 1266baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono if (latch != null) { 1276baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono try { 1286baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono latch.await(); 1296baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } catch(InterruptedException e) { 1306baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono fail(); 1316baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1326baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 133bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski return super.getObjectInfo(deviceId, objectHandle); 1346baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1356baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1366baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono} 137