Index: sync/test/android/javatests/src/org/chromium/sync/test/util/MockAccountManager.java |
diff --git a/sync/test/android/javatests/src/org/chromium/sync/test/util/MockAccountManager.java b/sync/test/android/javatests/src/org/chromium/sync/test/util/MockAccountManager.java |
index 3b3fd39313cc7daf4f06f4aeb4d3cd48fc9d9925..8c3efc9055aaf48d523040e2767f40f6d48a1358 100644 |
--- a/sync/test/android/javatests/src/org/chromium/sync/test/util/MockAccountManager.java |
+++ b/sync/test/android/javatests/src/org/chromium/sync/test/util/MockAccountManager.java |
@@ -90,6 +90,10 @@ public class MockAccountManager implements AccountManagerDelegate { |
private final SingleThreadedExecutor mExecutor; |
+ // Tracks the number of in-progress getAccountsByType() tasks so that tests can wait for |
+ // their completion. |
+ private final ZeroCounter mGetAccountsTaskCounter; |
+ |
@VisibleForTesting |
public MockAccountManager(Context context, Context testContext, Account... accounts) { |
mContext = context; |
@@ -98,6 +102,7 @@ public class MockAccountManager implements AccountManagerDelegate { |
mTestContext = testContext; |
mMainHandler = new Handler(mContext.getMainLooper()); |
mExecutor = new SingleThreadedExecutor(); |
+ mGetAccountsTaskCounter = new ZeroCounter(); |
mAccounts = new HashSet<AccountHolder>(); |
mAccountPermissionPreparations = new LinkedList<AccountAuthTokenPreparation>(); |
if (accounts != null) { |
@@ -139,6 +144,7 @@ public class MockAccountManager implements AccountManagerDelegate { |
@Override |
public void getAccountsByType(final String type, final Callback<Account[]> callback) { |
+ mGetAccountsTaskCounter.increment(); |
new AsyncTask<Void, Void, Account[]>() { |
@Override |
protected Account[] doInBackground(Void... params) { |
@@ -148,11 +154,18 @@ public class MockAccountManager implements AccountManagerDelegate { |
@Override |
protected void onPostExecute(Account[] accounts) { |
callback.onResult(accounts); |
+ mGetAccountsTaskCounter.decrement(); |
} |
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); |
} |
@VisibleForTesting |
+ public void waitForGetAccountsTask() throws InterruptedException { |
+ // Wait until all tasks are done because we don't know which is being waited for. |
+ mGetAccountsTaskCounter.waitUntilZero(); |
+ } |
+ |
+ @VisibleForTesting |
public boolean addAccountHolderExplicitly(AccountHolder accountHolder) { |
return addAccountHolderExplicitly(accountHolder, false); |
} |
@@ -643,4 +656,36 @@ public class MockAccountManager implements AccountManagerDelegate { |
+ '}'; |
} |
} |
+ |
+ /** |
+ * Simple concurrency helper class for waiting until a resource count becomes zero. |
+ */ |
+ private static class ZeroCounter { |
+ private static final int WAIT_TIMEOUT_MS = 10000; |
+ |
+ private final Object mLock = new Object(); |
+ private int mCount = 0; |
+ |
+ public void increment() { |
+ synchronized (mLock) { |
+ mCount++; |
+ } |
+ } |
+ |
+ public void decrement() { |
+ synchronized (mLock) { |
+ if (--mCount == 0) { |
+ mLock.notifyAll(); |
+ } |
+ } |
+ } |
+ |
+ public void waitUntilZero() throws InterruptedException { |
+ synchronized (mLock) { |
+ while (mCount != 0) { |
+ mLock.wait(WAIT_TIMEOUT_MS); |
+ } |
+ } |
+ } |
+ } |
} |