]> git.stg.codes - stg.git/commitdiff
Добавляем каталог с тестами
authorMaxim Mamontov <faust@user-desktop.(none)>
Mon, 8 Nov 2010 10:35:28 +0000 (12:35 +0200)
committerMaxim Mamontov <faust@user-desktop.(none)>
Mon, 8 Nov 2010 10:35:28 +0000 (12:35 +0200)
tests/Makefile [new file with mode: 0644]
tests/main.cpp [new file with mode: 0644]
tests/raw_ip_packet_old.h [new file with mode: 0644]
tests/test_admin_conf.cpp [new file with mode: 0644]
tests/test_raw_ip.cpp [new file with mode: 0644]
tests/test_tariff.cpp [new file with mode: 0644]

diff --git a/tests/Makefile b/tests/Makefile
new file mode 100644 (file)
index 0000000..a924540
--- /dev/null
@@ -0,0 +1,28 @@
+CXXFLAGS+=-g3 -Wall -W -pedantic -DLINUX -I../include -I../projects/stargazer
+LIBS=-lpthread
+PROG=tests
+
+SOURCES=main.cpp \
+       test_raw_ip.cpp \
+       test_admin_conf.cpp \
+       test_tariff.cpp \
+       ../projects/stargazer/tariff.cpp
+
+all: $(PROG) 
+
+$(PROG): $(subst .cpp,.o,$(SOURCES))
+       $(CXX) $(LDFLAGS) $^ $(LIBS) -o $@
+
+clean:
+       rm -f *.o *.d
+
+ifneq ($(MAKECMDGOALS),distclean)
+ifneq ($(MAKECMDGOALS),clean)
+-include $(subst .cpp,.d,$(SOURCES))
+endif
+endif
+
+%.d: %.cpp
+       @$(CC) -MM $(CXXFLAGS) $< > $@.$$$$; \
+       sed 's,\($*\).o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
+       rm -f $@.$$$$
diff --git a/tests/main.cpp b/tests/main.cpp
new file mode 100644 (file)
index 0000000..f561cb1
--- /dev/null
@@ -0,0 +1,22 @@
+#include <tut/tut.hpp>
+#include <tut_reporter.h>
+#include <iostream>
+
+using std::exception;
+using std::cerr;
+using std::endl;
+
+namespace tut
+{
+    test_runner_singleton runner;
+}
+
+int main()
+{
+    tut::reporter reporter;
+    tut::runner.get().set_callback(&reporter);
+
+    tut::runner.get().run_tests();
+
+    return !reporter.all_ok();
+}
diff --git a/tests/raw_ip_packet_old.h b/tests/raw_ip_packet_old.h
new file mode 100644 (file)
index 0000000..60af8ac
--- /dev/null
@@ -0,0 +1,146 @@
+#ifndef RAW_IP_PACKET_OLD_H
+#define RAW_IP_PACKET_OLD_H
+
+#include <netinet/in.h> // for htons
+//#include <netinet/ip.h> // for struct ip
+
+#include <cstring>
+
+#include "stg_const.h"
+
+#define IPv4 (2)
+
+enum { pcktSizeOLD = 68 }; //60(max) ip + 8 udp or tcp (part of tcp or udp header to ports)
+//-----------------------------------------------------------------------------
+struct RAW_PACKET_OLD
+{
+    RAW_PACKET_OLD()
+        : dataLen(-1)
+    {
+    memset(pckt, 0, pcktSizeOLD);
+    }
+
+    RAW_PACKET_OLD(const RAW_PACKET_OLD & rp)
+        : dataLen(rp.dataLen)
+    {
+    memcpy(pckt, rp.pckt, pcktSizeOLD);
+    }
+
+uint16_t    GetIPVersion() const;
+uint8_t     GetHeaderLen() const;
+uint8_t     GetProto() const;
+uint32_t    GetLen() const;
+uint32_t    GetSrcIP() const;
+uint32_t    GetDstIP() const;
+uint16_t    GetSrcPort() const;
+uint16_t    GetDstPort() const;
+
+uint8_t     pckt[pcktSizeOLD];         // îÁÞÁÌÏ ÐÁËÅÔÁ ÚÁÈ×ÁÞÅÎÎÏÇÏ ÉÚ ÓÅÔÉ
+int32_t     dataLen;                // äÌÉÎÁ IP ÐÁËÅÔÁ. åÓÌÉ -1, ÔÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÄÌÉÎÕ ÉÚ ÚÁÇÏÌÏ×ËÁ ÓÁÍÏÇÏ ÐÁËÅÔÁ.
+};
+//-----------------------------------------------------------------------------
+inline uint16_t RAW_PACKET_OLD::GetIPVersion() const
+{
+return pckt[0] >> 4;
+}
+//-----------------------------------------------------------------------------
+inline uint8_t RAW_PACKET_OLD::GetHeaderLen() const
+{
+return (pckt[0] & 0x0F) * 4;
+}
+//-----------------------------------------------------------------------------
+inline uint8_t RAW_PACKET_OLD::GetProto() const
+{
+return pckt[9];
+}
+//-----------------------------------------------------------------------------
+inline uint32_t RAW_PACKET_OLD::GetLen() const
+{
+if (dataLen != -1)
+    return dataLen;
+return ntohs(*(uint16_t*)(pckt + 2));
+}
+//-----------------------------------------------------------------------------
+inline uint32_t RAW_PACKET_OLD::GetSrcIP() const
+{
+return *(uint32_t*)(pckt + 12);
+}
+//-----------------------------------------------------------------------------
+inline uint32_t RAW_PACKET_OLD::GetDstIP() const
+{
+return *(uint32_t*)(pckt + 16);
+}
+//-----------------------------------------------------------------------------
+inline uint16_t RAW_PACKET_OLD::GetSrcPort() const
+{
+if (GetProto() == 1) // for icmp proto return port 0
+    return 0;
+return ntohs(*((uint16_t*)(pckt + GetHeaderLen())));
+}
+//-----------------------------------------------------------------------------
+inline uint16_t RAW_PACKET_OLD::GetDstPort() const
+{
+if (GetProto() == 1) // for icmp proto return port 0
+    return 0;
+return ntohs(*((uint16_t*)(pckt + GetHeaderLen() + 2)));
+}
+//-----------------------------------------------------------------------------
+inline bool operator==(const RAW_PACKET_OLD & lhs, const RAW_PACKET_OLD & rhs) 
+{
+if (lhs.GetSrcIP() != rhs.GetSrcIP())
+    return false;
+
+if (lhs.GetDstIP() != rhs.GetDstIP())
+    return false;
+
+if (lhs.GetSrcPort() != rhs.GetSrcPort())
+    return false;
+
+if (lhs.GetDstPort() != rhs.GetDstPort())
+    return false;
+
+if (lhs.GetProto() != rhs.GetProto())
+    return false;
+
+return true;
+}
+//-----------------------------------------------------------------------------
+inline bool operator<(const RAW_PACKET_OLD & lhs, const RAW_PACKET_OLD & rhs)
+{
+if (lhs.GetSrcIP() < rhs.GetSrcIP()) 
+    return true;
+if (lhs.GetSrcIP() > rhs.GetSrcIP()) 
+    return false;
+
+if (lhs.GetDstIP() < rhs.GetDstIP()) 
+    return true;
+if (lhs.GetDstIP() > rhs.GetDstIP()) 
+    return false;
+
+if (lhs.GetSrcPort() < rhs.GetSrcPort()) 
+    return true;
+if (lhs.GetSrcPort() > rhs.GetSrcPort()) 
+    return false;
+
+if (lhs.GetDstPort() < rhs.GetDstPort()) 
+    return true;
+if (lhs.GetDstPort() > rhs.GetDstPort()) 
+    return false;
+
+if (lhs.GetProto() < rhs.GetProto()) 
+    return true;
+
+/*
+Last compare
+
+if (lhs.GetProto() > rhs.GetProto())
+    return false;
+
+don't needed
+*/
+
+return false;
+}
+//-----------------------------------------------------------------------------
+
+#endif
diff --git a/tests/test_admin_conf.cpp b/tests/test_admin_conf.cpp
new file mode 100644 (file)
index 0000000..51913d5
--- /dev/null
@@ -0,0 +1,222 @@
+#include <iostream>
+
+#include <tut/tut.hpp>
+
+#include "admin_conf.h"
+
+namespace tut
+{
+    struct priv_data {
+        enum {
+            MIX2 = 0x06C6, // 2103210
+            ONES = 0x1555,
+            MIX3 = 0x1B1B, // 3210321
+            TWOS = 0x2AAA,
+            MIX1 = 0x24E4, // 0123012
+            THREES = 0x3FFF
+        };
+    };
+
+    typedef test_group<priv_data> tg;
+    tg priv_test_group("PRIV tests group");
+
+    typedef tg::object testobject;
+
+    template<>
+    template<>
+    void testobject::test<1>()
+    {
+        set_test_name("Check default constructor");
+
+        PRIV zero;
+
+        ensure("zero.userStat == 0", zero.userStat == 0);
+        ensure("zero.userConf == 0", zero.userConf == 0);
+        ensure("zero.userCash == 0", zero.userCash == 0);
+        ensure("zero.userPasswd == 0", zero.userPasswd == 0);
+        ensure("zero.userAddDel == 0", zero.userAddDel == 0);
+        ensure("zero.adminChg == 0", zero.adminChg == 0);
+        ensure("zero.tariffChg == 0", zero.tariffChg == 0);
+
+        ensure("zero.ToInt() == 0", zero.ToInt() == 0);
+    }
+
+    template<>
+    template<>
+    void testobject::test<2>()
+    {
+        set_test_name("Check uint16_t conversions");
+
+        for (uint16_t i = 0; i < 4; ++i) {
+
+            // 'i' is extra trash in high bits
+
+            PRIV priv1(ONES | (i << 0x0E)); // All 1
+
+            ensure_equals("priv1.userStat == 1", priv1.userStat, 1);
+            ensure_equals("priv1.userConf == 1", priv1.userConf, 1);
+            ensure_equals("priv1.userCash == 1", priv1.userCash, 1);
+            ensure_equals("priv1.userPasswd == 1", priv1.userPasswd, 1);
+            ensure_equals("priv1.userAddDel == 1", priv1.userAddDel, 1);
+            ensure_equals("priv1.adminChg == 1", priv1.adminChg, 1);
+            ensure_equals("priv1.tariffChg == 1", priv1.tariffChg, 1);
+
+            ensure_equals("priv1.ToInt() == 0x1555", priv1.ToInt(), static_cast<uint16_t>(ONES));
+
+            PRIV priv2(TWOS | (i << 0x0E)); // All 2
+
+            ensure_equals("priv2.userStat == 2", priv2.userStat, 2);
+            ensure_equals("priv2.userConf == 2", priv2.userConf, 2);
+            ensure_equals("priv2.userCash == 2", priv2.userCash, 2);
+            ensure_equals("priv2.userPasswd == 2", priv2.userPasswd, 2);
+            ensure_equals("priv2.userAddDel == 2", priv2.userAddDel, 2);
+            ensure_equals("priv2.adminChg == 2", priv2.adminChg, 2);
+            ensure_equals("priv2.tariffChg == 2", priv2.tariffChg, 2);
+
+            ensure_equals("priv2.ToInt() = 0x2AAA", priv2.ToInt(), static_cast<uint16_t>(TWOS));
+
+            PRIV priv3(THREES | (i << 0x0E)); // All 3
+
+            ensure_equals("priv3.userStat == 3", priv3.userStat, 3);
+            ensure_equals("priv3.userConf == 3", priv3.userConf, 3);
+            ensure_equals("priv3.userCash == 3", priv3.userCash, 3);
+            ensure_equals("priv3.userPasswd == 3", priv3.userPasswd, 3);
+            ensure_equals("priv3.userAddDel == 3", priv3.userAddDel, 3);
+            ensure_equals("priv3.adminChg == 3", priv3.adminChg, 3);
+            ensure_equals("priv3.tariffChg == 3", priv3.tariffChg, 3);
+
+            ensure_equals("priv2.ToInt() = 0x3FFF", priv3.ToInt(), static_cast<uint16_t>(THREES));
+
+            PRIV pm1(MIX1 | (i << 0x0E)); // 0123012
+
+            ensure_equals("pm1.userStat == 0", pm1.userStat, 0);
+            ensure_equals("pm1.userConf == 1", pm1.userConf, 1);
+            ensure_equals("pm1.userCash == 2", pm1.userCash, 2);
+            ensure_equals("pm1.userPasswd == 3", pm1.userPasswd, 3);
+            ensure_equals("pm1.userAddDel == 0", pm1.userAddDel, 0);
+            ensure_equals("pm1.adminChg == 1", pm1.adminChg, 1);
+            ensure_equals("pm1.tariffChg == 2", pm1.tariffChg, 2);
+
+            ensure_equals("pm1.ToInt() = 0x24E4", pm1.ToInt(), static_cast<uint16_t>(MIX1));
+
+            PRIV pm2(MIX2 | (i << 0x0E)); // 0123012
+
+            ensure_equals("pm2.userStat == 2", pm2.userStat, 2);
+            ensure_equals("pm2.userConf == 1", pm2.userConf, 1);
+            ensure_equals("pm2.userCash == 0", pm2.userCash, 0);
+            ensure_equals("pm2.userPasswd == 3", pm2.userPasswd, 3);
+            ensure_equals("pm2.userAddDel == 2", pm2.userAddDel, 2);
+            ensure_equals("pm2.adminChg == 1", pm2.adminChg, 1);
+            ensure_equals("pm2.tariffChg == 0", pm2.tariffChg, 0);
+
+            ensure_equals("pm2.ToInt() = 0x06C6", pm2.ToInt(), static_cast<uint16_t>(MIX2));
+
+            PRIV pm3(MIX3 | (i << 0x0E)); // 3210321
+
+            ensure_equals("pm3.userStat == 3", pm3.userStat, 3);
+            ensure_equals("pm3.userConf == 2", pm3.userConf, 2);
+            ensure_equals("pm3.userCash == 1", pm3.userCash, 1);
+            ensure_equals("pm3.userPasswd == 0", pm3.userPasswd, 0);
+            ensure_equals("pm3.userAddDel == 3", pm3.userAddDel, 3);
+            ensure_equals("pm3.adminChg == 2", pm3.adminChg, 2);
+            ensure_equals("pm3.tariffChg == 1", pm3.tariffChg, 1);
+
+            ensure_equals("pm3.ToInt() = 0x1B1B", pm3.ToInt(), static_cast<uint16_t>(MIX3));
+
+        }
+
+    }
+
+    template<>
+    template<>
+    void testobject::test<3>()
+    {
+        set_test_name("Check explicit uint16_t conversions");
+
+        for (uint16_t i = 0; i < 4; ++i) {
+
+            // 'i' is extra trash in high bits
+
+            PRIV priv1;
+            priv1.FromInt(ONES | (i << 0x0E)); // All 1
+
+            ensure_equals("priv1.userStat == 1", priv1.userStat, 1);
+            ensure_equals("priv1.userConf == 1", priv1.userConf, 1);
+            ensure_equals("priv1.userCash == 1", priv1.userCash, 1);
+            ensure_equals("priv1.userPasswd == 1", priv1.userPasswd, 1);
+            ensure_equals("priv1.userAddDel == 1", priv1.userAddDel, 1);
+            ensure_equals("priv1.adminChg == 1", priv1.adminChg, 1);
+            ensure_equals("priv1.tariffChg == 1", priv1.tariffChg, 1);
+
+            ensure_equals("priv1.ToInt() == 0x1555", priv1.ToInt(), static_cast<uint16_t>(ONES));
+
+            PRIV priv2;
+            priv2.FromInt(TWOS | (i << 0x0E)); // All 2
+
+            ensure_equals("priv2.userStat == 2", priv2.userStat, 2);
+            ensure_equals("priv2.userConf == 2", priv2.userConf, 2);
+            ensure_equals("priv2.userCash == 2", priv2.userCash, 2);
+            ensure_equals("priv2.userPasswd == 2", priv2.userPasswd, 2);
+            ensure_equals("priv2.userAddDel == 2", priv2.userAddDel, 2);
+            ensure_equals("priv2.adminChg == 2", priv2.adminChg, 2);
+            ensure_equals("priv2.tariffChg == 2", priv2.tariffChg, 2);
+
+            ensure_equals("priv2.ToInt() = 0x2AAA", priv2.ToInt(), static_cast<uint16_t>(TWOS));
+
+            PRIV priv3;
+            priv3.FromInt(THREES | (i << 0x0E)); // All 3
+
+            ensure_equals("priv3.userStat == 3", priv3.userStat, 3);
+            ensure_equals("priv3.userConf == 3", priv3.userConf, 3);
+            ensure_equals("priv3.userCash == 3", priv3.userCash, 3);
+            ensure_equals("priv3.userPasswd == 3", priv3.userPasswd, 3);
+            ensure_equals("priv3.userAddDel == 3", priv3.userAddDel, 3);
+            ensure_equals("priv3.adminChg == 3", priv3.adminChg, 3);
+            ensure_equals("priv3.tariffChg == 3", priv3.tariffChg, 3);
+
+            ensure_equals("priv2.ToInt() = 0x3FFF", priv3.ToInt(), static_cast<uint16_t>(THREES));
+
+            PRIV pm1;
+            pm1.FromInt(MIX1 | (i << 0x0E)); // 0123012
+
+            ensure_equals("pm1.userStat == 0", pm1.userStat, 0);
+            ensure_equals("pm1.userConf == 1", pm1.userConf, 1);
+            ensure_equals("pm1.userCash == 2", pm1.userCash, 2);
+            ensure_equals("pm1.userPasswd == 3", pm1.userPasswd, 3);
+            ensure_equals("pm1.userAddDel == 0", pm1.userAddDel, 0);
+            ensure_equals("pm1.adminChg == 1", pm1.adminChg, 1);
+            ensure_equals("pm1.tariffChg == 2", pm1.tariffChg, 2);
+
+            ensure_equals("pm1.ToInt() = 0x24E4", pm1.ToInt(), static_cast<uint16_t>(MIX1));
+
+            PRIV pm2;
+            pm2.FromInt(MIX2 | (i << 0x0E)); // 0123012
+
+            ensure_equals("pm2.userStat == 2", pm2.userStat, 2);
+            ensure_equals("pm2.userConf == 1", pm2.userConf, 1);
+            ensure_equals("pm2.userCash == 0", pm2.userCash, 0);
+            ensure_equals("pm2.userPasswd == 3", pm2.userPasswd, 3);
+            ensure_equals("pm2.userAddDel == 2", pm2.userAddDel, 2);
+            ensure_equals("pm2.adminChg == 1", pm2.adminChg, 1);
+            ensure_equals("pm2.tariffChg == 0", pm2.tariffChg, 0);
+
+            ensure_equals("pm2.ToInt() = 0x06C6", pm2.ToInt(), static_cast<uint16_t>(MIX2));
+
+            PRIV pm3;
+            pm3.FromInt(MIX3 | (i << 0x0E)); // 3210321
+
+            ensure_equals("pm3.userStat == 3", pm3.userStat, 3);
+            ensure_equals("pm3.userConf == 2", pm3.userConf, 2);
+            ensure_equals("pm3.userCash == 1", pm3.userCash, 1);
+            ensure_equals("pm3.userPasswd == 0", pm3.userPasswd, 0);
+            ensure_equals("pm3.userAddDel == 3", pm3.userAddDel, 3);
+            ensure_equals("pm3.adminChg == 2", pm3.adminChg, 2);
+            ensure_equals("pm3.tariffChg == 1", pm3.tariffChg, 1);
+
+            ensure_equals("pm3.ToInt() = 0x1B1B", pm3.ToInt(), static_cast<uint16_t>(MIX3));
+
+        }
+
+    }
+
+}
diff --git a/tests/test_raw_ip.cpp b/tests/test_raw_ip.cpp
new file mode 100644 (file)
index 0000000..6e14768
--- /dev/null
@@ -0,0 +1,110 @@
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <cstdlib>
+#include <ctime>
+#include <iostream>
+
+#include <tut/tut.hpp>
+
+#include "raw_ip_packet_old.h"
+#include "raw_ip_packet.h"
+
+#ifndef ITERATIONS
+#define ITERATIONS 1000
+#endif
+
+void genVector(uint8_t * buf);
+
+std::ostream & operator<<(std::ostream & stream, const RAW_PACKET & p);
+
+namespace tut
+{
+    struct rp_data {
+    };
+
+    typedef test_group<rp_data> tg;
+    tg rp_test_group("RAW_PACKET tests group");
+
+    typedef tg::object testobject;
+
+    template<>
+    template<>
+    void testobject::test<1>()
+    {
+        set_test_name("Check structure consistency");
+
+        RAW_PACKET rp;
+        rp.ipHeader.ip_v = 4;
+        rp.ipHeader.ip_hl = 5;
+        rp.ipHeader.ip_tos = 0;
+        rp.ipHeader.ip_len = htons(40); // 20 of header + 20 of data
+        rp.ipHeader.ip_p = 6;
+        rp.ipHeader.ip_src.s_addr = inet_addr("192.168.0.1");
+        rp.ipHeader.ip_dst.s_addr = inet_addr("192.168.0.101");
+        rp.sPort = htons(80);
+        rp.dPort = htons(38546);
+
+        ensure_equals("IP header size (explicitly)", sizeof(rp.ipHeader), 20);
+        ensure_equals("IP version", rp.GetIPVersion(), 4);
+        ensure_equals("IP header size (with options)", rp.GetHeaderLen(), 20);
+        ensure_equals("Underlying protocol version", rp.GetProto(), 6);
+        ensure_equals("Packet length", rp.GetLen(), 40);
+        ensure_equals("Source IP address", rp.GetSrcIP(), inet_addr("192.168.0.1"));
+        ensure_equals("Destination IP address", rp.GetDstIP(), inet_addr("192.168.0.101"));
+        ensure_equals("Source port number", rp.GetSrcPort(), 80);
+        ensure_equals("Destination port number", rp.GetDstPort(), 38546);
+    }
+
+    template<>
+    template<>
+    void testobject::test<2>()
+    {
+        srand(time(NULL));
+        for (size_t i = 0; i < ITERATIONS; ++i) {
+            RAW_PACKET_OLD p1;
+            RAW_PACKET p2;
+            RAW_PACKET p3;
+
+            uint8_t buf[68];
+            genVector(buf);
+
+            memcpy(p1.pckt, buf, 68);
+            memcpy(p2.pckt, buf, 68);
+            memcpy(p3.pckt, buf, 68);
+
+            ensure_equals("IP versions", p1.GetIPVersion(), p2.GetIPVersion());
+            ensure_equals("IP headers length", p1.GetHeaderLen(), p2.GetHeaderLen());
+            ensure_equals("Protocols", p1.GetProto(), p2.GetProto());
+            ensure_equals("Source IPs", p1.GetSrcIP(), p2.GetSrcIP());
+            ensure_equals("Destination IPs", p1.GetDstIP(), p2.GetDstIP());
+            ensure_equals("Source ports", p1.GetSrcPort(), p2.GetSrcPort());
+            ensure_equals("Destination ports", p1.GetDstPort(), p2.GetDstPort());
+
+            ensure_equals("Self equallity", p2, p3);
+            ensure_equals("Reverse self equallity", p3, p2);
+        }
+    }
+}
+
+inline
+void genVector(uint8_t * buf)
+{
+    for (size_t i = 0; i < 68; ++i) {
+        buf[i] = rand() % 256;
+    }
+    buf[0] = (buf[0] & 0xF0) | 0x05; // Fix header length
+}
+
+std::ostream & operator<<(std::ostream & stream, const RAW_PACKET & p)
+{
+    stream.unsetf(std::ios::dec);
+    stream.setf(std::ios::hex);
+    for (size_t i = 0; i < sizeof(p.pckt); ++i) {
+        stream << static_cast<unsigned>(p.pckt[i]);
+    }
+    stream.unsetf(std::ios::hex);
+    stream.setf(std::ios::dec);
+    return stream;
+}
diff --git a/tests/test_tariff.cpp b/tests/test_tariff.cpp
new file mode 100644 (file)
index 0000000..8e4a25a
--- /dev/null
@@ -0,0 +1,347 @@
+#include <tut/tut.hpp>
+
+#include "tariff_conf.h"
+#include "tariff.h"
+
+namespace tut
+{
+    struct tariff_data {
+    };
+
+    typedef test_group<tariff_data> tg;
+    tg tariff_test_group("TARIFF tests group");
+
+    typedef tg::object testobject;
+
+    template<>
+    template<>
+    void testobject::test<1>()
+    {
+        set_test_name("Check construction");
+
+        TARIFF_DATA td("test");
+        td.tariffConf.fee = 1;
+        td.tariffConf.free = 2;
+        td.tariffConf.traffType = TRAFF_UP_DOWN;
+        td.tariffConf.passiveCost = 4;
+        td.dirPrice[0].mDay = 30;
+        td.dirPrice[0].hDay = 9;
+        td.dirPrice[0].mNight = 30;
+        td.dirPrice[0].hNight = 21;
+        td.dirPrice[0].priceDayA = 0;
+        td.dirPrice[0].priceDayB = 1;
+        td.dirPrice[0].priceNightA = 2;
+        td.dirPrice[0].priceNightB = 3;
+        td.dirPrice[0].threshold = 4;
+        td.dirPrice[0].singlePrice = 0;
+        td.dirPrice[0].noDiscount = 0;
+        TARIFF tariff(td);
+
+        ensure("freeMb = 2", tariff.GetFreeMb() == td.tariffConf.free);
+        ensure("passiveCost = 4", tariff.GetPassiveCost() == td.tariffConf.passiveCost);
+        ensure("fee = 1", tariff.GetFee() == td.tariffConf.fee);
+        ensure("free (alias of freeMb) = 2", tariff.GetFree() == td.tariffConf.free);
+        ensure("name = \"test\"'", tariff.GetName() == td.tariffConf.name);
+        ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == td.tariffConf.traffType);
+        ensure("threshold[0] = 4", tariff.GetThreshold(0) == td.dirPrice[0].threshold);
+        ensure_equals("traffByType(6, 0) = 6", tariff.GetTraffByType(6, 0), 6);
+        ensure_equals("traffByType(5, 1) = 6", tariff.GetTraffByType(5, 1), 6);
+        ensure_equals("traffByType(4, 2) = 6", tariff.GetTraffByType(4, 2), 6);
+        ensure_equals("traffByType(3, 3) = 6", tariff.GetTraffByType(3, 3), 6);
+        ensure_equals("traffByType(2, 4) = 6", tariff.GetTraffByType(2, 4), 6);
+        ensure_equals("traffByType(1, 5) = 6", tariff.GetTraffByType(1, 5), 6);
+        ensure_equals("traffByType(0, 6) = 6", tariff.GetTraffByType(0, 6), 6);
+    }
+
+    template<>
+    template<>
+    void testobject::test<2>()
+    {
+        set_test_name("Check traff types");
+
+        TARIFF_DATA td("test");
+        td.tariffConf.fee = 1;
+        td.tariffConf.free = 2;
+        td.tariffConf.traffType = TRAFF_UP;
+        td.tariffConf.passiveCost = 4;
+        td.dirPrice[0].mDay = 30;
+        td.dirPrice[0].hDay = 9;
+        td.dirPrice[0].mNight = 30;
+        td.dirPrice[0].hNight = 21;
+        td.dirPrice[0].priceDayA = 0;
+        td.dirPrice[0].priceDayB = 1;
+        td.dirPrice[0].priceNightA = 2;
+        td.dirPrice[0].priceNightB = 3;
+        td.dirPrice[0].threshold = 4;
+        td.dirPrice[0].singlePrice = 0;
+        td.dirPrice[0].noDiscount = 0;
+        TARIFF tariff(td);
+
+        ensure("traffType = TRAFF_UP", tariff.GetTraffType() == TRAFF_UP);
+        ensure_equals("traffByType(6, 0) = 6 for UP", tariff.GetTraffByType(6, 0), 6);
+        ensure_equals("traffByType(5, 1) = 5 for UP", tariff.GetTraffByType(5, 1), 5);
+        ensure_equals("traffByType(4, 2) = 4 for UP", tariff.GetTraffByType(4, 2), 4);
+        ensure_equals("traffByType(3, 3) = 3 for UP", tariff.GetTraffByType(3, 3), 3);
+        ensure_equals("traffByType(2, 4) = 2 for UP", tariff.GetTraffByType(2, 4), 2);
+        ensure_equals("traffByType(1, 5) = 1 for UP", tariff.GetTraffByType(1, 5), 1);
+        ensure_equals("traffByType(0, 6) = 0 for UP", tariff.GetTraffByType(0, 6), 0);
+
+        td.tariffConf.traffType = TRAFF_DOWN;
+        tariff = td;
+
+        ensure("traffType = TRAFF_DOWN", tariff.GetTraffType() == TRAFF_DOWN);
+        ensure_equals("traffByType(6, 0) = 0 for DOWN", tariff.GetTraffByType(6, 0), 0);
+        ensure_equals("traffByType(5, 1) = 1 for DOWN", tariff.GetTraffByType(5, 1), 1);
+        ensure_equals("traffByType(4, 2) = 2 for DOWN", tariff.GetTraffByType(4, 2), 2);
+        ensure_equals("traffByType(3, 3) = 3 for DOWN", tariff.GetTraffByType(3, 3), 3);
+        ensure_equals("traffByType(2, 4) = 4 for DOWN", tariff.GetTraffByType(2, 4), 4);
+        ensure_equals("traffByType(1, 5) = 5 for DOWN", tariff.GetTraffByType(1, 5), 5);
+        ensure_equals("traffByType(0, 6) = 6 for DOWN", tariff.GetTraffByType(0, 6), 6);
+
+        td.tariffConf.traffType = TRAFF_MAX;
+        tariff = td;
+
+        ensure("traffType = TRAFF_MAX", tariff.GetTraffType() == TRAFF_MAX);
+        ensure_equals("traffByType(6, 0) = 6 for MAX", tariff.GetTraffByType(6, 0), 6);
+        ensure_equals("traffByType(5, 1) = 5 for MAX", tariff.GetTraffByType(5, 1), 5);
+        ensure_equals("traffByType(4, 2) = 4 for MAX", tariff.GetTraffByType(4, 2), 4);
+        ensure_equals("traffByType(3, 3) = 3 for MAX", tariff.GetTraffByType(3, 3), 3);
+        ensure_equals("traffByType(2, 4) = 4 for MAX", tariff.GetTraffByType(2, 4), 4);
+        ensure_equals("traffByType(1, 5) = 5 for MAX", tariff.GetTraffByType(1, 5), 5);
+        ensure_equals("traffByType(0, 6) = 6 for MAX", tariff.GetTraffByType(0, 6), 6);
+
+        td.tariffConf.traffType = TRAFF_UP_DOWN;
+        tariff = td;
+
+        ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == TRAFF_UP_DOWN);
+        ensure_equals("traffByType(6, 0) = 6 for UP_DOWN", tariff.GetTraffByType(6, 0), 6);
+        ensure_equals("traffByType(5, 1) = 6 for UP_DOWN", tariff.GetTraffByType(5, 1), 6);
+        ensure_equals("traffByType(4, 2) = 6 for UP_DOWN", tariff.GetTraffByType(4, 2), 6);
+        ensure_equals("traffByType(3, 3) = 6 for UP_DOWN", tariff.GetTraffByType(3, 3), 6);
+        ensure_equals("traffByType(2, 4) = 6 for UP_DOWN", tariff.GetTraffByType(2, 4), 6);
+        ensure_equals("traffByType(1, 5) = 6 for UP_DOWN", tariff.GetTraffByType(1, 5), 6);
+        ensure_equals("traffByType(0, 6) = 6 for UP_DOWN", tariff.GetTraffByType(0, 6), 6);
+    }
+
+    template<>
+    template<>
+    void testobject::test<3>()
+    {
+        set_test_name("Check normal interval prices");
+
+        TARIFF_DATA td("test");
+        td.tariffConf.fee = 1;
+        td.tariffConf.free = 2;
+        td.tariffConf.traffType = TRAFF_UP_DOWN;
+        td.tariffConf.passiveCost = 4;
+        td.dirPrice[0].mDay = 30;
+        td.dirPrice[0].hDay = 9;
+        td.dirPrice[0].mNight = 30;
+        td.dirPrice[0].hNight = 21;
+        td.dirPrice[0].priceDayA = 0;
+        td.dirPrice[0].priceDayB = 1;
+        td.dirPrice[0].priceNightA = 2;
+        td.dirPrice[0].priceNightB = 3;
+        td.dirPrice[0].threshold = 4;
+        td.dirPrice[0].singlePrice = 0;
+        td.dirPrice[0].noDiscount = 0;
+        TARIFF tariff(td);
+
+        ensure_equals("0000 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
+        ensure_equals("0001 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 1); // Near 17:30, 6 > 4 DB
+        ensure_equals("0010 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 2); // Near 22:30, 0 < 4 NA
+        ensure_equals("0011 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 3); // Near 22:30, 6 > 4 NB
+
+        td.dirPrice[0].singlePrice = 1;
+        tariff = td;
+
+        ensure_equals("0100 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
+        ensure_equals("0101 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 1); // Near 17:30, 6 > 4 DB
+        ensure_equals("0110 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
+        ensure_equals("0111 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 1); // Near 22:30, 6 > 4 DB
+
+        td.dirPrice[0].singlePrice = 0;
+        td.dirPrice[0].noDiscount = 1;
+        tariff = td;
+
+        ensure_equals("1000 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
+        ensure_equals("1001 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 6 > 4 DA
+        ensure_equals("1010 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 2); // Near 22:30, 0 < 4 NA
+        ensure_equals("1011 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 2); // Near 22:30, 6 > 4 NA
+
+        td.dirPrice[0].singlePrice = 1;
+        td.dirPrice[0].noDiscount = 1;
+        tariff = td;
+
+        ensure_equals("1100 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
+        ensure_equals("1101 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 6 > 4 DA
+        ensure_equals("1110 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
+        ensure_equals("1111 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 6 > 4 DA
+    }
+
+    template<>
+    template<>
+    void testobject::test<4>()
+    {
+        set_test_name("Check construction for day-night inversion");
+
+        TARIFF_DATA td("test");
+        td.tariffConf.fee = 1;
+        td.tariffConf.free = 2;
+        td.tariffConf.traffType = TRAFF_UP_DOWN;
+        td.tariffConf.passiveCost = 4;
+        td.dirPrice[0].mDay = 30;
+        td.dirPrice[0].hDay = 21;
+        td.dirPrice[0].mNight = 30;
+        td.dirPrice[0].hNight = 9;
+        td.dirPrice[0].priceDayA = 0;
+        td.dirPrice[0].priceDayB = 1;
+        td.dirPrice[0].priceNightA = 2;
+        td.dirPrice[0].priceNightB = 3;
+        td.dirPrice[0].threshold = 4;
+        td.dirPrice[0].singlePrice = 0;
+        td.dirPrice[0].noDiscount = 0;
+        TARIFF tariff(td);
+
+        ensure("freeMb = 2", tariff.GetFreeMb() == td.tariffConf.free);
+        ensure("passiveCost = 4", tariff.GetPassiveCost() == td.tariffConf.passiveCost);
+        ensure("fee = 1", tariff.GetFee() == td.tariffConf.fee);
+        ensure("free (alias of freeMb) = 2", tariff.GetFree() == td.tariffConf.free);
+        ensure("name = \"test\"'", tariff.GetName() == td.tariffConf.name);
+        ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == td.tariffConf.traffType);
+        ensure("threshold[0] = 4", tariff.GetThreshold(0) == td.dirPrice[0].threshold);
+        ensure_equals("traffByType(6, 0) = 6", tariff.GetTraffByType(6, 0), 6);
+        ensure_equals("traffByType(5, 1) = 6", tariff.GetTraffByType(5, 1), 6);
+        ensure_equals("traffByType(4, 2) = 6", tariff.GetTraffByType(4, 2), 6);
+        ensure_equals("traffByType(3, 3) = 6", tariff.GetTraffByType(3, 3), 6);
+        ensure_equals("traffByType(2, 4) = 6", tariff.GetTraffByType(2, 4), 6);
+        ensure_equals("traffByType(1, 5) = 6", tariff.GetTraffByType(1, 5), 6);
+        ensure_equals("traffByType(0, 6) = 6", tariff.GetTraffByType(0, 6), 6);
+    }
+
+    template<>
+    template<>
+    void testobject::test<5>()
+    {
+        set_test_name("Check traff types for day-night inversion");
+
+        TARIFF_DATA td("test");
+        td.tariffConf.fee = 1;
+        td.tariffConf.free = 2;
+        td.tariffConf.traffType = TRAFF_UP;
+        td.tariffConf.passiveCost = 4;
+        td.dirPrice[0].mDay = 30;
+        td.dirPrice[0].hDay = 21;
+        td.dirPrice[0].mNight = 30;
+        td.dirPrice[0].hNight = 9;
+        td.dirPrice[0].priceDayA = 0;
+        td.dirPrice[0].priceDayB = 1;
+        td.dirPrice[0].priceNightA = 2;
+        td.dirPrice[0].priceNightB = 3;
+        td.dirPrice[0].threshold = 4;
+        td.dirPrice[0].singlePrice = 0;
+        td.dirPrice[0].noDiscount = 0;
+        TARIFF tariff(td);
+
+        ensure("traffType = TRAFF_UP", tariff.GetTraffType() == TRAFF_UP);
+        ensure_equals("traffByType(6, 0) = 6 for UP", tariff.GetTraffByType(6, 0), 6);
+        ensure_equals("traffByType(5, 1) = 5 for UP", tariff.GetTraffByType(5, 1), 5);
+        ensure_equals("traffByType(4, 2) = 4 for UP", tariff.GetTraffByType(4, 2), 4);
+        ensure_equals("traffByType(3, 3) = 3 for UP", tariff.GetTraffByType(3, 3), 3);
+        ensure_equals("traffByType(2, 4) = 2 for UP", tariff.GetTraffByType(2, 4), 2);
+        ensure_equals("traffByType(1, 5) = 1 for UP", tariff.GetTraffByType(1, 5), 1);
+        ensure_equals("traffByType(0, 6) = 0 for UP", tariff.GetTraffByType(0, 6), 0);
+
+        td.tariffConf.traffType = TRAFF_DOWN;
+        tariff = td;
+
+        ensure("traffType = TRAFF_DOWN", tariff.GetTraffType() == TRAFF_DOWN);
+        ensure_equals("traffByType(6, 0) = 0 for DOWN", tariff.GetTraffByType(6, 0), 0);
+        ensure_equals("traffByType(5, 1) = 1 for DOWN", tariff.GetTraffByType(5, 1), 1);
+        ensure_equals("traffByType(4, 2) = 2 for DOWN", tariff.GetTraffByType(4, 2), 2);
+        ensure_equals("traffByType(3, 3) = 3 for DOWN", tariff.GetTraffByType(3, 3), 3);
+        ensure_equals("traffByType(2, 4) = 4 for DOWN", tariff.GetTraffByType(2, 4), 4);
+        ensure_equals("traffByType(1, 5) = 5 for DOWN", tariff.GetTraffByType(1, 5), 5);
+        ensure_equals("traffByType(0, 6) = 6 for DOWN", tariff.GetTraffByType(0, 6), 6);
+
+        td.tariffConf.traffType = TRAFF_MAX;
+        tariff = td;
+
+        ensure("traffType = TRAFF_MAX", tariff.GetTraffType() == TRAFF_MAX);
+        ensure_equals("traffByType(6, 0) = 6 for MAX", tariff.GetTraffByType(6, 0), 6);
+        ensure_equals("traffByType(5, 1) = 5 for MAX", tariff.GetTraffByType(5, 1), 5);
+        ensure_equals("traffByType(4, 2) = 4 for MAX", tariff.GetTraffByType(4, 2), 4);
+        ensure_equals("traffByType(3, 3) = 3 for MAX", tariff.GetTraffByType(3, 3), 3);
+        ensure_equals("traffByType(2, 4) = 4 for MAX", tariff.GetTraffByType(2, 4), 4);
+        ensure_equals("traffByType(1, 5) = 5 for MAX", tariff.GetTraffByType(1, 5), 5);
+        ensure_equals("traffByType(0, 6) = 6 for MAX", tariff.GetTraffByType(0, 6), 6);
+
+        td.tariffConf.traffType = TRAFF_UP_DOWN;
+        tariff = td;
+
+        ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == TRAFF_UP_DOWN);
+        ensure_equals("traffByType(6, 0) = 6 for UP_DOWN", tariff.GetTraffByType(6, 0), 6);
+        ensure_equals("traffByType(5, 1) = 6 for UP_DOWN", tariff.GetTraffByType(5, 1), 6);
+        ensure_equals("traffByType(4, 2) = 6 for UP_DOWN", tariff.GetTraffByType(4, 2), 6);
+        ensure_equals("traffByType(3, 3) = 6 for UP_DOWN", tariff.GetTraffByType(3, 3), 6);
+        ensure_equals("traffByType(2, 4) = 6 for UP_DOWN", tariff.GetTraffByType(2, 4), 6);
+        ensure_equals("traffByType(1, 5) = 6 for UP_DOWN", tariff.GetTraffByType(1, 5), 6);
+        ensure_equals("traffByType(0, 6) = 6 for UP_DOWN", tariff.GetTraffByType(0, 6), 6);
+    }
+
+    template<>
+    template<>
+    void testobject::test<6>()
+    {
+        set_test_name("Check normal interval prices for day-night inversion");
+
+        TARIFF_DATA td("test");
+        td.tariffConf.fee = 1;
+        td.tariffConf.free = 2;
+        td.tariffConf.traffType = TRAFF_UP_DOWN;
+        td.tariffConf.passiveCost = 4;
+        td.dirPrice[0].mDay = 30;
+        td.dirPrice[0].hDay = 21;
+        td.dirPrice[0].mNight = 30;
+        td.dirPrice[0].hNight = 9;
+        td.dirPrice[0].priceDayA = 0;
+        td.dirPrice[0].priceDayB = 1;
+        td.dirPrice[0].priceNightA = 2;
+        td.dirPrice[0].priceNightB = 3;
+        td.dirPrice[0].threshold = 4;
+        td.dirPrice[0].singlePrice = 0;
+        td.dirPrice[0].noDiscount = 0;
+        TARIFF tariff(td);
+
+        ensure_equals("0000 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 2); // Near 17:30, 0 < 4 NA
+        ensure_equals("0001 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 3); // Near 17:30, 6 > 4 NB
+        ensure_equals("0010 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
+        ensure_equals("0011 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 1); // Near 22:30, 6 > 4 DB
+
+        td.dirPrice[0].singlePrice = 1;
+        tariff = td;
+
+        ensure_equals("0100 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA (ignore night)
+        ensure_equals("0101 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 1); // Near 17:30, 6 > 4 DB (ignore night)
+        ensure_equals("0110 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA (ignore night)
+        ensure_equals("0111 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 1); // Near 22:30, 6 > 4 DB (ignore night)
+
+        td.dirPrice[0].singlePrice = 0;
+        td.dirPrice[0].noDiscount = 1;
+        tariff = td;
+
+        ensure_equals("1000 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 2); // Near 17:30, 0 < 4 NA
+        ensure_equals("1001 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 2); // Near 17:30, 6 > 4 NA
+        ensure_equals("1010 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
+        ensure_equals("1011 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 6 > 4 DA
+
+        td.dirPrice[0].singlePrice = 1;
+        td.dirPrice[0].noDiscount = 1;
+        tariff = td;
+
+        ensure_equals("1100 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA (ignore night)
+        ensure_equals("1101 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 6 > 4 DA (ignore night)
+        ensure_equals("1110 == 0", tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA (ignore night)
+        ensure_equals("1111 == 0", tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 6 > 4 DA (ignore night)
+    }
+}