mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-21 15:19:53 +01:00
Unit tests for ConnectionRecogniserImpl.
This commit is contained in:
@@ -32,6 +32,7 @@
|
|||||||
<test name='net.sf.briar.serial.ReaderImplTest'/>
|
<test name='net.sf.briar.serial.ReaderImplTest'/>
|
||||||
<test name='net.sf.briar.serial.WriterImplTest'/>
|
<test name='net.sf.briar.serial.WriterImplTest'/>
|
||||||
<test name='net.sf.briar.setup.SetupWorkerTest'/>
|
<test name='net.sf.briar.setup.SetupWorkerTest'/>
|
||||||
|
<test name='net.sf.briar.transport.ConnectionRecogniserImplTest'/>
|
||||||
<test name='net.sf.briar.transport.ConnectionWindowImplTest'/>
|
<test name='net.sf.briar.transport.ConnectionWindowImplTest'/>
|
||||||
<test name='net.sf.briar.transport.PacketEncrypterImplTest'/>
|
<test name='net.sf.briar.transport.PacketEncrypterImplTest'/>
|
||||||
<test name='net.sf.briar.transport.PacketWriterImplTest'/>
|
<test name='net.sf.briar.transport.PacketWriterImplTest'/>
|
||||||
|
|||||||
@@ -0,0 +1,98 @@
|
|||||||
|
package net.sf.briar.transport;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.SecretKey;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
import net.sf.briar.api.ContactId;
|
||||||
|
import net.sf.briar.api.crypto.CryptoComponent;
|
||||||
|
import net.sf.briar.api.db.DatabaseComponent;
|
||||||
|
import net.sf.briar.api.transport.ConnectionWindow;
|
||||||
|
import net.sf.briar.crypto.CryptoModule;
|
||||||
|
|
||||||
|
import org.jmock.Expectations;
|
||||||
|
import org.jmock.Mockery;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
|
public class ConnectionRecogniserImplTest extends TestCase {
|
||||||
|
|
||||||
|
private final CryptoComponent crypto;
|
||||||
|
private final ContactId contactId;
|
||||||
|
private final byte[] secret;
|
||||||
|
private final int transportId;
|
||||||
|
private final ConnectionWindow connectionWindow;
|
||||||
|
|
||||||
|
public ConnectionRecogniserImplTest() {
|
||||||
|
super();
|
||||||
|
Injector i = Guice.createInjector(new CryptoModule());
|
||||||
|
crypto = i.getInstance(CryptoComponent.class);
|
||||||
|
contactId = new ContactId(1);
|
||||||
|
secret = new byte[18];
|
||||||
|
transportId = 123;
|
||||||
|
connectionWindow = new ConnectionWindowImpl(0L, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testUnexpectedTag() throws Exception {
|
||||||
|
Mockery context = new Mockery();
|
||||||
|
final DatabaseComponent db = context.mock(DatabaseComponent.class);
|
||||||
|
context.checking(new Expectations() {{
|
||||||
|
oneOf(db).addListener(with(any(ConnectionRecogniserImpl.class)));
|
||||||
|
oneOf(db).getContacts();
|
||||||
|
will(returnValue(Collections.singleton(contactId)));
|
||||||
|
oneOf(db).getSharedSecret(contactId);
|
||||||
|
will(returnValue(secret));
|
||||||
|
oneOf(db).getConnectionWindow(contactId, transportId);
|
||||||
|
will(returnValue(connectionWindow));
|
||||||
|
}});
|
||||||
|
final ConnectionRecogniserImpl c =
|
||||||
|
new ConnectionRecogniserImpl(transportId, crypto, db);
|
||||||
|
assertNull(c.acceptConnection(new byte[16]));
|
||||||
|
context.assertIsSatisfied();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExpectedTag() throws Exception {
|
||||||
|
// Calculate the expected tag for connection number 3
|
||||||
|
SecretKey tagKey = crypto.deriveTagKey(secret);
|
||||||
|
Cipher tagCipher = crypto.getTagCipher();
|
||||||
|
tagCipher.init(Cipher.ENCRYPT_MODE, tagKey);
|
||||||
|
byte[] tag = TagEncoder.encodeTag(transportId, 3L, 0);
|
||||||
|
byte[] encryptedTag = tagCipher.doFinal(tag);
|
||||||
|
|
||||||
|
Mockery context = new Mockery();
|
||||||
|
final DatabaseComponent db = context.mock(DatabaseComponent.class);
|
||||||
|
context.checking(new Expectations() {{
|
||||||
|
oneOf(db).addListener(with(any(ConnectionRecogniserImpl.class)));
|
||||||
|
oneOf(db).getContacts();
|
||||||
|
will(returnValue(Collections.singleton(contactId)));
|
||||||
|
oneOf(db).getSharedSecret(contactId);
|
||||||
|
will(returnValue(secret));
|
||||||
|
oneOf(db).getConnectionWindow(contactId, transportId);
|
||||||
|
will(returnValue(connectionWindow));
|
||||||
|
oneOf(db).setConnectionWindow(contactId, transportId,
|
||||||
|
connectionWindow);
|
||||||
|
}});
|
||||||
|
final ConnectionRecogniserImpl c =
|
||||||
|
new ConnectionRecogniserImpl(transportId, crypto, db);
|
||||||
|
// First time - the tag should be expected
|
||||||
|
assertEquals(contactId, c.acceptConnection(encryptedTag));
|
||||||
|
// Second time - the tag should no longer be expected
|
||||||
|
assertNull(c.acceptConnection(encryptedTag));
|
||||||
|
// The window should have advanced
|
||||||
|
assertEquals(4L, connectionWindow.getCentre());
|
||||||
|
Collection<Long> unseen = connectionWindow.getUnseenConnectionNumbers();
|
||||||
|
assertEquals(19, unseen.size());
|
||||||
|
for(int i = 0; i < 19; i++) {
|
||||||
|
if(i == 3) continue;
|
||||||
|
assertTrue(unseen.contains(Long.valueOf(i)));
|
||||||
|
}
|
||||||
|
context.assertIsSatisfied();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user