From 3edcde295326db07520ed5eedde087c24c16dfd0 Mon Sep 17 00:00:00 2001 From: Daichi Hirono Date: Tue, 12 Apr 2016 11:29:07 +0900 Subject: [PATCH] Fix flakiness DocumentLoader#testCancelTask. For testing, we use blockDocument and unblockDocument test mehtods to control flow of DocumentLoader's background thread. Previously testCancelTask may exit before the background thread goes back from blocking, which causes InterruptedException. Fixes: 28125289 Change-Id: Id03826733c5b6f1da66b9280838eb1d2897ed5fc --- .../src/com/android/mtp/DocumentLoader.java | 7 ++++--- .../src/com/android/mtp/DocumentLoaderTest.java | 17 +++++++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java b/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java index 329afdd4f17cd..6ed4ea1db4994 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/DocumentLoader.java @@ -196,9 +196,10 @@ class DocumentLoader implements AutoCloseable { } task.loadObjectInfoList(NUM_LOADING_ENTRIES); final boolean shouldNotify = - task.mLastNotified.getTime() < - new Date().getTime() - NOTIFY_PERIOD_MS || - task.getState() != LoaderTask.STATE_LOADING; + task.getState() != LoaderTask.STATE_CANCELLED && + (task.mLastNotified.getTime() < + new Date().getTime() - NOTIFY_PERIOD_MS || + task.getState() != LoaderTask.STATE_LOADING); if (shouldNotify) { task.notify(mResolver); } diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java index 60dd7e16a1d9d..a3c6bd77cefbd 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/DocumentLoaderTest.java @@ -143,9 +143,9 @@ public class DocumentLoaderTest extends AndroidTestCase { } } - public void testCancelTask() throws IOException, InterruptedException { + public void testCancelTask() throws IOException, InterruptedException, TimeoutException { setUpDocument(mManager, - DocumentLoader.NUM_INITIAL_ENTRIES + DocumentLoader.NUM_LOADING_ENTRIES + 1); + DocumentLoader.NUM_INITIAL_ENTRIES + 1); // Block the first iteration in the background thread. mManager.blockDocument( @@ -155,19 +155,24 @@ public class DocumentLoaderTest extends AndroidTestCase { MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier)) { assertTrue(cursor.getExtras().getBoolean(DocumentsContract.EXTRA_LOADING)); } - Thread.sleep(DocumentLoader.NOTIFY_PERIOD_MS); + + final Uri uri = DocumentsContract.buildChildDocumentsUri( + MtpDocumentsProvider.AUTHORITY, mParentIdentifier.mDocumentId); + assertEquals(0, mResolver.getChangeCount(uri)); // Clear task while the first iteration is being blocked. + mLoader.cancelTask(mParentIdentifier); mManager.unblockDocument( 0, DocumentLoader.NUM_INITIAL_ENTRIES + 1); - mLoader.cancelTask(mParentIdentifier); - - Thread.sleep(DocumentLoader.NOTIFY_PERIOD_MS * 2); + Thread.sleep(DocumentLoader.NOTIFY_PERIOD_MS); + assertEquals(0, mResolver.getChangeCount(uri)); // Check if it's OK to query invalidated task. try (final Cursor cursor = mLoader.queryChildDocuments( MtpDocumentsProvider.DEFAULT_DOCUMENT_PROJECTION, mParentIdentifier)) { + assertTrue(cursor.getExtras().getBoolean(DocumentsContract.EXTRA_LOADING)); } + mResolver.waitForNotification(uri, 1); } private void setUpLoader() {