[Positioning] Tests: add global set up & tear down

Work on unit tests:
- TestUtil:
  - Add set_up(), that sets up lists of Request, Mobile and AccessPoint,
    primarily to be used with create_test_csv_file().
  - Add public attributes for these lists.
  - Update create_test_csv_file() to use these lists.
- Update InputCSV_test to use new TestUtil.
- Add class TestSetUp, a global fixture class. Before all tests off all
  test suites, it calls TestUtil::set_up().
- Update and clean Makefile.
This commit is contained in:
Matteo Cypriani 2010-02-15 20:39:08 +01:00
parent dbd58f8178
commit 8257e9e67d
6 changed files with 290 additions and 105 deletions

View File

@ -1,10 +1,6 @@
.PHONY : all test doc clean purge install uninstall style check
TEST_DIR = tests
TEST_XX = $(TEST_DIR)/tests.cc
TEST_OBJ = $(TEST_DIR)/tests.o
TESTUTIL_OBJ = $(TEST_DIR)/testutil.o
TEST_TARGET = $(TEST_DIR)/tests
TESTS_DIR = tests
DOXYGEN_DIR = doc
DOXYFILE = Doxyfile
@ -25,7 +21,7 @@ DOXYGEN = doxygen
# Compilation tools and flags
GXX = g++-4.4
#DEBUG = -g
TESTSGXXFLAGS = -I$(TEST_DIR) -I.
TESTSGXXFLAGS = -I$(TESTS_DIR) -I.
GXXFLAGS = $(DEBUG) -Wall -Wextra
LD = $(GXX)
LDFLAGS = -lm -lrt -lboost_program_options
@ -38,17 +34,26 @@ OBJ = posutil.o stock.o timestamp.o point3d.o referencepoint.o \
inputcsv.o configuration.o userinterface.o input.o
OBJ_NOTEST = posexcept.o
TESTS_XX = $(TESTS_DIR)/tests.cc
TESTS_OBJ = $(TESTS_DIR)/tests.o
TESTS_TARGET = $(TESTS_DIR)/tests
TESTUTIL_OBJ = $(TESTS_DIR)/testutil.o
TESTSETUP_OBJ = $(TESTS_DIR)/testsetup.o
SOURCE_TESTS = $(OBJ:%.o=$(TESTS_DIR)/%_test.hh)
OBJ_TESTS = $(TESTUTIL_OBJ) $(TESTSETUP_OBJ)
INCLUDES_TESTS = $(TESTS_DIR)/valuetraits.hh
all: $(TARGET)
# Generic targets
%: %.o
$(LD) $(LDFLAGS) -o $@ $^
$(TESTS_DIR)/%.o: $(TESTS_DIR)/%.cc $(TESTS_DIR)/%.hh
$(GXX) $(GXXFLAGS) $(TESTSGXXFLAGS) -o $@ -c $<
%.o: %.cc %.hh
$(GXX) $(GXXFLAGS) -c $<
$(TEST_DIR)/%_test.o: %.o
$(GXX) $(GXXFLAGS) $(TESTSGXXFLAGS) -c $<
%: %.o
$(LD) $(LDFLAGS) -o $@ $^
# Dependencies
userinterface.o: configuration.o
@ -67,35 +72,32 @@ input.o: posexcept.o
# Specific targets
$(TARGET): $(OBJ) $(OBJ_NOTEST)
$(TEST_XX): $(OBJ:%.o=$(TEST_DIR)/%_test.hh)
$(TEST_DIR)/cxxtestgen.pl --error-printer \
--include=$(TEST_DIR)/valuetraits.hh \
$(TESTS_XX): $(SOURCE_TESTS)
$(TESTS_DIR)/cxxtestgen.pl --error-printer \
--include=$(TESTS_DIR)/valuetraits.hh \
--include=$(TESTUTIL_OBJ:.o=.hh) \
-o $@ $^
$(TEST_OBJ): $(TEST_XX) $(OBJ) $(TESTUTIL_OBJ) $(TEST_DIR)/valuetraits.hh
$(TESTS_OBJ): $(TESTS_XX) $(OBJ) $(INCLUDES_TESTS)
$(GXX) $(GXXFLAGS) $(TESTSGXXFLAGS) -o $@ -c $<
$(TESTUTIL_OBJ): $(TESTUTIL_OBJ:.o=.cc) $(TESTUTIL_OBJ:.o=.hh)
$(GXX) $(GXXFLAGS) $(TESTSGXXFLAGS) -o $@ -c $<
$(TEST_TARGET): $(TEST_OBJ) $(TESTUTIL_OBJ)
$(TESTS_TARGET): $(TESTS_OBJ) $(OBJ_TESTS)
$(LD) $(LDFLAGS) -o $@ $^ $(OBJ) $(OBJ_NOTEST)
test: $(TEST_TARGET)
@$(TEST_TARGET)
test: $(TESTS_TARGET)
@$(TESTS_TARGET)
doc:
@$(DOXYGEN) $(DOXYFILE)
clean:
@$(RM) *~ *.o *.gch *.orig
@$(RM) $(TEST_XX) $(TEST_DIR)/*~ $(TEST_DIR)/*.o \
$(TEST_DIR)/*.orig
@$(RM) $(TESTS_XX) $(TESTS_DIR)/*~ $(TESTS_DIR)/*.o \
$(TESTS_DIR)/*.orig
purge: clean
@$(RM) $(TARGET)
@$(RM) $(TEST_TARGET)
@$(RM) $(TESTS_TARGET)
@$(RM_RECURSIVE) $(DOXYGEN_DIR)
install: $(TARGET)
@ -113,7 +115,8 @@ style:
$(OBJ_NOTEST:.o=.hh) \
$(OBJ_NOTEST:.o=.cc) \
inputmedium.hh \
$(OBJ:%.o=$(TEST_DIR)/%_test.hh)
$(TESTS_DIR)/*.hh \
$(TESTS_DIR)/*.cc
check:
@$(CPPCHECK) \

View File

@ -24,7 +24,7 @@ public:
Stock::clear() ;
csv_file_name = "/tmp/InputCSV_test_csv_file.csv" ;
aps = TestUtil::create_test_csv_file(csv_file_name) ;
TestUtil::create_test_csv_file(csv_file_name, true) ;
// Back to the normal behaviour (i.e. do not abort on fail)
CxxTest::setAbortTestOnFail(false) ;
@ -61,30 +61,24 @@ public:
TS_ASSERT(! inputcsv1.eof()) ;
Request request1 ;
std::tr1::unordered_map<std::string, Measurement> measurements ;
// First Request //
request1 = inputcsv1.get_next_request() ;
TS_ASSERT_EQUALS(request1.get_mobile()->get_mac_addr(),
"aa:bb:cc:dd:ee:ff") ;
TS_ASSERT_EQUALS(request1.get_timestamp().get_timestamp_ms(),
1265120910725llu) ;
TestUtil::mobiles[0].get_mac_addr()) ;
TS_ASSERT_EQUALS(request1.get_timestamp(),
TestUtil::requests[0].get_timestamp()) ;
measurements[aps[0].get_mac_addr()].add_ss(-58) ;
measurements[aps[2].get_mac_addr()].add_ss(-50) ;
measurements[aps[1].get_mac_addr()].add_ss(-42) ;
measurements[aps[0].get_mac_addr()].add_ss(-55) ;
measurements[aps[1].get_mac_addr()].add_ss(-37) ;
for (std::vector<AccessPoint>::const_iterator i = aps.begin() ;
i != aps.end() ; ++i)
for (std::vector<AccessPoint>::const_iterator i = TestUtil::aps.begin() ;
i != TestUtil::aps.end() ; ++i)
{
std::tr1::unordered_map<std::string, Measurement>::const_iterator
measurement_it1 =
request1.get_measurements().find(i->get_mac_addr()) ;
TS_ASSERT_DIFFERS(request1.get_measurements().end(), measurement_it1) ;
TS_ASSERT_EQUALS(measurements[i->get_mac_addr()].get_ss_list(),
TS_ASSERT_EQUALS(TestUtil::requests[0].get_measurements().
at(i->get_mac_addr()).get_ss_list(),
measurement_it1->second.get_ss_list()) ;
}
@ -95,25 +89,19 @@ public:
request1 = inputcsv1.get_next_request() ;
TS_ASSERT_EQUALS(request1.get_mobile()->get_mac_addr(),
"aa:bb:cc:dd:ee:77") ;
TS_ASSERT_EQUALS(request1.get_timestamp().get_timestamp_ms(),
1265120911234llu) ;
TestUtil::mobiles[1].get_mac_addr()) ;
TS_ASSERT_EQUALS(request1.get_timestamp(),
TestUtil::requests[1].get_timestamp()) ;
measurements.clear() ;
measurements[aps[2].get_mac_addr()].add_ss(-59) ;
measurements[aps[0].get_mac_addr()].add_ss(-51) ;
measurements[aps[1].get_mac_addr()].add_ss(-70) ;
measurements[aps[1].get_mac_addr()].add_ss(-21) ;
measurements[aps[0].get_mac_addr()].add_ss(-19) ;
for (std::vector<AccessPoint>::const_iterator i = aps.begin() ;
i != aps.end() ; ++i)
for (std::vector<AccessPoint>::const_iterator i = TestUtil::aps.begin() ;
i != TestUtil::aps.end() ; ++i)
{
std::tr1::unordered_map<std::string, Measurement>::const_iterator
measurement_it1 =
request1.get_measurements().find(i->get_mac_addr()) ;
TS_ASSERT_DIFFERS(request1.get_measurements().end(), measurement_it1) ;
TS_ASSERT_EQUALS(measurements[i->get_mac_addr()].get_ss_list(),
TS_ASSERT_EQUALS(TestUtil::requests[1].get_measurements().
at(i->get_mac_addr()).get_ss_list(),
measurement_it1->second.get_ss_list()) ;
}
@ -124,25 +112,19 @@ public:
request1 = inputcsv1.get_next_request() ;
TS_ASSERT_EQUALS(request1.get_mobile()->get_mac_addr(),
"aa:bb:cc:dd:ee:ff") ;
TS_ASSERT_EQUALS(request1.get_timestamp().get_timestamp_ms(),
1265120912345llu) ;
TestUtil::mobiles[0].get_mac_addr()) ;
TS_ASSERT_EQUALS(request1.get_timestamp(),
TestUtil::requests[2].get_timestamp()) ;
measurements.clear() ;
measurements[aps[2].get_mac_addr()].add_ss(-56) ;
measurements[aps[1].get_mac_addr()].add_ss(-45) ;
measurements[aps[0].get_mac_addr()].add_ss(-54) ;
measurements[aps[1].get_mac_addr()].add_ss(-23) ;
measurements[aps[0].get_mac_addr()].add_ss(-32) ;
for (std::vector<AccessPoint>::const_iterator i = aps.begin() ;
i != aps.end() ; ++i)
for (std::vector<AccessPoint>::const_iterator i = TestUtil::aps.begin() ;
i != TestUtil::aps.end() ; ++i)
{
std::tr1::unordered_map<std::string, Measurement>::const_iterator
measurement_it1 =
request1.get_measurements().find(i->get_mac_addr()) ;
TS_ASSERT_DIFFERS(request1.get_measurements().end(), measurement_it1) ;
TS_ASSERT_EQUALS(measurements[i->get_mac_addr()].get_ss_list(),
TS_ASSERT_EQUALS(TestUtil::requests[2].get_measurements().
at(i->get_mac_addr()).get_ss_list(),
measurement_it1->second.get_ss_list()) ;
}

View File

@ -0,0 +1,19 @@
#include "testsetup.hh"
// Create the global fixture
static TestSetUp testsetup ;
bool TestSetUp::setUpWorld(void)
{
TestUtil::set_up() ;
return true ;
}
bool TestSetUp::tearDownWorld(void)
{
TestUtil::tear_down() ;
return true ;
}

View File

@ -0,0 +1,10 @@
#include <cxxtest/GlobalFixture.h>
#include "testutil.hh"
class TestSetUp: public CxxTest::GlobalFixture
{
public:
bool setUpWorld(void) ;
bool tearDownWorld(void) ;
} ;

View File

@ -1,9 +1,100 @@
#include "testutil.hh"
#include <cxxtest/TestSuite.h>
#include "measurement.hh"
#include <fstream>
#include <sstream>
#include <boost/tr1/unordered_map.hpp>
using namespace std ;
using std::tr1::unordered_map ;
vector<AccessPoint> TestUtil::aps ;
vector<Mobile> TestUtil::mobiles ;
vector<Request> TestUtil::requests ;
void TestUtil::tear_down()
{
aps.clear() ;
mobiles.clear() ;
requests.clear() ;
}
void TestUtil::set_up()
{
tear_down() ;
// Create mobile list
mobiles.push_back(Mobile("192.168.0.42", "aa:bb:cc:dd:ee:ff")) ;
mobiles.push_back(Mobile("192.168.1.87", "aa:bb:cc:dd:ee:77")) ;
// Create AP list
aps.push_back(AccessPoint(Point3D(1,2,3), "10.0.0.1", "11:22:33:44:55:01")) ;
aps.push_back(AccessPoint(Point3D(4,5,6), "10.0.0.2", "11:22:33:44:55:02")) ;
aps.push_back(AccessPoint(Point3D(7,8,9), "10.0.0.3", "11:22:33:44:55:03")) ;
// Create measurement list
vector < unordered_map<string,Measurement> > measurements(3) ;
Measurement measurement1 ;
measurement1.add_ss(-58) ;
measurement1.add_ss(-55) ;
measurement1.set_ap(&aps[0]) ;
measurements[0][aps[0].get_mac_addr()] = measurement1 ;
measurement1.clear() ;
measurement1.add_ss(-50) ;
measurement1.set_ap(&aps[2]) ;
measurements[0][aps[2].get_mac_addr()] = measurement1 ;
measurement1.clear() ;
measurement1.add_ss(-42) ;
measurement1.add_ss(-37) ;
measurement1.set_ap(&aps[1]) ;
measurements[0][aps[1].get_mac_addr()] = measurement1 ;
measurement1.clear() ;
measurement1.add_ss(-51) ;
measurement1.add_ss(-19) ;
measurement1.set_ap(&aps[0]) ;
measurements[1][aps[0].get_mac_addr()] = measurement1 ;
measurement1.clear() ;
measurement1.add_ss(-70) ;
measurement1.add_ss(-21) ;
measurement1.set_ap(&aps[1]) ;
measurements[1][aps[1].get_mac_addr()] = measurement1 ;
measurement1.clear() ;
measurement1.add_ss(-59) ;
measurement1.set_ap(&aps[2]) ;
measurements[1][aps[2].get_mac_addr()] = measurement1 ;
measurement1.clear() ;
measurement1.add_ss(-54) ;
measurement1.add_ss(-32) ;
measurement1.set_ap(&aps[0]) ;
measurements[2][aps[0].get_mac_addr()] = measurement1 ;
measurement1.clear() ;
measurement1.add_ss(-45) ;
measurement1.add_ss(-23) ;
measurement1.set_ap(&aps[1]) ;
measurements[2][aps[1].get_mac_addr()] = measurement1 ;
measurement1.clear() ;
measurement1.add_ss(-56) ;
measurement1.set_ap(&aps[2]) ;
measurements[2][aps[2].get_mac_addr()] = measurement1 ;
// Create timestamp list
vector<Timestamp> timestamps ;
timestamps.push_back(Timestamp(1265120910725)) ;
timestamps.push_back(Timestamp(1265120911234)) ;
timestamps.push_back(Timestamp(1265120912345)) ;
// Create request list
requests.push_back(Request(timestamps[0], measurements[0])) ;
requests.push_back(Request(timestamps[1], measurements[1])) ;
requests.push_back(Request(timestamps[2], measurements[2])) ;
}
// Create the file output_file_name and fill it with the contents of
@ -34,48 +125,119 @@ void TestUtil::remove_file(const string &file_name)
}
vector<AccessPoint> TestUtil::
create_test_csv_file(const string &file_name)
void TestUtil::
create_test_csv_file(const string &file_name, bool with_spaces)
{
// Create AP list
vector<AccessPoint> aps ;
aps.push_back(AccessPoint(Point3D(1,2,3), "11:22:33:44:55:01")) ;
aps.push_back(AccessPoint(Point3D(4,5,6), "11:22:33:44:55:02")) ;
aps.push_back(AccessPoint(Point3D(7,8,9), "11:22:33:44:55:03")) ;
// Fill name and contents of the test CSV file
vector<string> csv_lines ;
csv_lines.push_back("\
\n \n\
aa:bb:cc:dd:ee:ff;1265120910725;0;0;0;0\
;" + aps[0].get_mac_addr() + ";-58\
;" + aps[2].get_mac_addr() + ";-50\
;" + aps[1].get_mac_addr() + ";-42\
;" + aps[0].get_mac_addr() + ";-55\
;" + aps[1].get_mac_addr() + ";-37\
\n") ;
csv_lines.push_back("\
aa:bb:cc:dd:ee:77;1265120911234;0;0;0;0\
;" + aps[2].get_mac_addr() + ";-59\
;" + aps[0].get_mac_addr() + ";-51\
;" + aps[1].get_mac_addr() + ";-70\
;" + aps[1].get_mac_addr() + ";-21\
;" + aps[0].get_mac_addr() + ";-19\
\n \n\
ostringstream line ;
if (with_spaces)
line << "\n \n " ;
line << mobiles[0].get_mac_addr() ;
line << ';' ;
line << requests[0].get_timestamp().get_timestamp_ms() ;
line << ";0;0;0;0;" ;
line << aps[0].get_mac_addr() ;
line << ";" ;
line << requests[0].get_measurements().at(aps[0].get_mac_addr())
.get_ss_list()[0] ;
line << ";" ;
line << aps[2].get_mac_addr() ;
line << ";" ;
line << requests[0].get_measurements().at(aps[2].get_mac_addr())
.get_ss_list()[0] ;
line << ";" ;
line << aps[1].get_mac_addr() ;
line << ";" ;
line << requests[0].get_measurements().at(aps[1].get_mac_addr())
.get_ss_list()[0] ;
line << ";" ;
line << aps[0].get_mac_addr() ;
line << ";" ;
line << requests[0].get_measurements().at(aps[0].get_mac_addr())
.get_ss_list()[1] ;
line << ";" ;
line << aps[1].get_mac_addr() ;
line << ";" ;
line << requests[0].get_measurements().at(aps[1].get_mac_addr())
.get_ss_list()[1] ;
line << '\n' ;
csv_lines.push_back(line.str()) ;
line.str("") ;
line << mobiles[1].get_mac_addr() ;
line << ';' ;
line << requests[1].get_timestamp().get_timestamp_ms() ;
line << ";0;0;0;0;" ;
line << aps[2].get_mac_addr() ;
line << ";" ;
line << requests[1].get_measurements().at(aps[2].get_mac_addr())
.get_ss_list()[0] ;
line << ";" ;
line << aps[0].get_mac_addr() ;
line << ";" ;
line << requests[1].get_measurements().at(aps[0].get_mac_addr())
.get_ss_list()[0] ;
line << ";" ;
line << aps[1].get_mac_addr() ;
line << ";" ;
line << requests[1].get_measurements().at(aps[1].get_mac_addr())
.get_ss_list()[0] ;
line << ";" ;
line << aps[1].get_mac_addr() ;
line << ";" ;
line << requests[1].get_measurements().at(aps[1].get_mac_addr())
.get_ss_list()[1] ;
line << ";" ;
line << aps[0].get_mac_addr() ;
line << ";" ;
line << requests[1].get_measurements().at(aps[0].get_mac_addr())
.get_ss_list()[1] ;
line << '\n' ;
if (with_spaces)
line << " \n\
\n\t\n\
\n \t \n\
\n") ;
csv_lines.push_back("\
\taa:bb:cc:dd:ee:ff;1265120912345;0;0;0;0\
;" + aps[2].get_mac_addr() + ";-56\
;" + aps[1].get_mac_addr() + ";-45\
;" + aps[0].get_mac_addr() + ";-54\
;" + aps[1].get_mac_addr() + ";-23\
;" + aps[0].get_mac_addr() + ";-32\
\n\n\t\n") ;
\n" ;
csv_lines.push_back(line.str()) ;
line.str("") ;
if (with_spaces)
line << '\t' ;
line << mobiles[0].get_mac_addr() ;
line << ';' ;
line << requests[2].get_timestamp().get_timestamp_ms() ;
line << ";0;0;0;0;" ;
line << aps[2].get_mac_addr() ;
line << ";" ;
line << requests[2].get_measurements().at(aps[2].get_mac_addr())
.get_ss_list()[0] ;
line << ";" ;
line << aps[1].get_mac_addr() ;
line << ";" ;
line << requests[2].get_measurements().at(aps[1].get_mac_addr())
.get_ss_list()[0] ;
line << ";" ;
line << aps[0].get_mac_addr() ;
line << ";" ;
line << requests[2].get_measurements().at(aps[0].get_mac_addr())
.get_ss_list()[0] ;
line << ";" ;
line << aps[1].get_mac_addr() ;
line << ";" ;
line << requests[2].get_measurements().at(aps[1].get_mac_addr())
.get_ss_list()[1] ;
line << ";" ;
line << aps[0].get_mac_addr() ;
line << ";" ;
line << requests[2].get_measurements().at(aps[0].get_mac_addr())
.get_ss_list()[1] ;
line << '\n' ;
if (with_spaces)
line << "\n\t\n" ;
csv_lines.push_back(line.str()) ;
// Create and fill the test CSV file
fill_file(file_name, csv_lines) ;
return aps ;
}

View File

@ -1,20 +1,29 @@
#ifndef _OWLPS_POSITIONING_TESTS_TESTUTIL_HH_
#define _OWLPS_POSITIONING_TESTS_TESTUTIL_HH_
#include "accesspoint.hh"
#include "mobile.hh"
#include "request.hh"
#include <string>
#include <vector>
#include "accesspoint.hh"
class TestUtil
{
public:
static std::vector<AccessPoint> aps ;
static std::vector<Mobile> mobiles ;
static std::vector<Request> requests ;
static void set_up(void) ;
static void tear_down(void) ;
static void fill_file(const std::string &output_file_name,
const std::vector<std::string> output_lines) ;
const std::vector<std::string> output_lines) ;
static void remove_file(const std::string &file_name) ;
static std::vector<AccessPoint>
create_test_csv_file(const std::string &file_name) ;
static void create_test_csv_file(const std::string &file_name,
bool with_spaces = false) ;
} ;
#endif // _OWLPS_POSITIONING_TESTS_TESTUTIL_HH_