package co.mwater.clientapp.test;
import java.util.UUID;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase;
import co.mwater.clientapp.dbsync.ChangeSet;
import co.mwater.clientapp.dbsync.CompleteDataSlice;
import co.mwater.clientapp.dbsync.DataSlice;
import co.mwater.clientapp.dbsync.PendingChangesException;
import co.mwater.clientapp.dbsync.SyncClientImpl;
import co.mwater.clientapp.dbsync.SyncTable;
public class SyncClientImplTests extends AndroidTestCase {
TestSyncDatabase testSyncDatabase = new TestSyncDatabase();
SQLiteDatabase db;
SyncClientImpl clientImpl;
DataSlice dataSlice = new CompleteDataSlice();
@Override
public void setUp() throws Exception {
super.setUp();
db = testSyncDatabase.setUp(getContext());
clientImpl = new SyncClientImpl(db, new SyncTable[] { new TestSyncTable() });
}
@Override
public void tearDown() throws Exception {
super.tearDown();
testSyncDatabase.tearDown();
}
public void testGetChangeSetEmpty() {
assertNull(clientImpl.getChangeSet());
}
public void testGetChangeSetUntil() {
String uid = UUID.randomUUID().toString();
testSyncDatabase.insert(uid, 0);
testSyncDatabase.update(uid, "changed", 0);
ChangeSet changeSet = clientImpl.getChangeSet();
assertEquals(2, changeSet.getUntil());
}
public void testGetChangeSetInsert() {
String uid = UUID.randomUUID().toString();
testSyncDatabase.insert(uid, 0);
ChangeSet changeSet = clientImpl.getChangeSet();
assertNotNull(changeSet);
// Check for one upsert
assertEquals(1, changeSet.getTables()[0].upserts.getCount());
assertEquals(0, changeSet.getTables()[0].deletes.getCount());
}
public void testGetChangeSetUpdate() {
String uid = UUID.randomUUID().toString();
testSyncDatabase.insert(uid, 1);
testSyncDatabase.update(uid, "changed", 1);
ChangeSet changeSet = clientImpl.getChangeSet();
assertNotNull(changeSet);
// Check for one upsert
assertEquals(1, changeSet.getTables()[0].upserts.getCount());
assertEquals(0, changeSet.getTables()[0].deletes.getCount());
}
public void testGetChangeSetDelete() {
String uid = UUID.randomUUID().toString();
testSyncDatabase.insert(uid, 1);
testSyncDatabase.update(uid, "changed", 1);
testSyncDatabase.delete(uid);
ChangeSet changeSet = clientImpl.getChangeSet();
assertNotNull(changeSet);
// Check for one delete (since row inserted was not new row)
assertEquals(0, changeSet.getTables()[0].upserts.getCount());
assertEquals(1, changeSet.getTables()[0].deletes.getCount());
}
public void testGetChangeSetUpdateAbsorbed() {
String uid = UUID.randomUUID().toString();
testSyncDatabase.insert(uid, 0);
testSyncDatabase.update(uid, "changed", 0);
ChangeSet changeSet = clientImpl.getChangeSet();
assertNotNull(changeSet);
// Check for one upsert alone (update should be folded in)
assertEquals(1, changeSet.getTables()[0].upserts.getCount());
assertEquals(0, changeSet.getTables()[0].deletes.getCount());
}
public void testGetChangeSetDeleteAbsorbedInsert() {
String uid = UUID.randomUUID().toString();
testSyncDatabase.insert(uid, 0);
testSyncDatabase.delete(uid);
ChangeSet changeSet = clientImpl.getChangeSet();
assertNotNull(changeSet);
// Check for zero inserts (delete should be folded in)
assertEquals(0, changeSet.getTables()[0].upserts.getCount());
assertEquals(0, changeSet.getTables()[0].deletes.getCount());
}
public void testMarkChangeSetSent() {
// Do two updates
String uid = UUID.randomUUID().toString();
testSyncDatabase.insert(uid, 0);
testSyncDatabase.update(uid, "changed1", 0);
testSyncDatabase.update(uid, "changed2", 0);
ChangeSet changeSet = clientImpl.getChangeSet();
// Mark as sent
clientImpl.markChangeSetSent(changeSet.getUntil());
// Check that no changes still left
changeSet = clientImpl.getChangeSet();
assertNull(changeSet);
}
public void testMarkChangeSetPartiallySent() {
// Do two updates
String uid = UUID.randomUUID().toString();
testSyncDatabase.insert(uid, 0);
testSyncDatabase.update(uid, "changed1", 0);
ChangeSet changeSet = clientImpl.getChangeSet();
testSyncDatabase.update(uid, "changed2", 0);
// Mark as sent
clientImpl.markChangeSetSent(changeSet.getUntil());
// Check that one update still left
changeSet = clientImpl.getChangeSet();
assertEquals(1, changeSet.getTables()[0].upserts.getCount());
assertEquals(0, changeSet.getTables()[0].deletes.getCount());
}
public void testApplyChangeSetInsert() {
// Create simple insert
ChangeSet changeSet = createTestChangeSet(10);
MatrixCursor upserts = (MatrixCursor) changeSet.getTable(TestSyncTable.TABLE_NAME).upserts;
upserts.addRow(new Object[] { "001", 1, "cola", "colb" });
// Apply
try {
clientImpl.applyChangeSet(changeSet, dataSlice);
} catch (PendingChangesException e) {
fail();
}
// Check that row was added
Cursor query = testSyncDatabase.query();
assertEquals(1, query.getCount());
query.moveToFirst();
assertEquals("cola", query.getString(query.getColumnIndex("a")));
// Check that no changes
assertNull(clientImpl.getChangeSet());
// Check until
assertEquals(10, clientImpl.getUntil(dataSlice));
}
public void testApplyChangeSetUpdate() {
// Make change and pretend sent to server
String uid = UUID.randomUUID().toString();
testSyncDatabase.insert(uid, 0);
clientImpl.markChangeSetSent(clientImpl.getChangeSet().getUntil());
// Create delete
ChangeSet changeSet = createTestChangeSet(10);
MatrixCursor upserts = (MatrixCursor) changeSet.getTable(TestSyncTable.TABLE_NAME).upserts;
upserts.addRow(new Object[] { uid, 2, "changed", "colb" });
// Apply
try {
clientImpl.applyChangeSet(changeSet, dataSlice);
} catch (PendingChangesException e) {
fail();
}
// Check that row was updated
Cursor query = testSyncDatabase.query();
assertEquals(1, query.getCount());
query.moveToFirst();
assertEquals("changed", query.getString(query.getColumnIndex("a")));
// Check that no changes
assertNull(clientImpl.getChangeSet());
}
public void testApplyChangeSetDelete() {
// Make change and pretend sent to server
String uid = UUID.randomUUID().toString();
testSyncDatabase.insert(uid, 0);
clientImpl.markChangeSetSent(clientImpl.getChangeSet().getUntil());
// Create delete
ChangeSet changeSet = createTestChangeSet(10);
MatrixCursor deletes = (MatrixCursor) changeSet.getTable(TestSyncTable.TABLE_NAME).deletes;
deletes.addRow(new Object[] { uid });
// Apply
try {
clientImpl.applyChangeSet(changeSet, dataSlice);
} catch (PendingChangesException e) {
fail();
}
// Check that row was deleted
Cursor query = testSyncDatabase.query();
assertEquals(0, query.getCount());
// Check that no changes
assertNull(clientImpl.getChangeSet());
}
public void testApplyChangeSetWithPending() {
ChangeSet changeSet = createTestChangeSet(10);
// Make change
String uid = UUID.randomUUID().toString();
testSyncDatabase.insert(uid, 0);
// Apply
try {
clientImpl.applyChangeSet(changeSet, dataSlice);
fail("Pending not thrown");
} catch (PendingChangesException e) {
}
}
public static ChangeSet createTestChangeSet(long until) {
ChangeSet.Table table = new ChangeSet.Table();
table.tableName = TestSyncTable.TABLE_NAME;
table.upserts = new MatrixCursor(new String[] { "uid", "row_version", "a", "b" });
table.deletes = new MatrixCursor(new String[] { "uid" });
ChangeSet changeSet = new ChangeSet(until, new ChangeSet.Table[] { table });
return changeSet;
}
public void testGetSinceEmpty() {
assertEquals(0, clientImpl.getUntil(dataSlice));
}
public void testGetSinceAfterChanges() {
// Create empty change set
ChangeSet changeSet = createTestChangeSet(10);
// Apply
try {
clientImpl.applyChangeSet(changeSet, dataSlice);
} catch (PendingChangesException e) {
fail();
}
assertEquals(10, clientImpl.getUntil(dataSlice));
}
}