diff --git a/libguh-core/time/timemanager.cpp b/libguh-core/time/timemanager.cpp index 72682a9b..07e6688f 100644 --- a/libguh-core/time/timemanager.cpp +++ b/libguh-core/time/timemanager.cpp @@ -109,15 +109,16 @@ QList TimeManager::availableTimeZones() const void TimeManager::stopTimer() { - qWarning(dcTimeManager()) << "TimeManager timer stopped. You should only see this in tests."; + qCWarning(dcTimeManager()) << "TimeManager timer stopped. You should only see this in tests."; // Stop clock (used for testing) m_guhTimer->stop(); } void TimeManager::setTime(const QDateTime &dateTime) { - qWarning(dcTimeManager()) << "TimeManager time changed. You should only see this in tests."; + qCWarning(dcTimeManager()) << "TimeManager time changed. You should only see this in tests."; // This method will only be called for testing to set the guhIO intern time + qCDebug(dcTimeManager()) << dateTime.toString("dd.MM.yyyy hh:mm:ss"); emit tick(); emit dateTimeChanged(dateTime); } diff --git a/tests/auto/timemanager/testtimemanager.cpp b/tests/auto/timemanager/testtimemanager.cpp index ce4b3e29..7df3a578 100644 --- a/tests/auto/timemanager/testtimemanager.cpp +++ b/tests/auto/timemanager/testtimemanager.cpp @@ -69,6 +69,10 @@ private slots: void testCalendarYearlyDateTime_data(); void testCalendarYearlyDateTime(); + void testCalendarItemDailyStates_data(); + void testCalendarItemDailyStates(); + + // TimeEventItems void testEventItemDateTime_data(); void testEventItemDateTime(); @@ -98,6 +102,11 @@ private: void cleanupMockHistory(); + void removeAllRules(); + + void setIntState(const int &value); + void setBoolState(const bool &value); + QVariantMap createTimeEventItem(const QString &time = QString(), const QVariantMap &repeatingOption = QVariantMap()) const; QVariantMap createTimeEventItem(const int &dateTime, const QVariantMap &repeatingOption = QVariantMap()) const; QVariantMap createTimeDescriptorTimeEvent(const QVariantMap &timeEventItem) const; @@ -1020,6 +1029,123 @@ void TestTimeManager::testCalendarYearlyDateTime() verifyRuleError(response); } +void TestTimeManager::testCalendarItemDailyStates_data() +{ + initTimeManager(); + + // Repeating option + QVariantMap repeatingOptionDaily; + repeatingOptionDaily.insert("mode", "RepeatingModeDaily"); + + // Action + QVariantMap action; + action.insert("actionTypeId", mockActionIdNoParams); + action.insert("deviceId", m_mockDeviceId); + action.insert("ruleActionParams", QVariantList()); + + // Exit action (with params) + QVariantMap exitAction; + QVariantList actionParams; + QVariantMap param1; + param1.insert("paramTypeId", mockActionParam1ParamTypeId); + param1.insert("value", 12); + actionParams.append(param1); + QVariantMap param2; + param2.insert("paramTypeId", mockActionParam2ParamTypeId); + param2.insert("value", true); + actionParams.append(param2); + exitAction.insert("actionTypeId", mockActionIdWithParams); + exitAction.insert("deviceId", m_mockDeviceId); + exitAction.insert("ruleActionParams", actionParams); + + // Stateevaluators + QVariantMap stateEvaluator; + QVariantMap stateDescriptorInt; + stateDescriptorInt.insert("deviceId", m_mockDeviceId); + stateDescriptorInt.insert("operator", JsonTypes::valueOperatorToString(Types::ValueOperatorGreaterOrEqual)); + stateDescriptorInt.insert("stateTypeId", mockIntStateId); + stateDescriptorInt.insert("value", 65); + QVariantMap stateDescriptorBool; + stateDescriptorBool.insert("deviceId", m_mockDeviceId); + stateDescriptorBool.insert("operator", JsonTypes::valueOperatorToString(Types::ValueOperatorEquals)); + stateDescriptorBool.insert("stateTypeId", mockBoolStateId); + stateDescriptorBool.insert("value", true); + QVariantMap stateEvaluatorInt; + stateEvaluatorInt.insert("stateDescriptor", stateDescriptorInt); + stateEvaluatorInt.insert("operator", JsonTypes::stateOperatorToString(Types::StateOperatorAnd)); + QVariantMap stateEvaluatorBool; + stateEvaluatorBool.insert("stateDescriptor", stateDescriptorBool); + stateEvaluatorBool.insert("operator", JsonTypes::stateOperatorToString(Types::StateOperatorAnd)); + QVariantList childEvaluators; + childEvaluators.append(stateEvaluatorInt); + childEvaluators.append(stateEvaluatorBool); + stateEvaluator.insert("childEvaluators", childEvaluators); + stateEvaluator.insert("operator", JsonTypes::stateOperatorToString(Types::StateOperatorAnd)); + + + // The rule + QVariantMap ruleMap; + ruleMap.insert("name", "Time and state based daily calendar rule"); + ruleMap.insert("stateEvaluator", stateEvaluator); + ruleMap.insert("actions", QVariantList() << action); + ruleMap.insert("exitActions", QVariantList() << exitAction); + ruleMap.insert("timeDescriptor", createTimeDescriptorCalendar(createCalendarItem("08:00", 10, repeatingOptionDaily))); + + GuhCore::instance()->timeManager()->setTime(QDateTime(QDate::currentDate(), QTime(07,59))); + + QVariant response = injectAndWait("Rules.AddRule", ruleMap); + verifyRuleError(response); + + QTest::addColumn("dateTime"); + QTest::addColumn("boolValue"); + QTest::addColumn("intValue"); + QTest::addColumn("trigger"); + QTest::addColumn("active"); + + QTest::newRow("07:59 | true - 66") << QDateTime(QDate::currentDate(), QTime(07,59)) << true << 66 << false << false; + QTest::newRow("08:00 | true - 66") << QDateTime(QDate::currentDate(), QTime(8,0)) << true << 66 << true << true; + QTest::newRow("08:01 | true - 66") << QDateTime(QDate::currentDate(), QTime(8,1)) << true << 66 << false << false; + QTest::newRow("08:02 | false - 66") << QDateTime(QDate::currentDate(), QTime(8,2)) << false << 66 << true << false; + QTest::newRow("08:03 | true - 65") << QDateTime(QDate::currentDate(), QTime(8,3)) << true << 65 << true << true; + QTest::newRow("08:06 | true - 64") << QDateTime(QDate::currentDate(), QTime(8,6)) << true << 64 << true << false; + QTest::newRow("08:06 | true - 65") << QDateTime(QDate::currentDate(), QTime(8,6)) << true << 65 << true << true; + QTest::newRow("08:09 | true - 65") << QDateTime(QDate::currentDate(), QTime(8,9)) << true << 65 << false << false; + QTest::newRow("08:10 | true - 65") << QDateTime(QDate::currentDate(), QTime(8,10)) << true << 65 << false << false; + QTest::newRow("08:11 | true - 65") << QDateTime(QDate::currentDate(), QTime(8,11)) << true << 65 << false << false; + +} + +void TestTimeManager::testCalendarItemDailyStates() +{ + QFETCH(QDateTime, dateTime); + QFETCH(bool, boolValue); + QFETCH(int, intValue); + QFETCH(bool, trigger); + QFETCH(bool, active); + + GuhCore::instance()->timeManager()->setTime(dateTime); + setBoolState(boolValue); + setIntState(intValue); + + // Actions + if (trigger && active) { + verifyRuleExecuted(mockActionIdNoParams); + cleanupMockHistory(); + } + + // Exit actions + if (trigger && !active) { + verifyRuleExecuted(mockActionIdWithParams); + cleanupMockHistory(); + } + + // Nothing triggert + if (!trigger) { + verifyRuleNotExecuted(); + } + +} + void TestTimeManager::testEventItemDateTime_data() { QTest::addColumn("dateTime"); @@ -1033,6 +1159,7 @@ void TestTimeManager::testEventItemDateTime() { QFETCH(QDateTime, dateTime); + removeAllRules(); initTimeManager(); // Action (without params) @@ -1051,15 +1178,16 @@ void TestTimeManager::testEventItemDateTime() verifyRuleError(response); RuleId ruleId = RuleId(response.toMap().value("params").toMap().value("ruleId").toString()); - QDateTime oneMinuteBeforeEvent = dateTime.addSecs(-60); - // not triggering - GuhCore::instance()->timeManager()->setTime(oneMinuteBeforeEvent); + GuhCore::instance()->timeManager()->setTime(dateTime.addSecs(-120)); + GuhCore::instance()->timeManager()->setTime(dateTime.addSecs(-60)); verifyRuleNotExecuted(); + // trigger GuhCore::instance()->timeManager()->setTime(dateTime); verifyRuleExecuted(mockActionIdNoParams); cleanupMockHistory(); + // not triggering GuhCore::instance()->timeManager()->setTime(dateTime.addSecs(60)); verifyRuleNotExecuted(); @@ -1561,6 +1689,47 @@ void TestTimeManager::cleanupMockHistory() { reply->deleteLater(); } +void TestTimeManager::removeAllRules() +{ + qDebug() << "Remove all rules"; + QVariant response = injectAndWait("Rules.GetRules"); + QVariantList ruleDescriptions = response.toMap().value("params").toMap().value("ruleDescriptions").toList(); + QVariantMap removeParams; + foreach (const QVariant &ruleDescription, ruleDescriptions) { + removeParams.insert("ruleId", ruleDescription.toMap().value("id")); + response = injectAndWait("Rules.RemoveRule", removeParams); + verifyRuleError(response); + } +} + +void TestTimeManager::setIntState(const int &value) +{ + qDebug() << "Setting mock int state to" << value; + + QNetworkAccessManager nam; + QSignalSpy spy(&nam, SIGNAL(finished(QNetworkReply*))); + spy.clear(); + QNetworkRequest request(QUrl(QString("http://localhost:%1/setstate?%2=%3").arg(m_mockDevice1Port).arg(mockIntStateId.toString()).arg(value))); + QNetworkReply *reply = nam.get(request); + spy.wait(); + QCOMPARE(spy.count(), 1); + reply->deleteLater(); +} + +void TestTimeManager::setBoolState(const bool &value) +{ + qDebug() << "Setting mock bool state to" << value; + + QNetworkAccessManager nam; + QSignalSpy spy(&nam, SIGNAL(finished(QNetworkReply*))); + spy.clear(); + QNetworkRequest request(QUrl(QString("http://localhost:%1/setstate?%2=%3").arg(m_mockDevice1Port).arg(mockBoolStateId.toString()).arg(value))); + QNetworkReply *reply = nam.get(request); + spy.wait(); + QCOMPARE(spy.count(), 1); + reply->deleteLater(); +} + QVariantMap TestTimeManager::createTimeEventItem(const QString &time, const QVariantMap &repeatingOption) const { QVariantMap calendarItem;