commit
8403f77185
@ -0,0 +1,239 @@
|
||||
package foundation.pEp.jniadapter.test.jni153;
|
||||
|
||||
import foundation.pEp.jniadapter.Engine;
|
||||
import foundation.pEp.jniadapter.Message;
|
||||
import foundation.pEp.jniadapter.decrypt_message_Return;
|
||||
import foundation.pEp.jniadapter.test.utils.TestCallbacks;
|
||||
import foundation.pEp.jniadapter.test.utils.model.*;
|
||||
import foundation.pEp.jniadapter.test.utils.transport.fsmqmanager.FsMQIdentity;
|
||||
import foundation.pEp.jniadapter.test.utils.transport.fsmqmanager.FsMQManager;
|
||||
import foundation.pEp.jniadapter.test.utils.transport.fsmqmanager.FsMQMessage;
|
||||
import foundation.pEp.pitytest.AbstractTestContext;
|
||||
import foundation.pEp.pitytest.TestContextInterface;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static foundation.pEp.pitytest.TestLogger.log;
|
||||
|
||||
public class CTXMultiNode extends AbstractTestContext {
|
||||
public Engine engine;
|
||||
public TestCallbacks callbacks;
|
||||
public Transport transport;
|
||||
|
||||
// Model
|
||||
public TestModel model;
|
||||
|
||||
// Mappings
|
||||
private NodeName ownNodeName;
|
||||
private TestNode ownNode;
|
||||
public TestIdentity myself;
|
||||
public TestIdentity partner;
|
||||
|
||||
|
||||
CTXMultiNode(NodeName ownNodeName) {
|
||||
this.ownNodeName = ownNodeName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TestContextInterface init() throws Throwable {
|
||||
// pEp
|
||||
callbacks = new TestCallbacks();
|
||||
engine = new Engine();
|
||||
engine.setMessageToSendCallback(callbacks);
|
||||
engine.setNotifyHandshakeCallback(callbacks);
|
||||
|
||||
// Model
|
||||
model = setupModel();
|
||||
|
||||
// Setup Perspective
|
||||
ownNode = model.getNode(ownNodeName);
|
||||
myself = ownNode.getIdent();
|
||||
partner = myself.getDefaultPartner();
|
||||
|
||||
// Transport
|
||||
// Create own transport identity and Transport
|
||||
FsMQIdentity transportIdent = myself.getTransportIdent(ownNodeName);
|
||||
transport = new Transport(transportIdent, model.getAllIdents());
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
private TestModel setupModel() {
|
||||
TestModel ret = new TestModel();
|
||||
|
||||
ret.getNode(NodeName.NODE_A1).setRole(Role.ALICE);
|
||||
ret.getNode(NodeName.NODE_B1).setRole(Role.BOB);
|
||||
|
||||
ret.getIdent(Role.ALICE).setDefaultPartner(Role.BOB);
|
||||
ret.getIdent(Role.BOB).setDefaultPartner(Role.ALICE);
|
||||
// ret.getIdent(Role.CAROL).setDefaultPartner(Role.ALICE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class Transport {
|
||||
private FsMQManager fsMQTransport = null;
|
||||
private EncryptingSenderThread sender = null;
|
||||
private DecryptingReceiverThread receiver = null;
|
||||
private FsMQIdentity myself = null;
|
||||
private List<TestIdentity> peers = null;
|
||||
|
||||
// Message queues
|
||||
private LinkedBlockingQueue<Message> txQueue = new LinkedBlockingQueue<>();
|
||||
private LinkedBlockingQueue<Message> rxQueue = new LinkedBlockingQueue<>();
|
||||
|
||||
public Transport(FsMQIdentity ownIdent, List<TestIdentity> peers) {
|
||||
this.myself = ownIdent;
|
||||
this.peers = peers;
|
||||
this.sender = new EncryptingSenderThread(this, txQueue);
|
||||
this.receiver = new DecryptingReceiverThread(this, rxQueue);
|
||||
this.fsMQTransport = new FsMQManager(ownIdent);
|
||||
|
||||
for (TestIdentity ti : peers) {
|
||||
fsMQTransport.identities.addAll(ti.getAllTransportIdents());
|
||||
}
|
||||
}
|
||||
|
||||
public void clearOwnQueue() {
|
||||
fsMQTransport.clearOwnQueue();
|
||||
}
|
||||
|
||||
public boolean canReceiveAsync() {
|
||||
return !rxQueue.isEmpty();
|
||||
}
|
||||
|
||||
public void sendAsync(Message msg) {
|
||||
txQueue.add(msg);
|
||||
}
|
||||
|
||||
public Message receiveAsyncNonBlocking() {
|
||||
return rxQueue.remove();
|
||||
}
|
||||
|
||||
public void sendRaw(String pEpAddress, String msg) {
|
||||
//Find identity for address
|
||||
List<TestIdentity> res = peers.stream().filter(i -> {
|
||||
return i.pEpIdent.address.equals(pEpAddress);
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
if (res.size() > 1) {
|
||||
throw new RuntimeException("Unknown Error");
|
||||
} else if (res.size() <= 0) {
|
||||
throw new RuntimeException("Unknown address");
|
||||
}
|
||||
TestIdentity id = res.get(0);
|
||||
|
||||
for (FsMQIdentity tID : id.getAllTransportIdents()) {
|
||||
fsMQTransport.sendMessage(tID.getAddress(), msg);
|
||||
// log("send() to: " + tID.getAddress());
|
||||
}
|
||||
}
|
||||
|
||||
public String receiveRaw() {
|
||||
FsMQMessage rx = fsMQTransport.receiveMessage(2000);
|
||||
return rx.getMsg();
|
||||
}
|
||||
|
||||
public void start() {
|
||||
sender.start();
|
||||
receiver.start();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class EncryptingSenderThread extends Thread {
|
||||
private Engine engine = null;
|
||||
private Transport transport = null;
|
||||
private LinkedBlockingQueue<Message> queue;
|
||||
|
||||
public EncryptingSenderThread(Transport transport, LinkedBlockingQueue queue) {
|
||||
this.transport = transport;
|
||||
this.queue = queue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
engine = new Engine();
|
||||
Message msg;
|
||||
String msgEnc;
|
||||
while (true) {
|
||||
try {
|
||||
msg = queue.take();
|
||||
if (msg.getTo().size() != 1) {
|
||||
throw new RuntimeException("Sorry, msg.To has to have exactly 1 receiver for now");
|
||||
}
|
||||
String to = msg.getTo().get(0).address;
|
||||
msgEnc = encryptMessage(msg);
|
||||
transport.sendRaw(to, msgEnc);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String encryptMessage(Message msg) {
|
||||
String longMessage = msg.getLongmsg();
|
||||
|
||||
Message msgEnc = engine.encrypt_message(msg, null, Message.EncFormat.PEP);
|
||||
String encFormat;
|
||||
String transportMsg;
|
||||
if (msgEnc != null) {
|
||||
encFormat = "CRYPT";
|
||||
transportMsg = msgEnc.encodeMIME();
|
||||
} else {
|
||||
encFormat = "PLAIN";
|
||||
transportMsg = msg.encodeMIME();
|
||||
}
|
||||
log("<- : [" + encFormat + "] - " + longMessage);
|
||||
return transportMsg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class DecryptingReceiverThread extends Thread {
|
||||
private Engine engine = null;
|
||||
private Transport transport = null;
|
||||
private LinkedBlockingQueue<Message> queue;
|
||||
|
||||
public DecryptingReceiverThread(Transport transport, LinkedBlockingQueue queue) {
|
||||
this.transport = transport;
|
||||
this.queue = queue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
engine = new Engine();
|
||||
String msg;
|
||||
Message msgDec;
|
||||
while (true) {
|
||||
msg = transport.receiveRaw();
|
||||
msgDec = decryptMessage(msg);
|
||||
try {
|
||||
queue.put(msgDec);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Message decryptMessage(String msg) {
|
||||
Message msgIn = new Message(msg);
|
||||
Message msgInDec = null;
|
||||
|
||||
decrypt_message_Return decRet = engine.decrypt_message(msgIn, null, 0);
|
||||
|
||||
msgInDec = decRet.dst;
|
||||
|
||||
String encFormat = "PLAIN";
|
||||
if (!msgIn.getLongmsg().equals(msgInDec.getLongmsg())) {
|
||||
encFormat = "CRYPT";
|
||||
}
|
||||
|
||||
log("-> : [" + encFormat + "] - " + msgInDec.getLongmsg());
|
||||
return msgInDec;
|
||||
}
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
include ../../../../../../../Makefile.conf
|
||||
include ../Makefile.conf
|
||||
|
||||
TEST_UNIT_NAME=jni153
|
||||
|
||||
JAVA_CLASSES+= \
|
||||
TestAlice.class \
|
||||
TestBob.class \
|
||||
CTXMultiNode.class
|
||||
|
||||
.PHONY: pitytest compile alice bob test clean
|
||||
|
||||
all: both compile
|
||||
|
||||
pitytest:
|
||||
$(MAKE) -C $(PITYTEST_DIR)
|
||||
|
||||
both:
|
||||
$(MAKE) bob&
|
||||
$(MAKE) alice
|
||||
|
||||
alice: compile clean-pep-home-alice
|
||||
cd $(JAVA_CWD);pwd;HOME=$(JAVA_PEP_HOME_DIR_ALICE) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestAlice
|
||||
|
||||
bob: compile clean-pep-home-bob
|
||||
cd $(JAVA_CWD);pwd;HOME=$(JAVA_PEP_HOME_DIR_BOB) $(JAVA) $(JAVA_PKG_BASENAME).$(TEST_UNIT_NAME).TestBob
|
||||
|
||||
compile: $(JAVA_CLASSES) pitytest
|
||||
|
||||
%.class: %.java
|
||||
cd $(JAVA_CWD);$(JAVAC_CMD) -cp $(CLASSPATH) $(JAVA_PKG_BASEPATH)/$(TEST_UNIT_NAME)/$<
|
||||
|
||||
clean:
|
||||
rm -f $(JAVA_CLASSES)
|
||||
rm -f *.class
|
||||
rm -f *.log
|
||||
rm -Rf .gnupg
|
||||
rm -Rf .lldb
|
||||
|
||||
clean-pep-home: clean-pep-home-alice clean-pep-home-bob
|
||||
|
||||
clean-pep-home-alice:
|
||||
rm -rf $(PEP_HOME_DIR_ALICE)/.pEp
|
||||
|
||||
clean-pep-home-bob:
|
||||
rm -rf $(PEP_HOME_DIR_BOB)/.pEp
|
@ -0,0 +1,43 @@
|
||||
package foundation.pEp.jniadapter.test.jni153;
|
||||
|
||||
import foundation.pEp.jniadapter.Message;
|
||||
import foundation.pEp.jniadapter.test.utils.AdapterTestUtils;
|
||||
import foundation.pEp.jniadapter.test.utils.model.NodeName;
|
||||
import foundation.pEp.pitytest.TestSuite;
|
||||
import foundation.pEp.pitytest.TestUnit;
|
||||
import foundation.pEp.pitytest.utils.TestUtils;
|
||||
|
||||
import static foundation.pEp.pitytest.TestLogger.log;
|
||||
|
||||
|
||||
class TestAlice {
|
||||
public static void main(String[] args) throws Exception {
|
||||
TestSuite.getDefault().setVerbose(true);
|
||||
TestSuite.getDefault().setTestColor(TestUtils.TermColor.GREEN);
|
||||
|
||||
CTXMultiNode JNI153Ctx = new CTXMultiNode(NodeName.NODE_A1);
|
||||
|
||||
new TestUnit<CTXMultiNode>("test", JNI153Ctx, ctx -> {
|
||||
ctx.transport.clearOwnQueue();
|
||||
ctx.myself.pEpIdent = ctx.engine.myself(ctx.myself.pEpIdent);
|
||||
log(AdapterTestUtils.identityToString(ctx.myself.pEpIdent, true));
|
||||
|
||||
ctx.transport.start();
|
||||
|
||||
ctx.transport.sendAsync(AdapterTestUtils.newOutMessage(ctx.myself.pEpIdent, ctx.partner.pEpIdent, "UNIQUE_" + String.valueOf(0)));
|
||||
int counter = 0;
|
||||
|
||||
while (true) {
|
||||
while (ctx.transport.canReceiveAsync()) {
|
||||
ctx.transport.sendAsync(AdapterTestUtils.newOutMessage(ctx.myself.pEpIdent, ctx.partner.pEpIdent, "UNIQUE_" + String.valueOf(counter)));
|
||||
Message msg = ctx.transport.receiveAsyncNonBlocking();
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
TestSuite.getDefault().run();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,56 @@
|
||||
package foundation.pEp.jniadapter.test.jni153;
|
||||
|
||||
import foundation.pEp.jniadapter.Engine;
|
||||
import foundation.pEp.jniadapter.Message;
|
||||
import foundation.pEp.jniadapter.test.utils.AdapterTestUtils;
|
||||
import foundation.pEp.jniadapter.test.utils.model.NodeName;
|
||||
import foundation.pEp.pitytest.TestSuite;
|
||||
import foundation.pEp.pitytest.TestUnit;
|
||||
import foundation.pEp.pitytest.utils.TestUtils;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
import static foundation.pEp.pitytest.TestLogger.log;
|
||||
|
||||
class TestBob {
|
||||
public static void main(String[] args) throws Exception {
|
||||
TestSuite.getDefault().setVerbose(true);
|
||||
TestSuite.getDefault().setTestColor(TestUtils.TermColor.YELLOW);
|
||||
|
||||
CTXMultiNode JNI153Ctx = new CTXMultiNode(NodeName.NODE_B1);
|
||||
|
||||
new TestUnit<CTXMultiNode>("test", JNI153Ctx, ctx -> {
|
||||
ExecutorService executorService = Executors.newFixedThreadPool(10);
|
||||
ctx.transport.clearOwnQueue();
|
||||
ctx.myself.pEpIdent = ctx.engine.myself(ctx.myself.pEpIdent);
|
||||
log(AdapterTestUtils.identityToString(ctx.myself.pEpIdent, true));
|
||||
|
||||
ctx.transport.start();
|
||||
|
||||
int counter = 0;
|
||||
while (true) {
|
||||
|
||||
while (ctx.transport.canReceiveAsync()) {
|
||||
Message msgRx = ctx.transport.receiveAsyncNonBlocking();
|
||||
log(AdapterTestUtils.identityToString(msgRx.getFrom(),true));
|
||||
ctx.transport.sendAsync(AdapterTestUtils.newOutMessage(ctx.myself.pEpIdent, msgRx.getFrom(), msgRx.getLongmsg() + " - ACK"));
|
||||
counter++;
|
||||
|
||||
if (counter % 4 == 0) {
|
||||
executorService.submit(() -> {
|
||||
Engine eng = new Engine();
|
||||
log("Mistrusting");
|
||||
eng.keyMistrusted(msgRx.getFrom());
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
TestSuite.getDefault().run();
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in new issue