package mobisocial.musubi.model.helpers; import java.util.Arrays; import java.util.Date; import mobisocial.crypto.IBIdentity; import mobisocial.musubi.model.MApp; import mobisocial.musubi.model.MFeed; import mobisocial.musubi.model.MFeedApp; import mobisocial.musubi.model.MIdentity; import mobisocial.test.TestBase; import mobisocial.test.TestDatabase; import android.database.Cursor; import android.database.sqlite.SQLiteOpenHelper; public class FeedManagerTest extends TestBase { private TestDatabase database; private MIdentity myIdentity; private MIdentity friend1; private MIdentity friend2; private MIdentity stranger; public void setUp() { SQLiteOpenHelper dbh = new DatabaseFile(getContext(), null, new DebugSQLiteCursorFactory()); database = new TestDatabase(getContext(), dbh); IBIdentity me = randomIBIdentity(); myIdentity = database.insertIdentity(me, true, true); friend1 = database.insertIdentity(randomIBIdentity(), false, true); friend2 = database.insertIdentity(randomIBIdentity(), false, false); stranger = database.insertIdentity(randomIBIdentity(), false, true); friend1.whitelisted_ = true; friend2.whitelisted_ = true; stranger.whitelisted_ = true; database.getIdentityManager().updateIdentity(friend1); database.getIdentityManager().updateIdentity(friend2); database.getIdentityManager().updateIdentity(stranger); } public void testFeedCreate() { MIdentity[] identities = new MIdentity[] { myIdentity, friend1, friend2 }; byte[] capability = FeedManager.computeFixedIdentifier(identities); MFeed feed = database.getFeedManager().getOrCreateFixedFeed(myIdentity, friend1, friend2); assertTrue(Arrays.equals(capability, feed.capability_)); MFeed lookup = database.getFeedManager().lookupFeed(feed.id_); assertNotNull(lookup); assertTrue(Arrays.equals(capability, lookup.capability_)); } public void testFeedDelete() { FeedManager fm = database.getFeedManager(); MFeed feed = fm.getOrCreateFixedFeed(myIdentity, friend1, friend2); MFeed lookup1 = database.getFeedManager().lookupFeed(feed.id_); assertNotNull(lookup1); assertEquals(3, fm.getFeedMembers(lookup1).length); fm.deleteFeedAndMembers(feed); MFeed lookup2 = database.getFeedManager().lookupFeed(feed.id_); assertNull(lookup2); assertEquals(0, fm.getFeedMembers(lookup1).length); } public void testFeedUpdate() { FeedManager fm = database.getFeedManager(); MFeed feed = database.getFeedManager().getOrCreateFixedFeed(myIdentity, friend1, friend2); long feedId = feed.id_; MFeed lookup = fm.lookupFeed(feedId); lookup.name_ = "newName"; database.getFeedManager().updateFeed(lookup); feed = fm.lookupFeed(feedId); assertEquals(lookup.name_, feed.name_); assertEquals(lookup.shortCapability_, feed.shortCapability_); assertTrue(lookup.shortCapability_ != 0); MIdentity[] members = fm.getFeedMembers(feed); assertEquals(3, members.length); } public void testFeedUpdateNullables() { FeedManager fm = database.getFeedManager(); MFeed feed = database.getFeedManager().getOrCreateFixedFeed(myIdentity, friend1, friend2); long feedId = feed.id_; Long time = new Date().getTime(); Long id = 4L; String name = "foobarred"; MFeed lookup = fm.lookupFeed(feedId); lookup.name_ = name; lookup.latestRenderableObjId_ = id; lookup.latestRenderableObjTime_ = time; lookup.accepted_ = true; database.getFeedManager().updateFeed(lookup); feed = fm.lookupFeed(feedId); assertEquals(name, feed.name_); assertEquals(lookup.shortCapability_, feed.shortCapability_); assertTrue(feed.accepted_); assertTrue(feed.shortCapability_ != 0); assertEquals(id, feed.latestRenderableObjId_); assertEquals(time, feed.latestRenderableObjTime_); feed.latestRenderableObjId_ = null; feed.latestRenderableObjTime_ = null; feed.name_ = null; feed.accepted_ = false; database.getFeedManager().updateFeed(feed); lookup = fm.lookupFeed(feedId); assertFalse(lookup.accepted_); assertNull(lookup.name_); assertNull(lookup.latestRenderableObjId_); assertNull(lookup.latestRenderableObjTime_); } public void testFixedCapabilityGeneration() { MIdentity[] ids = new MIdentity[] { myIdentity, friend1, friend2 }; byte[] c1 = FeedManager.computeFixedIdentifier(ids); ids = new MIdentity[] { friend1, friend2, myIdentity }; byte[] c2 = FeedManager.computeFixedIdentifier(ids); assertTrue(Arrays.equals(c1, c2)); ids = new MIdentity[] { friend1, friend2 }; byte[] c3 = FeedManager.computeFixedIdentifier(ids); assertFalse(Arrays.equals(c1, c3)); ids = new MIdentity[] { friend1, friend2, friend2, friend1}; byte[] c4 = FeedManager.computeFixedIdentifier(ids); assertTrue(Arrays.equals(c3, c4)); } public void testFeedApp() { MFeed feed = database.getFeedManager().getOrCreateFixedFeed(myIdentity, friend1, friend2); MApp app = database.getAppManager().ensureApp("some.app"); Cursor c; c = getFeedApps(feed.id_); try { assertEquals(0, c.getCount()); } finally { c.close(); } database.getFeedManager().ensureFeedApp(feed.id_, app.id_); c = getFeedApps(feed.id_); try { assertEquals(1, c.getCount()); } finally { c.close(); } // reinsert should be noop database.getFeedManager().ensureFeedApp(feed.id_, app.id_); c = getFeedApps(feed.id_); try { assertEquals(1, c.getCount()); } finally { c.close(); } // make sure delete works database.getFeedManager().deleteFeedApp(feed.id_, app.id_); c = getFeedApps(feed.id_); try { assertEquals(0, c.getCount()); } finally { c.close(); } // make sure delete doesnt barf database.getFeedManager().deleteFeedApp(feed.id_, app.id_); c = getFeedApps(feed.id_); try { assertEquals(0, c.getCount()); } finally { c.close(); } } Cursor getFeedApps(long feed) { String selection = MFeedApp.COL_FEED_ID + "=?"; String[] selectionArgs = new String[] { Long.toString(feed) }; return database.getReadableDatabase().query(MFeedApp.TABLE, null, selection, selectionArgs, null, null, null); } }