tests/auto/network-settings.h
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/auto/network-settings.h	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,373 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 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
+
+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();
+        //return "qttest.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 QByteArray expectedReplyIMAP()
+    {
+#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');
+            }
+            return imapExpectedReply.data();
+        }
+#endif
+        QByteArray expected( "* OK [CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID STARTTLS LOGINDISABLED] " );
+        expected = expected.append(QtNetworkSettings::serverName().toAscii());
+        expected = expected.append(" Cyrus IMAP4 v2.3.11-Mandriva-RPM-2.3.11-6mdv2008.1 server ready\r\n");
+        return expected;
+    }
+
+    static QByteArray expectedReplySSL()
+    {
+#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');
+            }
+            return imapExpectedReplySsl.data();
+        }
+#endif
+        QByteArray expected( "* OK [CAPABILITY IMAP4 IMAP4rev1 LITERAL+ ID AUTH=PLAIN SASL-IR] " );
+        expected = expected.append(QtNetworkSettings::serverName().toAscii());
+        expected = expected.append(" Cyrus IMAP4 v2.3.11-Mandriva-RPM-2.3.11-6mdv2008.1 server ready\r\n");
+        return expected;
+    }
+
+    static QByteArray expectedReplyFtp()
+    {
+        QByteArray expected( "220 (vsFTPd 2.0.5)\r\n221 Goodbye.\r\n" );
+        return expected;
+    }
+
+#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