38be0d1383
This is the beginning of revision history for this module. If you want to look at revision history older than this, please refer to the Qt Git wiki for how to use Git history grafting. At the time of writing, this wiki is located here: http://qt.gitorious.org/qt/pages/GitIntroductionWithQt If you have already performed the grafting and you don't see any history beyond this commit, try running "git log" with the "--follow" argument. Branched from the monolithic repo, Qt master branch, at commit 896db169ea224deb96c59ce8af800d019de63f12
421 lines
14 KiB
C++
421 lines
14 KiB
C++
/****************************************************************************
|
|
**
|
|
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
|
** All rights reserved.
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
|
**
|
|
** This file is part of the test suite of the Qt Toolkit.
|
|
**
|
|
** $QT_BEGIN_LICENSE:LGPL$
|
|
** No Commercial Usage
|
|
** This file contains pre-release code and may not be distributed.
|
|
** You may use this file in accordance with the terms and conditions
|
|
** contained in the Technology Preview License Agreement accompanying
|
|
** this package.
|
|
**
|
|
** 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, Nokia gives you certain additional
|
|
** rights. These rights are described in the Nokia Qt LGPL Exception
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
**
|
|
** If you have questions regarding the use of this file, please contact
|
|
** Nokia at qt-info@nokia.com.
|
|
**
|
|
**
|
|
**
|
|
**
|
|
**
|
|
**
|
|
**
|
|
**
|
|
** $QT_END_LICENSE$
|
|
**
|
|
****************************************************************************/
|
|
|
|
#include <QString>
|
|
#ifdef QT_NETWORK_LIB
|
|
#include <QtNetwork/QHostInfo>
|
|
#endif
|
|
|
|
|
|
#ifdef Q_OS_SYMBIAN
|
|
#include <e32base.h>
|
|
#include <sys/socket.h>
|
|
#include <net/if.h>
|
|
#include <QSharedPointer>
|
|
#include <QHash>
|
|
#endif
|
|
#if defined(Q_OS_SYMBIAN)
|
|
#if defined(Q_CC_NOKIAX86)
|
|
// In emulator we use WINSOCK connectivity by default. Unfortunately winsock
|
|
// does not work very well with UDP sockets. This defines skips some test
|
|
// cases which have known problems.
|
|
|
|
// NOTE: Prefer to use WINPCAP based connectivity in S60 emulator when running
|
|
// network tests. WINPCAP connectivity uses Symbian OS IP stack,
|
|
// correspondingly as HW does. When using WINPCAP disable this define
|
|
//#define SYMBIAN_WINSOCK_CONNECTIVITY
|
|
#endif // Q_CC_NOKIAX86
|
|
|
|
// FIXME: any reason we do this for symbian only, and not other platforms?
|
|
class QtNetworkSettingsRecord {
|
|
public:
|
|
QtNetworkSettingsRecord() { }
|
|
|
|
QtNetworkSettingsRecord(const QString& recName, const QString& recVal)
|
|
: strRecordName(recName), strRecordValue(recVal) { }
|
|
|
|
QtNetworkSettingsRecord(const QtNetworkSettingsRecord & other)
|
|
: strRecordName(other.strRecordName), strRecordValue(other.strRecordValue) { }
|
|
|
|
~QtNetworkSettingsRecord() { }
|
|
|
|
const QString& recordName() const { return strRecordName; }
|
|
const QString& recordValue() const { return strRecordValue; }
|
|
|
|
private:
|
|
QString strRecordName;
|
|
QString strRecordValue;
|
|
};
|
|
|
|
#endif // Q_OS_SYMBIAN
|
|
|
|
class QtNetworkSettings
|
|
{
|
|
public:
|
|
|
|
static QString serverLocalName()
|
|
{
|
|
#ifdef Q_OS_SYMBIAN
|
|
loadTestSettings();
|
|
|
|
if(QtNetworkSettings::entries.contains("server.localname")) {
|
|
QtNetworkSettingsRecord* entry = entries["server.localname"];
|
|
return entry->recordValue();
|
|
}
|
|
#endif
|
|
return QString("qt-test-server");
|
|
}
|
|
static QString serverDomainName()
|
|
{
|
|
#ifdef Q_OS_SYMBIAN
|
|
loadTestSettings();
|
|
|
|
if(QtNetworkSettings::entries.contains("server.domainname")) {
|
|
QtNetworkSettingsRecord* entry = entries["server.domainname"];
|
|
return entry->recordValue();
|
|
}
|
|
#endif
|
|
return QString("qt-test-net");
|
|
}
|
|
static QString serverName()
|
|
{
|
|
#ifdef Q_OS_SYMBIAN
|
|
loadTestSettings();
|
|
#endif
|
|
return serverLocalName() + "." + serverDomainName();
|
|
}
|
|
static QString winServerName()
|
|
{
|
|
return serverName();
|
|
}
|
|
static QString wildcardServerName()
|
|
{
|
|
return "qt-test-server.wildcard.dev." + serverDomainName();
|
|
}
|
|
|
|
#ifdef QT_NETWORK_LIB
|
|
static QHostAddress serverIP()
|
|
{
|
|
#ifdef Q_OS_SYMBIAN
|
|
loadTestSettings();
|
|
|
|
if(QtNetworkSettings::entries.contains("server.ip")) {
|
|
QtNetworkSettingsRecord* entry = entries["server.ip"];
|
|
if(serverIp.isNull()) {
|
|
serverIp = entry->recordValue().toAscii();
|
|
}
|
|
return QHostAddress(serverIp.data());
|
|
}
|
|
#endif // Q_OS_SYMBIAN
|
|
return QHostInfo::fromName(serverName()).addresses().first();
|
|
}
|
|
#endif
|
|
|
|
static bool compareReplyIMAP(QByteArray const& actual)
|
|
{
|
|
QList<QByteArray> expected;
|
|
|
|
#ifdef Q_OS_SYMBIAN
|
|
loadTestSettings();
|
|
|
|
if(QtNetworkSettings::entries.contains("imap.expectedreply")) {
|
|
QtNetworkSettingsRecord* entry = entries["imap.expectedreply"];
|
|
if(imapExpectedReply.isNull()) {
|
|
imapExpectedReply = entry->recordValue().toAscii();
|
|
imapExpectedReply.append('\r').append('\n');
|
|
}
|
|
expected << imapExpectedReply.data();
|
|
}
|
|
#endif
|
|
|
|
// Mandriva; old test server
|
|
expected << QByteArray( "* OK [CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID STARTTLS LOGINDISABLED] " )
|
|
.append(QtNetworkSettings::serverName().toAscii())
|
|
.append(" Cyrus IMAP4 v2.3.11-Mandriva-RPM-2.3.11-6mdv2008.1 server ready\r\n");
|
|
|
|
// Ubuntu 10.04; new test server
|
|
expected << QByteArray( "* OK " )
|
|
.append(QtNetworkSettings::serverLocalName().toAscii())
|
|
.append(" Cyrus IMAP4 v2.2.13-Debian-2.2.13-19 server ready\r\n");
|
|
|
|
// Feel free to add more as needed
|
|
|
|
Q_FOREACH (QByteArray const& ba, expected) {
|
|
if (ba == actual) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
static bool compareReplyIMAPSSL(QByteArray const& actual)
|
|
{
|
|
QList<QByteArray> expected;
|
|
|
|
#ifdef Q_OS_SYMBIAN
|
|
loadTestSettings();
|
|
|
|
if(QtNetworkSettings::entries.contains("imap.expectedreplyssl")) {
|
|
QtNetworkSettingsRecord* entry = entries["imap.expectedreplyssl"];
|
|
if(imapExpectedReplySsl.isNull()) {
|
|
imapExpectedReplySsl = entry->recordValue().toAscii();
|
|
imapExpectedReplySsl.append('\r').append('\n');
|
|
}
|
|
expected << imapExpectedReplySsl.data();
|
|
}
|
|
#endif
|
|
// Mandriva; old test server
|
|
expected << QByteArray( "* OK [CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID AUTH=PLAIN SASL-IR] " )
|
|
.append(QtNetworkSettings::serverName().toAscii())
|
|
.append(" Cyrus IMAP4 v2.3.11-Mandriva-RPM-2.3.11-6mdv2008.1 server ready\r\n");
|
|
|
|
// Ubuntu 10.04; new test server
|
|
expected << QByteArray( "* OK " )
|
|
.append(QtNetworkSettings::serverLocalName().toAscii())
|
|
.append(" Cyrus IMAP4 v2.2.13-Debian-2.2.13-19 server ready\r\n");
|
|
|
|
// Feel free to add more as needed
|
|
|
|
Q_FOREACH (QByteArray const& ba, expected) {
|
|
if (ba == actual) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
static bool compareReplyFtp(QByteArray const& actual)
|
|
{
|
|
QList<QByteArray> expected;
|
|
|
|
// A few different vsFTPd versions.
|
|
// Feel free to add more as needed
|
|
expected << QByteArray( "220 (vsFTPd 2.0.5)\r\n221 Goodbye.\r\n" );
|
|
expected << QByteArray( "220 (vsFTPd 2.2.2)\r\n221 Goodbye.\r\n" );
|
|
|
|
Q_FOREACH (QByteArray const& ba, expected) {
|
|
if (ba == actual) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
#ifdef Q_OS_SYMBIAN
|
|
static void setDefaultIap()
|
|
{
|
|
loadDefaultIap();
|
|
|
|
struct ifreq ifReq;
|
|
if(entries.contains("iap.default")) {
|
|
QtNetworkSettingsRecord* entry = entries["iap.default"];
|
|
QByteArray tmp(entry->recordValue().toAscii());
|
|
strcpy( ifReq.ifr_name, tmp.data());
|
|
}
|
|
else // some default value
|
|
strcpy( ifReq.ifr_name, "Lab");
|
|
|
|
int err = setdefaultif( &ifReq );
|
|
if(err)
|
|
printf("Setting default IAP - '%s' failed: %d\n", ifReq.ifr_name, err);
|
|
else
|
|
printf("'%s' used as an default IAP\n", ifReq.ifr_name);
|
|
}
|
|
#endif
|
|
|
|
private:
|
|
|
|
#ifdef Q_OS_SYMBIAN
|
|
|
|
static QHash<QString, QtNetworkSettingsRecord* > entries;
|
|
static bool bDefaultIapLoaded;
|
|
static bool bTestSettingsLoaded;
|
|
static QString iapFileFullPath;
|
|
static QByteArray serverIp;
|
|
static QByteArray imapExpectedReply;
|
|
static QByteArray imapExpectedReplySsl;
|
|
|
|
static bool loadDefaultIap() {
|
|
if(bDefaultIapLoaded)
|
|
return true;
|
|
|
|
QFile iapCfgFile(iapFileFullPath);
|
|
|
|
bool bFoundDefaultIapTag = false;
|
|
|
|
if (iapCfgFile.open(QFile::ReadOnly)) {
|
|
QTextStream input(&iapCfgFile);
|
|
QString line;
|
|
do {
|
|
line = input.readLine().trimmed();
|
|
if(line.startsWith(QString("#")))
|
|
continue; // comment found
|
|
|
|
if(line.contains(QString("[DEFAULT]"))) {
|
|
bFoundDefaultIapTag = true;
|
|
} else if(line.contains(QString("[")) && bFoundDefaultIapTag) {
|
|
break;
|
|
}
|
|
|
|
if(bFoundDefaultIapTag && line.contains("name")) {
|
|
int position = line.indexOf(QString("="));
|
|
position += QString("=").length();
|
|
|
|
//create record
|
|
QtNetworkSettingsRecord *entry =
|
|
new QtNetworkSettingsRecord( QString("iap.default"), line.mid(position).trimmed() );
|
|
entries.insert(entry->recordName(), entry);
|
|
break;
|
|
}
|
|
} while (!line.isNull());
|
|
}
|
|
|
|
return bDefaultIapLoaded = bFoundDefaultIapTag;
|
|
}
|
|
|
|
static bool loadTestSettings() {
|
|
if(bTestSettingsLoaded)
|
|
return true;
|
|
|
|
QFile cfgFile(iapFileFullPath);
|
|
bool bFoundTestTag = false;
|
|
|
|
if (cfgFile.open(QFile::ReadOnly)) {
|
|
QTextStream input(&cfgFile);
|
|
QString line;
|
|
do {
|
|
line = input.readLine().trimmed();
|
|
|
|
if(line.startsWith(QString("#")) || line.length() == 0)
|
|
continue; // comment or empty line found
|
|
|
|
if(line.contains(QString("[TEST]"))) {
|
|
bFoundTestTag = true;
|
|
} else if(line.startsWith(QString("[")) && bFoundTestTag) {
|
|
bFoundTestTag = false;
|
|
break; // finished with test tag
|
|
}
|
|
|
|
if(bFoundTestTag) { // non-empty line
|
|
int position = line.indexOf(QString("="));
|
|
|
|
if(position <= 0) // not found
|
|
continue;
|
|
|
|
// found - extract
|
|
|
|
QString recname = line.mid(0, position - QString("=").length()).trimmed();
|
|
QString recval = line.mid(position + QString("=").length()).trimmed();
|
|
|
|
//create record
|
|
QtNetworkSettingsRecord *entry = new QtNetworkSettingsRecord(recname, recval);
|
|
entries.insert(entry->recordName(), entry);
|
|
}
|
|
} while (!line.isNull());
|
|
}
|
|
|
|
return bTestSettingsLoaded = true;
|
|
}
|
|
#endif
|
|
|
|
|
|
};
|
|
#ifdef Q_OS_SYMBIAN
|
|
QHash<QString, QtNetworkSettingsRecord* > QtNetworkSettings::entries = QHash<QString, QtNetworkSettingsRecord* > ();
|
|
bool QtNetworkSettings::bDefaultIapLoaded = false;
|
|
bool QtNetworkSettings::bTestSettingsLoaded = false;
|
|
QString QtNetworkSettings::iapFileFullPath = QString("C:\\Data\\iap.txt");
|
|
QByteArray QtNetworkSettings::serverIp;
|
|
QByteArray QtNetworkSettings::imapExpectedReply;
|
|
QByteArray QtNetworkSettings::imapExpectedReplySsl;
|
|
#endif
|
|
|
|
#ifdef Q_OS_SYMBIAN
|
|
#define Q_SET_DEFAULT_IAP QtNetworkSettings::setDefaultIap();
|
|
#else
|
|
#define Q_SET_DEFAULT_IAP
|
|
#endif
|
|
|
|
#ifdef QT_NETWORK_LIB
|
|
class QtNetworkSettingsInitializerCode {
|
|
public:
|
|
QtNetworkSettingsInitializerCode() {
|
|
#ifdef Q_OS_SYMBIAN
|
|
#ifdef Q_CC_NOKIAX86
|
|
// We have a non-trivial constructor in global static.
|
|
// The QtNetworkSettings::serverName() uses native API which assumes
|
|
// Cleanup-stack to exist. That's why we create it here and install
|
|
// top level TRAP harness.
|
|
CTrapCleanup *cleanupStack = q_check_ptr(CTrapCleanup::New());
|
|
TRAPD(err,
|
|
QHostInfo testServerResult = QHostInfo::fromName(QtNetworkSettings::serverName());
|
|
if (testServerResult.error() != QHostInfo::NoError) {
|
|
qWarning() << "Could not lookup" << QtNetworkSettings::serverName();
|
|
qWarning() << "Please configure the test environment!";
|
|
qWarning() << "See /etc/hosts or network-settings.h";
|
|
qFatal("Exiting");
|
|
}
|
|
)
|
|
delete cleanupStack;
|
|
//#else
|
|
// In Symbian HW there is no sense to run this check since global statics are
|
|
// initialized before QTestLib initializes the output channel for QWarnigns.
|
|
// So if there is problem network setup, also all QtCore etc tests whcih have
|
|
// QtNetwork dependency will crash with panic "0 - Exiciting"
|
|
#endif
|
|
|
|
#else
|
|
QHostInfo testServerResult = QHostInfo::fromName(QtNetworkSettings::serverName());
|
|
if (testServerResult.error() != QHostInfo::NoError) {
|
|
qWarning() << "Could not lookup" << QtNetworkSettings::serverName();
|
|
qWarning() << "Please configure the test environment!";
|
|
qWarning() << "See /etc/hosts or network-settings.h";
|
|
qFatal("Exiting");
|
|
}
|
|
#endif
|
|
}
|
|
};
|
|
QtNetworkSettingsInitializerCode qtNetworkSettingsInitializer;
|
|
#endif
|