#define BOOST_TEST_MODULE STGReconnectOnTariffChange #include "stg/admin.h" #include "stg/user_property.h" #include "user_impl.h" #include "testsettings.h" #include "testtariffs.h" #include "teststore.h" #include "testauth.h" #include "testusers.h" #include "testservices.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 #pragma GCC diagnostic pop volatile time_t stgTime = 0; namespace { class ConnectCtr { public: ConnectCtr() : m_connects(0), m_disconnects(0) {} void update(bool isConnect) { if (isConnect) ++m_connects; else ++m_disconnects; } size_t connects() const { return m_connects; } size_t disconnects() const { return m_disconnects; } private: size_t m_connects; size_t m_disconnects; }; class Settings : public TestSettings { public: Settings(bool reconnectOnTariffChange) : m_reconnectOnTariffChange(reconnectOnTariffChange) {} bool GetReconnectOnTariffChange() const { return m_reconnectOnTariffChange; } private: bool m_reconnectOnTariffChange; }; } BOOST_AUTO_TEST_SUITE(ReconnectOnTariffChange) BOOST_AUTO_TEST_CASE(NormalBehavior) { Settings settings(false); TestTariffs tariffs; tariffs.ReadTariffs(); STG::Admin admin(STG::Priv(0xFFFF), {}, {}); TestStore store; TestAuth auth; TestUsers users; TestServices services; STG::UserImpl user(&settings, &store, &tariffs, &admin, &users, services); ConnectCtr ctr; STG::ScopedConnection conn = user.afterConnectedChange([&ctr](auto, auto newVal){ ctr.update(newVal); }); STG::UserProperty & tariffName = user.GetProperties().tariffName; STG::UserProperty & ips = user.GetProperties().ips; ips = STG::UserIPs::parse("*"); BOOST_CHECK_EQUAL(user.GetConnected(), false); BOOST_CHECK_EQUAL(ctr.connects(), static_cast(0)); BOOST_CHECK_EQUAL(ctr.disconnects(), static_cast(0)); BOOST_CHECK_EQUAL(user.GetProperties().tariffName.ConstData(), NO_TARIFF_NAME); user.Authorize(inet_strington("127.0.0.1"), 0, &auth); user.Run(); BOOST_CHECK_EQUAL(user.IsAuthorizedBy(&auth), true); BOOST_CHECK_EQUAL(user.GetConnected(), true); BOOST_CHECK_EQUAL(ctr.connects(), static_cast(1)); BOOST_CHECK_EQUAL(ctr.disconnects(), static_cast(0)); tariffName = "test"; BOOST_CHECK_EQUAL(user.GetProperties().tariffName.ConstData(), "test"); BOOST_CHECK_EQUAL(user.IsAuthorizedBy(&auth), true); BOOST_CHECK_EQUAL(user.GetConnected(), true); BOOST_CHECK_EQUAL(ctr.connects(), static_cast(1)); BOOST_CHECK_EQUAL(ctr.disconnects(), static_cast(0)); } BOOST_AUTO_TEST_CASE(Reconnect) { Settings settings(true); TestSettings * s1 = &settings; STG::Settings * s2 = &settings; BOOST_CHECK(settings.GetReconnectOnTariffChange()); BOOST_CHECK(s1->GetReconnectOnTariffChange()); BOOST_CHECK(s2->GetReconnectOnTariffChange()); TestTariffs tariffs; STG::Admin admin(STG::Priv(0xFFFF), {}, {}); TestStore store; TestAuth auth; TestUsers users; TestServices services; STG::UserImpl user(&settings, &store, &tariffs, &admin, &users, services); ConnectCtr ctr; STG::ScopedConnection conn = user.afterConnectedChange([&ctr](auto, auto newVal){ ctr.update(newVal); }); STG::UserProperty & tariffName = user.GetProperties().tariffName; STG::UserProperty & ips = user.GetProperties().ips; ips = STG::UserIPs::parse("*"); BOOST_CHECK_EQUAL(user.GetConnected(), false); BOOST_CHECK_EQUAL(ctr.connects(), static_cast(0)); BOOST_CHECK_EQUAL(ctr.disconnects(), static_cast(0)); BOOST_CHECK_EQUAL(user.GetProperties().tariffName.ConstData(), NO_TARIFF_NAME); user.Authorize(inet_strington("127.0.0.1"), 0, &auth); user.Run(); BOOST_CHECK_EQUAL(user.IsAuthorizedBy(&auth), true); BOOST_CHECK_EQUAL(user.GetConnected(), true); BOOST_CHECK_EQUAL(ctr.connects(), static_cast(1)); BOOST_CHECK_EQUAL(ctr.disconnects(), static_cast(0)); tariffName = "test"; BOOST_CHECK_EQUAL(user.GetProperties().tariffName.ConstData(), "test"); BOOST_CHECK_EQUAL(user.IsAuthorizedBy(&auth), true); BOOST_CHECK_EQUAL(user.GetConnected(), true); BOOST_CHECK_EQUAL(ctr.connects(), static_cast(2)); BOOST_CHECK_EQUAL(ctr.disconnects(), static_cast(1)); } BOOST_AUTO_TEST_SUITE_END()