qtmobility/tests/auto/qnetworksession/tst_qnetworksession/tst_qnetworksession.cpp
branchRCL_3
changeset 2 5822d84012fb
parent 0 cfcbf08528c4
child 3 87be51aa5b5b
equal deleted inserted replaced
0:cfcbf08528c4 2:5822d84012fb
    40 ****************************************************************************/
    40 ****************************************************************************/
    41 
    41 
    42 #include <QtTest/QtTest>
    42 #include <QtTest/QtTest>
    43 #include <QLocalServer>
    43 #include <QLocalServer>
    44 #include <QLocalSocket>
    44 #include <QLocalSocket>
       
    45 #include <QTimer>
    45 #include "../../qbearertestcommon.h"
    46 #include "../../qbearertestcommon.h"
    46 #include <qnetworkconfigmanager.h>
    47 #include <qnetworkconfigmanager.h>
    47 #include <qnetworksession.h>
    48 #include <qnetworksession.h>
    48 
    49 
    49 #ifdef Q_WS_MAEMO_6
    50 #if defined(Q_WS_MAEMO_6) || defined(Q_WS_MAEMO_5)
    50 #include <stdio.h>
    51 #include <stdio.h>
    51 #include <iapconf.h>
    52 #include <iapconf.h>
    52 #endif
    53 #endif
    53 
    54 
    54 QTM_USE_NAMESPACE
    55 QTM_USE_NAMESPACE
       
    56 
       
    57 // Can be used to configure tests that require manual attention (such as roaming)
       
    58 //#define QNETWORKSESSION_MANUAL_TESTS 1
    55 
    59 
    56 Q_DECLARE_METATYPE(QNetworkConfiguration)
    60 Q_DECLARE_METATYPE(QNetworkConfiguration)
    57 Q_DECLARE_METATYPE(QNetworkConfiguration::Type);
    61 Q_DECLARE_METATYPE(QNetworkConfiguration::Type);
    58 Q_DECLARE_METATYPE(QNetworkSession::State);
    62 Q_DECLARE_METATYPE(QNetworkSession::State);
    59 Q_DECLARE_METATYPE(QNetworkSession::SessionError);
    63 Q_DECLARE_METATYPE(QNetworkSession::SessionError);
    73 
    77 
    74     void repeatedOpenClose_data();
    78     void repeatedOpenClose_data();
    75     void repeatedOpenClose();
    79     void repeatedOpenClose();
    76     
    80     
    77     void roamingErrorCodes();
    81     void roamingErrorCodes();
       
    82     
       
    83     void sessionStop_data();
       
    84     void sessionStop();
    78 
    85 
    79     void sessionProperties_data();
    86     void sessionProperties_data();
    80     void sessionProperties();
    87     void sessionProperties();
    81 
    88 
    82     void userChoiceSession_data();
    89     void userChoiceSession_data();
    88 private:
    95 private:
    89     QNetworkConfigurationManager manager;
    96     QNetworkConfigurationManager manager;
    90 
    97 
    91     uint inProcessSessionManagementCount;
    98     uint inProcessSessionManagementCount;
    92 
    99 
    93 #ifdef Q_WS_MAEMO_6
   100 #if defined(Q_WS_MAEMO_6) || defined(Q_WS_MAEMO_5)
    94     Maemo::IAPConf *iapconf;
   101     Maemo::IAPConf *iapconf;
    95     Maemo::IAPConf *iapconf2;
   102     Maemo::IAPConf *iapconf2;
    96     Maemo::IAPConf *gprsiap;
   103     Maemo::IAPConf *gprsiap;
    97 #define MAX_IAPS 10
   104 #define MAX_IAPS 10
    98     Maemo::IAPConf *iaps[MAX_IAPS];
   105     Maemo::IAPConf *iaps[MAX_IAPS];
   101 };
   108 };
   102 
   109 
   103 // Helper functions
   110 // Helper functions
   104 bool openSession(QNetworkSession *session);
   111 bool openSession(QNetworkSession *session);
   105 bool closeSession(QNetworkSession *session, bool lastSessionOnConfiguration = true);
   112 bool closeSession(QNetworkSession *session, bool lastSessionOnConfiguration = true);
       
   113 void updateConfigurations();
   106 QNetworkConfiguration suitableConfiguration(QString bearerType, QNetworkConfiguration::Type configType);
   114 QNetworkConfiguration suitableConfiguration(QString bearerType, QNetworkConfiguration::Type configType);
   107 
   115 
   108 void tst_QNetworkSession::initTestCase()
   116 void tst_QNetworkSession::initTestCase()
   109 {
   117 {
   110     qRegisterMetaType<QNetworkSession::State>("QNetworkSession::State");
   118     qRegisterMetaType<QNetworkSession::State>("QNetworkSession::State");
   111     qRegisterMetaType<QNetworkSession::SessionError>("QNetworkSession::SessionError");
   119     qRegisterMetaType<QNetworkSession::SessionError>("QNetworkSession::SessionError");
   112     qRegisterMetaType<QNetworkConfiguration>("QNetworkConfiguration");
   120     qRegisterMetaType<QNetworkConfiguration>("QNetworkConfiguration");
   113     qRegisterMetaType<QNetworkConfiguration::Type>("QNetworkConfiguration::Type");
   121     qRegisterMetaType<QNetworkConfiguration::Type>("QNetworkConfiguration::Type");
   114 
   122 
   115 #ifdef Q_WS_MAEMO_6
   123 #if defined(Q_WS_MAEMO_6) || defined(Q_WS_MAEMO_5)
   116     iapconf = new Maemo::IAPConf("007");
   124     iapconf = new Maemo::IAPConf("007");
   117     iapconf->setValue("ipv4_type", "AUTO");
   125     iapconf->setValue("ipv4_type", "AUTO");
   118     iapconf->setValue("wlan_wepkey1", "connt");
   126     iapconf->setValue("wlan_wepkey1", "connt");
   119     iapconf->setValue("wlan_wepdefkey", 1);
   127     iapconf->setValue("wlan_wepdefkey", 1);
   120     iapconf->setValue("wlan_ssid", QByteArray("JamesBond"));
   128     iapconf->setValue("wlan_ssid", QByteArray("JamesBond"));
   196         inProcessSessionManagementCount == 0) {
   204         inProcessSessionManagementCount == 0) {
   197         QFAIL("No usable configurations found to complete all possible "
   205         QFAIL("No usable configurations found to complete all possible "
   198               "tests in inProcessSessionManagement()");
   206               "tests in inProcessSessionManagement()");
   199     }
   207     }
   200 
   208 
   201 #ifdef Q_WS_MAEMO_6
   209 #if defined(Q_WS_MAEMO_6) || defined(Q_WS_MAEMO_5)
   202     iapconf->clear();
   210     iapconf->clear();
   203     delete iapconf;
   211     delete iapconf;
   204     iapconf2->clear();
   212     iapconf2->clear();
   205     delete iapconf2;
   213     delete iapconf2;
   206     gprsiap->clear();
   214     gprsiap->clear();
   221 #endif
   229 #endif
   222 }
   230 }
   223 
   231 
   224 void tst_QNetworkSession::invalidSession()
   232 void tst_QNetworkSession::invalidSession()
   225 {
   233 {
   226     // Verify that session created with invalid configuration remains in invalid state
   234     // 1. Verify that session created with invalid configuration remains in invalid state
   227     QNetworkSession session(QNetworkConfiguration(), 0);
   235     QNetworkSession session(QNetworkConfiguration(), 0);
   228     QVERIFY(!session.isOpen());
   236     QVERIFY(!session.isOpen());
   229     QVERIFY(session.state() == QNetworkSession::Invalid);
   237     QVERIFY(session.state() == QNetworkSession::Invalid);
   230     
   238     
   231     // Verify that opening session with invalid configuration both 1) emits invalidconfigurationerror
   239     // 2. Verify that opening session with invalid configuration both 1) emits invalidconfigurationerror and 2) sets session's state as invalid.
   232     // and 2) sets session's state as invalid.
       
   233     QSignalSpy errorSpy(&session, SIGNAL(error(QNetworkSession::SessionError)));
   240     QSignalSpy errorSpy(&session, SIGNAL(error(QNetworkSession::SessionError)));
   234     session.open();
   241     session.open();
   235     session.waitForOpened(1000); // Should bail out right away
   242     session.waitForOpened(1000); // Should bail out right away
   236     QVERIFY(errorSpy.count() == 1); 
   243     QVERIFY(errorSpy.count() == 1); 
   237     QNetworkSession::SessionError error =
   244     QNetworkSession::SessionError error =
   238            qvariant_cast<QNetworkSession::SessionError> (errorSpy.first().at(0));
   245            qvariant_cast<QNetworkSession::SessionError> (errorSpy.first().at(0));
   239     QVERIFY(error == QNetworkSession::InvalidConfigurationError);
   246     QVERIFY(error == QNetworkSession::InvalidConfigurationError);
   240     QVERIFY(session.state() == QNetworkSession::Invalid);
   247     QVERIFY(session.state() == QNetworkSession::Invalid);
   241 
   248 
   242     // Check same thing with a config from platform (there are subtle differences
   249 #ifdef QNETWORKSESSION_MANUAL_TESTS
   243     // because emtpy configuration does not have private pointer). Test with config 
   250     QNetworkConfiguration definedConfig = suitableConfiguration("WLAN",QNetworkConfiguration::InternetAccessPoint);
   244     // in '(un)defined' state
   251     if (definedConfig.isValid()) {
   245     QList<QNetworkConfiguration> allConfigs = manager.allConfigurations();
   252         // 3. Verify that opening a session with defined configuration emits error and enters notavailable-state
   246     foreach(QNetworkConfiguration config, allConfigs) {
   253         // TODO these timer waits should be changed to waiting appropriate signals, now these wait excessively
   247         if ((config.state() & QNetworkConfiguration::Discovered) != QNetworkConfiguration::Discovered) {
   254         qDebug() << "Shutdown WLAN IAP (waiting 60 seconds): " << definedConfig.name();
   248             QNetworkSession session2(config);
   255         QTest::qWait(60000);
   249             QSignalSpy errorSpy2(&session2, SIGNAL(error(QNetworkSession::SessionError)));
   256         // Shutting down WLAN should bring back to defined -state.
   250             session2.open();
   257         QVERIFY((definedConfig.state() & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined);
   251             session2.waitForOpened(1000); // Should bail out right away
   258         QNetworkSession definedSession(definedConfig);
   252             QVERIFY(errorSpy2.count() == 1); 
   259         QSignalSpy errorSpy(&definedSession, SIGNAL(error(QNetworkSession::SessionError)));
   253             QNetworkSession::SessionError error2 =
   260         QNetworkSession::SessionError sessionError;
   254                        qvariant_cast<QNetworkSession::SessionError> (errorSpy2.first().at(0));
   261 
   255             QVERIFY(error2 == QNetworkSession::InvalidConfigurationError);
   262         definedSession.open();
   256             QVERIFY(session2.state() == QNetworkSession::Invalid);
   263 
   257             break; // Once is enough
   264         QVERIFY(definedConfig.isValid()); // Session remains valid
   258         }
   265         QVERIFY(definedSession.state() == QNetworkSession::NotAvailable); // State is not available because WLAN is not in coverage
   259     }
   266         QVERIFY(!errorSpy.isEmpty()); // Session tells with error about invalidated configuration
       
   267         sessionError = qvariant_cast<QNetworkSession::SessionError> (errorSpy.first().at(0));
       
   268         qDebug() << "Error code is: " << sessionError;
       
   269         QVERIFY(sessionError == QNetworkSession::InvalidConfigurationError);
       
   270         
       
   271         qDebug() << "Turn the WLAN IAP back on (waiting 60 seconds): " << definedConfig.name();
       
   272         QTest::qWait(60000);
       
   273         updateConfigurations();
       
   274         
       
   275         QVERIFY(definedConfig.state() == QNetworkConfiguration::Discovered);
       
   276     }
       
   277         
       
   278     QNetworkConfiguration invalidatedConfig = suitableConfiguration("WLAN",QNetworkConfiguration::InternetAccessPoint);
       
   279     if (invalidatedConfig.isValid()) {
       
   280         // 4. Verify that invalidating a session after its successfully configured works
       
   281         QNetworkSession invalidatedSession(invalidatedConfig);
       
   282         QSignalSpy errorSpy(&invalidatedSession, SIGNAL(error(QNetworkSession::SessionError)));
       
   283         QNetworkSession::SessionError sessionError;
       
   284         
       
   285         qDebug() << "Delete the WLAN IAP from phone now (waiting 60 seconds): " << invalidatedConfig.name();
       
   286         QTest::qWait(60000);
       
   287         
       
   288         invalidatedSession.open();
       
   289         QVERIFY(!invalidatedConfig.isValid());
       
   290         QVERIFY(invalidatedSession.state() == QNetworkSession::Invalid);
       
   291         QVERIFY(!errorSpy.isEmpty());
       
   292         
       
   293         sessionError = qvariant_cast<QNetworkSession::SessionError> (errorSpy.first().at(0));
       
   294         QVERIFY(sessionError == QNetworkSession::InvalidConfigurationError);
       
   295         qDebug() << "Add the WLAN IAP back (waiting 60 seconds): " << invalidatedConfig.name();
       
   296         QTest::qWait(60000);
       
   297     }
       
   298 #endif
   260 }
   299 }
   261 
   300 
   262 void tst_QNetworkSession::sessionProperties_data()
   301 void tst_QNetworkSession::sessionProperties_data()
   263 {
   302 {
   264     QTest::addColumn<QNetworkConfiguration>("configuration");
   303     QTest::addColumn<QNetworkConfiguration>("configuration");
   370        QVERIFY(closeSession(&permanentSession));
   409        QVERIFY(closeSession(&permanentSession));
   371     }
   410     }
   372 }
   411 }
   373 
   412 
   374 void tst_QNetworkSession::roamingErrorCodes() {
   413 void tst_QNetworkSession::roamingErrorCodes() {
   375     
       
   376 #ifndef Q_OS_SYMBIAN
   414 #ifndef Q_OS_SYMBIAN
   377     QSKIP("Roaming supported on Symbian.", SkipAll);
   415     QSKIP("Roaming supported on Symbian.", SkipAll);
   378 #else 
   416 #else 
   379     QNetworkConfiguration wlanIapConfig = suitableConfiguration("WLAN", QNetworkConfiguration::InternetAccessPoint);
   417     QNetworkConfiguration wlanIapConfig = suitableConfiguration("WLAN", QNetworkConfiguration::InternetAccessPoint);
   380     if (!wlanIapConfig.isValid()) {
   418     if (!wlanIapConfig.isValid()) {
   398     QNetworkSession::SessionError error = qvariant_cast<QNetworkSession::SessionError>(errorSpy.first().at(0));
   436     QNetworkSession::SessionError error = qvariant_cast<QNetworkSession::SessionError>(errorSpy.first().at(0));
   399     QVERIFY(error == QNetworkSession::SessionAbortedError);
   437     QVERIFY(error == QNetworkSession::SessionAbortedError);
   400     QVERIFY(iapSession.state() == QNetworkSession::Disconnected);
   438     QVERIFY(iapSession.state() == QNetworkSession::Disconnected);
   401     QVERIFY(adminIapSession.state() == QNetworkSession::Disconnected);
   439     QVERIFY(adminIapSession.state() == QNetworkSession::Disconnected);
   402 #endif // Q_OS_SYMBIAN
   440 #endif // Q_OS_SYMBIAN
   403     /*
   441    
   404      // Check for roaming error. Challenging to automate, therefore commented out.
   442 #ifdef QNETWORKSESSION_MANUAL_TESTS
       
   443      // Check for roaming error.
   405      // Case requires that you have controllable WLAN in Internet SNAP (only).
   444      // Case requires that you have controllable WLAN in Internet SNAP (only).
   406     QNetworkConfiguration snapConfig = suitableConfiguration("bearer_not_relevant_with_snaps", QNetworkConfiguration::ServiceNetwork);
   445     QNetworkConfiguration snapConfig = suitableConfiguration("bearer_not_relevant_with_snaps", QNetworkConfiguration::ServiceNetwork);
   407     if (!snapConfig.isValid()) {
   446     if (!snapConfig.isValid()) {
   408         QSKIP("No SNAP accessible, skipping test.", SkipAll);
   447         QSKIP("No SNAP accessible, skipping test.", SkipAll);
   409     }
   448     }
   427     QTRY_VERIFY(!errorSpy2.isEmpty()); // wait for error signals
   466     QTRY_VERIFY(!errorSpy2.isEmpty()); // wait for error signals
   428     QVERIFY(errorSpy2.count() == 1);
   467     QVERIFY(errorSpy2.count() == 1);
   429     error = qvariant_cast<QNetworkSession::SessionError>(errorSpy2.first().at(0));
   468     error = qvariant_cast<QNetworkSession::SessionError>(errorSpy2.first().at(0));
   430     QVERIFY(error == QNetworkSession::SessionAbortedError);
   469     QVERIFY(error == QNetworkSession::SessionAbortedError);
   431     QVERIFY(iapSession2.state() == QNetworkSession::Disconnected);
   470     QVERIFY(iapSession2.state() == QNetworkSession::Disconnected);
   432     */
   471 #endif
       
   472 }
       
   473 
       
   474 
       
   475 void tst_QNetworkSession::sessionStop_data() {
       
   476     QTest::addColumn<QString>("bearerType");
       
   477     QTest::addColumn<QNetworkConfiguration::Type>("configurationType");
       
   478 
       
   479     QTest::newRow("SNAP") << "bearer_type_not_relevant_with_SNAPs" << QNetworkConfiguration::ServiceNetwork;
       
   480     QTest::newRow("WLAN_IAP") << "WLAN" << QNetworkConfiguration::InternetAccessPoint;
       
   481     QTest::newRow("Cellular_IAP") << "cellular" << QNetworkConfiguration::InternetAccessPoint;
       
   482 }
       
   483 
       
   484 void tst_QNetworkSession::sessionStop() 
       
   485 {
       
   486 #ifndef Q_OS_SYMBIAN
       
   487     QSKIP("Testcase contains mainly Symbian specific checks, because it is only platform to really support interface (IAP-level) Stop.", SkipAll);
       
   488 #endif 
       
   489     QFETCH(QString, bearerType);
       
   490     QFETCH(QNetworkConfiguration::Type, configurationType);
       
   491     
       
   492     int configWaitdelayInMs = 2000;
       
   493     
       
   494     QNetworkConfiguration config = suitableConfiguration(bearerType, configurationType);
       
   495     if (!config.isValid()) {
       
   496         QSKIP("No suitable configurations, skipping this round of session stop test.", SkipSingle);
       
   497     }
       
   498     qDebug() << "Using following configuration to open and stop a session: " << config.name();
       
   499 
       
   500     QNetworkSession openedSession(config);
       
   501     QNetworkSession closedSession(config);
       
   502     QNetworkSession innocentSession(config);
       
   503     QNetworkConfigurationManager mgr;
       
   504     
       
   505     QSignalSpy closedSessionOpenedSpy(&closedSession, SIGNAL(opened()));
       
   506     QSignalSpy closedSessionClosedSpy(&closedSession, SIGNAL(closed()));
       
   507     QSignalSpy closedSessionStateChangedSpy(&closedSession, SIGNAL(stateChanged(QNetworkSession::State)));
       
   508     QSignalSpy closedErrorSpy(&closedSession, SIGNAL(error(QNetworkSession::SessionError)));
       
   509     
       
   510     QSignalSpy innocentSessionClosedSpy(&innocentSession, SIGNAL(closed()));
       
   511     QSignalSpy innocentSessionStateChangedSpy(&innocentSession, SIGNAL(stateChanged(QNetworkSession::State)));
       
   512     QSignalSpy innocentErrorSpy(&innocentSession, SIGNAL(error(QNetworkSession::SessionError)));
       
   513     QNetworkSession::SessionError sessionError;
       
   514     
       
   515     // 1. Verify that stopping an opened session works (the simplest usecase).
       
   516     qDebug("----------1. Verify that stopping an opened session works (the simplest usecase)");
       
   517     QSignalSpy configChangeSpy(&mgr, SIGNAL(configurationChanged(QNetworkConfiguration)));
       
   518     QVERIFY(openSession(&openedSession));
       
   519     qDebug("Waiting for %d ms to get all configurationChange signals from platform.", configWaitdelayInMs);
       
   520     // Clear signals caused by opening
       
   521     closedSessionOpenedSpy.clear();
       
   522     closedSessionClosedSpy.clear();
       
   523     closedSessionStateChangedSpy.clear();
       
   524     closedErrorSpy.clear();
       
   525     openedSession.stop();
       
   526 
       
   527     QVERIFY(openedSession.state() == QNetworkSession::Disconnected);
       
   528     QTest::qWait(configWaitdelayInMs); // Wait to get all relevant configurationChange() signals
       
   529     QVERIFY(config.state() != QNetworkConfiguration::Active);
       
   530     
       
   531     // 2. Verify that stopping a session based on non-connected configuration does nothing
       
   532     qDebug("----------2. Verify that stopping a session based on non-connected configuration does nothing");
       
   533     QNetworkSession::State closedSessionOriginalState = closedSession.state();
       
   534     // Clear all possible signals
       
   535     configChangeSpy.clear();
       
   536     closedSessionOpenedSpy.clear();
       
   537     closedSessionClosedSpy.clear();
       
   538     closedSessionStateChangedSpy.clear();
       
   539     closedErrorSpy.clear();
       
   540     
       
   541     closedSession.stop();
       
   542     qDebug("Waiting for %d ms to get all configurationChange signals from platform.", configWaitdelayInMs);
       
   543     QTest::qWait(configWaitdelayInMs); // Wait to get all relevant configurationChange() signals
       
   544     
       
   545     QVERIFY(closedSessionOpenedSpy.isEmpty());
       
   546     QVERIFY(closedSessionClosedSpy.isEmpty());
       
   547     QVERIFY(closedSessionStateChangedSpy.isEmpty());
       
   548     QVERIFY(closedErrorSpy.isEmpty());
       
   549     QVERIFY(closedSession.state() == closedSessionOriginalState); // State remains
       
   550     
       
   551     // 3. Check that stopping a opened session affects also other opened session based on the same configuration.
       
   552     if (config.type() == QNetworkConfiguration::InternetAccessPoint) {
       
   553         qDebug("----------3. Check that stopping a opened session affects also other opened session based on the same configuration.");
       
   554         QVERIFY(openSession(&openedSession));
       
   555         QVERIFY(openSession(&innocentSession));
       
   556 
       
   557         configChangeSpy.clear();
       
   558         innocentSessionClosedSpy.clear();
       
   559         innocentSessionStateChangedSpy.clear();
       
   560         innocentErrorSpy.clear();
       
   561       
       
   562         openedSession.stop();    
       
   563         qDebug("Waiting for %d ms to get all configurationChange signals from platform.", configWaitdelayInMs);
       
   564         QTest::qWait(configWaitdelayInMs); // Wait to get all relevant configurationChange() signals
       
   565 
       
   566         QVERIFY(!innocentSessionClosedSpy.isEmpty());
       
   567         QVERIFY(!innocentSessionStateChangedSpy.isEmpty());
       
   568         QVERIFY(!innocentErrorSpy.isEmpty());
       
   569         QVERIFY(innocentSession.state() == QNetworkSession::Disconnected);
       
   570         QVERIFY(openedSession.state() == QNetworkSession::Disconnected);
       
   571         sessionError = qvariant_cast<QNetworkSession::SessionError>(innocentErrorSpy.first().at(0));
       
   572         QVERIFY(sessionError == QNetworkSession::SessionAbortedError);
       
   573 
       
   574         innocentSessionClosedSpy.clear();
       
   575         innocentSessionStateChangedSpy.clear();
       
   576         innocentErrorSpy.clear();
       
   577     } else {
       
   578         qDebug("----------3. Skip for SNAP configuration.");
       
   579     }
       
   580     // 4. Check that stopping a non-opened session stops the other session based on the 
       
   581     // same configuration if configuration is IAP. Stopping closed SNAP session has no impact on other opened SNAP session.
       
   582     if (config.type() == QNetworkConfiguration::ServiceNetwork) {
       
   583         qDebug("----------4. Skip for SNAP configuration.");
       
   584     } else if (config.type() == QNetworkConfiguration::InternetAccessPoint) {
       
   585         qDebug("----------4. Check that stopping a non-opened session stops the other session based on the same configuration");
       
   586         QVERIFY(openSession(&innocentSession));
       
   587         qDebug("Waiting for %d ms after open to make sure all platform indications are propagated", configWaitdelayInMs);
       
   588         QTest::qWait(configWaitdelayInMs);
       
   589         closedSession.stop();
       
   590         qDebug("Waiting for %d ms to get all configurationChange signals from platform..", configWaitdelayInMs);
       
   591         QTest::qWait(configWaitdelayInMs); // Wait to get all relevant configurationChange() signals
       
   592     
       
   593         QVERIFY(!innocentSessionClosedSpy.isEmpty());
       
   594         QVERIFY(!innocentSessionStateChangedSpy.isEmpty());
       
   595         QVERIFY(!innocentErrorSpy.isEmpty());
       
   596         QVERIFY(innocentSession.state() == QNetworkSession::Disconnected);
       
   597         QVERIFY(closedSession.state() == QNetworkSession::Disconnected);
       
   598         sessionError = qvariant_cast<QNetworkSession::SessionError>(innocentErrorSpy.first().at(0));
       
   599         QVERIFY(sessionError == QNetworkSession::SessionAbortedError);
       
   600         QVERIFY(config.state() == QNetworkConfiguration::Discovered);
       
   601     }
       
   602     
       
   603     // 5. Sanity check that stopping invalid session does not crash
       
   604     qDebug("----------5. Sanity check that stopping invalid session does not crash");
       
   605     QNetworkSession invalidSession(QNetworkConfiguration(), 0);
       
   606     QVERIFY(invalidSession.state() == QNetworkSession::Invalid);
       
   607     invalidSession.stop();
       
   608     QVERIFY(invalidSession.state() == QNetworkSession::Invalid);
   433 }
   609 }
   434 
   610 
   435 void tst_QNetworkSession::userChoiceSession_data()
   611 void tst_QNetworkSession::userChoiceSession_data()
   436 {
   612 {
   437     QTest::addColumn<QNetworkConfiguration>("configuration");
   613     QTest::addColumn<QNetworkConfiguration>("configuration");
  1040 
  1216 
  1041 // A convinience / helper function for testcases. Return the first matching configuration.
  1217 // A convinience / helper function for testcases. Return the first matching configuration.
  1042 // Ignores configurations in other than 'discovered' -state. Returns invalid (QNetworkConfiguration())
  1218 // Ignores configurations in other than 'discovered' -state. Returns invalid (QNetworkConfiguration())
  1043 // if none found.
  1219 // if none found.
  1044 QNetworkConfiguration suitableConfiguration(QString bearerType, QNetworkConfiguration::Type configType) {
  1220 QNetworkConfiguration suitableConfiguration(QString bearerType, QNetworkConfiguration::Type configType) {
       
  1221     
  1045     // Refresh configurations and derive configurations matching given parameters.
  1222     // Refresh configurations and derive configurations matching given parameters.
  1046     QNetworkConfigurationManager mgr;
  1223     QNetworkConfigurationManager mgr;
  1047     QSignalSpy updateSpy(&mgr, SIGNAL(updateCompleted()));
  1224     QSignalSpy updateSpy(&mgr, SIGNAL(updateCompleted()));
  1048     mgr.updateConfigurations();
  1225     mgr.updateConfigurations();
  1049     QTRY_NOOP(updateSpy.count() == 1);
  1226     QTRY_NOOP(updateSpy.count() == 1);
  1080     } else {
  1257     } else {
  1081         return discoveredConfigs.first();
  1258         return discoveredConfigs.first();
  1082     }
  1259     }
  1083 }
  1260 }
  1084 
  1261 
       
  1262 // A convinience-function: updates configurations and waits that they are updated.
       
  1263 void updateConfigurations() 
       
  1264 {
       
  1265     QNetworkConfigurationManager mgr;
       
  1266     QSignalSpy updateSpy(&mgr, SIGNAL(updateCompleted()));
       
  1267     mgr.updateConfigurations();
       
  1268     QTRY_NOOP(updateSpy.count() == 1);
       
  1269 }
       
  1270 
  1085 // A convinience function for test-cases: opens the given configuration and return
  1271 // A convinience function for test-cases: opens the given configuration and return
  1086 // true if it was done gracefully.
  1272 // true if it was done gracefully.
  1087 bool openSession(QNetworkSession *session) {
  1273 bool openSession(QNetworkSession *session) {
  1088     QNetworkConfigurationManager mgr;
  1274     QNetworkConfigurationManager mgr;
  1089     QSignalSpy openedSpy(session, SIGNAL(opened()));
  1275     QSignalSpy openedSpy(session, SIGNAL(opened()));
  1179         configChangeSpy.isEmpty()) {
  1365         configChangeSpy.isEmpty()) {
  1180         qDebug("tst_QNetworkSession::closeSession() failure: QNetworkConfigurationManager::configurationChanged() - signal not detected.");
  1366         qDebug("tst_QNetworkSession::closeSession() failure: QNetworkConfigurationManager::configurationChanged() - signal not detected.");
  1181         return false;
  1367         return false;
  1182     }
  1368     }
  1183     if (lastSessionOnConfiguration &&
  1369     if (lastSessionOnConfiguration &&
  1184         session->configuration().state() != QNetworkConfiguration::Discovered) {
  1370         session->configuration().state() == QNetworkConfiguration::Active) {
  1185          qDebug("tst_QNetworkSession::closeSession() failure: session's configuration is not back in 'Discovered' -state.");
  1371          qDebug("tst_QNetworkSession::closeSession() failure: session's configuration is still in active state.");
  1186          return false;
  1372          return false;
  1187     }
  1373     }
  1188     return true;
  1374     return true;
  1189 }
  1375 }
  1190 
  1376 
  1191 
       
  1192 
       
  1193 QTEST_MAIN(tst_QNetworkSession)
  1377 QTEST_MAIN(tst_QNetworkSession)
  1194 
  1378 
  1195 #include "tst_qnetworksession.moc"
  1379 #include "tst_qnetworksession.moc"
  1196