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")); |
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"); |
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"); |