diff -r 1a6714c53019 -r cce62ebc198e radiohswidget/tsrc/src/t_radiohswidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/radiohswidget/tsrc/src/t_radiohswidget.cpp Tue Aug 31 15:15:02 2010 +0300 @@ -0,0 +1,405 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// System includes +#include + +// User Includes +#include "t_radiohswidget.h" +#include "xqsettingsmanager.h" +#include "xqapplicationmanager.h" +#include "xqaiwrequest.h" +#include "xqaiwinterfacedescriptor.h" +#include "radioservicedef.h" +#include "radiologger.h" + +// Constants +/** +* From ProfileEngineSDKCRKeys.h +* The id of the currently active profile, integer value. +* Possible values: +* +* 0 = General profile (default value)
+* 1 = Silent profile
+* 2 = Meeting profile
+* 3 = Outdoor profile
+* 4 = Pager profile
+* 5 = Off-line profile
+* 6 = Drive profile
+* 30-49 = User-created profiles
+**/ +const int PROFILE_GENERAL(0); +const int PROFILE_SILENT(1); +const int PROFILE_MEETING(2); +const int PROFILE_OUTDOOR(3); +const int PROFILE_PAGER(4); +const int PROFILE_OFFLINE(5); +const int PROFILE_DRIVE(6); +const int PROFILE_USER_CREATED(35); + +/** Requests are not embedded. */ +const bool EMBEDDED_REQUEST(false); + +/** Last request should be answered with empty reply. */ +int EMPTY_REPLY(-5); + +/** Test values for favorite station count. */ +const int FAVORITE_STATION_COUNT_INVALID_TOO_LOW1(-56); +const int FAVORITE_STATION_COUNT_INVALID_TOO_LOW2(-1); +const int FAVORITE_STATION_COUNT_VALID_LOWER_BOUNDARY(0); +const int FAVORITE_STATION_COUNT_VALID1(1); +const int FAVORITE_STATION_COUNT_VALID2(2); +const int FAVORITE_STATION_COUNT_VALID3(3); +const int FAVORITE_STATION_COUNT_VALID4(9); +const int FAVORITE_STATION_COUNT_VALID5(78); +const int FAVORITE_STATION_COUNT_VALID_UPPER_BOUNDARY(100); +const int FAVORITE_STATION_COUNT_INVALID_TOO_HIGH1(101); +const int FAVORITE_STATION_COUNT_INVALID_TOO_HIGH2(1256); + +/** Test values for textual information. */ +const QString TEST_FREQUENCY("99.9"); +const QString TEST_NAME("Radio Test"); +const QString TEST_GENRE("Test GenRe"); +const QString TEST_RADIO_TEXT("Test RDS"); +const QString TEST_DYNAMIC_PSNAME("Dynamic PS Name test"); +const QString TEST_EMPTY_STRING(""); +const QString TEST_INVALID_STRING; +/** This test string contains 1000 characters. */ +const QString TEST_TOO_LONG_STRING("1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"); + +/** Test values for service notification types. */ +const int RADIO_SERVICE_NOTIFICATION_ID_INVALID_TOO_LOW1(-357); +const int RADIO_SERVICE_NOTIFICATION_ID_INVALID_TOO_LOW2(-1); +const int RADIO_SERVICE_NOTIFICATION_ID_INVALID_TOO_LOW3(0); +const int RADIO_SERVICE_NOTIFICATION_ID_VALID_LOWER_BOUNDARY(1); +const int RADIO_SERVICE_NOTIFICATION_ID_VALID_UPPER_BOUNDARY(8); +const int RADIO_SERVICE_NOTIFICATION_ID_INVALID_TOO_HIGH1(9); +const int RADIO_SERVICE_NOTIFICATION_ID_INVALID_TOO_HIGH2(57982); +const int RADIO_STATUS_INVALID_TOO_LOW1(-581); +const int RADIO_STATUS_INVALID_TOO_LOW2(-1); +const int RADIO_STATUS_VALID_LOWER_BOUNDARY(0); +const int RADIO_STATUS_VALID_UPPER_BOUNDARY(5); +const int RADIO_STATUS_INVALID_TOO_HIGH1(6); +const int RADIO_STATUS_INVALID_TOO_HIGH2(456); + +/** Mock returns for settings manager stub. */ +QVariant settings_manager_mock_return_profile; +QVariant settings_manager_mock_return_2nd_profile; +bool settings_manager_mock_bool_return; + +/** These request are defined in stub xqapplicationmanager.cpp. */ +extern XQAiwRequest *application_manager_mock_refresh_request; +extern XQAiwRequest *application_manager_mock_monitor_request; + +/** List for request mocks. */ +QVariantList request_mocks; +/** Amount of requests send. */ +int send_count; + + +/*! + \class TestRadioHsWidget + \brief Unit testing for FM Radio hs widget. + + TestRadioHsWidget implements needed functions for the FM Radio home screen + widget unit tests. +*/ + +// ======== MEMBER FUNCTIONS ======== + +/*! + Main function. + + There's been problems with QTEST_MAIN macro, so main function is defined + here. +*/ +int main(int /* argc*/, char *argv[]) +{ + LOG_METHOD_ENTER; + TestRadioHsWidget tv; + + char *pass[3]; + pass[0] = argv[0]; + pass[1] = "-o"; + pass[2] = "c:\\data\\testradiohswidget.txt"; + + int res = QTest::qExec(&tv, 3, pass); + + return res; +} + +/*! + Constructor. + */ +TestRadioHsWidget::TestRadioHsWidget() +{ + LOG_METHOD_ENTER; +} + + +/*! + Destructor. + */ +TestRadioHsWidget::~TestRadioHsWidget() +{ + LOG_METHOD_ENTER; +} + +/*! + Called before each testfunction is executed. + */ +void TestRadioHsWidget::init() +{ + LOG_METHOD_ENTER; + settings_manager_mock_return_profile = PROFILE_GENERAL; + request_mocks.clear(); + mSendInfos.clear(); + send_count = -1; + mRadioHsWidgetStub.data()->reset(); +} + +/*! + Called after every testfunction. + */ +void TestRadioHsWidget::cleanup() +{ + LOG_METHOD_ENTER; +} + +/*! + Called before the first testfunction is executed + */ +void TestRadioHsWidget::initTestCase() +{ + LOG_METHOD_ENTER; + mRadioHsWidgetStub.reset(new RadioHsWidget()); + QVERIFY(mRadioHsWidgetStub); + mProfileReader.reset(new RadioHsWidgetProfileReader(mRadioHsWidgetStub.data())); + QVERIFY(mProfileReader); + mServiceClient.reset(new RadioHsWidgetRadioServiceClient(mRadioHsWidgetStub.data())); + QVERIFY(mServiceClient); +} + +/*! + Called after the last testfunction was executed. + */ +void TestRadioHsWidget::cleanupTestCase() +{ + LOG_METHOD_ENTER; +} + +/*! + Tests RadioHsWidgetProfileReader and it's isCurrentProfileOffline() + function. + */ +void TestRadioHsWidget::offlineModeTest() +{ + LOG_METHOD; + settings_manager_mock_return_profile = PROFILE_GENERAL; + bool isOffline = mProfileReader.data()->isCurrentProfileOffline(); + QVERIFY2(( isOffline == false ), "FmRadioHsWidget:RadioHsWidget profile is offline"); + settings_manager_mock_return_profile = PROFILE_OFFLINE; + isOffline = mProfileReader.data()->isCurrentProfileOffline(); + QVERIFY2(( isOffline == true ), "FmRadioHsWidget:RadioHsWidget profile is not offline"); + settings_manager_mock_return_profile = PROFILE_USER_CREATED; + isOffline = mProfileReader.data()->isCurrentProfileOffline(); + QVERIFY2(( isOffline == false ), "FmRadioHsWidget:RadioHsWidget profile is offline"); +} + +/*! + Tests RadioHsWidgetRadioServiceClient class and it's ability to receive + and forward valid information. + */ +void TestRadioHsWidget::validReplies() +{ + LOG_METHOD; + // Replies that should be ok. + createSendInfo(RadioServiceNotification::FavoriteCount, QVariant(FAVORITE_STATION_COUNT_VALID_LOWER_BOUNDARY)); + createSendInfo(RadioServiceNotification::FavoriteCount, QVariant(FAVORITE_STATION_COUNT_VALID1)); + createSendInfo(RadioServiceNotification::FavoriteCount, QVariant(FAVORITE_STATION_COUNT_VALID2)); + createSendInfo(RadioServiceNotification::FavoriteCount, QVariant(FAVORITE_STATION_COUNT_VALID3)); + createSendInfo(RadioServiceNotification::FavoriteCount, QVariant(FAVORITE_STATION_COUNT_VALID4)); + createSendInfo(RadioServiceNotification::FavoriteCount, QVariant(FAVORITE_STATION_COUNT_VALID5)); + createSendInfo(RadioServiceNotification::FavoriteCount, QVariant(FAVORITE_STATION_COUNT_VALID_UPPER_BOUNDARY)); + createSendInfo(RadioServiceNotification::CurrentIsFavorite, QVariant(true)); + createSendInfo(RadioServiceNotification::CurrentIsFavorite, QVariant(false)); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant(RadioStatus::UnSpecified)); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant(RadioStatus::Playing)); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant(RadioStatus::Muted)); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant(RadioStatus::Seeking)); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant(RadioStatus::NoAntenna)); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant(RadioStatus::PoweringOff)); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant(RADIO_STATUS_VALID_LOWER_BOUNDARY)); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant(RADIO_STATUS_VALID_UPPER_BOUNDARY)); + createSendInfo(RadioServiceNotification::Frequency, QVariant(TEST_FREQUENCY)); + createSendInfo(RadioServiceNotification::Name, QVariant(TEST_NAME)); + createSendInfo(RadioServiceNotification::Name, QVariant(TEST_EMPTY_STRING)); + createSendInfo(RadioServiceNotification::Genre, QVariant(TEST_GENRE)); + createSendInfo(RadioServiceNotification::RadioText, QVariant(TEST_RADIO_TEXT)); + createSendInfo(RadioServiceNotification::DynamicPS, QVariant(TEST_DYNAMIC_PSNAME)); + // Empty reply should be last to put RServiceClient to make an request, which is not replied. + createSendInfo(EMPTY_REPLY, QVariant(EMPTY_REPLY)); + + send_count = mSendInfos.count(); + + mServiceClient.data()->startMonitoring(FmRadio::VisibiltyToBackground); + mServiceClient.data()->stopMonitoring(); + + int receivedCount = mRadioHsWidgetStub.data()->receivedInformationCount(); + QVERIFY2((receivedCount == send_count - 1), "Send and received counts doesn't match"); + + ReceivedInfo temp; + for (int i = 0; i < send_count - 1; i++) { + temp = mRadioHsWidgetStub.data()->receivedInformation(); + QVERIFY(temp.informationType == mSendInfos.at(i).informationType); + verifyReceivedInformation(temp.informationType, temp.information, mSendInfos.at(i).information); + } +} + +/*! + Tests RadioHsWidgetRadioServiceClient class and it's ability to receive + and forward invalid information. + */ +void TestRadioHsWidget::invalidReplies() +{ + LOG_METHOD; + QList skipSendInfo; + // Replies that should not be ok. + createSendInfo(RadioServiceNotification::FavoriteCount, QVariant(FAVORITE_STATION_COUNT_INVALID_TOO_LOW1)); + createSendInfo(RadioServiceNotification::FavoriteCount, QVariant(FAVORITE_STATION_COUNT_INVALID_TOO_LOW2)); + createSendInfo(RadioServiceNotification::FavoriteCount, QVariant(FAVORITE_STATION_COUNT_INVALID_TOO_HIGH1)); + createSendInfo(RadioServiceNotification::FavoriteCount, QVariant(FAVORITE_STATION_COUNT_INVALID_TOO_HIGH2)); + createSendInfo(RadioServiceNotification::FavoriteCount, QVariant()); + skipSendInfo.append(request_mocks.count() - 1); + createSendInfo(RadioServiceNotification::CurrentIsFavorite, QVariant()); + skipSendInfo.append(request_mocks.count() - 1); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant(RADIO_STATUS_INVALID_TOO_LOW1)); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant(RADIO_STATUS_INVALID_TOO_LOW1)); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant(RADIO_STATUS_INVALID_TOO_HIGH1)); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant(RADIO_STATUS_INVALID_TOO_HIGH2)); + createSendInfo(RadioServiceNotification::RadioStatus, QVariant()); + skipSendInfo.append(request_mocks.count() - 1); + createSendInfo(RadioServiceNotification::Frequency, QVariant()); + skipSendInfo.append(request_mocks.count() - 1); + createSendInfo(RadioServiceNotification::Name, QVariant(TEST_INVALID_STRING)); + createSendInfo(RadioServiceNotification::Name, QVariant(TEST_TOO_LONG_STRING)); + createSendInfo(RadioServiceNotification::Name, QVariant()); + skipSendInfo.append(request_mocks.count() - 1); + createSendInfo(RadioServiceNotification::Genre, QVariant()); + skipSendInfo.append(request_mocks.count() - 1); + createSendInfo(RadioServiceNotification::RadioText, QVariant()); + skipSendInfo.append(request_mocks.count() - 1); + createSendInfo(RadioServiceNotification::DynamicPS, QVariant()); + skipSendInfo.append(request_mocks.count() - 1); + // Replies that should generate a warning. + createSendInfo(RADIO_SERVICE_NOTIFICATION_ID_VALID_LOWER_BOUNDARY, QVariant(TEST_EMPTY_STRING)); + createSendInfo(RADIO_SERVICE_NOTIFICATION_ID_VALID_UPPER_BOUNDARY, QVariant(TEST_EMPTY_STRING)); + createSendInfo(RADIO_SERVICE_NOTIFICATION_ID_INVALID_TOO_LOW1, QVariant(TEST_EMPTY_STRING)); + createSendInfo(RADIO_SERVICE_NOTIFICATION_ID_INVALID_TOO_LOW2, QVariant(TEST_EMPTY_STRING)); + createSendInfo(RADIO_SERVICE_NOTIFICATION_ID_INVALID_TOO_LOW3, QVariant(TEST_EMPTY_STRING)); + createSendInfo(RADIO_SERVICE_NOTIFICATION_ID_INVALID_TOO_HIGH1, QVariant(TEST_EMPTY_STRING)); + createSendInfo(RADIO_SERVICE_NOTIFICATION_ID_INVALID_TOO_HIGH2, QVariant(TEST_EMPTY_STRING)); + // Empty reply should be last to put RServiceClient to make an request, which is not replied. + createSendInfo(EMPTY_REPLY, QVariant(EMPTY_REPLY)); + + send_count = mSendInfos.count(); + + mServiceClient.data()->startMonitoring(FmRadio::VisibiltyToBackground); + mServiceClient.data()->stopMonitoring(); + + int receivedCount = mRadioHsWidgetStub.data()->receivedInformationCount(); + int skippedCount = skipSendInfo.count(); + QVERIFY2((receivedCount == send_count - skippedCount - 1), "Send and received counts doesn't match"); + + ReceivedInfo temp; + for (int i = 0; i < send_count - 1; i++) { + if (skipSendInfo.contains(i)) { + // Skip verification for information that was filtered in + // RadioHsWidgetRadioServiceClient. + continue; + } + temp = mRadioHsWidgetStub.data()->receivedInformation(); + QVERIFY(temp.informationType == mSendInfos.at(i).informationType); + verifyReceivedInformation(temp.informationType, temp.information, mSendInfos.at(i).information); + } +} + +/*! + Helper function to store send information and append it to a request + mocks. + */ +void TestRadioHsWidget::createSendInfo(int informationType, const QVariant information) +{ + SendInfo info; + QVariantList notificationList; + + info.informationType = informationType; + info.information = information; + info.data = QVariant(mServiceClient.data()-> + createRadioNotificationData( + info.informationType, + info.information + )); + + mSendInfos.append(info); + + notificationList.append(info.data); + request_mocks.append(QVariant(notificationList)); +} + +/*! + Helper function to verify receved information. + */ +void TestRadioHsWidget::verifyReceivedInformation(int informationType, + const QVariant &receivedInformation, const QVariant &sendInformation) +{ + switch (informationType) { + case RadioServiceNotification::CurrentIsFavorite: + QVERIFY(receivedInformation.canConvert(QVariant::Bool)); + QCOMPARE(receivedInformation.toBool(), sendInformation.toBool()); + break; + case RadioServiceNotification::FavoriteCount: + // Fall through because of similar handling + case RadioServiceNotification::RadioStatus: + QVERIFY(receivedInformation.canConvert(QVariant::Int)); + QCOMPARE(receivedInformation.toInt(), sendInformation.toInt()); + break; + case RadioServiceNotification::Frequency: + // Fall through because of similar type of information and thus + // similar handling + case RadioServiceNotification::Name: + // Fall through because of similar type of information and thus + // similar handling + case RadioServiceNotification::Genre: + // Fall through because of similar type of information and thus + // similar handling + case RadioServiceNotification::RadioText: + // Fall through because of similar type of information and thus + // similar handling + case RadioServiceNotification::DynamicPS: + QVERIFY(receivedInformation.canConvert(QVariant::String)); + QCOMPARE(receivedInformation.toString(), sendInformation.toString()); + break; + default: + QWARN("Default case, shouldn't be here except if specifically testing RadioServiceNotification id out of bounds."); + QVERIFY(receivedInformation.canConvert(QVariant::String)); + QCOMPARE(receivedInformation.toString(), sendInformation.toString()); + break; + } +} + +//QTEST_MAIN(t_radiohswidget)