/** * Copyright (c) 2012 Todoroo Inc * * See the file "LICENSE" for the full license governing this code. */ package com.todoroo.astrid.sync.repeats; import java.io.IOException; import java.util.Date; import java.util.List; import java.util.concurrent.Semaphore; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AccountManagerFuture; import android.content.Intent; import android.os.Bundle; import com.google.api.client.googleapis.extensions.android2.auth.GoogleAccountManager; import com.google.api.services.tasks.model.Tasks; import com.timsu.astrid.R; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.gtasks.GtasksMetadata; import com.todoroo.astrid.gtasks.GtasksMetadataService; import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.api.GtasksApiUtilities; import com.todoroo.astrid.gtasks.api.GtasksInvoker; import com.todoroo.astrid.gtasks.auth.GtasksTokenValidator; import com.todoroo.astrid.gtasks.sync.GtasksSyncService; import com.todoroo.astrid.gtasks.sync.GtasksSyncV2Provider; import com.todoroo.astrid.service.MetadataService; import com.todoroo.astrid.sync.SyncResultCallbackAdapter; public class RepeatTestsGtasksSync extends AbstractSyncRepeatTests<com.google.api.services.tasks.model.Task> { @Autowired MetadataService metadataService; @Autowired GtasksMetadataService gtasksMetadataService; @Autowired GtasksPreferenceService gtasksPreferenceService; @Autowired GtasksSyncService gtasksSyncService; private static final String TEST_ACCOUNT = "sync_tester2@astrid.com"; public static final String DEFAULT_LIST = "@default"; private static boolean initialized = false; protected static GtasksInvoker gtasksService; @Override protected void setUp() throws Exception { super.setUp(); Preferences.setStringFromInteger(R.string.p_default_urgency_key, 0); if (!initialized) { initializeTestService(); } gtasksSyncService.initialize(); setupTestList(); } @Override protected void waitAndSync() { AndroidUtilities.sleepDeep(3000L); final Semaphore sema = new Semaphore(0); GtasksSyncV2Provider.getInstance().synchronizeActiveTasks(true, new SyncResultCallbackAdapter() { @Override public void finished() { sema.release(); } }); try { sema.acquire(); } catch (InterruptedException e) { fail("Interrupted while waiting for sync to finish"); } AndroidUtilities.sleepDeep(3000L); gtasksSyncService.waitUntilEmpty(); } @Override protected com.google.api.services.tasks.model.Task assertTaskExistsRemotely(Task t, long expectedRemoteTime) { Metadata metadata = gtasksMetadataService.getTaskMetadata(t.getId()); assertNotNull(metadata); String listId = metadata.getValue(GtasksMetadata.LIST_ID); String taskId = metadata.getValue(GtasksMetadata.ID); com.google.api.services.tasks.model.Task remote = null; try { remote = gtasksService.getGtask(listId, taskId); } catch (IOException e){ e.printStackTrace(); fail("Exception in gtasks service"); } assertNotNull(remote); assertEquals(t.getValue(Task.TITLE), remote.getTitle()); Date expected = new Date(expectedRemoteTime); expected.setHours(0); expected.setMinutes(0); expected.setSeconds(0); long gtasksTime = GtasksApiUtilities.gtasksDueTimeToUnixTime(remote.getDue(), 0); assertTimesMatch(expected.getTime(), gtasksTime); return remote; } @Override protected void assertTaskCompletedRemotely(Task t) { Metadata metadata = gtasksMetadataService.getTaskMetadata(t.getId()); assertNotNull(metadata); String listId = metadata.getValue(GtasksMetadata.LIST_ID); String taskId = metadata.getValue(GtasksMetadata.ID); com.google.api.services.tasks.model.Task remote = null; try { remote = gtasksService.getGtask(listId, taskId); } catch (IOException e) { e.printStackTrace(); fail("Exception in gtasks service"); } assertNotNull(remote); assertEquals(t.getValue(Task.TITLE), remote.getTitle()); } private void initializeTestService() throws Exception { GoogleAccountManager manager = new GoogleAccountManager(ContextManager.getContext()); Account[] accounts = manager.getAccounts(); Account toUse = null; for (Account a : accounts) { if (a.name.equals(TEST_ACCOUNT)) { toUse = a; break; } } if (toUse == null) { if (accounts.length == 0) { return; } toUse = accounts[0]; } Preferences.setString(GtasksPreferenceService.PREF_USER_NAME, toUse.name); AccountManagerFuture<Bundle> accountManagerFuture = manager.manager.getAuthToken(toUse, "oauth2:https://www.googleapis.com/auth/tasks", true, null, null); Bundle authTokenBundle = accountManagerFuture.getResult(); if (authTokenBundle.containsKey(AccountManager.KEY_INTENT)) { Intent i = (Intent) authTokenBundle.get(AccountManager.KEY_INTENT); ContextManager.getContext().startActivity(i); return; } String authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); authToken = GtasksTokenValidator.validateAuthToken(getContext(), authToken); gtasksPreferenceService.setToken(authToken); gtasksService = new GtasksInvoker(authToken); initialized = true; } private void setupTestList() throws Exception { Tasks defaultListTasks = gtasksService.getAllGtasksFromListId(DEFAULT_LIST, false, false, 0); List<com.google.api.services.tasks.model.Task> items = defaultListTasks.getItems(); if (items != null) { for (com.google.api.services.tasks.model.Task t : items) { gtasksService.deleteGtask(DEFAULT_LIST, t.getId()); } } } }