Reputation: 16845
The original question complicates things, actually the problem is much simpler.
I try to simply run existing unit tests without adding anything. In the unit test inet/tests/unit
folder I run:
./runtest
and get this:
andreatino@andreatino-virtual-machine:~/Git/inet/tests/unit$ ./runtest
opp_test: extracting files from *.test files into work...
Creating Makefile in /home/andreatino/Git/inet/tests/unit/work...
Makefile created, running "make depend" to add dependencies...
Creating dependencies...
intervaltree/test.cc
In file included from /home/andreatino/Downloads/omnetpp-5.0/include/platdep/sockets.h:2:0,
from ../../../src/inet/common/precompiled.h:19,
from ../../../src/inet/common/INETDefs.h:22,
from ../../../src/inet/common/IntervalTree.h:42,
from intervaltree/test.cc:4:
/home/andreatino/Downloads/omnetpp-5.0/include/omnetpp/platdep/sockets.h:33:3: error: #error "#include <platdep/sockets.h> must precede <omnetpp.h> (and <platdep/timeutil.h> if present)"
# error "#include <platdep/sockets.h> must precede <omnetpp.h> (and <platdep/timeutil.h> if present)"
^
Makefile:122: recipe for target 'out/gcc-debug//intervaltree/test.o' failed
make: *** [out/gcc-debug//intervaltree/test.o] Error 1
What is going on?
Attention You can avoid reading the original question actually. Unless you are curios about some getting more info on the issue.
I am trying to run a custom test in the INet Framework, I am adding a custom test for a component I am writing. The files are part of this commit.
I am adding a test in: inet/tests/unit
, please see the commit for the file structure.
The test file:
%description:
Test MacUtils in Ieee80211ac:
- Length of MU bundles is correctly computed.
%includes:
#include "ieee80211ac/MacUtilsTest.h"
%global:
using namespace ::inet::tcp::test::ieee80211ac;
%activity:
MacUtilsTest test = MacUtilsTest();
test.testMaxLengthReturned();
EV << ".\n";
%contains: stdout
l=7
.
And the included header:
#ifndef __INET_IEEE80211AC_MACUTILSTEST_H
#define __INET_IEEE80211AC_MACUTILSTEST_H
#include "inet/linklayer/ieee80211/mac/IMacParameters.h"
#include "inet/linklayer/ieee80211/mac/IRateSelection.h"
#include "inet/linklayer/ieee80211/mac/AccessCategory.h"
#include "inet/linklayer/ieee80211/mac/IRateControl.h"
#include "inet/linklayer/ieee80211/mac/Ieee80211Frame_m.h"
using namespace inet::ieee80211ac;
namespace inet {
namespace ieee80211ac {
class MacUtils;
class Ieee80211acMUBundleFrame;
}
namespace test {
namespace ieee80211ac {
/**
* Tests focusing on utils on bundle messages.
*/
class MacUtilsTest
{
protected:
class DummyMacParameters : public inet::ieee80211::IMacParameters {
public:
virtual const MACAddress& getAddress() const override {}
virtual bool isEdcaEnabled() const override {return false;}
virtual simtime_t getSlotTime() const override {return 0;}
virtual simtime_t getSifsTime() const override {return 0;}
virtual simtime_t getAifsTime(inet::ieee80211::AccessCategory ac) const override {return 0;}
virtual simtime_t getEifsTime(inet::ieee80211::AccessCategory ac) const override {return 0;}
virtual simtime_t getPifsTime() const override {return 0;}
virtual simtime_t getRifsTime() const override {return 0;}
virtual int getCwMin(inet::ieee80211::AccessCategory ac) const override {return 0;}
virtual int getCwMax(inet::ieee80211::AccessCategory ac) const override {return 0;}
virtual int getCwMulticast(inet::ieee80211::AccessCategory ac) const override {return 0;}
virtual simtime_t getTxopLimit(inet::ieee80211::AccessCategory ac) const override {return 0;}
virtual int getShortRetryLimit() const override {return 0;}
virtual int getLongRetryLimit() const override {return 0;}
virtual int getRtsThreshold() const override {return 0;}
virtual simtime_t getPhyRxStartDelay() const override {return 0;}
virtual bool getUseFullAckTimeout() const override {return false;}
};
class DummyRateSelection : public inet::ieee80211::IRateSelection {
public:
virtual void setRateControl(inet::ieee80211::IRateControl *rateControl) override {}
virtual const IIeee80211Mode *getSlowestMandatoryMode() override {return nullptr;}
virtual const IIeee80211Mode *getModeForUnicastDataOrMgmtFrame(
inet::ieee80211::Ieee80211DataOrMgmtFrame *frame) override {return nullptr;}
virtual const IIeee80211Mode *getModeForMulticastDataOrMgmtFrame(
inet::ieee80211::Ieee80211DataOrMgmtFrame *frame) override {return nullptr;}
virtual const IIeee80211Mode *getModeForControlFrame(
inet::ieee80211::Ieee80211Frame *controlFrame) override {return nullptr;}
virtual const IIeee80211Mode *getResponseControlFrameMode() override {return nullptr;}
};
protected:
DummyMacParameters *macParameters = nullptr;
DummyRateSelection *rateSelection = nullptr;
MacUtils *utils = nullptr;
Ieee80211acMUBundleFrame *bundleFrame = nullptr;
protected:
virtual void initialize();
public:
MacUtilsTest();
virtual ~MacUtilsTest();
public:
void testMaxLengthReturned();
};
} // namespace ieee80211ac
} // namespace test
} // namespace inet
#endif
And implementation:
#include "MacUtilsTest.h"
#include "inet/linklayer/ieee80211ac/mac/MacUtils.h"
#include "inet/linklayer/ieee80211/mac/MacUtils.h"
#include "inet/linklayer/ieee80211ac/mac/Ieee80211acFrame_m.h"
using namespace inet::ieee80211ac;
namespace inet {
namespace test {
namespace ieee80211ac {
MacUtilsTest::MacUtilsTest()
{
this->initialize();
}
MacUtilsTest::~MacUtilsTest()
{
delete this->macParameters;
delete this->rateSelection;
delete this->utils;
for (unsigned int i = 0, l = this->bundleFrame->getSingleFramesArraySize(); i < l; i++)
delete this->bundleFrame->getSingleFrames(i);
delete this->bundleFrame;
}
void MacUtilsTest::initialize()
{
this->macParameters = new MacUtilsTest::DummyMacParameters();
this->rateSelection = new MacUtilsTest::DummyRateSelection();
this->utils = new inet::ieee80211ac::MacUtils(this->macParameters, this->rateSelection);
this->bundleFrame = new Ieee80211acMUBundleFrame("MU Bundle");
Ieee80211acDataFrame* data1 = new Ieee80211acDataFrame("Data-1");
data1->setByteLength(3);
Ieee80211acDataFrame* data2 = new Ieee80211acDataFrame("Data-2");
data2->setByteLength(6);
Ieee80211acDataFrame* data3 = new Ieee80211acDataFrame("Data-3");
data3->setByteLength(7);
this->bundleFrame->setSingleFramesArraySize(3);
this->bundleFrame->setSingleFrames(0, *data1);
this->bundleFrame->setSingleFrames(0, *data2);
this->bundleFrame->setSingleFrames(0, *data3);
}
void MacUtilsTest::testMaxLengthReturned()
{
int64_t length = this->utils->getMUBundleByteLength(this->bundleFrame);
EV << "l=" << length << endl;
}
} // namespace ieee80211ac
} // namespace test
} // namespace inet
I'm adding them here just for the sake of this question, but in the commit I linked you can get more info about where these files are.
I try then running ./runtest
in the unit
folder and get this:
andreatino@andreatino-virtual-machine:~/Git/inet/tests/unit$ ./runtest
opp_test: extracting files from *.test files into work...
Creating Makefile in /home/andreatino/Git/inet/tests/unit/work...
Makefile created, running "make depend" to add dependencies...
Creating dependencies...
IEEE80211ac_MacUtils_MUBundleLength/test.cc
In file included from /home/andreatino/Downloads/omnetpp-5.0/include/platdep/sockets.h:2:0,
from ../../../src/inet/common/precompiled.h:19,
from ../../../src/inet/common/INETDefs.h:22,
from ../../../src/inet/linklayer/ieee80211/mac/AccessCategory.h:23,
from ../../../src/inet/linklayer/ieee80211/mac/IMacParameters.h:23,
from ./lib/ieee80211ac/MacUtilsTest.h:4,
from IEEE80211ac_MacUtils_MUBundleLength/test.cc:4:
/home/andreatino/Downloads/omnetpp-5.0/include/omnetpp/platdep/sockets.h:33:3: error: #error "#include <platdep/sockets.h> must precede <omnetpp.h> (and <platdep/timeutil.h> if present)"
# error "#include <platdep/sockets.h> must precede <omnetpp.h> (and <platdep/timeutil.h> if present)"
^
In file included from IEEE80211ac_MacUtils_MUBundleLength/test.cc:4:0:
./lib/ieee80211ac/MacUtilsTest.h:10:23: error: ‘ieee80211ac’ is not a namespace-name
using namespace inet::ieee80211ac;
^
./lib/ieee80211ac/MacUtilsTest.h:10:34: error: expected namespace-name before ‘;’ token
using namespace inet::ieee80211ac;
^
./lib/ieee80211ac/MacUtilsTest.h:65:9: error: ‘MacUtils’ does not name a type
MacUtils *utils = nullptr;
^
./lib/ieee80211ac/MacUtilsTest.h:66:9: error: ‘Ieee80211acMUBundleFrame’ does not name a type
Ieee80211acMUBundleFrame *bundleFrame = nullptr;
^
./lib/ieee80211ac/MacUtilsTest.h: In member function ‘virtual const inet::MACAddress& inet::test::ieee80211ac::MacUtilsTest::DummyMacParameters::getAddress() const’:
./lib/ieee80211ac/MacUtilsTest.h:30:72: warning: no return statement in function returning non-void [-Wreturn-type]
virtual const MACAddress& getAddress() const override {}
^
IEEE80211ac_MacUtils_MUBundleLength/test.cc: At global scope:
IEEE80211ac_MacUtils_MUBundleLength/test.cc:13:25: error: ‘inet::tcp’ has not been declared
using namespace ::inet::tcp::test::ieee80211ac;
^
IEEE80211ac_MacUtils_MUBundleLength/test.cc:13:36: error: ‘ieee80211ac’ is not a namespace-name
using namespace ::inet::tcp::test::ieee80211ac;
^
IEEE80211ac_MacUtils_MUBundleLength/test.cc:13:47: error: expected namespace-name before ‘;’ token
using namespace ::inet::tcp::test::ieee80211ac;
^
IEEE80211ac_MacUtils_MUBundleLength/test.cc: In member function ‘virtual void IEEE80211ac_MacUtils_MUBundleLength::Test::activity()’:
IEEE80211ac_MacUtils_MUBundleLength/test.cc:28:1: error: ‘MacUtilsTest’ was not declared in this scope
MacUtilsTest test = MacUtilsTest();
^
IEEE80211ac_MacUtils_MUBundleLength/test.cc:28:1: note: suggested alternative:
In file included from IEEE80211ac_MacUtils_MUBundleLength/test.cc:4:0:
./lib/ieee80211ac/MacUtilsTest.h:25:7: note: ‘inet::test::ieee80211ac::MacUtilsTest’
class MacUtilsTest
^
IEEE80211ac_MacUtils_MUBundleLength/test.cc:30:1: error: ‘test’ was not declared in this scope
test.testMaxLengthReturned();
^
IEEE80211ac_MacUtils_MUBundleLength/test.cc:30:1: note: suggested alternative:
In file included from IEEE80211ac_MacUtils_MUBundleLength/test.cc:4:0:
./lib/ieee80211ac/MacUtilsTest.h:19:16: note: ‘inet::test’
namespace test {
^
Makefile:123: recipe for target 'out/gcc-debug//IEEE80211ac_MacUtils_MUBundleLength/test.o' failed
make: *** [out/gcc-debug//IEEE80211ac_MacUtils_MUBundleLength/test.o] Error 1
I don't understand what I am doing wrong... Or even what is going on here...
Upvotes: 0
Views: 396
Reputation: 66
Starting from OMNeT++ 4.2 <platdep/sockets.h>
MUST precede <omnetpp.h>
as mentionend in the changelog:
Within inet they ensured the right order by adapting the src/makefrag
in the following commit:
https://github.com/inet-framework/inet/commit/d9abbd1b4df5b9efcfb7a7f58e8f2223f4a91a33
So, you have to add a makefrag
file in the same folder as your Makefile
with the following code:
PRECOMPILED_HEADER=<path-to-inet>/src/inet/common/precompiled.h
CFLAGS += -include $(PRECOMPILED_HEADER)
Consider replacing <path-to-inet>
by your paths e.g. ../../
UPDATE: The changelog for OMNeT++ 5.1 Preview 3 emphasis, that the issue is resolved:
Ordering of 'platdep/sockets.h' and 'omnetpp.h' is no longer important. It is recommended to include 'omnetpp.h' first.
Upvotes: 1