]> git.stg.codes - stg.git/commitdiff
Convert some tests from TUT to Boost.Test
authorMaksym Mamontov <madf@madf.info>
Wed, 17 Aug 2022 20:40:36 +0000 (23:40 +0300)
committerMaksym Mamontov <madf@madf.info>
Wed, 17 Aug 2022 20:40:36 +0000 (23:40 +0300)
tests/CMakeLists.txt
tests/longstring.h
tests/test_admin_conf.cpp
tests/test_bfstream.cpp
tests/test_crypto.cpp
tests/test_raw_ip.cpp
tests/test_tariff.cpp

index cedaaebd03879514e9032330e4c82032ce06616b..2f9283a80df31693673a2ff0504d8d3c53bc5ea8 100644 (file)
@@ -1,23 +1,41 @@
 set ( CPP_FILES main.cpp
 set ( CPP_FILES main.cpp
-                test_raw_ip.cpp
-                test_admin_conf.cpp
-                test_tariff.cpp
                 test_conffiles.cpp
                 test_fee_charge_rules.cpp
                 test_reconnect_on_tariff_change.cpp
                 test_disable_session_log.cpp
                 test_filter_params_log.cpp
                 test_conffiles.cpp
                 test_fee_charge_rules.cpp
                 test_reconnect_on_tariff_change.cpp
                 test_disable_session_log.cpp
                 test_filter_params_log.cpp
-                test_crypto.cpp
-                test_bfstream.cpp
                 ../projects/stargazer/tariff_impl.cpp
                 ../projects/stargazer/user_impl.cpp
                 ../projects/stargazer/user_property.cpp )
 
 set ( THREADS_PREFER_PTHREAD_FLAG ON )
 find_package ( Threads REQUIRED )
                 ../projects/stargazer/tariff_impl.cpp
                 ../projects/stargazer/user_impl.cpp
                 ../projects/stargazer/user_property.cpp )
 
 set ( THREADS_PREFER_PTHREAD_FLAG ON )
 find_package ( Threads REQUIRED )
+find_package ( Boost REQUIRED unit_test_framework )
 
 
+add_definitions ( -DBOOST_TEST_DYN_LINK )
 add_definitions ( -DUSE_ABSTRACT_SETTINGS )
 
 add_definitions ( -DUSE_ABSTRACT_SETTINGS )
 
+add_executable ( test_admin_conf test_admin_conf.cpp )
+target_link_libraries ( test_admin_conf Boost::unit_test_framework )
+add_test ( admin_conf test_admin_conf )
+
+add_executable ( test_raw_ip test_raw_ip.cpp )
+target_link_libraries ( test_raw_ip Boost::unit_test_framework )
+add_test ( raw_ip test_raw_ip )
+
+add_executable ( test_bfstream test_bfstream.cpp )
+target_link_libraries ( test_bfstream crypto Boost::unit_test_framework )
+add_test ( bfstream test_bfstream )
+
+add_executable ( test_crypto test_crypto.cpp )
+target_link_libraries ( test_crypto crypto Boost::unit_test_framework )
+add_test ( stgcrypto test_crypto )
+
+add_executable ( test_tariff test_tariff.cpp ../projects/stargazer/tariff_impl.cpp )
+target_link_libraries ( test_tariff crypto common Boost::unit_test_framework )
+target_include_directories ( test_tariff PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ../projects/stargazer )
+add_test ( tariff test_tariff )
+
 add_executable ( tests ${CPP_FILES} )
 
 target_link_libraries ( tests conffiles crypto logger scriptexecuter common Threads::Threads )
 add_executable ( tests ${CPP_FILES} )
 
 target_link_libraries ( tests conffiles crypto logger scriptexecuter common Threads::Threads )
index 2f41c371aa48c0bb1caedafb62a147112eb0689a..2926bdef7b811c81e2dbf5980bb7b20f845a8b1c 100644 (file)
@@ -1,6 +1,5 @@
-#ifndef __LONG_STRING_H__
-#define __LONG_STRING_H__
+#pragma once
 
 
-std::string longString = "<GetUsers><User result=\"ok\"><Login value=\"test6\"/><Password value=\"123456\" /><Cash value=\"0.000000\"/><FreeMb value=\"0.000000\"/><Credit value=\"0.000000\"/><Tariff value=\"In.Pi\"/><Note value=\"\"/><Phone value=\"\"/><Address value=\"\"/><Email value=\"\"/><UserData0 value=\"\" /><UserData1 value=\"\" /><UserData2 value=\"\" /><UserData3 value=\"\" /><UserData4 value=\"\" /><UserData5 value=\"\" /><UserData6 value=\"\" /><UserData7 value=\"\" /><UserData8 value=\"\" /><UserData9 value=\"\" /><Name value=\"\"/><Group value=\"\"/><Status value=\"0\"/><AOnline value=\"0\"/><CurrIP value=\"0.0.0.0\"/><IP value=\"192.168.1.5\"/><Traff MU0=\"0\" MU1=\"0\" MU2=\"0\" MU3=\"0\" MU4=\"0\" MU5=\"0\" MU6=\"0\" MU7=\"0\" MU8=\"0\" MU9=\"0\" MD0=\"0\" MD1=\"0\" MD2=\"0\" MD3=\"0\" MD4=\"0\" MD5=\"0\" MD6=\"0\" MD7=\"0\" MD8=\"0\" MD9=\"0\"/><Down value=\"0\"/><DisableDetailStat value=\"0\"/><Passive value=\"0\"/><LastCash value=\"0.000000\"/><LastTimeCash value=\"0\"/><LastActivityTime value=\"0\"/><CreditExpire value=\"0\"/><AuthorizedBy></AuthorizedBy></U<GetUsers><User result=\"ok\"><Login value=\"test6\"/><Password value=\"123456\" /><Cash value=\"0.000000\"/><FreeMb value=\"0.000000\"/><Credit value=\"0.000000\"/><Tariff value=\"In.Pi\"/><Note value=\"\"/><Phone value=\"\"/><Address value=\"\"/><Email value=\"\"/><UserData0 value=\"\" /><UserData1 value=\"\" /><UserData2 value=\"\" /><UserData3 value=\"\" /><UserData4 value=\"\" /><UserData5 value=\"\" /><UserData6 value=\"\" /><UserData7 value=\"\" /><UserData8 value=\"\" /><UserData9 value=\"\" /><Name value=\"\"/><Group value=\"\"/><Status value=\"0\"/><AOnline value=\"0\"/><CurrIP value=\"0.0.0.0\"/><IP value=\"192.168.1.5\"/><Traff MU0=\"0\" MU1=\"0\" MU2=\"0\" MU3=\"0\" MU4=\"0\" MU5=\"0\" MU6=\"0\" MU7=\"0\" MU8=\"0\" MU9=\"0\" MD0=\"0\" MD1=\"0\" MD2=\"0\" MD3=\"0\" MD4=\"0\" MD5=\"0\" MD6=\"0\" MD7=\"0\" MD8=\"0\" MD9=\"0\"/><Down value=\"0\"/><DisableDetailStat value=\"0\"/><Passive value=\"0\"/><LastCash value=\"0.000000\"/><LastTimeCash value=\"0\"/><LastActivityTime value=\"0\"/><CreditExpire value=\"0\"/><AuthorizedBy></AuthorizedBy></U<GetUsers><User result=\"ok\"><Login value=\"test6\"/><Password value=\"123456\" /><Cash value=\"0.000000\"/><FreeMb value=\"0.000000\"/><Credit value=\"0.000000\"/><Tariff value=\"In.Pi\"/><Note value=\"\"/><Phone value=\"\"/><Address value=\"\"/><Email value=\"\"/><UserData0 value=\"\" /><UserData1 value=\"\" /><UserData2 value=\"\" /><UserData3 value=\"\" /><UserData4 value=\"\" /><UserData5 value=\"\" /><UserData6 value=\"\" /><UserData7 value=\"\" /><UserData8 value=\"\" /><UserData9 value=\"\" /><Name value=\"\"/><Group value=\"\"/><Status value=\"0\"/><AOnline value=\"0\"/><CurrIP value=\"0.0.0.0\"/><IP value=\"192.168.1.5\"/><Traff MU0=\"0\" MU1=\"0\" MU2=\"0\" MU3=\"0\" MU4=\"0\" MU5=\"0\" MU6=\"0\" MU7=\"0\" MU8=\"0\" MU9=\"0\" MD0=\"0\" MD1=\"0\" MD2=\"0\" MD3=\"0\" MD4=\"0\" MD5=\"0\" MD6=\"0\" MD7=\"0\" MD8=\"0\" MD9=\"0\"/><Down value=\"0\"/><DisableDetailStat value=\"0\"/><Passive value=\"0\"/><LastCash value=\"0.000000\"/><LastTimeCash value=\"0\"/><LastActivityTime value=\"0\"/><CreditExpire value=\"0\"/><AuthorizedBy></AuthorizedBy></U<GetUsers><User result=\"ok\"><Login value=\"test6\"/><Password value=\"123456\" /><Cash value=\"0.000000\"/><FreeMb value=\"0.000000\"/><Credit value=\"0.000000\"/><Tariff value=\"In.Pi\"/><Note value=\"\"/><Phone value=\"\"/><Address value=\"\"/><Email value=\"\"/><UserData0 value=\"\" /><UserData1 value=\"\" /><UserData2 value=\"\" /><UserData3 value=\"\" /><UserData4 value=\"\" /><UserData5 value=\"\" /><UserData6 value=\"\" /><UserData7 value=\"\" /><UserData8 value=\"\" /><UserData9 value=\"\" /><Name value=\"\"/><Group value=\"\"/><Status value=\"0\"/><AOnline value=\"0\"/><CurrIP value=\"0.0.0.0\"/><IP value=\"192.168.1.5\"/><Traff MU0=\"0\" MU1=\"0\" MU2=\"0\" MU3=\"0\" MU4=\"0\" MU5=\"0\" MU6=\"0\" MU7=\"0\" MU8=\"0\" MU9=\"0\" MD0=\"0\" MD1=\"0\" MD2=\"0\" MD3=\"0\" MD4=\"0\" MD5=\"0\" MD6=\"0\" MD7=\"0\" MD8=\"0\" MD9=\"0\"/><Down value=\"0\"/><DisableDetailStat value=\"0\"/><Passive value=\"0\"/><LastCash value=\"0.000000\"/><LastTimeCash value=\"0\"/><LastActivityTime value=\"0\"/><CreditExpire value=\"0\"/><AuthorizedBy></AuthorizedBy></U";
+#include <string>
 
 
-#endif
+const std::string longString = "<GetUsers><User result=\"ok\"><Login value=\"test6\"/><Password value=\"123456\" /><Cash value=\"0.000000\"/><FreeMb value=\"0.000000\"/><Credit value=\"0.000000\"/><Tariff value=\"In.Pi\"/><Note value=\"\"/><Phone value=\"\"/><Address value=\"\"/><Email value=\"\"/><UserData0 value=\"\" /><UserData1 value=\"\" /><UserData2 value=\"\" /><UserData3 value=\"\" /><UserData4 value=\"\" /><UserData5 value=\"\" /><UserData6 value=\"\" /><UserData7 value=\"\" /><UserData8 value=\"\" /><UserData9 value=\"\" /><Name value=\"\"/><Group value=\"\"/><Status value=\"0\"/><AOnline value=\"0\"/><CurrIP value=\"0.0.0.0\"/><IP value=\"192.168.1.5\"/><Traff MU0=\"0\" MU1=\"0\" MU2=\"0\" MU3=\"0\" MU4=\"0\" MU5=\"0\" MU6=\"0\" MU7=\"0\" MU8=\"0\" MU9=\"0\" MD0=\"0\" MD1=\"0\" MD2=\"0\" MD3=\"0\" MD4=\"0\" MD5=\"0\" MD6=\"0\" MD7=\"0\" MD8=\"0\" MD9=\"0\"/><Down value=\"0\"/><DisableDetailStat value=\"0\"/><Passive value=\"0\"/><LastCash value=\"0.000000\"/><LastTimeCash value=\"0\"/><LastActivityTime value=\"0\"/><CreditExpire value=\"0\"/><AuthorizedBy></AuthorizedBy></U<GetUsers><User result=\"ok\"><Login value=\"test6\"/><Password value=\"123456\" /><Cash value=\"0.000000\"/><FreeMb value=\"0.000000\"/><Credit value=\"0.000000\"/><Tariff value=\"In.Pi\"/><Note value=\"\"/><Phone value=\"\"/><Address value=\"\"/><Email value=\"\"/><UserData0 value=\"\" /><UserData1 value=\"\" /><UserData2 value=\"\" /><UserData3 value=\"\" /><UserData4 value=\"\" /><UserData5 value=\"\" /><UserData6 value=\"\" /><UserData7 value=\"\" /><UserData8 value=\"\" /><UserData9 value=\"\" /><Name value=\"\"/><Group value=\"\"/><Status value=\"0\"/><AOnline value=\"0\"/><CurrIP value=\"0.0.0.0\"/><IP value=\"192.168.1.5\"/><Traff MU0=\"0\" MU1=\"0\" MU2=\"0\" MU3=\"0\" MU4=\"0\" MU5=\"0\" MU6=\"0\" MU7=\"0\" MU8=\"0\" MU9=\"0\" MD0=\"0\" MD1=\"0\" MD2=\"0\" MD3=\"0\" MD4=\"0\" MD5=\"0\" MD6=\"0\" MD7=\"0\" MD8=\"0\" MD9=\"0\"/><Down value=\"0\"/><DisableDetailStat value=\"0\"/><Passive value=\"0\"/><LastCash value=\"0.000000\"/><LastTimeCash value=\"0\"/><LastActivityTime value=\"0\"/><CreditExpire value=\"0\"/><AuthorizedBy></AuthorizedBy></U<GetUsers><User result=\"ok\"><Login value=\"test6\"/><Password value=\"123456\" /><Cash value=\"0.000000\"/><FreeMb value=\"0.000000\"/><Credit value=\"0.000000\"/><Tariff value=\"In.Pi\"/><Note value=\"\"/><Phone value=\"\"/><Address value=\"\"/><Email value=\"\"/><UserData0 value=\"\" /><UserData1 value=\"\" /><UserData2 value=\"\" /><UserData3 value=\"\" /><UserData4 value=\"\" /><UserData5 value=\"\" /><UserData6 value=\"\" /><UserData7 value=\"\" /><UserData8 value=\"\" /><UserData9 value=\"\" /><Name value=\"\"/><Group value=\"\"/><Status value=\"0\"/><AOnline value=\"0\"/><CurrIP value=\"0.0.0.0\"/><IP value=\"192.168.1.5\"/><Traff MU0=\"0\" MU1=\"0\" MU2=\"0\" MU3=\"0\" MU4=\"0\" MU5=\"0\" MU6=\"0\" MU7=\"0\" MU8=\"0\" MU9=\"0\" MD0=\"0\" MD1=\"0\" MD2=\"0\" MD3=\"0\" MD4=\"0\" MD5=\"0\" MD6=\"0\" MD7=\"0\" MD8=\"0\" MD9=\"0\"/><Down value=\"0\"/><DisableDetailStat value=\"0\"/><Passive value=\"0\"/><LastCash value=\"0.000000\"/><LastTimeCash value=\"0\"/><LastActivityTime value=\"0\"/><CreditExpire value=\"0\"/><AuthorizedBy></AuthorizedBy></U<GetUsers><User result=\"ok\"><Login value=\"test6\"/><Password value=\"123456\" /><Cash value=\"0.000000\"/><FreeMb value=\"0.000000\"/><Credit value=\"0.000000\"/><Tariff value=\"In.Pi\"/><Note value=\"\"/><Phone value=\"\"/><Address value=\"\"/><Email value=\"\"/><UserData0 value=\"\" /><UserData1 value=\"\" /><UserData2 value=\"\" /><UserData3 value=\"\" /><UserData4 value=\"\" /><UserData5 value=\"\" /><UserData6 value=\"\" /><UserData7 value=\"\" /><UserData8 value=\"\" /><UserData9 value=\"\" /><Name value=\"\"/><Group value=\"\"/><Status value=\"0\"/><AOnline value=\"0\"/><CurrIP value=\"0.0.0.0\"/><IP value=\"192.168.1.5\"/><Traff MU0=\"0\" MU1=\"0\" MU2=\"0\" MU3=\"0\" MU4=\"0\" MU5=\"0\" MU6=\"0\" MU7=\"0\" MU8=\"0\" MU9=\"0\" MD0=\"0\" MD1=\"0\" MD2=\"0\" MD3=\"0\" MD4=\"0\" MD5=\"0\" MD6=\"0\" MD7=\"0\" MD8=\"0\" MD9=\"0\"/><Down value=\"0\"/><DisableDetailStat value=\"0\"/><Passive value=\"0\"/><LastCash value=\"0.000000\"/><LastTimeCash value=\"0\"/><LastActivityTime value=\"0\"/><CreditExpire value=\"0\"/><AuthorizedBy></AuthorizedBy></U";
index ef98db19d13770f0a9dec1f1593e599cac5c7b3b..0076860de67ca77e829afd55527864ed0b7852ad 100644 (file)
-#include "tut/tut.hpp"
+#define BOOST_TEST_MODULE STGAdminConf
 
 #include "stg/admin_conf.h"
 
 
 #include "stg/admin_conf.h"
 
-namespace tut
-{
-    struct priv_data {
-        enum {
-            MIX2 = 0x0002C6C6, // 210321032
-            ONES = 0x00015555,
-            MIX3 = 0x00031B1B, // 321032103
-            TWOS = 0x0002AAAA,
-            MIX1 = 0x0000E4E4, // 012301230
-            THREES = 0x0003FFFF
-        };
-    };
-
-    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");
-
-        STG::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.serviceChg == 0", zero.serviceChg == 0);
-        ensure("zero.corpChg == 0", zero.corpChg == 0);
-
-        ensure("zero.toInt() == 0", zero.toInt() == 0);
-    }
-
-    template<>
-    template<>
-    void testobject::test<2>()
-    {
-        set_test_name("Check uint32_t conversions");
-
-        for (uint8_t i = 0; i < 4; ++i) {
-
-            // 'i' is extra trash in high bits
-
-            STG::Priv priv1(ONES | (i << 0x12)); // 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.serviceChg == 1", priv1.serviceChg, 1);
-            ensure_equals("priv1.corpChg == 1", priv1.corpChg, 1);
-
-            ensure_equals("priv1.toInt() == 0x00015555", priv1.toInt(), static_cast<uint32_t>(ONES));
-
-            STG::Priv priv2(TWOS | (i << 0x12)); // 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.serviceChg == 2", priv2.serviceChg, 2);
-            ensure_equals("priv2.corpChg == 2", priv2.corpChg, 2);
-
-            ensure_equals("priv2.toInt() = 0x0002AAAA", priv2.toInt(), static_cast<uint32_t>(TWOS));
-
-            STG::Priv priv3(THREES | (i << 0x12)); // 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("priv3.serviceChg == 3", priv3.serviceChg, 3);
-            ensure_equals("priv3.corpChg == 3", priv3.corpChg, 3);
-
-            ensure_equals("priv3.toInt() = 0x0003FFFF", priv3.toInt(), static_cast<uint32_t>(THREES));
-
-            STG::Priv pm1(MIX1 | (i << 0x12)); // 012301230
-
-            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.serviceChg == 3", pm1.serviceChg, 3);
-            ensure_equals("pm1.corpChg == 0", pm1.corpChg, 0);
-
-            ensure_equals("pm1.toInt() = 0xE4E4", pm1.toInt(), static_cast<uint32_t>(MIX1));
-
-            STG::Priv pm2(MIX2 | (i << 0x12)); // 210321032
-
-            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.serviceChg == 3", pm2.serviceChg, 3);
-            ensure_equals("pm2.corpChg == 2", pm2.corpChg, 2);
-
-            ensure_equals("pm2.toInt() = 0x0002C6C6", pm2.toInt(), static_cast<uint32_t>(MIX2));
-
-            STG::Priv pm3(MIX3 | (i << 0x12)); // 321032103
-
-            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.serviceChg == 0", pm3.serviceChg, 0);
-            ensure_equals("pm3.corpChg == 3", pm3.corpChg, 3);
-
-            ensure_equals("pm3.toInt() = 0x00031B1B", pm3.toInt(), static_cast<uint32_t>(MIX3));
-
-        }
-
-    }
-
-    template<>
-    template<>
-    void testobject::test<3>()
-    {
-        set_test_name("Check explicit uint32_t conversions");
-
-        for (uint8_t i = 0; i < 4; ++i) {
-
-            // 'i' is extra trash in high bits
-
-            STG::Priv priv1(ONES | (i << 0x12)); // 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.serviceChg == 1", priv1.serviceChg, 1);
-            ensure_equals("priv1.corpChg == 1", priv1.corpChg, 1);
-
-            ensure_equals("priv1.toInt() == 0x00015555", priv1.toInt(), static_cast<uint32_t>(ONES));
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wold-style-cast"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wsign-compare"
+#pragma GCC diagnostic ignored "-Wparentheses"
+#include <boost/test/unit_test.hpp>
+#pragma GCC diagnostic pop
 
 
-            STG::Priv priv2(TWOS | (i << 0x12)); // All 2
+#include <cstdint>
 
 
-            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.serviceChg == 2", priv2.serviceChg, 2);
-            ensure_equals("priv2.corpChg == 2", priv2.corpChg, 2);
-
-            ensure_equals("priv2.toInt() = 0x0002AAAA", priv2.toInt(), static_cast<uint32_t>(TWOS));
-
-            STG::Priv priv3(THREES | (i << 0x12)); // 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("priv3.serviceChg == 3", priv3.serviceChg, 3);
-            ensure_equals("priv3.corpChg == 3", priv3.corpChg, 3);
-
-            ensure_equals("priv3.toInt() = 0x0003FFFF", priv3.toInt(), static_cast<uint32_t>(THREES));
-
-            STG::Priv pm1(MIX1 | (i << 0x12)); // 012301230
-
-            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.serviceChg == 3", pm1.serviceChg, 3);
-            ensure_equals("pm1.corpChg == 0", pm1.corpChg, 0);
-
-            ensure_equals("pm1.toInt() = 0xE4E4", pm1.toInt(), static_cast<uint32_t>(MIX1));
-
-            STG::Priv pm2(MIX2 | (i << 0x12)); // 210321032
-
-            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.serviceChg == 3", pm2.serviceChg, 3);
-            ensure_equals("pm2.corpChg == 2", pm2.corpChg, 2);
-
-            ensure_equals("pm2.toInt() = 0x0002C6C6", pm2.toInt(), static_cast<uint32_t>(MIX2));
+namespace
+{
 
 
-            STG::Priv pm3(MIX3 | (i << 0x12)); // 321032103
+constexpr uint32_t MIX2 = 0x0002C6C6; // 210321032
+constexpr uint32_t ONES = 0x00015555;
+constexpr uint32_t MIX3 = 0x00031B1B; // 321032103
+constexpr uint32_t TWOS = 0x0002AAAA;
+constexpr uint32_t MIX1 = 0x0000E4E4; // 012301230
+constexpr uint32_t THREES = 0x0003FFFF;
 
 
-            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.serviceChg == 0", pm3.serviceChg, 0);
-            ensure_equals("pm3.corpChg == 3", pm3.corpChg, 3);
+}
 
 
-            ensure_equals("pm3.toInt() = 0x00031B1B", pm3.toInt(), static_cast<uint32_t>(MIX3));
+BOOST_AUTO_TEST_SUITE(AdminConf)
 
 
-        }
+BOOST_AUTO_TEST_CASE(DefaultConstructor)
+{
+    STG::Priv zero;
+
+    BOOST_CHECK_EQUAL(zero.userStat, 0);
+    BOOST_CHECK_EQUAL(zero.userConf, 0);
+    BOOST_CHECK_EQUAL(zero.userCash, 0);
+    BOOST_CHECK_EQUAL(zero.userPasswd, 0);
+    BOOST_CHECK_EQUAL(zero.userAddDel, 0);
+    BOOST_CHECK_EQUAL(zero.adminChg, 0);
+    BOOST_CHECK_EQUAL(zero.tariffChg, 0);
+    BOOST_CHECK_EQUAL(zero.serviceChg, 0);
+    BOOST_CHECK_EQUAL(zero.corpChg, 0);
+
+    BOOST_CHECK_EQUAL(zero.toInt(), 0);
+}
 
 
+BOOST_AUTO_TEST_CASE(UINT32Conversions)
+{
+    for (uint8_t i = 0; i < 4; ++i)
+    {
+        // 'i' is extra garbage in high bits
+
+        STG::Priv priv1(ONES | (i << 0x12)); // All 1
+
+        BOOST_CHECK_EQUAL(priv1.userStat, 1);
+        BOOST_CHECK_EQUAL(priv1.userConf, 1);
+        BOOST_CHECK_EQUAL(priv1.userCash, 1);
+        BOOST_CHECK_EQUAL(priv1.userPasswd, 1);
+        BOOST_CHECK_EQUAL(priv1.userAddDel, 1);
+        BOOST_CHECK_EQUAL(priv1.adminChg, 1);
+        BOOST_CHECK_EQUAL(priv1.tariffChg, 1);
+        BOOST_CHECK_EQUAL(priv1.serviceChg, 1);
+        BOOST_CHECK_EQUAL(priv1.corpChg, 1);
+
+        BOOST_CHECK_EQUAL(priv1.toInt(), static_cast<uint32_t>(ONES));
+
+        STG::Priv priv2(TWOS | (i << 0x12)); // All 2
+
+        BOOST_CHECK_EQUAL(priv2.userStat, 2);
+        BOOST_CHECK_EQUAL(priv2.userConf, 2);
+        BOOST_CHECK_EQUAL(priv2.userCash, 2);
+        BOOST_CHECK_EQUAL(priv2.userPasswd, 2);
+        BOOST_CHECK_EQUAL(priv2.userAddDel, 2);
+        BOOST_CHECK_EQUAL(priv2.adminChg, 2);
+        BOOST_CHECK_EQUAL(priv2.tariffChg, 2);
+        BOOST_CHECK_EQUAL(priv2.serviceChg, 2);
+        BOOST_CHECK_EQUAL(priv2.corpChg, 2);
+
+        BOOST_CHECK_EQUAL(priv2.toInt(), static_cast<uint32_t>(TWOS));
+
+        STG::Priv priv3(THREES | (i << 0x12)); // All 3
+
+        BOOST_CHECK_EQUAL(priv3.userStat, 3);
+        BOOST_CHECK_EQUAL(priv3.userConf, 3);
+        BOOST_CHECK_EQUAL(priv3.userCash, 3);
+        BOOST_CHECK_EQUAL(priv3.userPasswd, 3);
+        BOOST_CHECK_EQUAL(priv3.userAddDel, 3);
+        BOOST_CHECK_EQUAL(priv3.adminChg, 3);
+        BOOST_CHECK_EQUAL(priv3.tariffChg, 3);
+        BOOST_CHECK_EQUAL(priv3.serviceChg, 3);
+        BOOST_CHECK_EQUAL(priv3.corpChg, 3);
+
+        BOOST_CHECK_EQUAL(priv3.toInt(), static_cast<uint32_t>(THREES));
+
+        STG::Priv pm1(MIX1 | (i << 0x12)); // 012301230
+
+        BOOST_CHECK_EQUAL(pm1.userStat, 0);
+        BOOST_CHECK_EQUAL(pm1.userConf, 1);
+        BOOST_CHECK_EQUAL(pm1.userCash, 2);
+        BOOST_CHECK_EQUAL(pm1.userPasswd, 3);
+        BOOST_CHECK_EQUAL(pm1.userAddDel, 0);
+        BOOST_CHECK_EQUAL(pm1.adminChg, 1);
+        BOOST_CHECK_EQUAL(pm1.tariffChg, 2);
+        BOOST_CHECK_EQUAL(pm1.serviceChg, 3);
+        BOOST_CHECK_EQUAL(pm1.corpChg, 0);
+
+        BOOST_CHECK_EQUAL(pm1.toInt(), static_cast<uint32_t>(MIX1));
+
+        STG::Priv pm2(MIX2 | (i << 0x12)); // 210321032
+
+        BOOST_CHECK_EQUAL(pm2.userStat, 2);
+        BOOST_CHECK_EQUAL(pm2.userConf, 1);
+        BOOST_CHECK_EQUAL(pm2.userCash, 0);
+        BOOST_CHECK_EQUAL(pm2.userPasswd, 3);
+        BOOST_CHECK_EQUAL(pm2.userAddDel, 2);
+        BOOST_CHECK_EQUAL(pm2.adminChg, 1);
+        BOOST_CHECK_EQUAL(pm2.tariffChg, 0);
+        BOOST_CHECK_EQUAL(pm2.serviceChg, 3);
+        BOOST_CHECK_EQUAL(pm2.corpChg, 2);
+
+        BOOST_CHECK_EQUAL(pm2.toInt(), static_cast<uint32_t>(MIX2));
+
+        STG::Priv pm3(MIX3 | (i << 0x12)); // 321032103
+
+        BOOST_CHECK_EQUAL(pm3.userStat, 3);
+        BOOST_CHECK_EQUAL(pm3.userConf, 2);
+        BOOST_CHECK_EQUAL(pm3.userCash, 1);
+        BOOST_CHECK_EQUAL(pm3.userPasswd, 0);
+        BOOST_CHECK_EQUAL(pm3.userAddDel, 3);
+        BOOST_CHECK_EQUAL(pm3.adminChg, 2);
+        BOOST_CHECK_EQUAL(pm3.tariffChg, 1);
+        BOOST_CHECK_EQUAL(pm3.serviceChg, 0);
+        BOOST_CHECK_EQUAL(pm3.corpChg, 3);
+
+        BOOST_CHECK_EQUAL(pm3.toInt(), static_cast<uint32_t>(MIX3));
     }
     }
-
 }
 }
+
+BOOST_AUTO_TEST_SUITE_END()
index a3252c9eb9829380126f5025520d180e5c3c0d3d..f6c5bad73ac4ec9fe1d8bfd18082596e3d91fd11 100644 (file)
@@ -1,9 +1,17 @@
-#include "tut/tut.hpp"
+#define BOOST_TEST_MODULE STGBFStream
 
 #include "longstring.h"
 
 #include "stg/bfstream.h"
 
 
 #include "longstring.h"
 
 #include "stg/bfstream.h"
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wold-style-cast"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wsign-compare"
+#pragma GCC diagnostic ignored "-Wparentheses"
+#include <boost/test/unit_test.hpp>
+#pragma GCC diagnostic pop
+
 #include <algorithm>
 #include <string>
 #include <cstring>
 #include <algorithm>
 #include <string>
 #include <cstring>
 namespace
 {
 
 namespace
 {
 
-class TRACKER
+class Tracker
 {
     public:
 {
     public:
-        TRACKER() : m_lastSize(0), m_callCount(0), m_lastBlock(NULL) {}
-        ~TRACKER() { delete[] m_lastBlock; }
-        bool Call(const void * block, size_t size)
+        Tracker() : m_lastSize(0), m_callCount(0), m_lastBlock(NULL) {}
+        ~Tracker() { delete[] m_lastBlock; }
+        void Call(const void* block, size_t size)
         {
         {
-        delete[] m_lastBlock;
-        if (size > 0)
+            delete[] m_lastBlock;
+            if (size > 0)
             {
             {
-            m_lastBlock = new char[size];
-            memcpy(m_lastBlock,  block, size);
-            m_result.append(m_lastBlock, size);
+                m_lastBlock = new char[size];
+                memcpy(m_lastBlock,  block, size);
+                m_result.append(m_lastBlock, size);
             }
             }
-        else
-            m_lastBlock = NULL;
-        m_lastSize = size;
-        ++m_callCount;
-        return true;
+            else
+                m_lastBlock = NULL;
+            m_lastSize = size;
+            ++m_callCount;
         }
         size_t LastSize() const { return m_lastSize; }
         size_t CallCount() const { return m_callCount; }
         }
         size_t LastSize() const { return m_lastSize; }
         size_t CallCount() const { return m_callCount; }
-        const void * LastBlock() const { return m_lastBlock; }
+        const void* LastBlock() const { return m_lastBlock; }
 
         const std::string& Result() const { return m_result; }
 
     private:
         size_t m_lastSize;
         size_t m_callCount;
 
         const std::string& Result() const { return m_result; }
 
     private:
         size_t m_lastSize;
         size_t m_callCount;
-        char * m_lastBlock;
+        char* m_lastBlock;
 
         std::string m_result;
 };
 
 
         std::string m_result;
 };
 
-bool DecryptCallback(const void * block, size_t size, void * data);
+bool DecryptCallback(const void* block, size_t size, void* data);
 
 class Decryptor
 {
     public:
 
 class Decryptor
 {
     public:
-        Decryptor(const std::string & key)
+        Decryptor(const std::string& key)
             : m_stream(key, DecryptCallback, this)
         {}
 
             : m_stream(key, DecryptCallback, this)
         {}
 
-        bool Call(const void * block, size_t size)
+        void Call(const void* block, size_t size)
         {
             m_stream.Put(block, size);
         {
             m_stream.Put(block, size);
-            return true;
         }
 
         }
 
-        bool Put(const void * block, size_t size)
+        void Put(const void* block, size_t size)
         {
         {
-            const char * data = static_cast<const char *>(block);
+            const auto* data = static_cast<const char*>(block);
             size = strnlen(data, size);
             m_result.append(data, size);
             size = strnlen(data, size);
             m_result.append(data, size);
-            return true;
         }
 
         void Flush()
         }
 
         void Flush()
@@ -81,159 +86,123 @@ class Decryptor
         std::string m_result;
 };
 
         std::string m_result;
 };
 
-bool EncryptCallback(const void * block, size_t size, void * data)
+bool EncryptCallback(const void* block, size_t size, void* data)
+{
+    auto& decryptor = *static_cast<Decryptor*>(data);
+    decryptor.Call(block, size);
+    return true;
+}
+
+bool DecryptCallback(const void* block, size_t size, void* data)
 {
 {
-Decryptor & decryptor = *static_cast<Decryptor *>(data);
-return decryptor.Call(block, size);
+    auto& decryptor = *static_cast<Decryptor*>(data);
+    decryptor.Put(block, size);
+    return true;
+}
+
+bool Callback(const void* block, size_t size, void* data)
+{
+    auto& tracker = *static_cast<Tracker*>(data);
+    tracker.Call(block, size);
+    return true;
+}
+
 }
 
 }
 
-bool DecryptCallback(const void * block, size_t size, void * data)
+BOOST_AUTO_TEST_SUITE(BFStream)
+
+BOOST_AUTO_TEST_CASE(Mechanics)
 {
 {
-Decryptor & decryptor = *static_cast<Decryptor *>(data);
-return decryptor.Put(block, size);
+    Tracker tracker;
+    STG::ENCRYPT_STREAM stream("pr7Hhen", Callback, &tracker);
+    BOOST_CHECK_EQUAL(tracker.CallCount(), 0);
+
+    uint32_t block[2] = {0x12345678, 0x87654321};
+    stream.Put(&block[0], sizeof(block[0]));
+    BOOST_CHECK_EQUAL(tracker.CallCount(), 0);
+    stream.Put(&block[1], sizeof(block[1]));
+    BOOST_CHECK_EQUAL(tracker.CallCount(), 1);
+
+    uint32_t block2[4] = {0x12345678, 0x87654321, 0x12345678, 0x87654321};
+    stream.Put(&block2[0], sizeof(block2[0]) * 3);
+    BOOST_CHECK_EQUAL(tracker.CallCount(), 2);
+    stream.Put(&block2[3], sizeof(block2[3]));
+    BOOST_CHECK_EQUAL(tracker.CallCount(), 3);
 }
 
 }
 
-bool Callback(const void * block, size_t size, void * data)
+BOOST_AUTO_TEST_CASE(Encryption)
 {
 {
-TRACKER & tracker = *static_cast<TRACKER *>(data);
-return tracker.Call(block, size);
+    Tracker tracker;
+    STG::ENCRYPT_STREAM stream("pr7Hhen", Callback, &tracker);
+
+    uint32_t block[2] = {0x12345678, 0x87654321};
+    stream.Put(&block[0], sizeof(block[0]));
+    BOOST_CHECK_EQUAL(tracker.LastSize(), 0);
+    BOOST_CHECK_EQUAL(tracker.LastBlock(), static_cast<const void *>(NULL));
+    stream.Put(&block[1], sizeof(block[1]));
+    BOOST_CHECK_EQUAL(tracker.LastSize(), 8);
+    const uint32_t * ptr = static_cast<const uint32_t *>(tracker.LastBlock());
+    BOOST_CHECK_EQUAL(ptr[0], 0xd3988cd);
+    BOOST_CHECK_EQUAL(ptr[1], 0x7996c6d6);
+
+    uint32_t block2[4] = {0x12345678, 0x87654321, 0x12345678, 0x87654321};
+    stream.Put(&block2[0], sizeof(block2[0]) * 3);
+    BOOST_CHECK_EQUAL(tracker.LastSize(), 8);
+    ptr = static_cast<const uint32_t *>(tracker.LastBlock());
+    BOOST_CHECK_EQUAL(ptr[0], 0xd3988cd);
+    BOOST_CHECK_EQUAL(ptr[1], 0x7996c6d6);
+
+    stream.Put(&block2[3], sizeof(block2[3]));
+    BOOST_CHECK_EQUAL(tracker.LastSize(), 8);
+    ptr = static_cast<const uint32_t *>(tracker.LastBlock());
+    BOOST_CHECK_EQUAL(ptr[0], 0xd3988cd);
+    BOOST_CHECK_EQUAL(ptr[1], 0x7996c6d6);
 }
 
 }
 
+BOOST_AUTO_TEST_CASE(LongStringProcessing)
+{
+    Tracker tracker;
+    STG::ENCRYPT_STREAM estream("pr7Hhen", Callback, &tracker);
+    const std::string source = "This is a test long string for checking stream encryption/decryption. \"abcdefghijklmnopqrstuvwxyz 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\"";
+    std::vector<char> buffer(source.length() + 9, 0);
+
+    estream.Put(source.c_str(), source.length() + 1, true);
+    BOOST_CHECK(tracker.LastSize() >= source.length() + 1);
+    BOOST_CHECK(tracker.LastBlock() != NULL);
+    memcpy(buffer.data(), tracker.LastBlock(), std::min(tracker.LastSize(), buffer.size()));
+
+    STG::DECRYPT_STREAM dstream("pr7Hhen", Callback, &tracker);
+    dstream.Put(buffer.data(), buffer.size(), true);
+    BOOST_CHECK(tracker.LastSize() >= buffer.size());
+    BOOST_CHECK(tracker.LastBlock() != NULL);
+    memcpy(buffer.data(), tracker.LastBlock(), std::min(tracker.LastSize(), buffer.size()));
+
+    BOOST_CHECK_EQUAL(std::string(buffer.data()), source);
 }
 
 }
 
-namespace tut
+BOOST_AUTO_TEST_CASE(VeryLongStringProcessing)
 {
 {
-    struct bfstream_data {
-    };
-
-    typedef test_group<bfstream_data> tg;
-    tg bfstream_test_group("BFStream tests group");
-
-    typedef tg::object testobject;
-
-    template<>
-    template<>
-    void testobject::test<1>()
-    {
-        set_test_name("Check bfstream mechanics");
-
-        TRACKER tracker;
-        STG::ENCRYPT_STREAM stream("pr7Hhen", Callback, &tracker);
-        ensure_equals("CallCount() == 0 after construction", tracker.CallCount(), 0);
-
-        uint32_t block[2] = {0x12345678, 0x87654321};
-        stream.Put(&block[0], sizeof(block[0]));
-        ensure_equals("CallCount() == 0 after first put", tracker.CallCount(), 0);
-        stream.Put(&block[1], sizeof(block[1]));
-        ensure_equals("CallCount() == 1 after second put", tracker.CallCount(), 1);
-
-        uint32_t block2[4] = {0x12345678, 0x87654321, 0x12345678, 0x87654321};
-        stream.Put(&block2[0], sizeof(block2[0]) * 3);
-        ensure_equals("CallCount() == 2 after third put", tracker.CallCount(), 2);
-        stream.Put(&block2[3], sizeof(block2[3]));
-        ensure_equals("CallCount() == 3 after fourth put", tracker.CallCount(), 3);
-    }
-
-    template<>
-    template<>
-    void testobject::test<2>()
-    {
-        set_test_name("Check bfstream encryption");
-
-        TRACKER tracker;
-        STG::ENCRYPT_STREAM stream("pr7Hhen", Callback, &tracker);
-
-        uint32_t block[2] = {0x12345678, 0x87654321};
-        stream.Put(&block[0], sizeof(block[0]));
-        ensure_equals("LastSize() == 0 after first put", tracker.LastSize(), 0);
-        ensure_equals("LastBlock() == NULL after first put", tracker.LastBlock(), static_cast<const void *>(NULL));
-        stream.Put(&block[1], sizeof(block[1]));
-        ensure_equals("LastSize() == 8 after second put", tracker.LastSize(), 8);
-        const uint32_t * ptr = static_cast<const uint32_t *>(tracker.LastBlock());
-        ensure_equals("ptr[0] == 0xd3988cd after second put", ptr[0], 0xd3988cd);
-        ensure_equals("ptr[1] == 0x7996c6d6 after second put", ptr[1], 0x7996c6d6);
-
-        uint32_t block2[4] = {0x12345678, 0x87654321, 0x12345678, 0x87654321};
-        stream.Put(&block2[0], sizeof(block2[0]) * 3);
-        ensure_equals("LastSize() == 8 after third put", tracker.LastSize(), 8);
-        ptr = static_cast<const uint32_t *>(tracker.LastBlock());
-        ensure_equals("ptr[0] == 0xd3988cd after third put", ptr[0], 0xd3988cd);
-        ensure_equals("ptr[1] == 0x7996c6d6 after third put", ptr[1], 0x7996c6d6);
-
-        stream.Put(&block2[3], sizeof(block2[3]));
-        ensure_equals("LastSize() == 8 after fourth put", tracker.LastSize(), 8);
-        ptr = static_cast<const uint32_t *>(tracker.LastBlock());
-        ensure_equals("ptr[0] == 0xd3988cd after fourth put", ptr[0], 0xd3988cd);
-        ensure_equals("ptr[1] == 0x7996c6d6 after fourth put", ptr[1], 0x7996c6d6);
-    }
-
-    template<>
-    template<>
-    void testobject::test<3>()
-    {
-        set_test_name("Check bfstream long string processing");
-
-        TRACKER tracker;
-        STG::ENCRYPT_STREAM estream("pr7Hhen", Callback, &tracker);
-        std::string source = "This is a test long string for checking stream encryption/decryption. \"abcdefghijklmnopqrstuvwxyz 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ\"";
-        char buffer[source.length() + 9];
-        memset(buffer, 0, sizeof(buffer));
-
-        estream.Put(source.c_str(), source.length() + 1, true);
-        ensure("Encryption long string LastSize()", tracker.LastSize() >= source.length() + 1);
-        ensure("Encryption long string LastBlock() != NULL", tracker.LastBlock() != NULL);
-        memcpy(buffer, tracker.LastBlock(), std::min(tracker.LastSize(), sizeof(buffer)));
-
-        STG::DECRYPT_STREAM dstream("pr7Hhen", Callback, &tracker);
-        dstream.Put(buffer, sizeof(buffer), true);
-        ensure("Decryption long string LastSize() decryption", tracker.LastSize() >= sizeof(buffer));
-        ensure("Decryption long string LastBlock() != NULL", tracker.LastBlock() != NULL);
-        memcpy(buffer, tracker.LastBlock(), std::min(tracker.LastSize(), sizeof(buffer)));
-
-        ensure_equals("Decrypt(Encrypt(source)) == source", std::string(buffer), source);
-    }
-
-    template<>
-    template<>
-    void testobject::test<4>()
-    {
-        set_test_name("Check bfstream very long string processing");
-
-        Decryptor decryptor("pr7Hhen");
-        STG::ENCRYPT_STREAM estream("pr7Hhen", EncryptCallback, &decryptor);
-        //char buffer[source.length() + 9];
-        //memset(buffer, 0, sizeof(buffer));
-
-        estream.Put(longString.c_str(), longString.length() + 1, true);
-        //ensure("Encryption long string LastSize()", tracker.LastSize() >= source.length() + 1);
-        //ensure("Encryption long string LastBlock() != NULL", tracker.LastBlock() != NULL);
-        //memcpy(buffer, tracker.LastBlock(), std::min(tracker.LastSize(), sizeof(buffer)));
-
-        //dstream.Put(buffer, sizeof(buffer), true);
-        //ensure("Decryption long string LastSize() decryption", tracker.LastSize() >= sizeof(buffer));
-        //ensure("Decryption long string LastBlock() != NULL", tracker.LastBlock() != NULL);
-        //memcpy(buffer, tracker.LastBlock(), std::min(tracker.LastSize(), sizeof(buffer)));
-
-        ensure_equals("Decrypt(Encrypt(source)) == source", decryptor.Result(), longString);
-    }
-
-    template<>
-    template<>
-    void testobject::test<5>()
-    {
-        set_test_name("Check bfstream mechanics");
-
-        TRACKER tracker;
-        STG::ENCRYPT_STREAM stream("pr7Hhen", Callback, &tracker);
-        ensure_equals("CallCount() == 0 after construction", tracker.CallCount(), 0);
-
-        uint32_t block[2] = {0x12345678, 0x87654321};
-        stream.Put(&block[0], sizeof(block[0]));
-        ensure_equals("CallCount() == 0 after first put", tracker.CallCount(), 0);
-        stream.Put(&block[1], sizeof(block[1]));
-        ensure_equals("CallCount() == 1 after second put", tracker.CallCount(), 1);
-        stream.Put(&block[0], 0, true); // Check last callback
-        ensure_equals("CallCount() == 2 after third (null) put", tracker.CallCount(), 2);
-    }
+    Decryptor decryptor("pr7Hhen");
+    STG::ENCRYPT_STREAM estream("pr7Hhen", EncryptCallback, &decryptor);
+
+    estream.Put(longString.c_str(), longString.length() + 1, true);
 
 
+    BOOST_CHECK_EQUAL(decryptor.Result(), longString);
 }
 }
+
+BOOST_AUTO_TEST_CASE(Mechanics2)
+{
+    Tracker tracker;
+    STG::ENCRYPT_STREAM stream("pr7Hhen", Callback, &tracker);
+    BOOST_CHECK_EQUAL(tracker.CallCount(), 0);
+
+    uint32_t block[2] = {0x12345678, 0x87654321};
+    stream.Put(&block[0], sizeof(block[0]));
+    BOOST_CHECK_EQUAL(tracker.CallCount(), 0);
+    stream.Put(&block[1], sizeof(block[1]));
+    BOOST_CHECK_EQUAL(tracker.CallCount(), 1);
+    stream.Put(&block[0], 0, true); // Check last callback
+    BOOST_CHECK_EQUAL(tracker.CallCount(), 2);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
index 8db8ab72dec23093de69525f983f4b564511e07b..bf4ecde3b45ecbcda8f545da4f00ef9d61671e45 100644 (file)
@@ -1,20 +1,34 @@
-#include "tut/tut.hpp"
+#define BOOST_TEST_MODULE STGCrypto
 
 #include "stg/blowfish.h"
 
 
 #include "stg/blowfish.h"
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wold-style-cast"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wsign-compare"
+#pragma GCC diagnostic ignored "-Wparentheses"
+#include <boost/test/unit_test.hpp>
+#pragma GCC diagnostic pop
+
+#include <string>
+#include <vector>
+#include <array>
+
 namespace
 {
 
 namespace
 {
 
-bool equalCtx(const BLOWFISH_CTX & a, const BLOWFISH_CTX & b)
+bool equalCtx(const BLOWFISH_CTX& a, const BLOWFISH_CTX& b)
 {
     for (size_t i = 0; i < sizeof(a.P); ++i)
 {
     for (size_t i = 0; i < sizeof(a.P); ++i)
-        if (a.P[i] != b.P[i]) {
+        if (a.P[i] != b.P[i])
+        {
             //printf("Failed for P at %d: 0%x != 0%x\n", i, a.P[i], b.P[i]);
             return false;
         }
     for (size_t i = 0; i < 4; ++i)
         for (size_t j = 0; j < 256; ++j)
             //printf("Failed for P at %d: 0%x != 0%x\n", i, a.P[i], b.P[i]);
             return false;
         }
     for (size_t i = 0; i < 4; ++i)
         for (size_t j = 0; j < 256; ++j)
-            if (a.S[i][j] != b.S[i][j]) {
+            if (a.S[i][j] != b.S[i][j])
+            {
                 //printf("Failed for S at %d, %d: 0%x != 0%x\n", i, j, a.S[i][j], b.S[i][j]);
 
                 return false;
                 //printf("Failed for S at %d, %d: 0%x != 0%x\n", i, j, a.S[i][j], b.S[i][j]);
 
                 return false;
@@ -24,13 +38,13 @@ bool equalCtx(const BLOWFISH_CTX & a, const BLOWFISH_CTX & b)
 
 bool equalString(const char* a, const char* b, size_t length)
 {
 
 bool equalString(const char* a, const char* b, size_t length)
 {
-    bool res = true;
     for (size_t i = 0; i < length; ++i)
     for (size_t i = 0; i < length; ++i)
-        if (a[i] != b[i]) {
+        if (a[i] != b[i])
+        {
             //printf("Failed at pos %d: %hhu != %hhu\n", i, a[i], b[i]);
             //printf("Failed at pos %d: %hhu != %hhu\n", i, a[i], b[i]);
-            res = false;
+            return false;
         }
         }
-    return res;
+    return true;
 }
 
 const BLOWFISH_CTX testCtx =
 }
 
 const BLOWFISH_CTX testCtx =
@@ -318,153 +332,109 @@ const unsigned char testString[] = { 68, 100, 2, 115, 6, 54, 226, 228 };
 
 } // namespace anonymous
 
 
 } // namespace anonymous
 
-namespace tut
-{
-    struct crypto_data {
-    };
-
-    typedef test_group<crypto_data> tg;
-    tg crypto_test_group("Crypto tests group");
-
-    typedef tg::object testobject;
-
-    template<>
-    template<>
-    void testobject::test<1>()
-    {
-        set_test_name("Check context creation");
-
-        BLOWFISH_CTX ctx;
-        InitContext("pr7Hhen", 7, &ctx);
-        ensure("ctx == testCtx", equalCtx(ctx, testCtx));
-    }
-
-    template<>
-    template<>
-    void testobject::test<2>()
-    {
-        set_test_name("Check encryption");
-
-        BLOWFISH_CTX ctx;
-        InitContext("pr7Hhen", 7, &ctx);
-        uint32_t a = 0x12345678;
-        uint32_t b = 0x87654321;
-        Blowfish_Encrypt(&ctx, &a, &b);
-
-        ensure_equals("a == 0xd3988cd", a, 0xd3988cd);
-        ensure_equals("b == 0x7996c6d6", b, 0x7996c6d6);
-    }
-
-    template<>
-    template<>
-    void testobject::test<3>()
-    {
-        set_test_name("Check decryption");
-
-        BLOWFISH_CTX ctx;
-        InitContext("pr7Hhen", 7, &ctx);
-        uint32_t a = 0xd3988cd;
-        uint32_t b = 0x7996c6d6;
-        Blowfish_Decrypt(&ctx, &a, &b);
-
-        ensure_equals("a == 0x12345678", a, 0x12345678);
-        ensure_equals("b == 0x87654321", b, 0x87654321);
-    }
-
-    template<>
-    template<>
-    void testobject::test<4>()
-    {
-        set_test_name("Check block encryption");
-
-        BLOWFISH_CTX ctx;
-        InitContext("pr7Hhen", 7, &ctx);
-        uint32_t block[2] = {0x12345678, 0x87654321};
-        EncryptBlock(&block, &block, &ctx);
-
-        ensure_equals("block[0] == 0xd3988cd", block[0], 0xd3988cd);
-        ensure_equals("block[1] == 0x7996c6d6", block[1], 0x7996c6d6);
-    }
-
-    template<>
-    template<>
-    void testobject::test<5>()
-    {
-        set_test_name("Check block decryption");
-
-        BLOWFISH_CTX ctx;
-        InitContext("pr7Hhen", 7, &ctx);
-        uint32_t block[2] = {0xd3988cd, 0x7996c6d6};
-        DecryptBlock(&block, &block, &ctx);
-
-        ensure_equals("block[0] == 0x12345678", block[0], 0x12345678);
-        ensure_equals("block[1] == 0x87654321", block[1], 0x87654321);
-    }
-
-    template<>
-    template<>
-    void testobject::test<6>()
-    {
-        set_test_name("Check string encryption");
+BOOST_AUTO_TEST_SUITE(Crypto)
 
 
-        BLOWFISH_CTX ctx;
-        InitContext("pr7Hhen", 7, &ctx);
-        char res[8];
-        EncryptString(res, "testtest", 8, &ctx);
+BOOST_AUTO_TEST_CASE(ContextCreation)
+{
+    BLOWFISH_CTX ctx;
+    InitContext("pr7Hhen", 7, &ctx);
+    BOOST_CHECK(equalCtx(ctx, testCtx));
+}
 
 
-        ensure("EncryptString(\"testtest\") == testString", equalString(res, (char *)testString, 8));
-    }
+BOOST_AUTO_TEST_CASE(Encryption)
+{
+    BLOWFISH_CTX ctx;
+    InitContext("pr7Hhen", 7, &ctx);
+    uint32_t a = 0x12345678;
+    uint32_t b = 0x87654321;
+    Blowfish_Encrypt(&ctx, &a, &b);
+
+    BOOST_CHECK_EQUAL(a, 0xd3988cd);
+    BOOST_CHECK_EQUAL(b, 0x7996c6d6);
+}
 
 
-    template<>
-    template<>
-    void testobject::test<7>()
-    {
-        set_test_name("Check long string encryption");
+BOOST_AUTO_TEST_CASE(Decryption)
+{
+    BLOWFISH_CTX ctx;
+    InitContext("pr7Hhen", 7, &ctx);
+    uint32_t a = 0xd3988cd;
+    uint32_t b = 0x7996c6d6;
+    Blowfish_Decrypt(&ctx, &a, &b);
+
+    BOOST_CHECK_EQUAL(a, 0x12345678);
+    BOOST_CHECK_EQUAL(b, 0x87654321);
+}
 
 
-        BLOWFISH_CTX ctx;
-        InitContext("pr7Hhen", 7, &ctx);
-        std::string source("abcdefghijklmnopqrstuvwxyz 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ");
-        char longTest[source.length() + 8];
-        EncryptString(longTest, source.c_str(), source.length() + 1, &ctx);
-        DecryptString(longTest, longTest, sizeof(longTest), &ctx);
+BOOST_AUTO_TEST_CASE(BlockEncryption)
+{
+    BLOWFISH_CTX ctx;
+    InitContext("pr7Hhen", 7, &ctx);
+    uint32_t block[2] = {0x12345678, 0x87654321};
+    EncryptBlock(&block, &block, &ctx);
 
 
-        ensure_equals("DecryptString(EncryptString(longTest)) == longTest", source, std::string(longTest));
-    }
+    BOOST_CHECK_EQUAL(block[0], 0xd3988cd);
+    BOOST_CHECK_EQUAL(block[1], 0x7996c6d6);
+}
 
 
-    template<>
-    template<>
-    void testobject::test<8>()
-    {
-        set_test_name("Check old string encryption");
+BOOST_AUTO_TEST_CASE(BlockDecryption)
+{
+    BLOWFISH_CTX ctx;
+    InitContext("pr7Hhen", 7, &ctx);
+    uint32_t block[2] = {0xd3988cd, 0x7996c6d6};
+    DecryptBlock(&block, &block, &ctx);
 
 
-        BLOWFISH_CTX ctx;
-        InitContext("123456", 7, &ctx);
-        const unsigned char source[] = {0xe9, 0xfe, 0xcb, 0xc5, 0xad, 0x3e, 0x87, 0x39,
-                                        0x3d, 0xd5, 0xf4, 0xed, 0xb0, 0x15, 0xe6, 0xcb,
-                                        0x3d, 0xd5, 0xf4, 0xed, 0xb0, 0x15, 0xe6, 0xcb,
-                                        0x3d, 0xd5, 0xf4, 0xed, 0xb0, 0x15, 0xe6, 0xcb};
-        char res[32];
-        DecryptString(res, source, 32, &ctx);
+    BOOST_CHECK_EQUAL(block[0], 0x12345678);
+    BOOST_CHECK_EQUAL(block[1], 0x87654321);
+}
 
 
-        ensure_equals("DecryptString(...) == 'admin'", std::string(res), "admin");
-    }
+BOOST_AUTO_TEST_CASE(StringEncryption)
+{
+    BLOWFISH_CTX ctx;
+    InitContext("pr7Hhen", 7, &ctx);
+    char res[8];
+    EncryptString(res, "testtest", 8, &ctx);
 
 
-    template<>
-    template<>
-    void testobject::test<9>()
-    {
-        set_test_name("Check new string encryption");
+    BOOST_CHECK(equalString(res, reinterpret_cast<const char*>(testString), 8));
+}
 
 
-        BLOWFISH_CTX ctx;
-        InitContext("123456", 7, &ctx);
-        const unsigned char source[] = {0xe9, 0xfe, 0xcb, 0xc5, 0xad, 0x3e, 0x87, 0x39,
-                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-        char res[32];
-        DecryptString(res, source, 32, &ctx);
+BOOST_AUTO_TEST_CASE(LongStringEncryption)
+{
+    BLOWFISH_CTX ctx;
+    InitContext("pr7Hhen", 7, &ctx);
+    const std::string source("abcdefghijklmnopqrstuvwxyz 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+    std::vector<char> longTest(source.length() + 8);
+    EncryptString(longTest.data(), source.c_str(), source.length() + 1, &ctx);
+    DecryptString(longTest.data(), longTest.data(), longTest.size(), &ctx);
+
+    BOOST_CHECK_EQUAL(source, std::string(longTest.data()));
+}
 
 
-        ensure_equals("DecryptString(...) == 'admin'", std::string(res), "admin");
-    }
+BOOST_AUTO_TEST_CASE(OldStringEncryption)
+{
+    BLOWFISH_CTX ctx;
+    InitContext("123456", 7, &ctx);
+    const unsigned char source[] = {0xe9, 0xfe, 0xcb, 0xc5, 0xad, 0x3e, 0x87, 0x39,
+                                    0x3d, 0xd5, 0xf4, 0xed, 0xb0, 0x15, 0xe6, 0xcb,
+                                    0x3d, 0xd5, 0xf4, 0xed, 0xb0, 0x15, 0xe6, 0xcb,
+                                    0x3d, 0xd5, 0xf4, 0xed, 0xb0, 0x15, 0xe6, 0xcb};
+    std::array<char, 32> res{};
+    DecryptString(res.data(), source, res.size(), &ctx);
+
+    BOOST_CHECK_EQUAL(std::string(res.data()), "admin");
+}
 
 
+BOOST_AUTO_TEST_CASE(NewStringEncryption)
+{
+    BLOWFISH_CTX ctx;
+    InitContext("123456", 7, &ctx);
+    const unsigned char source[] = {0xe9, 0xfe, 0xcb, 0xc5, 0xad, 0x3e, 0x87, 0x39,
+                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+    std::array<char, 32> res{};
+    DecryptString(res.data(), source, 32, &ctx);
+
+    BOOST_CHECK_EQUAL(std::string(res.data()), "admin");
 }
 }
+
+BOOST_AUTO_TEST_SUITE_END()
index 90a2cdd5a44758ec193cdfa6a196bc2c8ebb770e..a7b3e8a5bb0a845c82c586ab5aa7c92f82a939a0 100644 (file)
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
+#define BOOST_TEST_MODULE STGRawIP
+
+#include "raw_ip_packet_old.h"
+#include "stg/raw_ip_packet.h"
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wold-style-cast"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wsign-compare"
+#pragma GCC diagnostic ignored "-Wparentheses"
+#include <boost/test/unit_test.hpp>
+#pragma GCC diagnostic pop
 
 #include <cstdlib>
 #include <cstdint>
 #include <ctime>
 #include <iostream>
 
 
 #include <cstdlib>
 #include <cstdint>
 #include <ctime>
 #include <iostream>
 
-#include "tut/tut.hpp"
-
-#include "raw_ip_packet_old.h"
-#include "stg/raw_ip_packet.h"
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
 
 
-#ifndef ITERATIONS
-#define ITERATIONS 1000
-#endif
+namespace
+{
 
 
-void genVector(uint8_t * buf);
+constexpr size_t ITERATIONS = 1000;
 
 
-namespace STG
+std::array<uint8_t, 68> genVector()
 {
 {
-std::ostream & operator<<(std::ostream & stream, const RawPacket & p);
+    std::array<uint8_t, 68> res;
+    for (size_t i = 0; i < 68; ++i)
+        res[i] = rand() % 256;
+    res[0] = (res[0] & 0xF0) | 0x05; // Fix header length
+    return res;
 }
 
 }
 
-namespace tut
-{
-    struct rp_data {
-    };
-
-    typedef test_group<rp_data> tg;
-    tg rp_test_group("STG::RawPacket tests group");
-
-    typedef tg::object testobject;
-
-    template<>
-    template<>
-    void testobject::test<1>()
-    {
-        set_test_name("Check structure consistency");
-
-        STG::RawPacket rp;
-        rp.rawPacket.header.ipHeader.ip_v = 4;
-        rp.rawPacket.header.ipHeader.ip_hl = 5;
-        rp.rawPacket.header.ipHeader.ip_tos = 0;
-        rp.rawPacket.header.ipHeader.ip_len = htons(40); // 20 of header + 20 of data
-        rp.rawPacket.header.ipHeader.ip_p = 6;
-        rp.rawPacket.header.ipHeader.ip_src.s_addr = inet_addr("192.168.0.1");
-        rp.rawPacket.header.ipHeader.ip_dst.s_addr = inet_addr("192.168.0.101");
-        rp.rawPacket.header.sPort = htons(80);
-        rp.rawPacket.header.dPort = htons(38546);
-
-        ensure_equals("IP header size (explicitly)", sizeof(rp.rawPacket.header.ipHeader), static_cast<size_t>(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(), static_cast<uint32_t>(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;
-            STG::RawPacket p2;
-            STG::RawPacket p3;
-
-            uint8_t buf[68];
-            genVector(buf);
-
-            memcpy(p1.pckt, buf, 68);
-            memcpy(p2.rawPacket.data, buf, 68);
-            memcpy(p3.rawPacket.data, 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)
+namespace std
 {
 {
-    for (size_t i = 0; i < 68; ++i) {
-        buf[i] = rand() % 256;
-    }
-    buf[0] = (buf[0] & 0xF0) | 0x05; // Fix header length
-}
 
 
-std::ostream & STG::operator<<(std::ostream & stream, const RawPacket & p)
+std::ostream & operator<<(std::ostream& stream, const STG::RawPacket& p)
 {
 {
-    stream.unsetf(std::ios::dec);
     stream.setf(std::ios::hex);
     for (size_t i = 0; i < sizeof(p.rawPacket.data); ++i) {
         stream << static_cast<unsigned>(p.rawPacket.data[i]);
     }
     stream.setf(std::ios::hex);
     for (size_t i = 0; i < sizeof(p.rawPacket.data); ++i) {
         stream << static_cast<unsigned>(p.rawPacket.data[i]);
     }
-    stream.unsetf(std::ios::hex);
     stream.setf(std::ios::dec);
     return stream;
 }
     stream.setf(std::ios::dec);
     return stream;
 }
+
+}
+
+BOOST_AUTO_TEST_SUITE(RawIP)
+
+BOOST_AUTO_TEST_CASE(StructureConsistency)
+{
+    STG::RawPacket rp;
+    rp.rawPacket.header.ipHeader.ip_v = 4;
+    rp.rawPacket.header.ipHeader.ip_hl = 5;
+    rp.rawPacket.header.ipHeader.ip_tos = 0;
+    rp.rawPacket.header.ipHeader.ip_len = htons(40); // 20 of header + 20 of data
+    rp.rawPacket.header.ipHeader.ip_p = 6;
+    rp.rawPacket.header.ipHeader.ip_src.s_addr = inet_addr("192.168.0.1");
+    rp.rawPacket.header.ipHeader.ip_dst.s_addr = inet_addr("192.168.0.101");
+    rp.rawPacket.header.sPort = htons(80);
+    rp.rawPacket.header.dPort = htons(38546);
+
+    BOOST_CHECK_EQUAL(sizeof(rp.rawPacket.header.ipHeader), static_cast<size_t>(20));
+    BOOST_CHECK_EQUAL(rp.GetIPVersion(), 4);
+    BOOST_CHECK_EQUAL(rp.GetHeaderLen(), 20);
+    BOOST_CHECK_EQUAL(rp.GetProto(), 6);
+    BOOST_CHECK_EQUAL(rp.GetLen(), static_cast<uint32_t>(40));
+    BOOST_CHECK_EQUAL(rp.GetSrcIP(), inet_addr("192.168.0.1"));
+    BOOST_CHECK_EQUAL(rp.GetDstIP(), inet_addr("192.168.0.101"));
+    BOOST_CHECK_EQUAL(rp.GetSrcPort(), 80);
+    BOOST_CHECK_EQUAL(rp.GetDstPort(), 38546);
+}
+
+BOOST_AUTO_TEST_CASE(RandomTests)
+{
+    srand(time(NULL));
+    for (size_t i = 0; i < ITERATIONS; ++i)
+    {
+        RAW_PACKET_OLD p1;
+        STG::RawPacket p2;
+        STG::RawPacket p3;
+
+        const auto buf = genVector();
+
+        memcpy(p1.pckt, buf.data(), 68);
+        memcpy(p2.rawPacket.data, buf.data(), 68);
+        memcpy(p3.rawPacket.data, buf.data(), 68);
+
+        BOOST_CHECK_EQUAL(p1.GetIPVersion(), p2.GetIPVersion());
+        BOOST_CHECK_EQUAL(p1.GetHeaderLen(), p2.GetHeaderLen());
+        BOOST_CHECK_EQUAL(p1.GetProto(), p2.GetProto());
+        BOOST_CHECK_EQUAL(p1.GetSrcIP(), p2.GetSrcIP());
+        BOOST_CHECK_EQUAL(p1.GetDstIP(), p2.GetDstIP());
+        BOOST_CHECK_EQUAL(p1.GetSrcPort(), p2.GetSrcPort());
+        BOOST_CHECK_EQUAL(p1.GetDstPort(), p2.GetDstPort());
+
+        BOOST_CHECK_EQUAL(p2, p3);
+        BOOST_CHECK_EQUAL(p3, p2);
+    }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
index f5b7d57e42cd5ebd1da7bd5968e07634c4cb0197..da681a215f96272473844f79a0b57202d85a0238 100644 (file)
-#include "tut/tut.hpp"
+#define BOOST_TEST_MODULE STGTariff
 
 #include "stg/tariff_conf.h"
 #include "tariff_impl.h"
 
 
 #include "stg/tariff_conf.h"
 #include "tariff_impl.h"
 
-namespace tut
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wold-style-cast"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#pragma GCC diagnostic ignored "-Wsign-compare"
+#pragma GCC diagnostic ignored "-Wparentheses"
+#include <boost/test/unit_test.hpp>
+#pragma GCC diagnostic pop
+
+BOOST_AUTO_TEST_SUITE(Tariffs)
+
+BOOST_AUTO_TEST_CASE(Construction)
+{
+    STG::TariffData td("test");
+    td.tariffConf.fee = 1;
+    td.tariffConf.free = 2;
+    td.tariffConf.traffType = STG::Tariff::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;
+    const STG::TariffImpl tariff(td);
+
+    BOOST_CHECK(tariff.GetFreeMb() == td.tariffConf.free);
+    BOOST_CHECK(tariff.GetPassiveCost() == td.tariffConf.passiveCost);
+    BOOST_CHECK(tariff.GetFee() == td.tariffConf.fee);
+    BOOST_CHECK(tariff.GetFree() == td.tariffConf.free);
+    BOOST_CHECK(tariff.GetName() == td.tariffConf.name);
+    BOOST_CHECK(tariff.GetTraffType() == td.tariffConf.traffType);
+    BOOST_CHECK(tariff.GetThreshold(0) == td.dirPrice[0].threshold);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(6, 0), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(5, 1), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(4, 2), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(3, 3), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(2, 4), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(1, 5), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(0, 6), 6);
+}
+
+BOOST_AUTO_TEST_CASE(TraffTypes)
+{
+    STG::TariffData td("test");
+    td.tariffConf.fee = 1;
+    td.tariffConf.free = 2;
+    td.tariffConf.traffType = STG::Tariff::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;
+    STG::TariffImpl tariff(td);
+
+    BOOST_CHECK(tariff.GetTraffType() == STG::Tariff::TRAFF_UP);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(6, 0), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(5, 1), 5);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(4, 2), 4);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(3, 3), 3);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(2, 4), 2);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(1, 5), 1);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(0, 6), 0);
+
+    td.tariffConf.traffType = STG::Tariff::TRAFF_DOWN;
+    tariff = td;
+
+    BOOST_CHECK(tariff.GetTraffType() == STG::Tariff::TRAFF_DOWN);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(6, 0), 0);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(5, 1), 1);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(4, 2), 2);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(3, 3), 3);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(2, 4), 4);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(1, 5), 5);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(0, 6), 6);
+
+    td.tariffConf.traffType = STG::Tariff::TRAFF_MAX;
+    tariff = td;
+
+    BOOST_CHECK(tariff.GetTraffType() == STG::Tariff::TRAFF_MAX);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(6, 0), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(5, 1), 5);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(4, 2), 4);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(3, 3), 3);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(2, 4), 4);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(1, 5), 5);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(0, 6), 6);
+
+    td.tariffConf.traffType = STG::Tariff::TRAFF_UP_DOWN;
+    tariff = td;
+
+    BOOST_CHECK(tariff.GetTraffType() == STG::Tariff::TRAFF_UP_DOWN);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(6, 0), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(5, 1), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(4, 2), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(3, 3), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(2, 4), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(1, 5), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(0, 6), 6);
+}
+
+BOOST_AUTO_TEST_CASE(NormalIntervalPrices)
+{
+    STG::TariffData td("test");
+    td.tariffConf.fee = 1;
+    td.tariffConf.free = 2;
+    td.tariffConf.traffType = STG::Tariff::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;
+    STG::TariffImpl tariff(td);
+
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 1); // Near 17:30, 6 > 4 DB
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 2); // Near 22:30, 0 < 4 NA
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 3); // Near 22:30, 6 > 4 NB
+
+    td.dirPrice[0].singlePrice = 1;
+    tariff = td;
+
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 1); // Near 17:30, 6 > 4 DB
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
+    BOOST_CHECK_EQUAL(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;
+
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 6 > 4 DA
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 2); // Near 22:30, 0 < 4 NA
+    BOOST_CHECK_EQUAL(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;
+
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 6 > 4 DA
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 6 > 4 DA
+}
+
+BOOST_AUTO_TEST_CASE(ConstructionForDayNightInversion)
+{
+    STG::TariffData td("test");
+    td.tariffConf.fee = 1;
+    td.tariffConf.free = 2;
+    td.tariffConf.traffType = STG::Tariff::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;
+    const STG::TariffImpl tariff(td);
+
+    BOOST_CHECK(tariff.GetFreeMb() == td.tariffConf.free);
+    BOOST_CHECK(tariff.GetPassiveCost() == td.tariffConf.passiveCost);
+    BOOST_CHECK(tariff.GetFee() == td.tariffConf.fee);
+    BOOST_CHECK(tariff.GetFree() == td.tariffConf.free);
+    BOOST_CHECK(tariff.GetName() == td.tariffConf.name);
+    BOOST_CHECK(tariff.GetTraffType() == td.tariffConf.traffType);
+    BOOST_CHECK(tariff.GetThreshold(0) == td.dirPrice[0].threshold);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(6, 0), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(5, 1), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(4, 2), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(3, 3), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(2, 4), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(1, 5), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(0, 6), 6);
+}
+
+BOOST_AUTO_TEST_CASE(TraffTypeForDayNightInversion)
+{
+    STG::TariffData td("test");
+    td.tariffConf.fee = 1;
+    td.tariffConf.free = 2;
+    td.tariffConf.traffType = STG::Tariff::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;
+    STG::TariffImpl tariff(td);
+
+    BOOST_CHECK(tariff.GetTraffType() == STG::Tariff::TRAFF_UP);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(6, 0), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(5, 1), 5);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(4, 2), 4);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(3, 3), 3);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(2, 4), 2);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(1, 5), 1);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(0, 6), 0);
+
+    td.tariffConf.traffType = STG::Tariff::TRAFF_DOWN;
+    tariff = td;
+
+    BOOST_CHECK(tariff.GetTraffType() == STG::Tariff::TRAFF_DOWN);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(6, 0), 0);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(5, 1), 1);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(4, 2), 2);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(3, 3), 3);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(2, 4), 4);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(1, 5), 5);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(0, 6), 6);
+
+    td.tariffConf.traffType = STG::Tariff::TRAFF_MAX;
+    tariff = td;
+
+    BOOST_CHECK(tariff.GetTraffType() == STG::Tariff::TRAFF_MAX);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(6, 0), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(5, 1), 5);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(4, 2), 4);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(3, 3), 3);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(2, 4), 4);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(1, 5), 5);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(0, 6), 6);
+
+    td.tariffConf.traffType = STG::Tariff::TRAFF_UP_DOWN;
+    tariff = td;
+
+    BOOST_CHECK(tariff.GetTraffType() == STG::Tariff::TRAFF_UP_DOWN);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(6, 0), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(5, 1), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(4, 2), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(3, 3), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(2, 4), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(1, 5), 6);
+    BOOST_CHECK_EQUAL(tariff.GetTraffByType(0, 6), 6);
+}
+
+BOOST_AUTO_TEST_CASE(NormalIntervalPricesForDayNightInversion)
+{
+    STG::TariffData td("test");
+    td.tariffConf.fee = 1;
+    td.tariffConf.free = 2;
+    td.tariffConf.traffType = STG::Tariff::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;
+    STG::TariffImpl tariff(td);
+
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 2); // Near 17:30, 0 < 4 NA
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 3); // Near 17:30, 6 > 4 NB
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 1); // Near 22:30, 6 > 4 DB
+
+    td.dirPrice[0].singlePrice = 1;
+    tariff = td;
+
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA (ignore night)
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 1); // Near 17:30, 6 > 4 DB (ignore night)
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA (ignore night)
+    BOOST_CHECK_EQUAL(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;
+
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 2); // Near 17:30, 0 < 4 NA
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 2); // Near 17:30, 6 > 4 NA
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA
+    BOOST_CHECK_EQUAL(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;
+
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 0 < 4 DA (ignore night)
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286461245), 0); // Near 17:30, 6 > 4 DA (ignore night)
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 0 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 0 < 4 DA (ignore night)
+    BOOST_CHECK_EQUAL(tariff.GetPriceWithTraffType(0, 6 * 1024 * 1024, 0, 1286479245), 0); // Near 22:30, 6 > 4 DA (ignore night)
+}
+
+BOOST_AUTO_TEST_CASE(ChangePolicyAllow)
+{
+    STG::TariffData td("test");
+    td.tariffConf.changePolicy = STG::Tariff::ALLOW;
+    td.tariffConf.fee = 100;
+    const STG::TariffImpl tariff(td);
+
+    td.tariffConf.fee = 50;
+    const STG::TariffImpl cheaper(td);
+
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), true);
+
+    td.tariffConf.fee = 100;
+    const STG::TariffImpl equal(td);
+
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(equal, 1461606400).empty(), true);
+
+    td.tariffConf.fee = 150;
+    const STG::TariffImpl expensive(td);
+
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(expensive, 1461606400).empty(), true);
+}
+
+BOOST_AUTO_TEST_CASE(ChangePolicyToCheap)
 {
 {
-    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");
-
-        STG::TariffData td("test");
-        td.tariffConf.fee = 1;
-        td.tariffConf.free = 2;
-        td.tariffConf.traffType = STG::Tariff::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;
-        STG::TariffImpl 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");
-
-        STG::TariffData td("test");
-        td.tariffConf.fee = 1;
-        td.tariffConf.free = 2;
-        td.tariffConf.traffType = STG::Tariff::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;
-        STG::TariffImpl tariff(td);
-
-        ensure("traffType = TRAFF_UP", tariff.GetTraffType() == STG::Tariff::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 = STG::Tariff::TRAFF_DOWN;
-        tariff = td;
-
-        ensure("traffType = TRAFF_DOWN", tariff.GetTraffType() == STG::Tariff::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 = STG::Tariff::TRAFF_MAX;
-        tariff = td;
-
-        ensure("traffType = TRAFF_MAX", tariff.GetTraffType() == STG::Tariff::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 = STG::Tariff::TRAFF_UP_DOWN;
-        tariff = td;
-
-        ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == STG::Tariff::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");
-
-        STG::TariffData td("test");
-        td.tariffConf.fee = 1;
-        td.tariffConf.free = 2;
-        td.tariffConf.traffType = STG::Tariff::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;
-        STG::TariffImpl 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");
-
-        STG::TariffData td("test");
-        td.tariffConf.fee = 1;
-        td.tariffConf.free = 2;
-        td.tariffConf.traffType = STG::Tariff::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;
-        STG::TariffImpl 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");
-
-        STG::TariffData td("test");
-        td.tariffConf.fee = 1;
-        td.tariffConf.free = 2;
-        td.tariffConf.traffType = STG::Tariff::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;
-        STG::TariffImpl tariff(td);
-
-        ensure("traffType = TRAFF_UP", tariff.GetTraffType() == STG::Tariff::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 = STG::Tariff::TRAFF_DOWN;
-        tariff = td;
-
-        ensure("traffType = TRAFF_DOWN", tariff.GetTraffType() == STG::Tariff::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 = STG::Tariff::TRAFF_MAX;
-        tariff = td;
-
-        ensure("traffType = TRAFF_MAX", tariff.GetTraffType() == STG::Tariff::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 = STG::Tariff::TRAFF_UP_DOWN;
-        tariff = td;
-
-        ensure("traffType = TRAFF_UP_DOWN", tariff.GetTraffType() == STG::Tariff::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");
-
-        STG::TariffData td("test");
-        td.tariffConf.fee = 1;
-        td.tariffConf.free = 2;
-        td.tariffConf.traffType = STG::Tariff::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;
-        STG::TariffImpl 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)
-   }
-
-    template<>
-    template<>
-    void testobject::test<7>()
-    {
-        set_test_name("Check changePolicy - ALLOW");
-
-        STG::TariffData td("test");
-        td.tariffConf.changePolicy = STG::Tariff::ALLOW;
-        td.tariffConf.fee = 100;
-        STG::TariffImpl tariff(td);
-
-        td.tariffConf.fee = 50;
-        STG::TariffImpl cheaper(td);
-
-        ensure_equals("Allow cheaper", tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), true);
-
-        td.tariffConf.fee = 100;
-        STG::TariffImpl equal(td);
-
-        ensure_equals("Allow equal", tariff.TariffChangeIsAllowed(equal, 1461606400).empty(), true);
-
-        td.tariffConf.fee = 150;
-        STG::TariffImpl expensive(td);
-
-        ensure_equals("Allow expensive", tariff.TariffChangeIsAllowed(expensive, 1461606400).empty(), true);
-    }
-
-    template<>
-    template<>
-    void testobject::test<8>()
-    {
-        set_test_name("Check changePolicy - TO_CHEAP");
-
-        STG::TariffData td("test");
-        td.tariffConf.changePolicy = STG::Tariff::TO_CHEAP;
-        td.tariffConf.fee = 100;
-        STG::TariffImpl tariff(td);
-
-        td.tariffConf.fee = 50;
-        STG::TariffImpl cheaper(td);
-
-        ensure_equals("Allow cheaper", tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), true);
-
-        td.tariffConf.fee = 100;
-        STG::TariffImpl equal(td);
-
-        ensure_equals("Prohibit equal", tariff.TariffChangeIsAllowed(equal, 1461606400).empty(), false);
-
-        td.tariffConf.fee = 150;
-        STG::TariffImpl expensive(td);
-
-        ensure_equals("Prohibit expensive", tariff.TariffChangeIsAllowed(expensive, 1461606400).empty(), false);
-    }
-
-    template<>
-    template<>
-    void testobject::test<9>()
-    {
-        set_test_name("Check changePolicy - TO_EXPENSIVE");
+    STG::TariffData td("test");
+    td.tariffConf.changePolicy = STG::Tariff::TO_CHEAP;
+    td.tariffConf.fee = 100;
+    const STG::TariffImpl tariff(td);
 
 
-        STG::TariffData td("test");
-        td.tariffConf.changePolicy = STG::Tariff::TO_EXPENSIVE;
-        td.tariffConf.fee = 100;
-        STG::TariffImpl tariff(td);
+    td.tariffConf.fee = 50;
+    const STG::TariffImpl cheaper(td);
 
 
-        td.tariffConf.fee = 50;
-        STG::TariffImpl cheaper(td);
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), true);
 
 
-        ensure_equals("Prohibit cheaper", tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), false);
+    td.tariffConf.fee = 100;
+    const STG::TariffImpl equal(td);
 
 
-        td.tariffConf.fee = 100;
-        STG::TariffImpl equal(td);
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(equal, 1461606400).empty(), false);
 
 
-        ensure_equals("Allow equal", tariff.TariffChangeIsAllowed(equal, 1461606400).empty(), true);
+    td.tariffConf.fee = 150;
+    const STG::TariffImpl expensive(td);
 
 
-        td.tariffConf.fee = 150;
-        STG::TariffImpl expensive(td);
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(expensive, 1461606400).empty(), false);
+}
 
 
-        ensure_equals("Allow expensive", tariff.TariffChangeIsAllowed(expensive, 1461606400).empty(), true);
-    }
+BOOST_AUTO_TEST_CASE(ChangePolicyToExpensive)
+{
+    STG::TariffData td("test");
+    td.tariffConf.changePolicy = STG::Tariff::TO_EXPENSIVE;
+    td.tariffConf.fee = 100;
+    const STG::TariffImpl tariff(td);
 
 
-    template<>
-    template<>
-    void testobject::test<10>()
-    {
-        set_test_name("Check changePolicy - DENY");
+    td.tariffConf.fee = 50;
+    const STG::TariffImpl cheaper(td);
 
 
-        STG::TariffData td("test");
-        td.tariffConf.changePolicy = STG::Tariff::DENY;
-        td.tariffConf.fee = 100;
-        STG::TariffImpl tariff(td);
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), false);
 
 
-        td.tariffConf.fee = 50;
-        STG::TariffImpl cheaper(td);
+    td.tariffConf.fee = 100;
+    const STG::TariffImpl equal(td);
 
 
-        ensure_equals("Prohibit cheaper", tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), false);
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(equal, 1461606400).empty(), true);
 
 
-        td.tariffConf.fee = 100;
-        STG::TariffImpl equal(td);
+    td.tariffConf.fee = 150;
+    const STG::TariffImpl expensive(td);
 
 
-        ensure_equals("Prohibit equal", tariff.TariffChangeIsAllowed(equal, 1461606400).empty(), false);
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(expensive, 1461606400).empty(), true);
+}
 
 
-        td.tariffConf.fee = 150;
-        STG::TariffImpl expensive(td);
+BOOST_AUTO_TEST_CASE(ChangePolicyDeny)
+{
+    STG::TariffData td("test");
+    td.tariffConf.changePolicy = STG::Tariff::DENY;
+    td.tariffConf.fee = 100;
+    const STG::TariffImpl tariff(td);
+
+    td.tariffConf.fee = 50;
+    const STG::TariffImpl cheaper(td);
 
 
-        ensure_equals("Prohibit expensive", tariff.TariffChangeIsAllowed(expensive, 1461606400).empty(), false);
-    }
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), false);
 
 
-    template<>
-    template<>
-    void testobject::test<11>()
-    {
-        set_test_name("Check changePolicyTimeout < current time");
+    td.tariffConf.fee = 100;
+    const STG::TariffImpl equal(td);
 
 
-        STG::TariffData td("test");
-        td.tariffConf.changePolicyTimeout = 1451606400;
-        td.tariffConf.changePolicy = STG::Tariff::TO_EXPENSIVE;
-        td.tariffConf.fee = 100;
-        STG::TariffImpl tariff(td);
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(equal, 1461606400).empty(), false);
 
 
-        td.tariffConf.fee = 50;
-        STG::TariffImpl cheaper(td);
+    td.tariffConf.fee = 150;
+    const STG::TariffImpl expensive(td);
 
 
-        ensure_equals("Allow cheaper", tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), true);
-    }
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(expensive, 1461606400).empty(), false);
+}
+
+BOOST_AUTO_TEST_CASE(ChangePolicyTimeoutInThePast)
+{
+    STG::TariffData td("test");
+    td.tariffConf.changePolicyTimeout = 1451606400;
+    td.tariffConf.changePolicy = STG::Tariff::TO_EXPENSIVE;
+    td.tariffConf.fee = 100;
+    const STG::TariffImpl tariff(td);
 
 
-    template<>
-    template<>
-    void testobject::test<12>()
-    {
-        set_test_name("Check changePolicyTimeout > current time");
+    td.tariffConf.fee = 50;
+    const STG::TariffImpl cheaper(td);
 
 
-        STG::TariffData td("test");
-        td.tariffConf.changePolicyTimeout = 1483228800;
-        td.tariffConf.changePolicy = STG::Tariff::TO_EXPENSIVE;
-        td.tariffConf.fee = 100;
-        STG::TariffImpl tariff(td);
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), true);
+}
 
 
-        td.tariffConf.fee = 50;
-        STG::TariffImpl cheaper(td);
+BOOST_AUTO_TEST_CASE(ChangePolicyTimeoutInFuture)
+{
+    STG::TariffData td("test");
+    td.tariffConf.changePolicyTimeout = 1483228800;
+    td.tariffConf.changePolicy = STG::Tariff::TO_EXPENSIVE;
+    td.tariffConf.fee = 100;
+    const STG::TariffImpl tariff(td);
 
 
-        ensure_equals("Prohibit cheaper", tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), false);
-    }
+    td.tariffConf.fee = 50;
+    const STG::TariffImpl cheaper(td);
 
 
-    template<>
-    template<>
-    void testobject::test<13>()
-    {
-        set_test_name("Check changePolicyTimeout = 0");
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), false);
+}
 
 
-        STG::TariffData td("test");
-        td.tariffConf.changePolicyTimeout = 0;
-        td.tariffConf.changePolicy = STG::Tariff::TO_EXPENSIVE;
-        td.tariffConf.fee = 100;
-        STG::TariffImpl tariff(td);
+BOOST_AUTO_TEST_CASE(ChangePolicyTimeoutNow)
+{
+    STG::TariffData td("test");
+    td.tariffConf.changePolicyTimeout = 0;
+    td.tariffConf.changePolicy = STG::Tariff::TO_EXPENSIVE;
+    td.tariffConf.fee = 100;
+    const STG::TariffImpl tariff(td);
 
 
-        td.tariffConf.fee = 50;
-        STG::TariffImpl cheaper(td);
+    td.tariffConf.fee = 50;
+    const STG::TariffImpl cheaper(td);
 
 
-        ensure_equals("Prohibit cheaper", tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), false);
-    }
+    BOOST_CHECK_EQUAL(tariff.TariffChangeIsAllowed(cheaper, 1461606400).empty(), false);
 }
 }
+
+BOOST_AUTO_TEST_SUITE_END()