--- /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 <QVariant>
+
+// 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)<br>
+* 1 = Silent profile<br>
+* 2 = Meeting profile<br>
+* 3 = Outdoor profile<br>
+* 4 = Pager profile<br>
+* 5 = Off-line profile<br>
+* 6 = Drive profile<br>
+* 30-49 = User-created profiles<br>
+**/
+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<int> 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)