private Task<Void> waitForConnectionAsync() { synchronized (connectionLock) { return connectionTaskCompletionSource.getTask(); } }
@Override public Task<Void> then(Task<Void> toAwait) { synchronized (currentLock) { current = toAwait; } return tcs.getTask(); } });
@Override public Task<Void> then(Task<Void> task) { return tcs.getTask(); } });
@Override public Task<Void> then(Task<Void> task) { try { db.close(); } finally { tcs.setResult(null); } return tcs.getTask(); } }, dbExecutor);
public Task<Integer> pendingCountAsync() { final TaskCompletionSource<Integer> tcs = new TaskCompletionSource<>(); taskQueue.enqueue(new Continuation<Void, Task<Void>>() { @Override public Task<Void> then(Task<Void> toAwait) { return pendingCountAsync(toAwait).continueWithTask(new Continuation<Integer, Task<Void>>() { @Override public Task<Void> then(Task<Integer> task) { int count = task.getResult(); tcs.setResult(count); return Task.forResult(null); } }); } }); return tcs.getTask(); }
/** * Pins the eventually operation on {@link ParsePinningEventuallyQueue#taskQueue}. * * @return Returns a Task that will be resolved when the command completes. */ @Override public Task<JSONObject> enqueueEventuallyAsync(final ParseRESTCommand command, final ParseObject object) { Parse.requirePermission(Manifest.permission.ACCESS_NETWORK_STATE); final TaskCompletionSource<JSONObject> tcs = new TaskCompletionSource<>(); taskQueue.enqueue(new Continuation<Void, Task<Void>>() { @Override public Task<Void> then(Task<Void> toAwait) { return enqueueEventuallyAsync(command, object, toAwait, tcs); } }); return tcs.getTask(); }
@Override public Task<JSONObject> then(Task<JSONObject> task) { synchronized (taskQueueSyncLock) { pendingEventuallyTasks.remove(uuid); uuidToOperationSet.remove(uuid); uuidToEventuallyPin.remove(uuid); } Exception error = task.getError(); if (error != null) { tcs.trySetError(error); } else if (task.isCancelled()) { tcs.trySetCancelled(); } else { tcs.trySetResult(task.getResult()); } return tcs.getTask(); } });
private static TaskCompletionSource<ParseObject.State> mockObjectControllerForSave() { TaskCompletionSource<ParseObject.State> tcs = new TaskCompletionSource<>(); ParseObjectController objectController = mock(ParseObjectController.class); when(objectController.saveAsync( any(ParseObject.State.class), any(ParseOperationSet.class), anyString(), any(ParseDecoder.class)) ).thenReturn(tcs.getTask()); ParseCorePlugins.getInstance().registerObjectController(objectController); return tcs; }
pendingEventuallyTasks.put(uuid, tcs); return tcs.getTask(); } else { tcs = pendingEventuallyTasks.get(uuid);
private static TaskCompletionSource<Void> mockObjectControllerForDelete() { TaskCompletionSource<Void> tcs = new TaskCompletionSource<>(); ParseObjectController objectController = mock(ParseObjectController.class); when(objectController.deleteAsync( any(ParseObject.State.class), anyString()) ).thenReturn(tcs.getTask()); ParseCorePlugins.getInstance().registerObjectController(objectController); return tcs; }
return tcs.getTask();
fullTask = taskStart.then(readyToStart.getTask()); } catch (RuntimeException e) { throw e;
return tcs.getTask();
return retryTask.getTask();
@Test public void testGetAsyncWithNoInstallationRaceCondition() throws ParseException { // Mock installationId InstallationId installationId = mock(InstallationId.class); when(installationId.get()).thenReturn("testInstallationId"); //noinspection unchecked ParseObjectStore<ParseInstallation> store = mock(ParseObjectStore.class); TaskCompletionSource<ParseInstallation> tcs = new TaskCompletionSource(); when(store.getAsync()).thenReturn(tcs.getTask()); // Create test controller CachedCurrentInstallationController controller = new CachedCurrentInstallationController(store, installationId); Task<ParseInstallation> taskA = controller.getAsync(); Task<ParseInstallation> taskB = controller.getAsync(); tcs.setResult(null); ParseInstallation installationA = ParseTaskUtils.wait(taskA); ParseInstallation installationB = ParseTaskUtils.wait(taskB); verify(store, times(1)).getAsync(); assertSame(controller.currentInstallation, installationA); assertSame(controller.currentInstallation, installationB); // Make sure device info is updated assertEquals("testInstallationId", installationA.getInstallationId()); assertEquals("android", installationA.get(KEY_DEVICE_TYPE)); }
@Test public void testQueryCancellation() throws ParseException { TestQueryController controller = new TestQueryController(); ParseCorePlugins.getInstance().registerQueryController(controller); TaskCompletionSource<Void> tcs = new TaskCompletionSource(); controller.await(tcs.getTask()); ParseQuery<ParseObject> query = ParseQuery.getQuery("TestObject"); query.setUser(new ParseUser()); Task<Void> task = query.findInBackground().makeVoid(); query.cancel(); tcs.setResult(null); try { ParseTaskUtils.wait(task); } catch (RuntimeException e) { assertThat(e.getCause(), instanceOf(CancellationException.class)); } // Should succeed task = query.findInBackground().makeVoid(); ParseTaskUtils.wait(task); }
@Test public void testIsRunning() { TestQueryController controller = new TestQueryController(); ParseCorePlugins.getInstance().registerQueryController(controller); TaskCompletionSource<Void> tcs = new TaskCompletionSource<>(); controller.await(tcs.getTask()); ParseQuery<ParseObject> query = ParseQuery.getQuery("TestObject"); query.setUser(new ParseUser()); assertFalse(query.isRunning()); query.findInBackground(); assertTrue(query.isRunning()); tcs.setResult(null); assertFalse(query.isRunning()); // Run another tcs = new TaskCompletionSource<>(); controller.await(tcs.getTask()); query.findInBackground(); assertTrue(query.isRunning()); query.cancel(); assertFalse(query.isRunning()); }
@Test public void testMultipleQueries() { TestQueryController controller1 = new TestQueryController(); TestQueryController controller2 = new TestQueryController(); TaskCompletionSource<Void> tcs1 = new TaskCompletionSource<>(); TaskCompletionSource<Void> tcs2 = new TaskCompletionSource<>(); controller1.await(tcs1.getTask()); controller2.await(tcs2.getTask()); ParseQuery<ParseObject> query = ParseQuery.getQuery("TestObject"); query.setUser(new ParseUser()); ParseCorePlugins.getInstance().registerQueryController(controller1); query.findInBackground(); assertTrue(query.isRunning()); ParseCorePlugins.getInstance().reset(); ParseCorePlugins.getInstance().registerQueryController(controller2); query.countInBackground(); assertTrue(query.isRunning()); // Stop the first operation. tcs1.setResult(null); assertTrue(query.isRunning()); // Stop the second. tcs2.setResult(null); assertFalse(query.isRunning()); }
@Test public void testMultipleQueriesWithInflightChanges() throws ParseException { Parse.enableLocalDatastore(null); TestQueryController controller = new TestQueryController(); TaskCompletionSource<Void> tcs = new TaskCompletionSource<>(); controller.await(tcs.getTask()); ParseQuery<ParseObject> query = ParseQuery.getQuery("TestObject"); query.setUser(new ParseUser()); ParseCorePlugins.getInstance().registerQueryController(controller); List<Task<Void>> tasks = Arrays.asList( query.fromNetwork().findInBackground().makeVoid(), query.fromLocalDatastore().findInBackground().makeVoid(), query.setLimit(10).findInBackground().makeVoid(), query.whereEqualTo("key", "value").countInBackground().makeVoid()); assertTrue(query.isRunning()); tcs.trySetResult(null); ParseTaskUtils.wait(Task.whenAll(tasks)); assertFalse(query.isRunning()); }