/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include "../qbearertestcommon.h" #ifndef QT_NO_BEARERMANAGEMENT #include #include #endif QT_USE_NAMESPACE class tst_QNetworkConfigurationManager : public QObject { Q_OBJECT private slots: #ifndef QT_NO_BEARERMANAGEMENT void usedInThread(); // this test must be first, or it will falsely pass void allConfigurations(); void defaultConfiguration(); void configurationFromIdentifier(); #endif }; #ifndef QT_NO_BEARERMANAGEMENT void printConfigurationDetails(const QNetworkConfiguration& p) { qDebug() << p.name() <<": isvalid->" <"<< p.type() << " roaming->" << p.isRoamingAvailable() << "identifier->" << p.identifier() << " purpose->" << p.purpose() << " state->" << p.state(); } void tst_QNetworkConfigurationManager::allConfigurations() { QNetworkConfigurationManager manager; QList preScanConfigs = manager.allConfigurations(); foreach(QNetworkConfiguration c, preScanConfigs) { QVERIFY2(c.type()!=QNetworkConfiguration::UserChoice, "allConfiguration must not return UserChoice configs"); } QSignalSpy spy(&manager, SIGNAL(updateCompleted())); manager.updateConfigurations(); //initiate scans QTRY_VERIFY_WITH_TIMEOUT(spy.count() == 1, TestTimeOut); //wait for scan to complete QList configs = manager.allConfigurations(); int all = configs.count(); qDebug() << "All configurations:" << all; QVERIFY(all); foreach(QNetworkConfiguration p, configs) { QVERIFY(p.isValid()); printConfigurationDetails(p); QVERIFY(p.type() != QNetworkConfiguration::Invalid); QVERIFY(p.type() != QNetworkConfiguration::UserChoice); } configs = manager.allConfigurations(QNetworkConfiguration::Undefined); int undefined = configs.count(); QVERIFY(undefined <= all); qDebug() << "Undefined configurations:" << undefined; foreach( const QNetworkConfiguration p, configs) { printConfigurationDetails(p); QVERIFY(p.state() & QNetworkConfiguration::Undefined); QVERIFY(!(p.state() & QNetworkConfiguration::Defined)); } //get defined configs only (same as all) configs = manager.allConfigurations(QNetworkConfiguration::Defined); int defined = configs.count(); qDebug() << "Defined configurations:" << defined; QVERIFY(defined <= all); foreach( const QNetworkConfiguration p, configs) { printConfigurationDetails(p); QVERIFY(p.state() & QNetworkConfiguration::Defined); QVERIFY(!(p.state() & QNetworkConfiguration::Undefined)); } //get discovered configurations only configs = manager.allConfigurations(QNetworkConfiguration::Discovered); int discovered = configs.count(); //QVERIFY(discovered); qDebug() << "Discovered configurations:" << discovered; foreach(const QNetworkConfiguration p, configs) { printConfigurationDetails(p); QVERIFY(p.isValid()); QVERIFY(!(p.state() & QNetworkConfiguration::Undefined)); QVERIFY(p.state() & QNetworkConfiguration::Defined); QVERIFY(p.state() & QNetworkConfiguration::Discovered); } //getactive configurations only configs = manager.allConfigurations(QNetworkConfiguration::Active); int active = configs.count(); if (active) QVERIFY(manager.isOnline()); else QVERIFY(!manager.isOnline()); //QVERIFY(active); qDebug() << "Active configurations:" << active; foreach(const QNetworkConfiguration p, configs) { printConfigurationDetails(p); QVERIFY(p.isValid()); QVERIFY(!(p.state() & QNetworkConfiguration::Undefined)); QVERIFY(p.state() & QNetworkConfiguration::Active); QVERIFY(p.state() & QNetworkConfiguration::Discovered); QVERIFY(p.state() & QNetworkConfiguration::Defined); } QVERIFY(all >= discovered); QVERIFY(discovered >= active); } void tst_QNetworkConfigurationManager::defaultConfiguration() { QNetworkConfigurationManager manager; QSignalSpy spy(&manager, SIGNAL(updateCompleted())); manager.updateConfigurations(); //initiate scans QTRY_VERIFY_WITH_TIMEOUT(spy.count() == 1, TestTimeOut); //wait for scan to complete QList configs = manager.allConfigurations(); QNetworkConfiguration defaultConfig = manager.defaultConfiguration(); bool confirm = configs.contains(defaultConfig); if (defaultConfig.type() != QNetworkConfiguration::UserChoice) { QVERIFY(confirm || !defaultConfig.isValid()); QVERIFY(!(confirm && !defaultConfig.isValid())); } else { QVERIFY(!confirm); // user choice config is not part of allConfigurations() QVERIFY(defaultConfig.isValid()); QCOMPARE(defaultConfig.name(), QString("UserChoice")); QCOMPARE(defaultConfig.children().count(), 0); QVERIFY(!defaultConfig.isRoamingAvailable()); QCOMPARE(defaultConfig.state(), QNetworkConfiguration::Discovered); QNetworkConfiguration copy = manager.configurationFromIdentifier(defaultConfig.identifier()); QVERIFY(copy == defaultConfig); } } void tst_QNetworkConfigurationManager::configurationFromIdentifier() { QNetworkConfigurationManager manager; QSet allIdentifier; //force an update to get maximum number of configs QSignalSpy spy(&manager, SIGNAL(updateCompleted())); manager.updateConfigurations(); //initiate scans QTRY_VERIFY_WITH_TIMEOUT(spy.count() == 1, TestTimeOut); //wait for scan to complete QList configs = manager.allConfigurations(); foreach(QNetworkConfiguration c, configs) { QVERIFY(!allIdentifier.contains(c.identifier())); allIdentifier.insert(c.identifier()); QNetworkConfiguration direct = manager.configurationFromIdentifier(c.identifier()); QVERIFY(direct.isValid()); QVERIFY(direct == c); } //assume that there is no item with identifier 'FooBar' QVERIFY(!allIdentifier.contains("FooBar")); QNetworkConfiguration invalid = manager.configurationFromIdentifier("FooBar"); QVERIFY(!invalid.isValid()); } class QNCMTestThread : public QThread { protected: virtual void run() { QNetworkConfigurationManager manager; preScanConfigs = manager.allConfigurations(); QSignalSpy spy(&manager, SIGNAL(updateCompleted())); manager.updateConfigurations(); //initiate scans QTRY_VERIFY_WITH_TIMEOUT(spy.count() == 1, TestTimeOut); //wait for scan to complete configs = manager.allConfigurations(); } public: QList configs; QList preScanConfigs; }; // regression test for QTBUG-18795 void tst_QNetworkConfigurationManager::usedInThread() { #if defined Q_OS_MAC && !defined (QT_NO_COREWLAN) QSKIP("QTBUG-19070 Mac CoreWlan plugin is broken"); #else QNCMTestThread thread; connect(&thread, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); thread.start(); QTestEventLoop::instance().enterLoop(100); //QTRY_VERIFY_WITH_TIMEOUT could take ~90 seconds to time out in the thread QVERIFY(!QTestEventLoop::instance().timeout()); qDebug() << "prescan:" << thread.preScanConfigs.count(); qDebug() << "postscan:" << thread.configs.count(); QNetworkConfigurationManager manager; QList preScanConfigs = manager.allConfigurations(); QSignalSpy spy(&manager, SIGNAL(updateCompleted())); manager.updateConfigurations(); //initiate scans QTRY_VERIFY_WITH_TIMEOUT(spy.count() == 1, TestTimeOut); //wait for scan to complete QList configs = manager.allConfigurations(); QCOMPARE(thread.configs, configs); //Don't compare pre scan configs, because these may be cached and therefore give different results //which makes the test unstable. The post scan results should have all configurations every time //QCOMPARE(thread.preScanConfigs, preScanConfigs); #endif } #endif QTEST_MAIN(tst_QNetworkConfigurationManager) #include "tst_qnetworkconfigurationmanager.moc"