Merge branch '224-unique-author-id' into 'master'

Allow different identities to have the same contact. #224

Previous fix was incomplete, the DB still had a unique constraint on the author ID column of the contacts table.

See merge request !91
This commit is contained in:
akwizgran
2016-02-02 17:06:35 +00:00
2 changed files with 30 additions and 1 deletions

View File

@@ -100,7 +100,6 @@ abstract class JdbcDatabase implements Database<Connection> {
+ " localAuthorId HASH NOT NULL,"
+ " status INT NOT NULL,"
+ " PRIMARY KEY (contactId),"
+ " UNIQUE (authorId),"
+ " FOREIGN KEY (localAuthorId)"
+ " REFERENCES localAuthors (authorId)"
+ " ON DELETE CASCADE)";

View File

@@ -51,6 +51,7 @@ import static org.briarproject.api.sync.ValidationManager.Validity.VALID;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -1157,6 +1158,35 @@ public class H2DatabaseTest extends BriarTestCase {
db.close();
}
@Test
public void testDifferentLocalPseudonymsCanHaveTheSameContact()
throws Exception {
AuthorId localAuthorId1 = new AuthorId(TestUtils.getRandomId());
LocalAuthor localAuthor1 = new LocalAuthor(localAuthorId1, "Carol",
new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp,
StorageStatus.ACTIVE);
Database<Connection> db = open(false);
Connection txn = db.startTransaction();
// Add two local pseudonyms
db.addLocalAuthor(txn, localAuthor);
db.addLocalAuthor(txn, localAuthor1);
// Add the same contact for each local pseudonym
ContactId contactId = db.addContact(txn, author, localAuthorId);
ContactId contactId1 = db.addContact(txn, author, localAuthorId1);
// The contacts should be distinct
assertNotEquals(contactId, contactId1);
assertEquals(2, db.getContacts(txn).size());
assertEquals(1, db.getContacts(txn, localAuthorId).size());
assertEquals(1, db.getContacts(txn, localAuthorId1).size());
db.commitTransaction(txn);
db.close();
}
@Test
public void testExceptionHandling() throws Exception {
Database<Connection> db = open(false);