156 lines
6.0 KiB
Java
156 lines
6.0 KiB
Java
/*
|
|
* Copyright 2016 Christian Basler
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package ch.dissem.bitmessage;
|
|
|
|
import ch.dissem.bitmessage.cryptography.bc.BouncyCryptography;
|
|
import ch.dissem.bitmessage.entity.BitmessageAddress;
|
|
import ch.dissem.bitmessage.entity.ObjectMessage;
|
|
import ch.dissem.bitmessage.entity.Plaintext;
|
|
import ch.dissem.bitmessage.entity.payload.Broadcast;
|
|
import ch.dissem.bitmessage.entity.payload.GetPubkey;
|
|
import ch.dissem.bitmessage.entity.payload.Msg;
|
|
import ch.dissem.bitmessage.factory.Factory;
|
|
import ch.dissem.bitmessage.ports.*;
|
|
import ch.dissem.bitmessage.utils.Singleton;
|
|
import ch.dissem.bitmessage.utils.TestBase;
|
|
import ch.dissem.bitmessage.utils.TestUtils;
|
|
import org.junit.Before;
|
|
import org.junit.Test;
|
|
import org.mockito.Mock;
|
|
import org.mockito.MockitoAnnotations;
|
|
|
|
import java.util.Collections;
|
|
|
|
import static ch.dissem.bitmessage.entity.Plaintext.Status.PUBKEY_REQUESTED;
|
|
import static ch.dissem.bitmessage.entity.Plaintext.Type.BROADCAST;
|
|
import static ch.dissem.bitmessage.entity.Plaintext.Type.MSG;
|
|
import static ch.dissem.bitmessage.utils.MessageMatchers.plaintext;
|
|
import static org.mockito.Mockito.*;
|
|
|
|
/**
|
|
* @author Christian Basler
|
|
*/
|
|
public class DefaultMessageListenerTest extends TestBase {
|
|
@Mock
|
|
private AddressRepository addressRepo;
|
|
@Mock
|
|
private MessageRepository messageRepo;
|
|
@Mock
|
|
private Inventory inventory;
|
|
@Mock
|
|
private NetworkHandler networkHandler;
|
|
|
|
private InternalContext ctx;
|
|
private DefaultMessageListener listener;
|
|
|
|
@Before
|
|
public void setUp() throws Exception {
|
|
MockitoAnnotations.initMocks(this);
|
|
ctx = mock(InternalContext.class);
|
|
Singleton.initialize(new BouncyCryptography());
|
|
when(ctx.getAddressRepository()).thenReturn(addressRepo);
|
|
when(ctx.getMessageRepository()).thenReturn(messageRepo);
|
|
when(ctx.getInventory()).thenReturn(inventory);
|
|
when(ctx.getNetworkHandler()).thenReturn(networkHandler);
|
|
when(ctx.getLabeler()).thenReturn(mock(Labeler.class));
|
|
|
|
listener = new DefaultMessageListener(mock(Labeler.class), mock(BitmessageContext.Listener.class));
|
|
}
|
|
|
|
@Test
|
|
public void ensurePubkeyIsSentOnRequest() throws Exception {
|
|
BitmessageAddress identity = TestUtils.loadIdentity("BM-2cSqjfJ8xK6UUn5Rw3RpdGQ9RsDkBhWnS8");
|
|
when(addressRepo.findIdentity(any(byte[].class)))
|
|
.thenReturn(identity);
|
|
listener.receive(new ObjectMessage.Builder()
|
|
.stream(2)
|
|
.payload(new GetPubkey(new BitmessageAddress("BM-2cSqjfJ8xK6UUn5Rw3RpdGQ9RsDkBhWnS8")))
|
|
.build());
|
|
verify(ctx).sendPubkey(eq(identity), eq(2L));
|
|
}
|
|
|
|
@Test
|
|
public void ensureIncomingPubkeyIsAddedToContact() throws Exception {
|
|
BitmessageAddress identity = TestUtils.loadIdentity("BM-2cSqjfJ8xK6UUn5Rw3RpdGQ9RsDkBhWnS8");
|
|
BitmessageAddress contact = new BitmessageAddress(identity.getAddress());
|
|
when(addressRepo.findContact(any(byte[].class)))
|
|
.thenReturn(contact);
|
|
when(messageRepo.findMessages(eq(PUBKEY_REQUESTED), eq(contact)))
|
|
.thenReturn(Collections.singletonList(
|
|
new Plaintext.Builder(MSG).from(identity).to(contact).message("S", "T").build()
|
|
));
|
|
|
|
ObjectMessage objectMessage = new ObjectMessage.Builder()
|
|
.stream(2)
|
|
.payload(identity.getPubkey())
|
|
.build();
|
|
objectMessage.sign(identity.getPrivateKey());
|
|
objectMessage.encrypt(Singleton.cryptography().createPublicKey(identity.getPublicDecryptionKey()));
|
|
listener.receive(objectMessage);
|
|
|
|
verify(addressRepo).save(any(BitmessageAddress.class));
|
|
}
|
|
|
|
@Test
|
|
public void ensureIncomingMessageIsSaved() throws Exception {
|
|
BitmessageAddress identity = TestUtils.loadIdentity("BM-2cSqjfJ8xK6UUn5Rw3RpdGQ9RsDkBhWnS8");
|
|
BitmessageAddress contact = new BitmessageAddress(identity.getAddress());
|
|
contact.setPubkey(identity.getPubkey());
|
|
|
|
when(addressRepo.getIdentities()).thenReturn(Collections.singletonList(identity));
|
|
|
|
ObjectMessage objectMessage = new ObjectMessage.Builder()
|
|
.stream(2)
|
|
.payload(new Msg(new Plaintext.Builder(MSG)
|
|
.from(identity)
|
|
.to(contact)
|
|
.message("S", "T")
|
|
.build()))
|
|
.nonce(new byte[8])
|
|
.build();
|
|
objectMessage.sign(identity.getPrivateKey());
|
|
objectMessage.encrypt(identity.getPubkey());
|
|
|
|
listener.receive(objectMessage);
|
|
|
|
verify(messageRepo, atLeastOnce()).save(plaintext(MSG));
|
|
}
|
|
|
|
@Test
|
|
public void ensureIncomingBroadcastIsSaved() throws Exception {
|
|
BitmessageAddress identity = TestUtils.loadIdentity("BM-2cSqjfJ8xK6UUn5Rw3RpdGQ9RsDkBhWnS8");
|
|
|
|
when(addressRepo.getSubscriptions(anyLong())).thenReturn(Collections.singletonList(identity));
|
|
|
|
Broadcast broadcast = Factory.getBroadcast(new Plaintext.Builder(BROADCAST)
|
|
.from(identity)
|
|
.message("S", "T")
|
|
.build());
|
|
ObjectMessage objectMessage = new ObjectMessage.Builder()
|
|
.stream(2)
|
|
.payload(broadcast)
|
|
.nonce(new byte[8])
|
|
.build();
|
|
objectMessage.sign(identity.getPrivateKey());
|
|
broadcast.encrypt();
|
|
|
|
listener.receive(objectMessage);
|
|
|
|
verify(messageRepo, atLeastOnce()).save(plaintext(BROADCAST));
|
|
}
|
|
}
|