diff -r fcbbe021d614 -r 9c97ad6591ae cmmanager/cppacketdataapplugin/tsrc/ut/testcppacketdataapplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmmanager/cppacketdataapplugin/tsrc/ut/testcppacketdataapplugin.cpp Mon May 03 12:53:07 2010 +0300 @@ -0,0 +1,638 @@ +/* +* 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: +* Control Panel packet data AP plugin unit testing. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cppacketdataapview.h" + +#include "hbautotest.h" +#include "testcppacketdataapplugin.h" + +// ----------------------------------------------------------------------------- +// STATIC TEST DATA +// ----------------------------------------------------------------------------- + +// Connection method (AP) ID used for testing +static const uint testApId = 1; + +static const QString pluginDir = + "\\resource\\qt\\plugins\\controlpanel\\bearerap"; + +static const QString pluginName = "cppacketdataapplugin.dll"; + +// Time to wait before continuing after an UI step +static const int waitTime = 10; + +// UI coordinates +static const QPoint sideTop(350, 60); +static const QPoint scrollStart(350, 300); +static const QPoint scrollStop(350, 240); + +static const QPoint messageBoxOkButton(170, 320); + +// These are measured when view is scrolled to top +static const QPoint connectionNameLineEdit(330, 110); + +static const QPoint accessPointNameLineEdit(330, 190); + +static const QPoint userNameLineEdit(330, 265); + +// These are measured when view is scrolled to bottom +static const QPoint passwordPromptCheckbox(50, 295); +static const QPoint passwordLineEdit(330, 380); + +static const QPoint authenticationComboBox(175, 470); +static const QPoint authenticationSecure(100, 420); +static const QPoint authenticationNormal(100, 365); + +static const QPoint homepageLineEdit(330, 555); + +// ----------------------------------------------------------------------------- +// FRAMEWORK FUNCTIONS +// ----------------------------------------------------------------------------- + +/** + * Test main function. Runs all test cases. + */ +#ifndef TESTCMAPPLSETTINGSUI_NO_OUTPUT_REDIRECT +int main(int argc, char *argv[]) +{ + HbApplication app(argc, argv); + app.setApplicationName("TestCpPacketDataApPlugin"); + + char *pass[3]; + pass[0] = argv[0]; + pass[1] = "-o"; + pass[2] = "c:\\data\\TestCpPacketDataApPlugin.txt"; + + TestCpPacketDataApPlugin tc; + int res = QTest::qExec(&tc, 3, pass); + + return res; +} +#else +QTEST_MAIN(TestCpPacketDataApPlugin) +#endif + +/** + * This function is be called before the first test case is executed. + */ +void TestCpPacketDataApPlugin::initTestCase() +{ + mMainWindow = new HbAutoTestMainWindow; + //mMainWindow = new HbMainWindow; + mMainWindow->show(); + + // Load plugin + QDir dir(pluginDir); + QPluginLoader loader(dir.absoluteFilePath(pluginName)); + mPlugin = qobject_cast(loader.instance()); + QVERIFY(mPlugin != NULL); + + // Verify plugin bearer type + QVERIFY(mPlugin->bearerType() == CMManagerShim::BearerTypePacketData); + + // Create packet data settings view (connection method ID given) + subCreateSettingsView(testApId); +} + +/** + * This function is be called after the last test case was executed. + */ +void TestCpPacketDataApPlugin::cleanupTestCase() +{ + delete mMainWindow; + mMainWindow = 0; +} + +/** + * This function is be called before each test case is executed. + */ +void TestCpPacketDataApPlugin::init() +{ + QTest::qWait(1000); +} + +/** + * This function is be called after each test case is executed. + */ +void TestCpPacketDataApPlugin::cleanup() +{ +} + +// ----------------------------------------------------------------------------- +// TEST CASES +// ----------------------------------------------------------------------------- + +/** + * Tests changing of connection name. + */ +void TestCpPacketDataApPlugin::tcChangeConnectionName() +{ + QFETCH(QString, string); + QFETCH(QString, result); + + HbAutoTest::mouseClick(mMainWindow, mTestView, connectionNameLineEdit); + + // Erase old string + subClearLineEdit(CMManagerShim::CmNameLength); + + // Enter new string + HbAutoTest::keyClicks(mMainWindow, string, 0, waitTime); + + HbAutoTest::mouseClick(mMainWindow, mTestView, sideTop); + + // Verify both commsdat and UI widget + subVerifyString( + CMManagerShim::CmName, + mTestView->mConnectionNameItem, + result); +} + +/** + * Test data for connection name change test case. + */ +void TestCpPacketDataApPlugin::tcChangeConnectionName_data() +{ + QTest::addColumn("string"); + QTest::addColumn("result"); + + QTest::newRow("maximum length") + << "really long name 1234567890123" + << "really long name 1234567890123"; + QTest::newRow("too long") + << "too long name 123456789012345678901234567890" + << "too long name 1234567890123456"; + QTest::newRow("basic") // last one must always fit on one line in UI + << "test packet AP" + << "test packet AP"; +} + +/** + * Tests that empty connection name is not accepted. + */ +void TestCpPacketDataApPlugin::tcConnectionNameEmpty() +{ + QString previous = + mTestView->mConnectionNameItem->contentWidgetData("text").toString(); + + HbAutoTest::mouseClick(mMainWindow, mTestView, connectionNameLineEdit); + + // Erase old string + subClearLineEdit(CMManagerShim::CmNameLength); + + HbAutoTest::mouseClick(mMainWindow, mTestView, sideTop); + + QTest::qWait(100); + // Dismiss messagebox + HbAutoTest::mouseClick(mMainWindow, mTestView, messageBoxOkButton); + + // Verify both commsdat and UI widget + subVerifyString( + CMManagerShim::CmName, + mTestView->mConnectionNameItem, + previous); +} + +/** + * Tests changing of access point name. + */ +void TestCpPacketDataApPlugin::tcChangeAccessPointName() +{ + QFETCH(QString, string); + QFETCH(QString, result); + + HbAutoTest::mouseClick(mMainWindow, mTestView, accessPointNameLineEdit); + + // Erase old string + subClearLineEdit(CMManagerShim::PacketDataAPNameLength); + + // Enter new string + HbAutoTest::keyClicks(mMainWindow, string, 0, waitTime); + + HbAutoTest::mouseClick(mMainWindow, mTestView, sideTop); + + // Verify both commsdat and UI widget + subVerifyString( + CMManagerShim::PacketDataAPName, + mTestView->mAccessPointNameItem, + result); +} + +/** + * Test data for access point name change test case. + */ +void TestCpPacketDataApPlugin::tcChangeAccessPointName_data() +{ + QTest::addColumn("string"); + QTest::addColumn("result"); + + QTest::newRow("maximum length") + << "really long name 12345678901234567890123456789012345678901234567890123456789012345678901234567890123" + << "really long name 12345678901234567890123456789012345678901234567890123456789012345678901234567890123"; + QTest::newRow("too long") + << "too long name 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345" + << "too long name 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456"; + QTest::newRow("basic") // last one must always fit on one line in UI + << "test AP name" + << "test AP name"; +} + +/** + * Tests that empty access point name is not accepted. + */ +void TestCpPacketDataApPlugin::tcAccessPointNameEmpty() +{ + QString previous = + mTestView->mAccessPointNameItem->contentWidgetData("text").toString(); + + HbAutoTest::mouseClick(mMainWindow, mTestView, accessPointNameLineEdit); + + // Erase old string + subClearLineEdit(CMManagerShim::PacketDataAPNameLength); + + HbAutoTest::mouseClick(mMainWindow, mTestView, sideTop); + + QTest::qWait(100); + // Dismiss messagebox + HbAutoTest::mouseClick(mMainWindow, mTestView, messageBoxOkButton); + + // Verify both commsdat and UI widget + subVerifyString( + CMManagerShim::PacketDataAPName, + mTestView->mAccessPointNameItem, + previous); +} + +/** + * Tests changing of user name. + */ +void TestCpPacketDataApPlugin::tcChangeUserName() +{ + QFETCH(QString, string); + QFETCH(QString, result); + + HbAutoTest::mouseClick(mMainWindow, mTestView, userNameLineEdit); + + // Erase old string + subClearLineEdit(CMManagerShim::PacketDataIFAuthNameLength); + + // Enter new string + HbAutoTest::keyClicks(mMainWindow, string, 0, waitTime); + + HbAutoTest::mouseClick(mMainWindow, mTestView, sideTop); + + // Verify both commsdat and UI widget + subVerifyString( + CMManagerShim::PacketDataIFAuthName, + mTestView->mUserNameItem, + result); +} + +/** + * Test data for user name change test case. + */ +void TestCpPacketDataApPlugin::tcChangeUserName_data() +{ + QTest::addColumn("string"); + QTest::addColumn("result"); + +// Long strings don't work, Orbit bug? Screen goes blank +// QTest::newRow("maximum length") +// << "really long name 123456789012345678901234567890123" +// << "really long name 123456789012345678901234567890123"; +// QTest::newRow("too long") +// << "too long name 1234567890123456789012345678901234567890123" +// << "too long name 123456789012345678901234567890123456"; + QTest::newRow("basic") + << "username" + << "username"; + QTest::newRow("empty") // last one must always fit on one line in UI + << "" + << ""; +} + +/** + * Scrolls the tested view to the bottom. + */ +void TestCpPacketDataApPlugin::tcScrollToBottom() +{ + // Scroll to the bottom of the view + HbAutoTest::mousePress(mMainWindow, mTestView, scrollStart); + QTest::qWait(500); + HbAutoTest::mouseMove(mMainWindow, mTestView, scrollStop); + HbAutoTest::mouseRelease(mMainWindow, mTestView, scrollStop); +} + +/** + * Tests "prompt" password checkbox. + */ +void TestCpPacketDataApPlugin::tcChangePromptPassword() +{ + // Ensure prompt for password is unchecked + bool prompt = subGetBool(CMManagerShim::PacketDataIFPromptForAuth); + if (prompt) { + // Disable prompt for password + HbAutoTest::mouseClick( + mMainWindow, + mTestView, + passwordPromptCheckbox); + } + + // Enable prompt for password and verify + HbAutoTest::mouseClick(mMainWindow, mTestView, passwordPromptCheckbox); + subVerifyBool( + CMManagerShim::PacketDataIFPromptForAuth, + true); + + // Verify that password lineedit is disabled, following steps will + // fail if editing is allowed + HbAutoTest::mouseClick(mMainWindow, mTestView, passwordLineEdit); + QTest::qWait(waitTime); + + // Disable prompt for password and verify + HbAutoTest::mouseClick(mMainWindow, mTestView, passwordPromptCheckbox); + subVerifyBool( + CMManagerShim::PacketDataIFPromptForAuth, + false); +} + +/** + * Tests changing of password. + */ +void TestCpPacketDataApPlugin::tcChangePassword() +{ + QFETCH(QString, string); + QFETCH(QString, result); + + HbAutoTest::mouseClick(mMainWindow, mTestView, passwordLineEdit); + + // Erase old string + subClearLineEdit(CMManagerShim::PacketDataIFAuthPassLength); + + // Enter new string + HbAutoTest::keyClicks(mMainWindow, string, 0, waitTime); + + HbAutoTest::mouseClick(mMainWindow, mTestView, sideTop); + + // Verify both commsdat and UI widget + subVerifyString( + CMManagerShim::PacketDataIFAuthPass, + mTestView->mPasswordItem, + result); +} + +/** + * Test data for password change test case. + */ +void TestCpPacketDataApPlugin::tcChangePassword_data() +{ + QTest::addColumn("string"); + QTest::addColumn("result"); + +// Long strings don't work, Orbit bug? Screen goes blank +// QTest::newRow("maximum length") +// << "really long name 123456789012345678901234567890123" +// << "really long name 123456789012345678901234567890123"; +// QTest::newRow("too long") +// << "too long name 1234567890123456789012345678901234567890123" +// << "too long name 123456789012345678901234567890123456"; + QTest::newRow("basic") + << "password" + << "password"; + QTest::newRow("empty") // last one must always fit on one line in UI + << "" + << ""; +} + +/** + * Tests changing of authentication mode. + */ +void TestCpPacketDataApPlugin::tcChangeAuthenticationMode() +{ + // Set authentication mode to secure + HbAutoTest::mouseClick(mMainWindow, mTestView, authenticationComboBox, 100); + QTest::qWait(100); + HbAutoTest::mouseClick(mMainWindow, mTestView, authenticationSecure, 100); + + subVerifyBool( + CMManagerShim::PacketDataDisablePlainTextAuth, + true); + + // Set authentication mode to normal + HbAutoTest::mouseClick(mMainWindow, mTestView, authenticationComboBox, 100); + QTest::qWait(100); + HbAutoTest::mouseClick(mMainWindow, mTestView, authenticationNormal, 100); + + subVerifyBool( + CMManagerShim::PacketDataDisablePlainTextAuth, + false); +} + +/** + * Tests changing of homepage. + */ +void TestCpPacketDataApPlugin::tcChangeHomepage() +{ + QFETCH(QString, string); + QFETCH(QString, result); + + HbAutoTest::mouseClick(mMainWindow, mTestView, homepageLineEdit); + + // Erase old string + QString text = mTestView->mHomepageItem->contentWidgetData("text").toString(); + subClearLineEdit(text.size()); + + // Enter new string + HbAutoTest::keyClicks(mMainWindow, string, 0, waitTime); + + HbAutoTest::mouseClick(mMainWindow, mTestView, sideTop); + + // Verify both commsdat and UI widget + subVerifyString( + CMManagerShim::CmStartPage, + mTestView->mHomepageItem, + result); +} + +/** + * Test data for homepage change test case. + */ +void TestCpPacketDataApPlugin::tcChangeHomepage_data() +{ + QTest::addColumn("string"); + QTest::addColumn("result"); + +// Doesn't work always, view goes blank sometimes, Orbit bug? +// QTest::newRow("long") +// << "http://developer.symbian.org/main/documentation/reference/s^3/doc_source/AboutSymbianOSLibrary9.6/index.html" +// << "http://developer.symbian.org/main/documentation/reference/s^3/doc_source/AboutSymbianOSLibrary9.6/index.html"; + QTest::newRow("basic") // last one should always fit on one line in UI + << "http://www.symbian.org/" + << "http://www.symbian.org/"; + QTest::newRow("empty") + << "" + << ""; +} + +/** + * Tests advanced settings view (which is currently empty). + */ +void TestCpPacketDataApPlugin::tcAdvancedSettings() +{ + // Launch advanced settings view + bool status = connect( + this, + SIGNAL(menuActionTriggered(HbAction *)), + mTestView, + SLOT(menuActionTriggered(HbAction *))); + Q_ASSERT(status); + emit menuActionTriggered(mTestView->mAdvancedSettingsAction); + + QTest::qWait(2000); + + // Return from advanced settings view + subClickWidget("HbNavigationButton"); +} + +// ----------------------------------------------------------------------------- +// SUB TEST CASES +// ----------------------------------------------------------------------------- + +/** + * Creates the settings view and shows it. + */ +void TestCpPacketDataApPlugin::subCreateSettingsView(uint connectionMethodId) +{ + // Create settings view + HbView *view = mPlugin->createSettingView(connectionMethodId); + QVERIFY(view != NULL); + + // Display the view + mMainWindow->addView(view); + mMainWindow->setCurrentView(view); + // Store pointer to settings view class + mTestView = static_cast(view); +} + +/** + * Verifies that given string is correctly stored in CommsDat and shown on UI. + */ +void TestCpPacketDataApPlugin::subVerifyString( + CMManagerShim::ConnectionMethodAttribute attribute, + HbDataFormModelItem *item, + QString expected) +{ + // Read attribute value from CommsDat + QScopedPointer cmManager(new CmManagerShim); + QScopedPointer connectionMethod( + cmManager->connectionMethod(testApId)); + QString commsdat = connectionMethod->getStringAttribute(attribute); + + QCOMPARE(commsdat, expected); + + // Get value from UI widget + QString widget = item->contentWidgetData("text").toString(); + + QCOMPARE(widget, expected); +} + +/** + * Clears a HbLineEdit. + */ +void TestCpPacketDataApPlugin::subClearLineEdit( + uint length) +{ + // Erase old string + QTest::qWait(5000); // TODO: Remove this when item specific menu doesn't pop up anymore + + // Move cursor to end of string + //HbAutoTest::keyClick(mMainWindow, Qt::Key_End, 0, waitTime); // doesn't seem to do anything? + HbAutoTest::keyClick(mMainWindow, Qt::Key_Down, 0, waitTime); + HbAutoTest::keyClick(mMainWindow, Qt::Key_Down, 0, waitTime); + HbAutoTest::keyClick(mMainWindow, Qt::Key_Down, 0, waitTime); + for (int i=0; i<25; i++) { + HbAutoTest::keyClick(mMainWindow, Qt::Key_Right, 0, waitTime); + } + for (int i=0; i cmManager(new CmManagerShim); + QScopedPointer connectionMethod( + cmManager->connectionMethod(testApId)); + return connectionMethod->getBoolAttribute(attribute); +} + +/** + * Verifies that given attribute contains expected boolean value in CommsDat. + */ +void TestCpPacketDataApPlugin::subVerifyBool( + CMManagerShim::ConnectionMethodAttribute attribute, + bool expected) +{ + // Read attribute value from CommsDat + QScopedPointer cmManager(new CmManagerShim); + QScopedPointer connectionMethod( + cmManager->connectionMethod(testApId)); + bool commsdat = connectionMethod->getBoolAttribute(attribute); + + QCOMPARE(commsdat, expected); +} + +/** + * Clicks a widget currently on UI by class name. + */ +void TestCpPacketDataApPlugin::subClickWidget(const QString &name) +{ + QList itemList = mMainWindow->scene()->items(); + + QGraphicsItem *target = 0; + foreach (QGraphicsItem* item, itemList) { + if (item->isWidget()) { + QString widgetClassName(static_cast(item)->metaObject()->className()); + //qDebug() << widgetClassName; + + if (widgetClassName == name) { + target = item; + break; + } + } + } + + Q_ASSERT(target); + HbAutoTest::mouseClick(mMainWindow, static_cast(target)); +}