package mobisocial.musubi.model.helpers;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.List;
import mobisocial.crypto.IBHashedIdentity.Authority;
import mobisocial.crypto.IBIdentity;
import mobisocial.musubi.model.MIdentity;
import mobisocial.musubi.util.Util;
import mobisocial.test.TestBase;
import mobisocial.test.TestDatabase;
public class IdentityManagerTest extends TestBase {
private DatabaseFile mDbh;
public void setUp() {
mDbh = new DatabaseFile(getContext(), null);
}
public void tearDown() {
mDbh.close();
}
void assertIdentitiesEqual(MIdentity a, MIdentity b) {
if(a == b)
return;
assertEquals(a.id_, b.id_);
assertEquals(a.blocked_, b.blocked_);
assertEquals(a.claimed_, b.claimed_);
assertEquals(a.receivedProfileVersion_, b.receivedProfileVersion_);
assertEquals(a.sentProfileVersion_, b.sentProfileVersion_);
assertEquals(a.name_, b.name_);
assertEquals(a.nextSequenceNumber_, b.nextSequenceNumber_);
assertEquals(a.owned_, b.owned_);
assertEquals(a.type_, b.type_);
assertEquals(a.principal_, b.principal_);
assertTrue(a.principalHash_ == b.principalHash_ || Arrays.equals(a.principalHash_, b.principalHash_));
assertEquals(a.principalShortHash_, b.principalShortHash_);
assertTrue(a.contactId_ == null && b.contactId_ == null || a.contactId_.equals(b.contactId_));
assertTrue(a.androidAggregatedContactId_ == null && b.androidAggregatedContactId_ == null || a.androidAggregatedContactId_.equals(b.androidAggregatedContactId_));
assertTrue(a.updatedAt_ > 0 && a.createdAt_ > 0);
assertTrue(a.createdAt_ <= a.updatedAt_);
assertTrue(b.updatedAt_ > 0 && b.createdAt_ > 0);
assertTrue(b.createdAt_ <= b.updatedAt_);
assertEquals(a.whitelisted_, b.whitelisted_);
}
void assertIdentitiesEqualWithThumbnail(MIdentity a, MIdentity b) {
assertIdentitiesEqual(a, b);
assertTrue(a.thumbnail_ == b.thumbnail_ || Arrays.equals(a.thumbnail_, b.thumbnail_));
assertTrue(a.musubiThumbnail_ == b.musubiThumbnail_ || Arrays.equals(a.musubiThumbnail_, b.musubiThumbnail_));
}
public void testBasicInsertAndGet() throws Exception {
IdentitiesManager idm = new IdentitiesManager(mDbh);
IBIdentity ibid0 = new IBIdentity(Authority.Email, "a", 0);
MIdentity id0 = new MIdentity();
id0.name_ = "Test";
id0.type_ = ibid0.authority_;
id0.principal_ = ibid0.principal_;
id0.principalHash_ = ibid0.hashed_;
id0.principalShortHash_ = ByteBuffer.wrap(ibid0.hashed_).getLong();
id0.owned_ = true;
id0.claimed_ = true;
id0.whitelisted_ = true;
idm.insertIdentity(id0);
assertEquals(idm.getIBIdentityForIBHashedIdentity(ibid0), ibid0);
assertIdentitiesEqual(id0, idm.getIdentityForIBHashedIdentity(ibid0));
assertIdentitiesEqual(id0, idm.getIdentityForId(id0.id_));
assertIdentitiesEqualWithThumbnail(id0, idm.getIdentityWithThumbnailsForId(id0.id_));
}
public void testBasicHashedInsertAndGet() throws Exception {
IdentitiesManager idm = new IdentitiesManager(mDbh);
IBIdentity ibid0 = new IBIdentity(Authority.Email, "a", 0);
MIdentity id0 = new MIdentity();
id0.name_ = "Test";
id0.type_ = ibid0.authority_;
id0.principalHash_ = ibid0.hashed_;
id0.principalShortHash_ = ByteBuffer.wrap(ibid0.hashed_).getLong();
id0.owned_ = false;
id0.claimed_ = true;
id0.whitelisted_ = true;
idm.insertIdentity(id0);
assertNull(idm.getIBIdentityForIBHashedIdentity(ibid0));
assertIdentitiesEqual(id0, idm.getIdentityForIBHashedIdentity(ibid0));
assertIdentitiesEqual(id0, idm.getIdentityForId(id0.id_));
assertIdentitiesEqualWithThumbnail(id0, idm.getIdentityWithThumbnailsForId(id0.id_));
}
public void testUpdate() throws Exception {
IdentitiesManager idm = new IdentitiesManager(mDbh);
IBIdentity ibid0 = new IBIdentity(Authority.Email, "a", 0);
MIdentity id0 = new MIdentity();
id0.name_ = "Test";
id0.musubiName_ = "Trist";
id0.type_ = ibid0.authority_;
id0.principal_ = ibid0.principal_;
id0.principalHash_ = ibid0.hashed_;
id0.principalShortHash_ = ByteBuffer.wrap(ibid0.hashed_).getLong();
id0.owned_ = true;
id0.claimed_ = true;
id0.whitelisted_ = true;
idm.insertIdentity(id0);
Thread.sleep(1000);
//The authority and principalHash and createdTime should never change, but still...
//i am testing the update function.
IBIdentity ibid1 = new IBIdentity(Authority.Facebook, "b", 0);
id0.name_ = null;
id0.musubiName_ = null;
id0.type_ = ibid1.authority_;
id0.principal_ = ibid1.principal_;
id0.principalHash_ = ibid1.hashed_;
id0.principalShortHash_ = ByteBuffer.wrap(ibid1.hashed_).getLong();
id0.owned_ = false;
id0.claimed_ = false;
id0.blocked_ = true;
id0.androidAggregatedContactId_ = 7L;
id0.contactId_ = 25L;
id0.receivedProfileVersion_ = 82L;
id0.sentProfileVersion_ = 91L;
id0.nextSequenceNumber_ = 765L;
id0.thumbnail_ = new byte[1];
id0.hasSentEmail_ = true;
id0.whitelisted_ = false;
idm.updateIdentity(id0);
MIdentity tmp = idm.getIdentityForIBHashedIdentity(ibid1);
assertTrue(tmp.updatedAt_ > tmp.createdAt_);
assertFalse(idm.getIBIdentityForIBHashedIdentity(ibid1).equals(ibid0));
assertTrue(idm.getIBIdentityForIBHashedIdentity(ibid1).equals(ibid1));
assertIdentitiesEqual(id0, idm.getIdentityForIBHashedIdentity(ibid1));
assertIdentitiesEqual(id0, idm.getIdentityForId(id0.id_));
assertFalse(id0.equals(idm.getIdentityWithThumbnailsForId(id0.id_)));
idm.updateThumbnail(id0);
MIdentity test = idm.getIdentityWithThumbnailsForId(id0.id_);
idm.getThumbnail(test);
assertIdentitiesEqualWithThumbnail(id0, test);
id0.musubiThumbnail_ = new byte[2];
idm.updateMusubiThumbnail(id0);
test = idm.getIdentityWithThumbnailsForId(id0.id_);
idm.getMusubiThumbnail(test);
assertIdentitiesEqualWithThumbnail(id0, test);
}
public void testNullableAndroidDataId() {
TestDatabase database = new TestDatabase(getContext(), mDbh);
MIdentity friend = database.insertIdentity(randomIBIdentity(), false, true);
long id = friend.id_;
friend.androidAggregatedContactId_ = 1L;
database.getIdentityManager().updateIdentity(friend);
MIdentity friend2 = database.getIdentityManager().getIdentityForId(id);
assertEquals((Long)1L, friend2.androidAggregatedContactId_);
friend2.androidAggregatedContactId_ = null;
database.getIdentityManager().updateIdentity(friend2);
friend = database.getIdentityManager().getIdentityForId(id);
assertNull(friend.androidAggregatedContactId_);
}
public void testAuthorityPrincipalLookup() throws Exception {
IdentitiesManager idm = new IdentitiesManager(mDbh);
IBIdentity ibid0 = new IBIdentity(Authority.Email, "a", 0);
MIdentity id0 = new MIdentity();
id0.type_ = ibid0.authority_;
id0.principal_ = ibid0.principal_;
id0.principalHash_ = ibid0.hashed_;
id0.principalShortHash_ = ByteBuffer.wrap(ibid0.hashed_).getLong();
idm.insertIdentity(id0);
IBIdentity ibid1 = new IBIdentity(Authority.Facebook, "a", 0);
MIdentity id1 = new MIdentity();
id1.type_ = ibid1.authority_;
id1.principal_ = ibid1.principal_;
id1.principalHash_ = ibid1.hashed_;
id1.principalShortHash_ = ByteBuffer.wrap(ibid1.hashed_).getLong();
idm.insertIdentity(id1);
assertFalse(idm.getIBIdentityForIBHashedIdentity(ibid0).equals(ibid1));
assertTrue(idm.getIBIdentityForIBHashedIdentity(ibid0).equals(ibid0));
assertFalse(idm.getIBIdentityForIBHashedIdentity(ibid1).equals(ibid0));
assertTrue(idm.getIBIdentityForIBHashedIdentity(ibid1).equals(ibid1));
}
public void testOwnedIdentities() throws Exception {
IdentitiesManager idm = new IdentitiesManager(mDbh);
IBIdentity ibid0 = new IBIdentity(Authority.Email, "a", 0);
MIdentity id0 = new MIdentity();
id0.name_ = "Test";
id0.type_ = ibid0.authority_;
id0.principal_ = ibid0.principal_;
id0.principalHash_ = ibid0.hashed_;
id0.principalShortHash_ = Util.shortHash(id0.principalHash_);
id0.owned_ = false;
id0.claimed_ = true;
idm.insertIdentity(id0);
assertIdentitiesEqual(id0, idm.getIdentityForIBHashedIdentity(ibid0));
List<MIdentity> owned = idm.getOwnedIdentities();
assertEquals(1, owned.size());
IBIdentity ibid1 = new IBIdentity(Authority.Email, "b", 0);
MIdentity id1 = new MIdentity();
id1.name_ = "Test";
id1.type_ = ibid1.authority_;
id1.principal_ = ibid1.principal_;
id1.principalHash_ = ibid1.hashed_;
id1.principalShortHash_ = Util.shortHash(ibid1.hashed_);
id1.owned_ = true;
id1.claimed_ = true;
idm.insertIdentity(id1);
assertIdentitiesEqual(id1, idm.getIdentityForIBHashedIdentity(ibid1));
owned = idm.getOwnedIdentities();
assertEquals(2, owned.size());
assertIdentitiesEqual(idm.getIdentityForIBHashedIdentity(ibid1), owned.get(1));
}
public void testDeviceNameExists() {
DeviceManager ddm = new DeviceManager(mDbh);
long deviceName = ddm.getLocalDeviceName();
assertTrue(deviceName != 0);
}
public void testTemporalFrame() {
String principal = randomUniquePrincipal();
int ok = 0;
for(int i = 0; i < 3; ++i) {
long a = IdentitiesManager.computeTemporalFrameFromPrincipal(principal);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {}
long b = IdentitiesManager.computeTemporalFrameFromPrincipal(principal);
if(a == b)
++ok;
}
//best two out of three in case test runs at the month boundary
assertTrue(ok >= 2);
}
}