/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 2015 Simon Stuerz * * Copyright (C) 2014 Michael Zanetti * * * * This file is part of guh. * * * * Guh is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, version 2 of the License. * * * * Guh is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with guh. If not, see . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "guhtestbase.h" #include "guhcore.h" #include "time/timemanager.h" #include "devicemanager.h" #include "mocktcpserver.h" #include #include #include #include using namespace guhserver; class TestTimeManager: public GuhTestBase { Q_OBJECT private slots: void changeTimeZone_data(); void changeTimeZone(); void addTimeDescriptor_data(); void addTimeDescriptor(); private: QVariantMap createCalendarItem(const QString &time = "00:00", const uint &duration = 0, const QVariantMap &repeatingOption = QVariantMap()) const; QVariantMap createCalendarItem(const int &dateTime, const uint &duration = 0, const QVariantMap &repeatingOption = QVariantMap()) const; QVariantMap createTimeDescriptorCalendar(const QVariantMap calendarItem) const; QVariantMap createTimeDescriptorCalendar(const QVariantList calendarItems) const; }; void TestTimeManager::changeTimeZone_data() { QTest::addColumn("timeZoneId"); QTest::addColumn("valid"); QTest::newRow("valid timezone: Asia/Tokyo") << QByteArray("Asia/Tokyo") << true; QTest::newRow("valid timezone: America/Lima") << QByteArray("America/Lima") << true; QTest::newRow("valid timezone: Africa/Harare") << QByteArray("Africa/Harare") << true; QTest::newRow("invalid timezone: Mars/Diacria") << QByteArray("Mars/Diacria") << false; QTest::newRow("invalid timezone: Moon/Kepler") << QByteArray("Moon/Kepler") << false; } void TestTimeManager::changeTimeZone() { QFETCH(QByteArray, timeZoneId); QFETCH(bool, valid); QTimeZone currentTimeZone(GuhCore::instance()->timeManager()->timeZone()); QTimeZone newTimeZone(timeZoneId); QDateTime currentDateTime = GuhCore::instance()->timeManager()->currentDateTime(); qDebug() << currentDateTime.toString(); GuhCore::instance()->timeManager()->setTimeZone(timeZoneId); QDateTime newDateTime = GuhCore::instance()->timeManager()->currentDateTime(); qDebug() << newDateTime.toString(); int offsetOriginal = currentTimeZone.offsetFromUtc(currentDateTime); int offsetNew = newTimeZone.offsetFromUtc(newDateTime); if (valid) QVERIFY(offsetOriginal != offsetNew); } void TestTimeManager::addTimeDescriptor_data() { // valid RepeatingOptions QVariantMap repeatingOptionDaily; repeatingOptionDaily.insert("mode", "RepeatingModeDaily"); QVariantMap repeatingOptionNone; repeatingOptionNone.insert("mode", "RepeatingModeNone"); QVariantMap repeatingOptionHourly; repeatingOptionHourly.insert("mode", "RepeatingModeHourly"); QVariantMap repeatingOptionWeeklyMultiple; repeatingOptionWeeklyMultiple.insert("mode", "RepeatingModeWeekly"); repeatingOptionWeeklyMultiple.insert("weekDays", QVariantList() << 2 << 4 << 5); QVariantMap repeatingOptionMonthlyMultiple; repeatingOptionMonthlyMultiple.insert("mode", "RepeatingModeMonthly"); repeatingOptionMonthlyMultiple.insert("monthDays", QVariantList() << 20 << 14 << 5); // invalid RepeatingOptions QVariantMap repeatingOptionInvalidWeekly; repeatingOptionInvalidWeekly.insert("mode", "RepeatingModeWeekly"); repeatingOptionInvalidWeekly.insert("monthDays", QVariantList() << 12 << 2 << 7); QVariantMap repeatingOptionInvalidMonthly; repeatingOptionInvalidMonthly.insert("mode", "RepeatingModeMonthly"); repeatingOptionInvalidMonthly.insert("weekDays", QVariantList() << 1 << 2 << 7); QVariantMap repeatingOptionInvalidWeekDays; repeatingOptionInvalidWeekDays.insert("mode", "RepeatingModeWeekly"); repeatingOptionInvalidWeekDays.insert("weekDays", QVariantList() << -1); QVariantMap repeatingOptionInvalidWeekDays2; repeatingOptionInvalidWeekDays2.insert("mode", "RepeatingModeWeekly"); repeatingOptionInvalidWeekDays2.insert("weekDays", QVariantList() << 8); QVariantMap repeatingOptionInvalidMonthDays; repeatingOptionInvalidMonthDays.insert("mode", "RepeatingModeMonthly"); repeatingOptionInvalidMonthDays.insert("monthDays", QVariantList() << -1); QVariantMap repeatingOptionInvalidMonthDays2; repeatingOptionInvalidMonthDays2.insert("mode", "RepeatingModeMonthly"); repeatingOptionInvalidMonthDays2.insert("monthDays", QVariantList() << 32); // Multiple calendar items QVariantList calendarItems; calendarItems.append(createCalendarItem("08:00", 5, repeatingOptionDaily)); calendarItems.append(createCalendarItem("09:00", 5, repeatingOptionWeeklyMultiple)); QTest::addColumn("timeDescriptor"); QTest::addColumn("error"); QTest::newRow("valid: single calendarItem") << createTimeDescriptorCalendar(createCalendarItem("08:00", 5)) << RuleEngine::RuleErrorNoError; QTest::newRow("valid: single calendarItem dateTime") << createTimeDescriptorCalendar(createCalendarItem(QDateTime::currentDateTime().toTime_t(), 5)) << RuleEngine::RuleErrorNoError; QTest::newRow("valid: single calendarItem - daily") << createTimeDescriptorCalendar(createCalendarItem("08:00", 5, repeatingOptionDaily)) << RuleEngine::RuleErrorNoError; QTest::newRow("valid: calendarItem - none") << createTimeDescriptorCalendar(createCalendarItem("09:00", 30, repeatingOptionNone)) << RuleEngine::RuleErrorNoError; QTest::newRow("valid: calendarItem - hourly") << createTimeDescriptorCalendar(createCalendarItem("09:00", 30, repeatingOptionHourly)) << RuleEngine::RuleErrorNoError; QTest::newRow("valid: calendarItems - weekly - multiple days") << createTimeDescriptorCalendar(calendarItems) << RuleEngine::RuleErrorNoError; QTest::newRow("valid: calendarItem - monthly - multiple days") << createTimeDescriptorCalendar(createCalendarItem("23:00", 5, repeatingOptionMonthlyMultiple)) << RuleEngine::RuleErrorNoError; QTest::newRow("invalid: calendarItem empty") << createTimeDescriptorCalendar(createCalendarItem()) << RuleEngine::RuleErrorInvalidCalendarItem; QTest::newRow("invalid: calendarItem - dateTime + repeatingOption") << createTimeDescriptorCalendar(createCalendarItem(QDateTime::currentDateTime().toTime_t(), 5, repeatingOptionDaily)) << RuleEngine::RuleErrorInvalidCalendarItem; QTest::newRow("invalid: calendarItem invalid time") << createTimeDescriptorCalendar(createCalendarItem("35:80", 5)) << RuleEngine::RuleErrorInvalidCalendarItem; QTest::newRow("invalid: calendarItem invalid duration") << createTimeDescriptorCalendar(createCalendarItem("12:00", 0)) << RuleEngine::RuleErrorInvalidCalendarItem; QTest::newRow("invalid: calendarItem - monthly - weekDays") << createTimeDescriptorCalendar(createCalendarItem("13:13", 5, repeatingOptionInvalidMonthly)) << RuleEngine::RuleErrorInvalidRepeatingOption; QTest::newRow("invalid: calendarItem - weekly - monthDays") << createTimeDescriptorCalendar(createCalendarItem("15:30", 20, repeatingOptionInvalidWeekly)) << RuleEngine::RuleErrorInvalidRepeatingOption; QTest::newRow("invalid: calendarItem - invalid weekdays (negative)") << createTimeDescriptorCalendar(createCalendarItem("13:13", 5, repeatingOptionInvalidWeekDays)) << RuleEngine::RuleErrorInvalidRepeatingOption; QTest::newRow("invalid: calendarItem - invalid weekdays (to big)") << createTimeDescriptorCalendar(createCalendarItem("13:13", 5, repeatingOptionInvalidWeekDays2)) << RuleEngine::RuleErrorInvalidRepeatingOption; QTest::newRow("invalid: calendarItem - invalid monthdays (negative)") << createTimeDescriptorCalendar(createCalendarItem("13:13", 5, repeatingOptionInvalidMonthDays)) << RuleEngine::RuleErrorInvalidRepeatingOption; QTest::newRow("invalid: calendarItem - invalid monthdays (to big)") << createTimeDescriptorCalendar(createCalendarItem("13:13", 5, repeatingOptionInvalidMonthDays2)) << RuleEngine::RuleErrorInvalidRepeatingOption; } void TestTimeManager::addTimeDescriptor() { QFETCH(QVariantMap, timeDescriptor); QFETCH(RuleEngine::RuleError, error); // ADD the rule QVariantMap params; QVariantMap action; action.insert("actionTypeId", mockActionIdNoParams); action.insert("deviceId", m_mockDeviceId); action.insert("ruleActionParams", QVariantList()); params.insert("name", "TimeBased rule"); params.insert("timeDescriptor", timeDescriptor); params.insert("actions", QVariantList() << action); QVariant response = injectAndWait("Rules.AddRule", params); verifyRuleError(response, error); if (error != RuleEngine::RuleErrorNoError) return; // Print rule RuleId newRuleId = RuleId(response.toMap().value("params").toMap().value("ruleId").toString()); params.clear(); params.insert("ruleId", newRuleId); response = injectAndWait("Rules.GetRuleDetails", params); QVariantMap rule = response.toMap().value("params").toMap().value("rule").toMap(); qDebug() << QJsonDocument::fromVariant(rule).toJson(); } QVariantMap TestTimeManager::createCalendarItem(const QString &time, const uint &duration, const QVariantMap &repeatingOption) const { QVariantMap calendarItem; calendarItem.insert("startTime", time); calendarItem.insert("duration", duration); if (!repeatingOption.isEmpty()) calendarItem.insert("repeating", repeatingOption); return calendarItem; } QVariantMap TestTimeManager::createCalendarItem(const int &dateTime, const uint &duration, const QVariantMap &repeatingOption) const { QVariantMap calendarItem; calendarItem.insert("datetime", dateTime); calendarItem.insert("duration", duration); if (!repeatingOption.isEmpty()) calendarItem.insert("repeating", repeatingOption); return calendarItem; } QVariantMap TestTimeManager::createTimeDescriptorCalendar(const QVariantMap calendarItem) const { QVariantMap timeDescriptorCalendar; timeDescriptorCalendar.insert("calendarItems", QVariantList() << calendarItem); return timeDescriptorCalendar; } QVariantMap TestTimeManager::createTimeDescriptorCalendar(const QVariantList calendarItems) const { QVariantMap timeDescriptorCalendar; timeDescriptorCalendar.insert("calendarItems", calendarItems); return timeDescriptorCalendar; } #include "testtimemanager.moc" QTEST_MAIN(TestTimeManager)