tests/auto/qdesktopservices/tst_qdesktopservices.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the test suite of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 
       
    43 #include <QtTest/QtTest>
       
    44 #include <QStandardItemModel>
       
    45 #include <qdebug.h>
       
    46 #include <qdesktopservices.h>
       
    47 
       
    48 //#define RUN_MANUAL_TESTS
       
    49 //TESTED_CLASS=
       
    50 //TESTED_FILES=
       
    51 
       
    52 class tst_qdesktopservices : public QObject {
       
    53   Q_OBJECT
       
    54 
       
    55 public:
       
    56     tst_qdesktopservices();
       
    57     virtual ~tst_qdesktopservices();
       
    58 
       
    59 private slots:
       
    60     void init();
       
    61     void cleanup();
       
    62     void openUrl();
       
    63 #ifdef Q_OS_SYMBIAN
       
    64     // These test are manual ones, you need to check from  device that
       
    65     // correct system application is started with correct content
       
    66     // When you want to run these test, uncomment //#define RUN_MANUAL_TESTS
       
    67     void openHttpUrl_data();
       
    68     void openHttpUrl();
       
    69     void openMailtoUrl_data();
       
    70     void openMailtoUrl();
       
    71     void openFileUrl_data();
       
    72     void openFileUrl();
       
    73 #endif
       
    74     void handlers();
       
    75     void storageLocation_data();
       
    76     void storageLocation();
       
    77 
       
    78     void storageLocationDoesNotEndWithSlash_data();
       
    79     void storageLocationDoesNotEndWithSlash();
       
    80 
       
    81 protected:
       
    82 };
       
    83 
       
    84 tst_qdesktopservices::tst_qdesktopservices()
       
    85 {
       
    86     QCoreApplication::setOrganizationName("Nokia");
       
    87     QCoreApplication::setApplicationName("tst_qdesktopservices");
       
    88 }
       
    89 
       
    90 tst_qdesktopservices::~tst_qdesktopservices()
       
    91 {
       
    92 }
       
    93 
       
    94 void tst_qdesktopservices::init()
       
    95 {
       
    96 }
       
    97 
       
    98 void tst_qdesktopservices::cleanup()
       
    99 {
       
   100 }
       
   101 
       
   102 void tst_qdesktopservices::openUrl()
       
   103 {
       
   104     // At the bare minimum check that they return false for invalid url's
       
   105     QCOMPARE(QDesktopServices::openUrl(QUrl()), false);
       
   106 #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
       
   107     // this test is only valid on windows on other systems it might mean open a new document in the application handling .file
       
   108     QCOMPARE(QDesktopServices::openUrl(QUrl("file://invalid.file")), false);
       
   109 #endif
       
   110 }
       
   111 
       
   112 #ifdef Q_OS_SYMBIAN
       
   113 void tst_qdesktopservices::openHttpUrl_data()
       
   114 {
       
   115     QTest::addColumn<QUrl>("url");
       
   116     QTest::addColumn<bool>("result");
       
   117     QTest::newRow("BasicWithHttp") << QUrl("http://www.google.fi") << true;
       
   118     QTest::newRow("BasicWithoutHttp") << QUrl("www.nokia.fi") << true;
       
   119     QTest::newRow("BasicWithUserAndPw") << QUrl("http://s60prereleases:oslofjord@pepper.troll.no/s60prereleases/patches/") << true;
       
   120     QTest::newRow("URL with space") << QUrl("http://www.manataka.org/Contents Page.html") << true;
       
   121 
       
   122 }
       
   123 
       
   124 void tst_qdesktopservices::openHttpUrl()
       
   125 {
       
   126 #ifndef RUN_MANUAL_TESTS
       
   127     QSKIP("Test disabled -- only for manual purposes", SkipAll);
       
   128 #endif
       
   129 
       
   130     QFETCH(QUrl, url);
       
   131     QFETCH(bool, result);
       
   132     QCOMPARE(QDesktopServices::openUrl(url), result);
       
   133     QTest::qWait(30000);
       
   134 }
       
   135 
       
   136 void tst_qdesktopservices::openMailtoUrl_data()
       
   137 {
       
   138     QTest::addColumn<QUrl>("url");
       
   139     QTest::addColumn<bool>("result");
       
   140 
       
   141     // http://en.wikipedia.org/wiki/E-mail_address
       
   142     // RFC Valid e-mail addresses
       
   143     QTest::newRow("Wiki valid email 1") << QUrl("mailto:abc@example.com") << true;
       
   144     QTest::newRow("Wiki valid email 2") << QUrl("mailto:Abc@example.com") << true;
       
   145     QTest::newRow("Wiki valid email 3") << QUrl("mailto:aBC@example.com") << true;
       
   146     QTest::newRow("Wiki valid email 4") << QUrl("mailto:abc.123@example.com") << true;
       
   147     QTest::newRow("Wiki valid email 5") << QUrl("mailto:1234567890@example.com") << true;
       
   148     QTest::newRow("Wiki valid email 6") << QUrl("mailto:_______@example.com") << true;
       
   149     QTest::newRow("Wiki valid email 7") << QUrl("mailto:abc+mailbox/department=shipping@example.com") << true;
       
   150     // S60 email client considers the next URL invalid, even ity should be valid
       
   151     QTest::newRow("Wiki valid email 8") << QUrl("mailto:!#$%&'*+-/=?^_`.{|}~@example.com") << true; // all of these characters are allowed
       
   152     QTest::newRow("Wiki valid email 9") << QUrl("mailto:\"abc@def\"@example.com") << true; // anything goes inside quotation marks
       
   153     QTest::newRow("Wiki valid email 10") << QUrl("mailto:\"Fred \\\"quota\\\" Bloggs\"@example.com") << true; // however, quotes need escaping
       
   154 
       
   155     // RFC invalid e-mail addresses
       
   156     // These return true even though they are invalid, but check that user is notified about invalid URL in mail application
       
   157     QTest::newRow("Wiki invalid email 1") << QUrl("mailto:Abc.example.com") << true;        // character @ is missing
       
   158     QTest::newRow("Wiki invalid email 2") << QUrl("mailto:Abc.@example.com") << true;        // character dot(.) is last in local part
       
   159     QTest::newRow("Wiki invalid email 3") << QUrl("mailto:Abc..123@example.com") << true;    // character dot(.) is double
       
   160     QTest::newRow("Wiki invalid email 4") << QUrl("mailto:A@b@c@example.com") << true;        // only one @ is allowed outside quotations marks
       
   161     QTest::newRow("Wiki invalid email 5") << QUrl("mailto:()[]\\;:,<>@example.com") << true;    // none of the characters before the @ is allowed outside quotation marks
       
   162 
       
   163     QTest::newRow("Basic") << QUrl("mailto:test@nokia.com") << true;
       
   164     QTest::newRow("BasicSeveralAddr") << QUrl("mailto:test@nokia.com,test2@nokia.com,test3@nokia.com") << true;
       
   165     QTest::newRow("BasicAndSubject") << QUrl("mailto:test@nokia.com?subject=hello nokia") << true;
       
   166     QTest::newRow("BasicAndTo") << QUrl("mailto:test@nokia.com?to=test2@nokia.com") << true;
       
   167 
       
   168     QTest::newRow("BasicAndCc") << QUrl("mailto:test@nokia.com?cc=mycc@address.com") << true;
       
   169     QTest::newRow("BasicAndBcc") << QUrl("mailto:test@nokia.com?bcc=mybcc@address.com") << true;
       
   170     QTest::newRow("BasicAndBody") << QUrl("mailto:test@nokia.com?body=Test email message body") << true;
       
   171 
       
   172     // RFC examples, these are actually invalid because there is not host defined
       
   173     // Check that user is notified about invalid URL in mail application
       
   174     QTest::newRow("RFC2368 Example 1") << QUrl::fromEncoded("mailto:addr1%2C%20addr2") << true;
       
   175     QTest::newRow("RFC2368 Example 2") << QUrl::fromEncoded("mailto:?to=addr1%2C%20addr2") << true;
       
   176     QTest::newRow("RFC2368 Example 3") << QUrl("mailto:addr1?to=addr2") << true;
       
   177 
       
   178     QTest::newRow("RFC2368 Example 4") << QUrl("mailto:joe@example.com?cc=bob@example.com&body=hello") << true;
       
   179     QTest::newRow("RFC2368 Example 5") << QUrl("mailto:?to=joe@example.com&cc=bob@example.com&body=hello") << true;
       
   180     QTest::newRow("RFC2368 Example 6") << QUrl("mailto:foobar@example.com?In-Reply-To=%3c3469A91.D10AF4C@example.com") << true; // OpaqueData
       
   181     QTest::newRow("RFC2368 Example 7") << QUrl::fromEncoded("mailto:infobot@example.com?body=send%20current-issue%0D%0Asend%20index") << true;
       
   182     QTest::newRow("RFC2368 Example 8") << QUrl::fromEncoded("mailto:infobot@example.com?body=send%20current-issue") << true;
       
   183     QTest::newRow("RFC2368 Example 9") << QUrl("mailto:infobot@example.com?subject=current-issue") << true;
       
   184     QTest::newRow("RFC2368 Example 10") << QUrl("mailto:chris@example.com") << true;
       
   185 
       
   186     //QTest::newRow("RFC2368 Example 11 - illegal chars") << QUrl("mailto:joe@example.com?cc=bob@example.com?body=hello") << false;
       
   187     QTest::newRow("RFC2368 Example 12") << QUrl::fromEncoded("mailto:gorby%25kremvax@example.com") << true; // encoded reserved chars '%'
       
   188     QTest::newRow("RFC2368 Example 13") << QUrl::fromEncoded("mailto:unlikely%3Faddress@example.com?blat=foop") << true;    // encoded reserved chars  `?'
       
   189 }
       
   190 
       
   191 void tst_qdesktopservices::openMailtoUrl()
       
   192 {
       
   193 #ifndef RUN_MANUAL_TESTS
       
   194     QSKIP("Test disabled -- only for manual purposes", SkipAll);
       
   195 #endif
       
   196 
       
   197     QFETCH(QUrl, url);
       
   198     QFETCH(bool, result);
       
   199     QCOMPARE(QDesktopServices::openUrl(url), result);
       
   200 }
       
   201 
       
   202 void tst_qdesktopservices::openFileUrl_data()
       
   203 {
       
   204     QTest::addColumn<QUrl>("url");
       
   205     QTest::addColumn<bool>("result");
       
   206 
       
   207     // Text files
       
   208     QTest::newRow("DOS text file") << QUrl("file:///c:/data/others/dosfile.txt") << true;
       
   209     QTest::newRow("No EOF text file") << QUrl("file:///c:/data/others/noendofline.txt") << true;
       
   210     QTest::newRow("text file") << QUrl("file:///c:/data/others/testfile.txt") << true;
       
   211     QTest::newRow("text file with space") << QUrl("file:///c:/data/others/test file.txt") << true;
       
   212 
       
   213     // Images
       
   214     QTest::newRow("BMP image") << QUrl("file:///c:/data/images/image.bmp") << true;
       
   215     QTest::newRow("GIF image") << QUrl("file:///c:/data/images/image.gif") << true;
       
   216     QTest::newRow("JPG image") << QUrl("file:///c:/data/images/image.jpg") << true;
       
   217     QTest::newRow("PNG image") << QUrl("file:///c:/data/images/image.png") << true;
       
   218 
       
   219     // Audio
       
   220     QTest::newRow("MP4 audio") << QUrl("file:///c:/data/sounds/aac-only.mp4") << true;
       
   221     QTest::newRow("3GP audio") << QUrl("file:///c:/data/sounds/audio_3gpp.3gp") << true;
       
   222 
       
   223     // Video
       
   224     QTest::newRow("MP4 video") << QUrl("file:///c:/data/videos/vid-mpeg4-22k.mp4") << true;
       
   225 
       
   226     // Installs
       
   227     QTest::newRow("SISX") << QUrl("file:///c:/data/installs/ErrRd.sisx") << true;
       
   228 
       
   229     // Errors
       
   230     QTest::newRow("File does not exist") << QUrl("file:///c:/thisfileneverexists.txt") << false;
       
   231 }
       
   232 
       
   233 void tst_qdesktopservices::openFileUrl()
       
   234 {
       
   235 #ifndef RUN_MANUAL_TESTS
       
   236     QSKIP("Test disabled -- only for manual purposes", SkipAll);
       
   237 #endif
       
   238 
       
   239     QFETCH(QUrl, url);
       
   240     QFETCH(bool, result);
       
   241     QCOMPARE(QDesktopServices::openUrl(url), result);
       
   242     QTest::qWait(15000);
       
   243 }
       
   244 #endif
       
   245 
       
   246 
       
   247 class MyUrlHandler : public QObject
       
   248 {
       
   249     Q_OBJECT
       
   250 public:
       
   251     QUrl lastHandledUrl;
       
   252 
       
   253 public slots:
       
   254     inline void handle(const QUrl &url) {
       
   255         lastHandledUrl = url;
       
   256     }
       
   257 };
       
   258 
       
   259 void tst_qdesktopservices::handlers()
       
   260 {
       
   261     MyUrlHandler fooHandler;
       
   262     MyUrlHandler barHandler;
       
   263 
       
   264     QDesktopServices::setUrlHandler(QString("foo"), &fooHandler, "handle");
       
   265     QDesktopServices::setUrlHandler(QString("bar"), &barHandler, "handle");
       
   266 
       
   267     QUrl fooUrl("foo://blub/meh");
       
   268     QUrl barUrl("bar://hmm/hmmmm");
       
   269 
       
   270     QVERIFY(QDesktopServices::openUrl(fooUrl));
       
   271     QVERIFY(QDesktopServices::openUrl(barUrl));
       
   272 
       
   273     QCOMPARE(fooHandler.lastHandledUrl.toString(), fooUrl.toString());
       
   274     QCOMPARE(barHandler.lastHandledUrl.toString(), barUrl.toString());
       
   275 }
       
   276 
       
   277 Q_DECLARE_METATYPE(QDesktopServices::StandardLocation)
       
   278 void tst_qdesktopservices::storageLocation_data()
       
   279 {
       
   280     QTest::addColumn<QDesktopServices::StandardLocation>("location");
       
   281     QTest::newRow("DesktopLocation") << QDesktopServices::DesktopLocation;
       
   282     QTest::newRow("DocumentsLocation") << QDesktopServices::DocumentsLocation;
       
   283     QTest::newRow("FontsLocation") << QDesktopServices::FontsLocation;
       
   284     QTest::newRow("ApplicationsLocation") << QDesktopServices::ApplicationsLocation;
       
   285     QTest::newRow("MusicLocation") << QDesktopServices::MusicLocation;
       
   286     QTest::newRow("MoviesLocation") << QDesktopServices::MoviesLocation;
       
   287     QTest::newRow("PicturesLocation") << QDesktopServices::PicturesLocation;
       
   288     QTest::newRow("TempLocation") << QDesktopServices::TempLocation;
       
   289     QTest::newRow("HomeLocation") << QDesktopServices::HomeLocation;
       
   290     QTest::newRow("DataLocation") << QDesktopServices::DataLocation;
       
   291 }
       
   292 
       
   293 void tst_qdesktopservices::storageLocation()
       
   294 {
       
   295     QFETCH(QDesktopServices::StandardLocation, location);
       
   296 #ifdef Q_OS_SYMBIAN
       
   297     QString storageLocation = QDesktopServices::storageLocation(location);
       
   298     QString displayName = QDesktopServices::displayName(location);
       
   299     //qDebug( "displayName: %s",  displayName );
       
   300 
       
   301     storageLocation = storageLocation.toLower();
       
   302     displayName = displayName.toLower();
       
   303 
       
   304     QString drive = QDir::currentPath().left(2).toLower();
       
   305     if( drive == "z:" )
       
   306         drive = "c:";
       
   307 
       
   308     switch(location) {
       
   309     case QDesktopServices::DesktopLocation:
       
   310         QCOMPARE( storageLocation, drive + QString("/data") );
       
   311         break;
       
   312     case QDesktopServices::DocumentsLocation:
       
   313         QCOMPARE( storageLocation, drive + QString("/data") );
       
   314         break;
       
   315     case QDesktopServices::FontsLocation:
       
   316         // Currently point always to ROM
       
   317         QCOMPARE( storageLocation, QString("z:/resource/fonts") );
       
   318         break;
       
   319     case QDesktopServices::ApplicationsLocation:
       
   320 #ifdef Q_CC_NOKIAX86
       
   321         QCOMPARE( storageLocation, QString("z:/sys/bin") );
       
   322 #else
       
   323         QCOMPARE( storageLocation, drive + QString("/sys/bin") );
       
   324 #endif
       
   325         break;
       
   326     case QDesktopServices::MusicLocation:
       
   327         QCOMPARE( storageLocation, drive + QString("/data/sounds") );
       
   328         break;
       
   329     case QDesktopServices::MoviesLocation:
       
   330         QCOMPARE( storageLocation, drive + QString("/data/videos") );
       
   331         break;
       
   332     case QDesktopServices::PicturesLocation:
       
   333         QCOMPARE( storageLocation, drive + QString("/data/images") );
       
   334         break;
       
   335     case QDesktopServices::TempLocation:
       
   336         QCOMPARE( storageLocation, QDir::tempPath().toLower());
       
   337         break;
       
   338     case QDesktopServices::HomeLocation:
       
   339         QCOMPARE( storageLocation, QDir::homePath().toLower());
       
   340         break;
       
   341     case QDesktopServices::DataLocation:
       
   342         // Just check the folder not the drive
       
   343         QCOMPARE( storageLocation.mid(2), QDir::currentPath().mid(2).toLower());
       
   344         break;
       
   345     default:
       
   346         QCOMPARE( storageLocation, QString() );
       
   347         break;
       
   348     }
       
   349 
       
   350 #else
       
   351     QDesktopServices::storageLocation(location);
       
   352     QDesktopServices::displayName(location);
       
   353 #endif
       
   354 }
       
   355 
       
   356 
       
   357 void tst_qdesktopservices::storageLocationDoesNotEndWithSlash_data()
       
   358 {
       
   359     storageLocation_data();
       
   360 }
       
   361 
       
   362 void tst_qdesktopservices::storageLocationDoesNotEndWithSlash()
       
   363 {
       
   364     // Currently all desktop locations return their storage location
       
   365     // with "Unix-style" paths (i.e. they use a slash, not backslash).
       
   366     QFETCH(QDesktopServices::StandardLocation, location);
       
   367     QString loc = QDesktopServices::storageLocation(location);
       
   368     if (loc.size() > 1)  // workaround for unlikely case of locations that return '/'
       
   369         QCOMPARE(loc.endsWith(QLatin1Char('/')), false);
       
   370 }
       
   371 
       
   372 
       
   373 QTEST_MAIN(tst_qdesktopservices)
       
   374 #include "tst_qdesktopservices.moc"