%description: Tests cGate::connectTo() and disconnect(). %file: test.ned simple Sender { gates: input in; output out; } simple Receiver { gates: input in; output out; } network Test { submodules: theSender : Sender; theReceiver : Receiver; connections: theSender.out --> theReceiver.in; theSender.in <-- theReceiver.out; } %file: test.cc #include using namespace omnetpp; namespace @TESTNAME@ { class Sender : public cSimpleModule { public: Sender() : cSimpleModule(32768) { } virtual void activity() override; }; Define_Module(Sender); #define PRINT(g) EV << #g << ":" << ((g) ? (g)->getFullName() : "nullptr") << endl void Sender::activity() { cGate *out = gate("out"); cGate *rcvin = gate("out")->getNextGate(); // start clean out->disconnect(); // connect, then check if OK out->connectTo(rcvin); PRINT(out->getNextGate()); PRINT(rcvin->getPreviousGate()); // even send message to verify cMessage *msg = new cMessage("hello"); send(msg, "out"); wait(1); // disconnect, then check if OK out->disconnect(); PRINT(out->getNextGate()); PRINT(rcvin->getPreviousGate()); // disconnect should be idempotent out->disconnect(); PRINT(out->getNextGate()); PRINT(rcvin->getPreviousGate()); // connect twice -- second one must throw error out->connectTo(rcvin); PRINT(out->getNextGate()); PRINT(rcvin->getPreviousGate()); out->connectTo(rcvin); } class Receiver : public cSimpleModule { public: Receiver() : cSimpleModule(32768) { } virtual void activity() override; }; Define_Module(Receiver); void Receiver::activity() { cMessage *msg = receive(); EV << "arrived:" << msg->getName() << endl; delete msg; } }; //namespace %extraargs: -m %exitcode: 1 %contains-regex: stdout out->getNextGate\(\):in rcvin->getPreviousGate\(\):out .* arrived:hello .* out->getNextGate\(\):nullptr rcvin->getPreviousGate\(\):nullptr out->getNextGate\(\):nullptr rcvin->getPreviousGate\(\):nullptr out->getNextGate\(\):in rcvin->getPreviousGate\(\):out .*Gate already connected