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