From 06763e6d2b50aa0ae71119450b9f2d635cf3dda0 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Tue, 18 Dec 2018 01:09:49 +0100 Subject: [PATCH] Improve logging in testtimemanager and add some more explicit tests for calendar items crossing midnight --- tests/auto/timemanager/testtimemanager.cpp | 143 +++++++++++++++++++++ 1 file changed, 143 insertions(+) diff --git a/tests/auto/timemanager/testtimemanager.cpp b/tests/auto/timemanager/testtimemanager.cpp index db147ee2..d1c1af40 100644 --- a/tests/auto/timemanager/testtimemanager.cpp +++ b/tests/auto/timemanager/testtimemanager.cpp @@ -30,6 +30,8 @@ class TestTimeManager: public NymeaTestBase Q_OBJECT private slots: + void initTestCase(); + void changeTimeZone_data(); void changeTimeZone(); @@ -67,6 +69,10 @@ private slots: void testCalendarItemStatesEvent_data(); void testCalendarItemStatesEvent(); + void testCalendarItemCrossesMidnight(); + + void testEventBasedWithCalendarItemCrossingMidnight(); + // TimeEventItems void testEventItemDateTime_data(); void testEventItemDateTime(); @@ -116,6 +122,12 @@ private: QVariantMap createTimeDescriptorCalendar(const QVariantList &calendarItems) const; }; +void TestTimeManager::initTestCase() +{ + NymeaTestBase::initTestCase(); + QLoggingCategory::setFilterRules("*.debug=false\nTests.debug=true\nRuleEngine.debug=true\nRuleEngineDebug.debug=true\nMockDevice.*=true\nTimeManager.debug=true"); +} + void TestTimeManager::changeTimeZone_data() { QTest::addColumn("timeZoneId"); @@ -1282,6 +1294,137 @@ void TestTimeManager::testCalendarItemStatesEvent() } } +void TestTimeManager::testCalendarItemCrossesMidnight() +{ + initTimeManager(); + + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(20,00))); + + // Action + QVariantMap action; + action.insert("actionTypeId", mockActionIdNoParams); + action.insert("deviceId", m_mockDeviceId); + action.insert("ruleActionParams", QVariantList()); + + QVariantMap repeatingOptionDaily; + repeatingOptionDaily.insert("mode", "RepeatingModeDaily"); + + // The rule + QVariantMap ruleMap; + ruleMap.insert("name", "Time based from 23:00 to 01:00"); + ruleMap.insert("actions", QVariantList() << action); + ruleMap.insert("timeDescriptor", createTimeDescriptorCalendar(createCalendarItem("23:00", 120, repeatingOptionDaily))); + + QVariant response = injectAndWait("Rules.AddRule", ruleMap); + verifyRuleError(response); + RuleId ruleId = RuleId(response.toMap().value("params").toMap().value("ruleId").toString()); + + QVariantMap params; + params.insert("ruleId", ruleId); + + response = injectAndWait("Rules.GetRuleDetails", params); + QVERIFY2(response.toMap().value("params").toMap().value("rule").toMap().value("active").toBool() == false, "Rule is active while it should not be (20:00)"); + + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(22,59))); + + response = injectAndWait("Rules.GetRuleDetails", params); + QVERIFY2(response.toMap().value("params").toMap().value("rule").toMap().value("active").toBool() == false, "Rule is active while it should not be (22:59)"); + + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(23,00))); + + response = injectAndWait("Rules.GetRuleDetails", params); + QVERIFY2(response.toMap().value("params").toMap().value("rule").toMap().value("active").toBool() == true, "Rule is not active while it should be (23:00)"); + + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(23,10))); + + response = injectAndWait("Rules.GetRuleDetails", params); + QVERIFY2(response.toMap().value("params").toMap().value("rule").toMap().value("active").toBool() == true, "Rule is not active while it should be (23:10)"); + + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(00,00))); + + response = injectAndWait("Rules.GetRuleDetails", params); + QVERIFY2(response.toMap().value("params").toMap().value("rule").toMap().value("active").toBool() == true, "Rule is not active while it should be (00:00)"); + + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(00,30))); + + response = injectAndWait("Rules.GetRuleDetails", params); + QVERIFY2(response.toMap().value("params").toMap().value("rule").toMap().value("active").toBool() == true, "Rule is not active while it should be (00:30)"); + + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(01,00))); + + response = injectAndWait("Rules.GetRuleDetails", params); + QVERIFY2(response.toMap().value("params").toMap().value("rule").toMap().value("active").toBool() == false, "Rule is active while it should not be (01:00)"); + + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(02,00))); + + response = injectAndWait("Rules.GetRuleDetails", params); + QVERIFY2(response.toMap().value("params").toMap().value("rule").toMap().value("active").toBool() == false, "Rule is active while it should not be (02:00)"); + +} + +void TestTimeManager::testEventBasedWithCalendarItemCrossingMidnight() +{ + initTimeManager(); + + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(20,00))); + + // Event descriptor + QVariantMap eventDescriptor; + eventDescriptor.insert("eventTypeId", mockEvent1Id); + eventDescriptor.insert("deviceId", m_mockDeviceId); + + // Action + QVariantMap action; + action.insert("actionTypeId", mockActionIdNoParams); + action.insert("deviceId", m_mockDeviceId); + action.insert("ruleActionParams", QVariantList()); + + QVariantMap repeatingOptionDaily; + repeatingOptionDaily.insert("mode", "RepeatingModeDaily"); + + // The rule + QVariantMap ruleMap; + ruleMap.insert("name", "Time based from 23:00 to 01:00"); + ruleMap.insert("actions", QVariantList() << action); + ruleMap.insert("eventDescriptors", QVariantList() << eventDescriptor); + ruleMap.insert("timeDescriptor", createTimeDescriptorCalendar(createCalendarItem("23:00", 120, repeatingOptionDaily))); + + QVariant response = injectAndWait("Rules.AddRule", ruleMap); + verifyRuleError(response); + RuleId ruleId = RuleId(response.toMap().value("params").toMap().value("ruleId").toString()); + + QVariantMap params; + params.insert("ruleId", ruleId); + + response = injectAndWait("Rules.GetRuleDetails", params); + QVERIFY2(response.toMap().value("params").toMap().value("rule").toMap().value("id").toUuid() == ruleId, "Rule not found in GetRules"); + + cleanupMockHistory(); + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(20, 00))); + triggerMockEvent1(); + verifyRuleNotExecuted(); + + cleanupMockHistory(); + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(23, 00))); + triggerMockEvent1(); + verifyRuleExecuted(mockActionIdNoParams); + + cleanupMockHistory(); + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(23, 50))); + triggerMockEvent1(); + verifyRuleExecuted(mockActionIdNoParams); + + cleanupMockHistory(); + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(00, 00))); + triggerMockEvent1(); + verifyRuleExecuted(mockActionIdNoParams); + + cleanupMockHistory(); + NymeaCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(01, 00))); + triggerMockEvent1(); + verifyRuleNotExecuted(); +} + void TestTimeManager::testEventItemDateTime_data() { QTest::addColumn("dateTime");