/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ package org.mozilla.android.sync.test; import java.util.ArrayList; import org.json.simple.JSONArray; import org.mozilla.gecko.sync.Utils; import org.mozilla.gecko.sync.repositories.NullCursorException; import org.mozilla.gecko.sync.repositories.android.ClientsDatabase; import org.mozilla.gecko.sync.repositories.android.ClientsDatabaseAccessor; import org.mozilla.gecko.sync.repositories.android.RepoUtils; import org.mozilla.gecko.sync.repositories.domain.ClientRecord; import android.database.Cursor; import android.test.AndroidTestCase; public class TestClientsDatabase extends AndroidTestCase { protected ClientsDatabase db; public void setUp() { db = new ClientsDatabase(mContext); db.wipeDB(); } public void testStoreAndFetch() { ClientRecord record = new ClientRecord(); String profileConst = ClientsDatabaseAccessor.PROFILE_ID; db.store(profileConst, record); Cursor cur = null; try { // Test stored item gets fetched correctly. cur = db.fetchClientsCursor(record.guid, profileConst); assertTrue(cur.moveToFirst()); assertEquals(1, cur.getCount()); String guid = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_ACCOUNT_GUID); String profileId = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_PROFILE); String clientName = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_NAME); String clientType = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_TYPE); assertEquals(record.guid, guid); assertEquals(profileConst, profileId); assertEquals(record.name, clientName); assertEquals(record.type, clientType); } catch (NullCursorException e) { fail("Should not have NullCursorException"); } finally { if (cur != null) { cur.close(); } } } public void testStoreAndFetchSpecificCommands() { String accountGUID = Utils.generateGuid(); ArrayList<String> args = new ArrayList<String>(); args.add("URI of Page"); args.add("Sender GUID"); args.add("Title of Page"); String jsonArgs = JSONArray.toJSONString(args); Cursor cur = null; try { db.store(accountGUID, "displayURI", jsonArgs); // This row should not show up in the fetch. args.add("Another arg."); db.store(accountGUID, "displayURI", JSONArray.toJSONString(args)); // Test stored item gets fetched correctly. cur = db.fetchSpecificCommand(accountGUID, "displayURI", jsonArgs); assertTrue(cur.moveToFirst()); assertEquals(1, cur.getCount()); String guid = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_ACCOUNT_GUID); String commandType = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_COMMAND); String fetchedArgs = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_ARGS); assertEquals(accountGUID, guid); assertEquals("displayURI", commandType); assertEquals(jsonArgs, fetchedArgs); } catch (NullCursorException e) { fail("Should not have NullCursorException"); } finally { if (cur != null) { cur.close(); } } } public void testFetchCommandsForClient() { String accountGUID = Utils.generateGuid(); ArrayList<String> args = new ArrayList<String>(); args.add("URI of Page"); args.add("Sender GUID"); args.add("Title of Page"); String jsonArgs = JSONArray.toJSONString(args); Cursor cur = null; try { db.store(accountGUID, "displayURI", jsonArgs); // This row should ALSO show up in the fetch. args.add("Another arg."); db.store(accountGUID, "displayURI", JSONArray.toJSONString(args)); // Test both stored items with the same GUID but different command are fetched. cur = db.fetchCommandsForClient(accountGUID); assertTrue(cur.moveToFirst()); assertEquals(2, cur.getCount()); } catch (NullCursorException e) { fail("Should not have NullCursorException"); } finally { if (cur != null) { cur.close(); } } } public void testDelete() { ClientRecord record1 = new ClientRecord(); ClientRecord record2 = new ClientRecord(); String profileConst = ClientsDatabaseAccessor.PROFILE_ID; db.store(profileConst, record1); db.store(profileConst, record2); Cursor cur = null; try { // Test record doesn't exist after delete. db.deleteClient(record1.guid, profileConst); cur = db.fetchClientsCursor(record1.guid, profileConst); assertFalse(cur.moveToFirst()); assertEquals(0, cur.getCount()); // Test record2 still there after deleting record1. cur = db.fetchClientsCursor(record2.guid, profileConst); assertTrue(cur.moveToFirst()); assertEquals(1, cur.getCount()); String guid = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_ACCOUNT_GUID); String profileId = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_PROFILE); String clientName = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_NAME); String clientType = RepoUtils.getStringFromCursor(cur, ClientsDatabase.COL_TYPE); assertEquals(record2.guid, guid); assertEquals(profileConst, profileId); assertEquals(record2.name, clientName); assertEquals(record2.type, clientType); } catch (NullCursorException e) { fail("Should not have NullCursorException"); } finally { if (cur != null) { cur.close(); } } } public void testWipe() { ClientRecord record1 = new ClientRecord(); ClientRecord record2 = new ClientRecord(); String profileConst = ClientsDatabaseAccessor.PROFILE_ID; db.store(profileConst, record1); db.store(profileConst, record2); Cursor cur = null; try { // Test before wipe the records are there. cur = db.fetchClientsCursor(record2.guid, profileConst); assertTrue(cur.moveToFirst()); assertEquals(1, cur.getCount()); cur = db.fetchClientsCursor(record2.guid, profileConst); assertTrue(cur.moveToFirst()); assertEquals(1, cur.getCount()); // Test after wipe neither record exists. db.wipeClientsTable(); cur = db.fetchClientsCursor(record2.guid, profileConst); assertFalse(cur.moveToFirst()); assertEquals(0, cur.getCount()); cur = db.fetchClientsCursor(record1.guid, profileConst); assertFalse(cur.moveToFirst()); assertEquals(0, cur.getCount()); } catch (NullCursorException e) { fail("Should not have NullCursorException"); } finally { if (cur != null) { cur.close(); } } } }