DocumentLoaderTest.java revision 0f32537e40ee2662d4f0b7b625ee280ca9c02066
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; 386a5ea7eae8a70bced97ceef051c965c27cb642caDaichi Hirono final private Identifier mParentIdentifier = new Identifier( 39619afdaae1ec7dcbd71bb1f698a0901a1fa290feDaichi Hirono 0, 0, 0, "2", MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE); 406baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 416baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono @Override 42619afdaae1ec7dcbd71bb1f698a0901a1fa290feDaichi Hirono public void setUp() throws Exception { 4347eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono mDatabase = new MtpDatabase(getContext(), MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY); 44619afdaae1ec7dcbd71bb1f698a0901a1fa290feDaichi Hirono 45619afdaae1ec7dcbd71bb1f698a0901a1fa290feDaichi Hirono mDatabase.getMapper().startAddingDocuments(null); 46619afdaae1ec7dcbd71bb1f698a0901a1fa290feDaichi Hirono mDatabase.getMapper().putDeviceDocument( 474e94b8deaa646f176bad9b80d5924ce64142743eDaichi Hirono new MtpDeviceRecord(0, "Device", null, true, new MtpRoot[0], null, null)); 48619afdaae1ec7dcbd71bb1f698a0901a1fa290feDaichi Hirono mDatabase.getMapper().stopAddingDocuments(null); 49619afdaae1ec7dcbd71bb1f698a0901a1fa290feDaichi Hirono 50619afdaae1ec7dcbd71bb1f698a0901a1fa290feDaichi Hirono mDatabase.getMapper().startAddingDocuments("1"); 510f32537e40ee2662d4f0b7b625ee280ca9c02066Daichi Hirono mDatabase.getMapper().putStorageDocuments("1", new int[0], new MtpRoot[] { 52f83ccbd7edd32e728785fb7aad44f11886e79645Daichi Hirono new MtpRoot(0, 0, "Storage", 1000, 1000, "") 5347eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono }); 54619afdaae1ec7dcbd71bb1f698a0901a1fa290feDaichi Hirono mDatabase.getMapper().stopAddingDocuments("1"); 55619afdaae1ec7dcbd71bb1f698a0901a1fa290feDaichi Hirono 56bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski mManager = new BlockableTestMtpManager(getContext()); 576baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mResolver = new TestContentResolver(); 584e94b8deaa646f176bad9b80d5924ce64142743eDaichi Hirono mLoader = new DocumentLoader(0, mManager, mResolver, mDatabase); 5947eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono } 6047eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono 6147eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono @Override 624e94b8deaa646f176bad9b80d5924ce64142743eDaichi Hirono public void tearDown() throws Exception { 634e94b8deaa646f176bad9b80d5924ce64142743eDaichi Hirono mLoader.close(); 6447eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono mDatabase.close(); 656baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 666baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 678b9024f0c20b1b79df1f2d0bc2f1a82f726b1176Daichi Hirono public void testBasic() throws Exception { 686baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Uri uri = DocumentsContract.buildChildDocumentsUri( 699e8a4fa78f5b9e3964dca84ad4047210d35c4013Daichi Hirono MtpDocumentsProvider.AUTHORITY, mParentIdentifier.mDocumentId); 706baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono setUpDocument(mManager, 40); 716baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.blockDocument(0, 15); 726baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.blockDocument(0, 35); 736baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 746baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono { 756baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Cursor cursor = mLoader.queryChildDocuments( 766baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); 776baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals(DocumentLoader.NUM_INITIAL_ENTRIES, cursor.getCount()); 786baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 796baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 806baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono Thread.sleep(DocumentLoader.NOTIFY_PERIOD_MS); 816baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.unblockDocument(0, 15); 826baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mResolver.waitForNotification(uri, 1); 836baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 846baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono { 856baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Cursor cursor = mLoader.queryChildDocuments( 866baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); 876baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals( 886baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono DocumentLoader.NUM_INITIAL_ENTRIES + DocumentLoader.NUM_LOADING_ENTRIES, 896baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono cursor.getCount()); 906baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 916baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 926baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mManager.unblockDocument(0, 35); 936baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono mResolver.waitForNotification(uri, 2); 946baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 956baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono { 966baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final Cursor cursor = mLoader.queryChildDocuments( 976baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier); 986baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals(40, cursor.getCount()); 996baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1006baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1016baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono assertEquals(2, mResolver.getChangeCount(uri)); 1026baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1036baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1046baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono private void setUpDocument(TestMtpManager manager, int count) { 1056baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono int[] childDocuments = new int[count]; 1066baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono for (int i = 0; i < childDocuments.length; i++) { 1076baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final int objectHandle = i + 1; 1086baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono childDocuments[i] = objectHandle; 109bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski manager.setObjectInfo(0, new MtpObjectInfo.Builder() 110bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski .setObjectHandle(objectHandle) 11147eb192b2704e27272ca94a95680cac40b6bff3fDaichi Hirono .setName(Integer.toString(i)) 112bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski .build()); 1136baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1146baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono manager.setObjectHandles(0, 0, MtpManager.OBJECT_HANDLE_ROOT_CHILDREN, childDocuments); 1156baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1166baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 117bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski private static class BlockableTestMtpManager extends TestMtpManager { 1186baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final private Map<String, CountDownLatch> blockedDocuments = new HashMap<>(); 1196baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 120bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski BlockableTestMtpManager(Context context) { 1216baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono super(context); 1226baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1236baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1246baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono void blockDocument(int deviceId, int objectHandle) { 1256baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono blockedDocuments.put(pack(deviceId, objectHandle), new CountDownLatch(1)); 1266baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1276baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1286baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono void unblockDocument(int deviceId, int objectHandle) { 1296baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono blockedDocuments.get(pack(deviceId, objectHandle)).countDown(); 1306baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1316baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono 1326baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono @Override 133bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski MtpObjectInfo getObjectInfo(int deviceId, int objectHandle) throws IOException { 1346baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono final CountDownLatch latch = blockedDocuments.get(pack(deviceId, objectHandle)); 1356baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono if (latch != null) { 1366baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono try { 1376baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono latch.await(); 1386baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } catch(InterruptedException e) { 1396baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono fail(); 1406baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1416baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 142bb430fa930fa0d0700e46e7b4881de2a252223ddTomasz Mikolajewski return super.getObjectInfo(deviceId, objectHandle); 1436baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1446baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono } 1456baa16e9109046661fef8dcc25b8754ac68bcdaeDaichi Hirono} 146