package mobisocial.musubi.model.helpers; import gnu.trove.list.linked.TLongLinkedList; import gnu.trove.procedure.TLongProcedure; import java.util.Arrays; import java.util.Random; import mobisocial.musubi.model.MEncodedMessage; import mobisocial.musubi.util.Util; import android.database.sqlite.SQLiteOpenHelper; import android.test.AndroidTestCase; public class EncodedMessageManagerTest extends AndroidTestCase { SQLiteOpenHelper mDbh; public void setUp() { mDbh = new DatabaseFile(getContext(), null); } public void tearDown() { mDbh.close(); } void assertEncodedMetadataEqual(MEncodedMessage a, MEncodedMessage b) { if(a == b) return; assertEquals(a.id_, b.id_); assertEquals(a.outbound_, b.outbound_); assertEquals(a.processed_, b.processed_); assertEquals(a.processedTime_, b.processedTime_); assertTrue(a.hash_ == b.hash_ || Arrays.equals(a.hash_, b.hash_)); assertTrue(a.fromDevice_ == null && b.fromDevice_ == null || a.fromDevice_.equals(b.fromDevice_)); assertTrue(a.fromIdentityId_ == null && b.fromIdentityId_ == null || a.fromIdentityId_.equals(b.fromIdentityId_)); assertTrue(a.shortHash_ == null && b.shortHash_ == null || a.shortHash_.equals(b.shortHash_)); } void assertEncodedEqual(MEncodedMessage a, MEncodedMessage b) { if(a == b) return; assertEncodedMetadataEqual(a, b); } public void testBasicInsertAndGets() { EncodedMessageManager emm = new EncodedMessageManager(mDbh); MEncodedMessage a = new MEncodedMessage(); a.encoded_ = new byte[8]; new Random().nextBytes(a.encoded_); emm.insertEncoded(a); MEncodedMessage b = emm.lookupById(a.id_); assertEncodedEqual(a, b); b = emm.lookupMetadataById(a.id_); assertEncodedEqual(a, b); } public void testFullInsertAndGet() { EncodedMessageManager emm = new EncodedMessageManager(mDbh); Random r = new Random(); MEncodedMessage a = new MEncodedMessage(); a.encoded_ = new byte[8]; r.nextBytes(a.encoded_); a.fromDevice_ = 10L; a.fromIdentityId_ = 3L; a.hash_ = Util.sha256(a.encoded_); a.outbound_ = true; a.processed_ = true; a.shortHash_ = Util.shortHash(a.hash_); a.processedTime_ = 11111111; emm.insertEncoded(a); MEncodedMessage b = emm.lookupById(a.id_); assertEncodedEqual(a, b); } public void testUpdateMetadata() { EncodedMessageManager emm = new EncodedMessageManager(mDbh); Random r = new Random(); MEncodedMessage a = new MEncodedMessage(); a.encoded_ = new byte[8]; r.nextBytes(a.encoded_); a.fromDevice_ = 10L; a.fromIdentityId_ = 3L; a.hash_ = Util.sha256(a.encoded_); a.outbound_ = true; a.processed_ = true; a.processedTime_ = 11111111; a.shortHash_ = Util.shortHash(a.hash_); emm.insertEncoded(a); r.nextBytes(a.encoded_); a.fromDevice_ = null; a.fromIdentityId_ = null; a.hash_ = Util.sha256(a.encoded_); a.outbound_ = false; a.processed_ = false; a.processedTime_ = 2222222; a.shortHash_ = Util.shortHash(a.hash_); emm.updateEncodedMetadata(a); MEncodedMessage b = emm.lookupById(a.id_); assertEncodedMetadataEqual(a, b); } public void testOutboundIDs() { final EncodedMessageManager emm = new EncodedMessageManager(mDbh); Random r = new Random(); final int TOTAL = 16; for(int i = 1; i < TOTAL; ++i) { MEncodedMessage a = new MEncodedMessage(); a.encoded_ = new byte[8]; r.nextBytes(a.encoded_); a.fromDevice_ = (long)i; a.fromIdentityId_ = (long)i; a.hash_ = Util.sha256(a.encoded_); a.outbound_ = (i & 1) != 0; a.processed_ = (i & 2) != 0; a.shortHash_ = Util.shortHash(a.hash_); emm.insertEncoded(a); } TLongLinkedList unsent = emm.getUnsentOutboundIdsNotPending(); assertEquals(unsent.size(), TOTAL / 4); unsent.forEach(new TLongProcedure() { public boolean execute(long id) { MEncodedMessage b = emm.lookupById(id); assertNotNull(b); assertTrue(b.outbound_); assertFalse(b.processed_); return true; } }); } }