%description: Test the cEventHeap optimization using the circular buffer, introduced at 20090725. Note: this test only schedules events for the current simTime()! Separate test needed for that. %file: test.ned simple Test { @isNetwork(true); } %file: test.cc #include using namespace omnetpp; namespace @TESTNAME@ { class Test : public cSimpleModule { protected: cFutureEventSet *fes; std::vector shadow; // t==simTime() events std::vector future; // future events public: Test() : fes(getSimulation()->getFES()) {} virtual void initialize() override; void verifyFES(); void insertMessages(int n); void removeRandomMessages(int n); virtual void handleMessage(cMessage *msg) override {} }; Define_Module(Test); void Test::verifyFES() { // produce reference event list (expected = shadow + future) int i; std::vector expected = shadow; for (i=0; i<(int)future.size(); i++) expected.push_back(future[i]); ASSERT(expected.size()==shadow.size()+future.size()); // verify ASSERT(fes->getLength()==(int)expected.size()); ASSERT(fes->isEmpty()==expected.empty()); ASSERT(fes->peekFirst()==(expected.empty() ? nullptr : expected[0])); for (i=0; igetLength(); i++) { ASSERT(fes->get(i)==expected[i]); ASSERT(expected[i]->getOwner()==fes); } } void Test::insertMessages(int n) { EV << "len=" << fes->getLength() << "; adding " << n << " events\n"; verifyFES(); for (int i=0; iremoveFirst(); ASSERT(first==msg); } else { fes->remove(msg); } shadow.erase(shadow.begin()+k); delete msg; verifyFES(); } } void Test::initialize() { // we'll directly exercise the FES (this is something that normal // simulation models are NOT supposed to do...) // fill up FES to a varying degree (n=1..20 events), and empty them; // this will exercise the circbuf reallocation code in cEventHeap for (int n=1; n<20; n++) { for (int rep=0; rep<3; rep++) { insertMessages(n); removeRandomMessages(n); } } // add at least 1 future message cMessage *msg = new cMessage(); scheduleAt(simTime()+1, msg); future.push_back(msg); verifyFES(); // randomly add/remove events for the current simtime for (int i=0; i<5000; i++) { insertMessages(intuniform(0,9)); removeRandomMessages(intuniform(0,10)); } EV << "done\n"; } }; //namespace %contains: stdout len=0; adding 1 events len=1; randomly removing max 1 events len=0; adding 1 events len=1; randomly removing max 1 events len=0; adding 1 events len=1; randomly removing max 1 events len=0; adding 2 events len=2; randomly removing max 2 events len=0; adding 2 events len=2; randomly removing max 2 events len=0; adding 2 events len=2; randomly removing max 2 events len=0; adding 3 events len=3; randomly removing max 3 events len=0; adding 3 events len=3; randomly removing max 3 events len=0; adding 3 events len=3; randomly removing max 3 events len=0; adding 4 events len=4; randomly removing max 4 events %contains: stdout done