From 273193ddd9a0535f6988879562a6d82f22d40dd9 Mon Sep 17 00:00:00 2001 From: heck Date: Mon, 3 May 2021 14:18:52 +0200 Subject: [PATCH] Tests: Add test JNI-153 - "'malloc_consolidate(): invalid chunk size' after receiving message from 'mistrusted' identity" This is also the prototype for nextgen DistributedTests (RoleAbstraction,MultiNode, MultiIdents) --- .../jniadapter/test/jni153/CTXMultiNode.java | 146 ++++++++++++++++++ .../pEp/jniadapter/test/jni153/Makefile | 46 ++++++ .../pEp/jniadapter/test/jni153/TestAlice.java | 41 +++++ .../pEp/jniadapter/test/jni153/TestBob.java | 45 ++++++ 4 files changed, 278 insertions(+) create mode 100644 test/java/foundation/pEp/jniadapter/test/jni153/CTXMultiNode.java create mode 100644 test/java/foundation/pEp/jniadapter/test/jni153/Makefile create mode 100644 test/java/foundation/pEp/jniadapter/test/jni153/TestAlice.java create mode 100644 test/java/foundation/pEp/jniadapter/test/jni153/TestBob.java diff --git a/test/java/foundation/pEp/jniadapter/test/jni153/CTXMultiNode.java b/test/java/foundation/pEp/jniadapter/test/jni153/CTXMultiNode.java new file mode 100644 index 0000000..c0ee7c6 --- /dev/null +++ b/test/java/foundation/pEp/jniadapter/test/jni153/CTXMultiNode.java @@ -0,0 +1,146 @@ +package foundation.pEp.jniadapter.test.jni153; + +import foundation.pEp.jniadapter.Engine; +import foundation.pEp.jniadapter.Identity; +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.Vector; +import java.util.stream.Collectors; + +import static foundation.pEp.pitytest.TestLogger.log; + +public class CTXMultiNode extends AbstractTestContext { + public Engine engine; + public TestCallbacks callbacks; + public FsMQManager 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 FsMQManager(transportIdent); + + // Add all transport identities of the model + for (TestIdentity ti : model.getAllIdents()) { + transport.identities.addAll(ti.getAllTransportIdents()); + } + + return this; + } + + public void send(String pEpAddress, String msg) { + //Find identity for address + List res = model.getAllIdents().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()) { + transport.sendMessage(tID.getAddress(), msg); +// log("send() to: " + tID.getAddress()); + } + } + + 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; + } + + public Message reveiveMessage() { + FsMQMessage rx = null; + rx = transport.receiveMessage(2000); + + // Receive + Message msgIn = new Message(rx.getMsg()); + 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; + } + + public void sendMessage(Identity toIdent, String longMessage) { + // Reply + Message reply = new Message(); + Vector to = new Vector<>(); + to.add(toIdent); + reply.setTo(to); + reply.setFrom(myself.pEpIdent); + reply.setShortmsg("Reply"); + reply.setLongmsg(longMessage); + reply.setDir(Message.Direction.Outgoing); + + Message replyEnc = engine.encrypt_message(reply, null, Message.EncFormat.PEP); + + String encFormat; + longMessage = reply.getLongmsg(); + String transportMsg; + if (replyEnc != null) { + encFormat = "CRYPT"; + transportMsg = replyEnc.encodeMIME(); + } else { + encFormat = "PLAIN"; + transportMsg = reply.encodeMIME(); + } + log("<- : [" + encFormat + "] - " + longMessage); + send(toIdent.address, transportMsg); + } +} diff --git a/test/java/foundation/pEp/jniadapter/test/jni153/Makefile b/test/java/foundation/pEp/jniadapter/test/jni153/Makefile new file mode 100644 index 0000000..34409e7 --- /dev/null +++ b/test/java/foundation/pEp/jniadapter/test/jni153/Makefile @@ -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 diff --git a/test/java/foundation/pEp/jniadapter/test/jni153/TestAlice.java b/test/java/foundation/pEp/jniadapter/test/jni153/TestAlice.java new file mode 100644 index 0000000..79da0a7 --- /dev/null +++ b/test/java/foundation/pEp/jniadapter/test/jni153/TestAlice.java @@ -0,0 +1,41 @@ +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("test", JNI153Ctx, ctx -> { + ctx.myself.pEpIdent = ctx.engine.myself(ctx.myself.pEpIdent); + log(AdapterTestUtils.identityToString(ctx.myself.pEpIdent, true)); + ctx.transport.clearOwnQueue(); + int counter = 0; + while (true) { + Message src = AdapterTestUtils.makeNewTestMessage(ctx.myself.pEpIdent, ctx.partner.pEpIdent, Message.Direction.Outgoing); + src.setLongmsg("UNIQUE_" + String.valueOf(counter)); + ctx.sendMessage(ctx.partner.pEpIdent, src.getLongmsg()); + ctx.reveiveMessage(); + + counter++; + TestUtils.sleep(3000); +// TestUtils.readKey(); + } + }); + + TestSuite.getDefault().run(); + } +} + + diff --git a/test/java/foundation/pEp/jniadapter/test/jni153/TestBob.java b/test/java/foundation/pEp/jniadapter/test/jni153/TestBob.java new file mode 100644 index 0000000..b6003b3 --- /dev/null +++ b/test/java/foundation/pEp/jniadapter/test/jni153/TestBob.java @@ -0,0 +1,45 @@ +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 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("test", JNI153Ctx, ctx -> { + ctx.myself.pEpIdent = ctx.engine.myself(ctx.myself.pEpIdent); + log(AdapterTestUtils.identityToString(ctx.myself.pEpIdent, true)); + ctx.transport.clearOwnQueue(); + int counter = 0; + + while (true) { + TestUtils.sleep(3000); + Message msgRx = ctx.reveiveMessage(); + + //Mistrust + if (counter == 1) { + log("Mistrusting"); + ctx.engine.keyMistrusted(msgRx.getFrom()); + } + + ctx.sendMessage(msgRx.getFrom(), msgRx.getLongmsg() + " - ACK"); + + counter++; + } + }); + + TestSuite.getDefault().run(); + } + + +}