tests/auto/qdbusmarshall/tst_qdbusmarshall.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
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 #define DBUS_API_SUBJECT_TO_CHANGE
       
    42 #include <QtCore/QtCore>
       
    43 #include <QtTest/QtTest>
       
    44 #include <QtDBus/QtDBus>
       
    45 #include <QtDBus/private/qdbusutil_p.h>
       
    46 
       
    47 #include "common.h"
       
    48 #include <limits>
       
    49 
       
    50 static const char serviceName[] = "com.trolltech.autotests.qpong";
       
    51 static const char objectPath[] = "/com/trolltech/qpong";
       
    52 static const char *interfaceName = serviceName;
       
    53 
       
    54 class tst_QDBusMarshall: public QObject
       
    55 {
       
    56     Q_OBJECT
       
    57 
       
    58 public slots:
       
    59     void initTestCase();
       
    60     void cleanupTestCase();
       
    61 
       
    62 private slots:
       
    63     void sendBasic_data();
       
    64     void sendBasic();
       
    65 
       
    66     void sendVariant_data();
       
    67     void sendVariant();
       
    68 
       
    69     void sendArrays_data();
       
    70     void sendArrays();
       
    71 
       
    72     void sendArrayOfArrays_data();
       
    73     void sendArrayOfArrays();
       
    74 
       
    75     void sendMaps_data();
       
    76     void sendMaps();
       
    77 
       
    78     void sendStructs_data();
       
    79     void sendStructs();
       
    80 
       
    81     void sendComplex_data();
       
    82     void sendComplex();
       
    83 
       
    84     void sendArgument_data();
       
    85     void sendArgument();
       
    86 
       
    87     void sendSignalErrors();
       
    88     void sendCallErrors_data();
       
    89     void sendCallErrors();
       
    90 
       
    91 private:
       
    92     QProcess proc;
       
    93 };
       
    94 
       
    95 struct UnregisteredType { };
       
    96 Q_DECLARE_METATYPE(UnregisteredType)
       
    97 
       
    98 class WaitForQPong: public QObject
       
    99 {
       
   100     Q_OBJECT
       
   101 public:
       
   102     WaitForQPong();
       
   103     bool ok();
       
   104 public Q_SLOTS:
       
   105     void ownerChange(const QString &name)
       
   106     {
       
   107         if (name == serviceName)
       
   108             loop.quit();
       
   109     }
       
   110 
       
   111 private:
       
   112     QEventLoop loop;
       
   113 };
       
   114 
       
   115 WaitForQPong::WaitForQPong()
       
   116 {
       
   117     QDBusConnection con = QDBusConnection::sessionBus();
       
   118     if (!ok()) {
       
   119         connect(con.interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)),
       
   120                 SLOT(ownerChange(QString)));
       
   121         QTimer::singleShot(2000, &loop, SLOT(quit()));
       
   122         loop.exec();
       
   123     }
       
   124 }
       
   125 
       
   126 bool WaitForQPong::ok()
       
   127 {
       
   128     return QDBusConnection::sessionBus().isConnected() &&
       
   129         QDBusConnection::sessionBus().interface()->isServiceRegistered(serviceName);
       
   130 }
       
   131 
       
   132 void tst_QDBusMarshall::initTestCase()
       
   133 {
       
   134     commonInit();
       
   135 #ifdef Q_OS_WIN
       
   136     proc.start("qpong");
       
   137 #else
       
   138     proc.start("./qpong/qpong");
       
   139 #endif
       
   140     QVERIFY(proc.waitForStarted());
       
   141 
       
   142     WaitForQPong w;
       
   143     QVERIFY(w.ok());
       
   144     //QTest::qWait(2000);
       
   145 }
       
   146 
       
   147 void tst_QDBusMarshall::cleanupTestCase()
       
   148 {
       
   149     proc.close();
       
   150     proc.kill();
       
   151 }
       
   152 
       
   153 void tst_QDBusMarshall::sendBasic_data()
       
   154 {
       
   155     QTest::addColumn<QVariant>("value");
       
   156     QTest::addColumn<QString>("sig");
       
   157     QTest::addColumn<QString>("stringResult");
       
   158 
       
   159     // basic types:
       
   160     QTest::newRow("bool") << QVariant(false) << "b" << "false";
       
   161 #if 1
       
   162     QTest::newRow("bool2") << QVariant(true) << "b" << "true";
       
   163     QTest::newRow("byte") << qVariantFromValue(uchar(1)) << "y" << "1";
       
   164     QTest::newRow("int16") << qVariantFromValue(short(2)) << "n" << "2";
       
   165     QTest::newRow("uint16") << qVariantFromValue(ushort(3)) << "q" << "3";
       
   166     QTest::newRow("int") << QVariant(1) << "i" << "1";
       
   167     QTest::newRow("uint") << QVariant(2U) << "u" << "2";
       
   168     QTest::newRow("int64") << QVariant(Q_INT64_C(3)) << "x" << "3";
       
   169     QTest::newRow("uint64") << QVariant(Q_UINT64_C(4)) << "t" << "4";
       
   170     QTest::newRow("double") << QVariant(42.5) << "d" << "42.5";
       
   171     QTest::newRow("string") << QVariant("ping") << "s" << "\"ping\"";
       
   172     QTest::newRow("objectpath") << qVariantFromValue(QDBusObjectPath("/org/kde")) << "o" << "[ObjectPath: /org/kde]";
       
   173     QTest::newRow("signature") << qVariantFromValue(QDBusSignature("g")) << "g" << "[Signature: g]";
       
   174     QTest::newRow("emptystring") << QVariant("") << "s" << "\"\"";
       
   175     QTest::newRow("nullstring") << QVariant(QString()) << "s" << "\"\"";
       
   176 #endif
       
   177 }
       
   178 
       
   179 void tst_QDBusMarshall::sendVariant_data()
       
   180 {
       
   181     sendBasic_data();
       
   182 
       
   183     QTest::newRow("variant") << qVariantFromValue(QDBusVariant(1)) << "v" << "[Variant(int): 1]";
       
   184 
       
   185     QDBusVariant nested(1);
       
   186     QTest::newRow("variant-variant") << qVariantFromValue(QDBusVariant(qVariantFromValue(nested))) << "v"
       
   187                                      << "[Variant(QDBusVariant): [Variant(int): 1]]";
       
   188 }
       
   189 
       
   190 void tst_QDBusMarshall::sendArrays_data()
       
   191 {
       
   192     QTest::addColumn<QVariant>("value");
       
   193     QTest::addColumn<QString>("sig");
       
   194     QTest::addColumn<QString>("stringResult");
       
   195 
       
   196     // arrays
       
   197     QStringList strings;
       
   198     QTest::newRow("emptystringlist") << QVariant(strings) << "as" << "{}";
       
   199     strings << "hello" << "world";
       
   200     QTest::newRow("stringlist") << QVariant(strings) << "as" << "{\"hello\", \"world\"}";
       
   201 
       
   202     strings.clear();
       
   203     strings << "" << "" << "";
       
   204     QTest::newRow("list-of-emptystrings") << QVariant(strings) << "as" << "{\"\", \"\", \"\"}";
       
   205 
       
   206     strings.clear();
       
   207     strings << QString() << QString() << QString() << QString();
       
   208     QTest::newRow("list-of-nullstrings") << QVariant(strings) << "as" << "{\"\", \"\", \"\", \"\"}";
       
   209 
       
   210     QByteArray bytearray;
       
   211     QTest::newRow("nullbytearray") << QVariant(bytearray) << "ay" << "{}";
       
   212     bytearray = "";             // empty, not null
       
   213     QTest::newRow("emptybytearray") << QVariant(bytearray) << "ay" << "{}";
       
   214     bytearray = "foo";
       
   215     QTest::newRow("bytearray") << QVariant(bytearray) << "ay" << "{102, 111, 111}";
       
   216 
       
   217     QList<bool> bools;
       
   218     QTest::newRow("emptyboollist") << qVariantFromValue(bools) << "ab" << "[Argument: ab {}]";
       
   219     bools << false << true << false;
       
   220     QTest::newRow("boollist") << qVariantFromValue(bools) << "ab" << "[Argument: ab {false, true, false}]";
       
   221 
       
   222     QList<short> shorts;
       
   223     QTest::newRow("emptyshortlist") << qVariantFromValue(shorts) << "an" << "[Argument: an {}]";
       
   224     shorts << 42 << -43 << 44 << 45 << -32768 << 32767;
       
   225     QTest::newRow("shortlist") << qVariantFromValue(shorts) << "an"
       
   226                                << "[Argument: an {42, -43, 44, 45, -32768, 32767}]";
       
   227 
       
   228     QList<ushort> ushorts;
       
   229     QTest::newRow("emptyushortlist") << qVariantFromValue(ushorts) << "aq" << "[Argument: aq {}]";
       
   230     ushorts << 12u << 13u << 14u << 15 << 65535;
       
   231     QTest::newRow("ushortlist") << qVariantFromValue(ushorts) << "aq" << "[Argument: aq {12, 13, 14, 15, 65535}]";
       
   232 
       
   233     QList<int> ints;
       
   234     QTest::newRow("emptyintlist") << qVariantFromValue(ints) << "ai" << "[Argument: ai {}]";
       
   235     ints << 42 << -43 << 44 << 45 << 2147483647 << -2147483647-1;
       
   236     QTest::newRow("intlist") << qVariantFromValue(ints) << "ai" << "[Argument: ai {42, -43, 44, 45, 2147483647, -2147483648}]";
       
   237 
       
   238     QList<uint> uints;
       
   239     QTest::newRow("emptyuintlist") << qVariantFromValue(uints) << "au" << "[Argument: au {}]";
       
   240     uints << uint(12) << uint(13) << uint(14) << 4294967295U;
       
   241     QTest::newRow("uintlist") << qVariantFromValue(uints) << "au" << "[Argument: au {12, 13, 14, 4294967295}]";
       
   242 
       
   243     QList<qlonglong> llints;
       
   244     QTest::newRow("emptyllintlist") << qVariantFromValue(llints) << "ax" << "[Argument: ax {}]";
       
   245     llints << Q_INT64_C(99) << Q_INT64_C(-100)
       
   246            << Q_INT64_C(-9223372036854775807)-1 << Q_INT64_C(9223372036854775807);
       
   247     QTest::newRow("llintlist") << qVariantFromValue(llints) << "ax"
       
   248                                << "[Argument: ax {99, -100, -9223372036854775808, 9223372036854775807}]";
       
   249 
       
   250     QList<qulonglong> ullints;
       
   251     QTest::newRow("emptyullintlist") << qVariantFromValue(ullints) << "at" << "[Argument: at {}]";
       
   252     ullints << Q_UINT64_C(66) << Q_UINT64_C(67)
       
   253             << Q_UINT64_C(18446744073709551615);
       
   254     QTest::newRow("ullintlist") << qVariantFromValue(ullints) << "at" << "[Argument: at {66, 67, 18446744073709551615}]";
       
   255 
       
   256     QList<double> doubles;
       
   257     QTest::newRow("emptydoublelist") << qVariantFromValue(doubles) << "ad" << "[Argument: ad {}]";
       
   258     doubles << 1.2 << 2.2 << 4.4
       
   259             << -std::numeric_limits<double>::infinity()
       
   260             << std::numeric_limits<double>::infinity()
       
   261             << std::numeric_limits<double>::quiet_NaN();
       
   262     QTest::newRow("doublelist") << qVariantFromValue(doubles) << "ad" << "[Argument: ad {1.2, 2.2, 4.4, -inf, inf, nan}]";
       
   263 
       
   264     QVariantList variants;
       
   265     QTest::newRow("emptyvariantlist") << QVariant(variants) << "av" << "[Argument: av {}]";
       
   266     variants << QString("Hello") << QByteArray("World") << 42 << -43.0 << 44U << Q_INT64_C(-45)
       
   267              << Q_UINT64_C(46) << true << qVariantFromValue(short(-47))
       
   268              << qVariantFromValue(QDBusSignature("av"))
       
   269              << qVariantFromValue(QDBusVariant(qVariantFromValue(QDBusObjectPath("/"))));
       
   270     QTest::newRow("variantlist") << QVariant(variants) << "av"
       
   271         << "[Argument: av {[Variant(QString): \"Hello\"], [Variant(QByteArray): {87, 111, 114, 108, 100}], [Variant(int): 42], [Variant(double): -43], [Variant(uint): 44], [Variant(qlonglong): -45], [Variant(qulonglong): 46], [Variant(bool): true], [Variant(short): -47], [Variant: [Signature: av]], [Variant: [Variant: [ObjectPath: /]]]}]";
       
   272 }
       
   273 
       
   274 void tst_QDBusMarshall::sendArrayOfArrays_data()
       
   275 {
       
   276     QTest::addColumn<QVariant>("value");
       
   277     QTest::addColumn<QString>("sig");
       
   278     QTest::addColumn<QString>("stringResult");
       
   279 
       
   280     // arrays:
       
   281     QList<QStringList> strings;
       
   282     QTest::newRow("empty-list-of-stringlist") << qVariantFromValue(strings) << "aas"
       
   283             << "[Argument: aas {}]";
       
   284     strings << QStringList();
       
   285     QTest::newRow("list-of-emptystringlist") << qVariantFromValue(strings) << "aas"
       
   286             << "[Argument: aas {{}}]";
       
   287     strings << (QStringList() << "hello" << "world")
       
   288             << (QStringList() << "hi" << "there")
       
   289             << (QStringList() << QString());
       
   290     QTest::newRow("stringlist") << qVariantFromValue(strings) << "aas"
       
   291             << "[Argument: aas {{}, {\"hello\", \"world\"}, {\"hi\", \"there\"}, {\"\"}}]";
       
   292 
       
   293     QList<QByteArray> bytearray;
       
   294     QTest::newRow("empty-list-of-bytearray") << qVariantFromValue(bytearray) << "aay"
       
   295             << "[Argument: aay {}]";
       
   296     bytearray << QByteArray();
       
   297     QTest::newRow("list-of-emptybytearray") << qVariantFromValue(bytearray) << "aay"
       
   298             << "[Argument: aay {{}}]";
       
   299     bytearray << "foo" << "bar" << "baz" << "" << QByteArray();
       
   300     QTest::newRow("bytearray") << qVariantFromValue(bytearray) << "aay"
       
   301             << "[Argument: aay {{}, {102, 111, 111}, {98, 97, 114}, {98, 97, 122}, {}, {}}]";
       
   302 
       
   303     QList<QList<bool> > bools;
       
   304     QTest::newRow("empty-list-of-boollist") << qVariantFromValue(bools) << "aab"
       
   305             << "[Argument: aab {}]";
       
   306     bools << QList<bool>();
       
   307     QTest::newRow("list-of-emptyboollist") << qVariantFromValue(bools) << "aab"
       
   308             << "[Argument: aab {[Argument: ab {}]}]";
       
   309     bools << (QList<bool>() << false << true) << (QList<bool>() << false) << (QList<bool>());
       
   310     QTest::newRow("boollist") << qVariantFromValue(bools) << "aab"
       
   311             << "[Argument: aab {[Argument: ab {}], [Argument: ab {false, true}], [Argument: ab {false}], [Argument: ab {}]}]";
       
   312     QList<QList<short> > shorts;
       
   313     QTest::newRow("empty-list-of-shortlist") << qVariantFromValue(shorts) << "aan"
       
   314             << "[Argument: aan {}]";
       
   315     shorts << QList<short>();
       
   316     QTest::newRow("list-of-emptyshortlist") << qVariantFromValue(shorts) << "aan"
       
   317             << "[Argument: aan {[Argument: an {}]}]";
       
   318     shorts << (QList<short>() << 42 << -43 << 44 << 45)
       
   319            << (QList<short>() << -32768 << 32767)
       
   320            << (QList<short>());
       
   321     QTest::newRow("shortlist") << qVariantFromValue(shorts) << "aan"
       
   322             << "[Argument: aan {[Argument: an {}], [Argument: an {42, -43, 44, 45}], [Argument: an {-32768, 32767}], [Argument: an {}]}]";
       
   323 
       
   324     QList<QList<ushort> > ushorts;
       
   325     QTest::newRow("empty-list-of-ushortlist") << qVariantFromValue(ushorts) << "aaq"
       
   326             << "[Argument: aaq {}]";
       
   327     ushorts << QList<ushort>();
       
   328     QTest::newRow("list-of-emptyushortlist") << qVariantFromValue(ushorts) << "aaq"
       
   329             << "[Argument: aaq {[Argument: aq {}]}]";
       
   330     ushorts << (QList<ushort>() << 12u << 13u << 14u << 15)
       
   331             << (QList<ushort>() << 65535)
       
   332             << (QList<ushort>());
       
   333     QTest::newRow("ushortlist") << qVariantFromValue(ushorts) << "aaq"
       
   334             << "[Argument: aaq {[Argument: aq {}], [Argument: aq {12, 13, 14, 15}], [Argument: aq {65535}], [Argument: aq {}]}]";
       
   335 
       
   336     QList<QList<int> > ints;
       
   337     QTest::newRow("empty-list-of-intlist") << qVariantFromValue(ints) << "aai"
       
   338             << "[Argument: aai {}]";
       
   339     ints << QList<int>();
       
   340     QTest::newRow("list-of-emptyintlist") << qVariantFromValue(ints) << "aai"
       
   341             << "[Argument: aai {[Argument: ai {}]}]";
       
   342     ints << (QList<int>() << 42 << -43 << 44 << 45)
       
   343          << (QList<int>() << 2147483647 << -2147483647-1)
       
   344          << (QList<int>());
       
   345     QTest::newRow("intlist") << qVariantFromValue(ints) << "aai"
       
   346             << "[Argument: aai {[Argument: ai {}], [Argument: ai {42, -43, 44, 45}], [Argument: ai {2147483647, -2147483648}], [Argument: ai {}]}]";
       
   347 
       
   348     QList<QList<uint> > uints;
       
   349     QTest::newRow("empty-list-of-uintlist") << qVariantFromValue(uints) << "aau"
       
   350             << "[Argument: aau {}]";
       
   351     uints << QList<uint>();
       
   352     QTest::newRow("list-of-emptyuintlist") << qVariantFromValue(uints) << "aau"
       
   353             << "[Argument: aau {[Argument: au {}]}]";
       
   354     uints << (QList<uint>() << uint(12) << uint(13) << uint(14))
       
   355           << (QList<uint>() << 4294967295U)
       
   356           << (QList<uint>());
       
   357     QTest::newRow("uintlist") << qVariantFromValue(uints) << "aau"
       
   358             << "[Argument: aau {[Argument: au {}], [Argument: au {12, 13, 14}], [Argument: au {4294967295}], [Argument: au {}]}]";
       
   359 
       
   360     QList<QList<qlonglong> > llints;
       
   361     QTest::newRow("empty-list-of-llintlist") << qVariantFromValue(llints) << "aax"
       
   362             << "[Argument: aax {}]";
       
   363     llints << QList<qlonglong>();
       
   364     QTest::newRow("list-of-emptyllintlist") << qVariantFromValue(llints) << "aax"
       
   365             << "[Argument: aax {[Argument: ax {}]}]";
       
   366     llints << (QList<qlonglong>() << Q_INT64_C(99) << Q_INT64_C(-100))
       
   367            << (QList<qlonglong>() << Q_INT64_C(-9223372036854775807)-1 << Q_INT64_C(9223372036854775807))
       
   368            << (QList<qlonglong>());
       
   369     QTest::newRow("llintlist") << qVariantFromValue(llints) << "aax"
       
   370             << "[Argument: aax {[Argument: ax {}], [Argument: ax {99, -100}], [Argument: ax {-9223372036854775808, 9223372036854775807}], [Argument: ax {}]}]";
       
   371 
       
   372     QList<QList<qulonglong> > ullints;
       
   373     QTest::newRow("empty-list-of-ullintlist") << qVariantFromValue(ullints) << "aat"
       
   374             << "[Argument: aat {}]";
       
   375     ullints << QList<qulonglong>();
       
   376     QTest::newRow("list-of-emptyullintlist") << qVariantFromValue(ullints) << "aat"
       
   377             << "[Argument: aat {[Argument: at {}]}]";
       
   378     ullints << (QList<qulonglong>() << Q_UINT64_C(66) << Q_UINT64_C(67))
       
   379             << (QList<qulonglong>() << Q_UINT64_C(18446744073709551615))
       
   380             << (QList<qulonglong>());
       
   381     QTest::newRow("ullintlist") << qVariantFromValue(ullints) << "aat"
       
   382             << "[Argument: aat {[Argument: at {}], [Argument: at {66, 67}], [Argument: at {18446744073709551615}], [Argument: at {}]}]";
       
   383 
       
   384     QList<QList<double> > doubles;
       
   385     QTest::newRow("empty-list-ofdoublelist") << qVariantFromValue(doubles) << "aad"
       
   386             << "[Argument: aad {}]";
       
   387     doubles << QList<double>();
       
   388     QTest::newRow("list-of-emptydoublelist") << qVariantFromValue(doubles) << "aad"
       
   389             << "[Argument: aad {[Argument: ad {}]}]";
       
   390     doubles << (QList<double>() << 1.2 << 2.2 << 4.4)
       
   391             << (QList<double>() << -std::numeric_limits<double>::infinity()
       
   392                 << std::numeric_limits<double>::infinity()
       
   393                 << std::numeric_limits<double>::quiet_NaN())
       
   394             << (QList<double>());
       
   395     QTest::newRow("doublelist") << qVariantFromValue(doubles) << "aad"
       
   396             << "[Argument: aad {[Argument: ad {}], [Argument: ad {1.2, 2.2, 4.4}], [Argument: ad {-inf, inf, nan}], [Argument: ad {}]}]";
       
   397 
       
   398     QList<QVariantList> variants;
       
   399     QTest::newRow("emptyvariantlist") << qVariantFromValue(variants) << "aav"
       
   400             << "[Argument: aav {}]";
       
   401     variants << QVariantList();
       
   402     QTest::newRow("emptyvariantlist") << qVariantFromValue(variants) << "aav"
       
   403             << "[Argument: aav {[Argument: av {}]}]";
       
   404     variants << (QVariantList() << QString("Hello") << QByteArray("World"))
       
   405              << (QVariantList() << 42 << -43.0 << 44U << Q_INT64_C(-45))
       
   406              << (QVariantList() << Q_UINT64_C(46) << true << qVariantFromValue(short(-47)));
       
   407     QTest::newRow("variantlist") << qVariantFromValue(variants) << "aav"
       
   408             << "[Argument: aav {[Argument: av {}], [Argument: av {[Variant(QString): \"Hello\"], [Variant(QByteArray): {87, 111, 114, 108, 100}]}], [Argument: av {[Variant(int): 42], [Variant(double): -43], [Variant(uint): 44], [Variant(qlonglong): -45]}], [Argument: av {[Variant(qulonglong): 46], [Variant(bool): true], [Variant(short): -47]}]}]";
       
   409 }
       
   410 
       
   411 void tst_QDBusMarshall::sendMaps_data()
       
   412 {
       
   413     QTest::addColumn<QVariant>("value");
       
   414     QTest::addColumn<QString>("sig");
       
   415     QTest::addColumn<QString>("stringResult");
       
   416 
       
   417     QMap<int, QString> ismap;
       
   418     QTest::newRow("empty-is-map") << qVariantFromValue(ismap) << "a{is}"
       
   419             << "[Argument: a{is} {}]";
       
   420     ismap[1] = "a";
       
   421     ismap[2000] = "b";
       
   422     ismap[-47] = "c";
       
   423     QTest::newRow("is-map") << qVariantFromValue(ismap) << "a{is}"
       
   424             << "[Argument: a{is} {-47 = \"c\", 1 = \"a\", 2000 = \"b\"}]";
       
   425 
       
   426     QMap<QString, QString> ssmap;
       
   427     QTest::newRow("empty-ss-map") << qVariantFromValue(ssmap) << "a{ss}"
       
   428             << "[Argument: a{ss} {}]";
       
   429     ssmap["a"] = "a";
       
   430     ssmap["c"] = "b";
       
   431     ssmap["b"] = "c";
       
   432     QTest::newRow("ss-map") << qVariantFromValue(ssmap) << "a{ss}"
       
   433             << "[Argument: a{ss} {\"a\" = \"a\", \"b\" = \"c\", \"c\" = \"b\"}]";
       
   434 
       
   435     QVariantMap svmap;
       
   436     QTest::newRow("empty-sv-map") << qVariantFromValue(svmap) << "a{sv}"
       
   437             << "[Argument: a{sv} {}]";
       
   438     svmap["a"] = 1;
       
   439     svmap["c"] = "b";
       
   440     svmap["b"] = QByteArray("c");
       
   441     svmap["d"] = 42U;
       
   442     svmap["e"] = qVariantFromValue(short(-47));
       
   443     svmap["f"] = qVariantFromValue(QDBusVariant(0));
       
   444     QTest::newRow("sv-map1") << qVariantFromValue(svmap) << "a{sv}"
       
   445             << "[Argument: a{sv} {\"a\" = [Variant(int): 1], \"b\" = [Variant(QByteArray): {99}], \"c\" = [Variant(QString): \"b\"], \"d\" = [Variant(uint): 42], \"e\" = [Variant(short): -47], \"f\" = [Variant: [Variant(int): 0]]}]";
       
   446 
       
   447     QMap<QDBusObjectPath, QString> osmap;
       
   448     QTest::newRow("empty-os-map") << qVariantFromValue(osmap) << "a{os}"
       
   449             << "[Argument: a{os} {}]";
       
   450     osmap[QDBusObjectPath("/")] = "root";
       
   451     osmap[QDBusObjectPath("/foo")] = "foo";
       
   452     osmap[QDBusObjectPath("/bar/baz")] = "bar and baz";
       
   453     QTest::newRow("os-map") << qVariantFromValue(osmap) << "a{os}"
       
   454             << "[Argument: a{os} {[ObjectPath: /] = \"root\", [ObjectPath: /bar/baz] = \"bar and baz\", [ObjectPath: /foo] = \"foo\"}]";
       
   455 
       
   456     QHash<QDBusSignature, QString> gsmap;
       
   457     QTest::newRow("empty-gs-map") << qVariantFromValue(gsmap) << "a{gs}"
       
   458             << "[Argument: a{gs} {}]";
       
   459     gsmap[QDBusSignature("i")] = "int32";
       
   460     gsmap[QDBusSignature("s")] = "string";
       
   461     gsmap[QDBusSignature("a{gs}")] = "array of dict_entry of (signature, string)";
       
   462     QTest::newRow("gs-map") << qVariantFromValue(gsmap) << "a{gs}"
       
   463             << "[Argument: a{gs} {[Signature: a{gs}] = \"array of dict_entry of (signature, string)\", [Signature: i] = \"int32\", [Signature: s] = \"string\"}]";
       
   464 
       
   465     svmap.clear();
       
   466     svmap["ismap"] = qVariantFromValue(ismap);
       
   467     svmap["ssmap"] = qVariantFromValue(ssmap);
       
   468     svmap["osmap"] = qVariantFromValue(osmap);
       
   469     svmap["gsmap"] = qVariantFromValue(gsmap);
       
   470     QTest::newRow("sv-map2") << qVariantFromValue(svmap) << "a{sv}"
       
   471             << "[Argument: a{sv} {\"gsmap\" = [Variant: [Argument: a{gs} {[Signature: a{gs}] = \"array of dict_entry of (signature, string)\", [Signature: i] = \"int32\", [Signature: s] = \"string\"}]], \"ismap\" = [Variant: [Argument: a{is} {-47 = \"c\", 1 = \"a\", 2000 = \"b\"}]], \"osmap\" = [Variant: [Argument: a{os} {[ObjectPath: /] = \"root\", [ObjectPath: /bar/baz] = \"bar and baz\", [ObjectPath: /foo] = \"foo\"}]], \"ssmap\" = [Variant: [Argument: a{ss} {\"a\" = \"a\", \"b\" = \"c\", \"c\" = \"b\"}]]}]";
       
   472 }
       
   473 
       
   474 void tst_QDBusMarshall::sendStructs_data()
       
   475 {
       
   476     QTest::addColumn<QVariant>("value");
       
   477     QTest::addColumn<QString>("sig");
       
   478     QTest::addColumn<QString>("stringResult");
       
   479 
       
   480     QTest::newRow("point") << QVariant(QPoint(1, 2)) << "(ii)" << "[Argument: (ii) 1, 2]";
       
   481     QTest::newRow("pointf") << QVariant(QPointF(1.5, -1.5)) << "(dd)" << "[Argument: (dd) 1.5, -1.5]";
       
   482 
       
   483     QTest::newRow("size") << QVariant(QSize(1, 2)) << "(ii)" << "[Argument: (ii) 1, 2]";
       
   484     QTest::newRow("sizef") << QVariant(QSizeF(1.5, 1.5)) << "(dd)" << "[Argument: (dd) 1.5, 1.5]";
       
   485 
       
   486     QTest::newRow("rect") << QVariant(QRect(1, 2, 3, 4)) << "(iiii)" << "[Argument: (iiii) 1, 2, 3, 4]";
       
   487     QTest::newRow("rectf") << QVariant(QRectF(0.5, 0.5, 1.5, 1.5)) << "(dddd)" << "[Argument: (dddd) 0.5, 0.5, 1.5, 1.5]";
       
   488 
       
   489     QTest::newRow("line") << QVariant(QLine(1, 2, 3, 4)) << "((ii)(ii))"
       
   490                           << "[Argument: ((ii)(ii)) [Argument: (ii) 1, 2], [Argument: (ii) 3, 4]]";
       
   491     QTest::newRow("linef") << QVariant(QLineF(0.5, 0.5, 1.5, 1.5)) << "((dd)(dd))"
       
   492                            << "[Argument: ((dd)(dd)) [Argument: (dd) 0.5, 0.5], [Argument: (dd) 1.5, 1.5]]";
       
   493 
       
   494     QDate date(2006, 6, 18);
       
   495     QTime time(12, 25, 00);     // the date I wrote this test on :-)
       
   496     QTest::newRow("date") << QVariant(date) << "(iii)" << "[Argument: (iii) 2006, 6, 18]";
       
   497     QTest::newRow("time") << QVariant(time) << "(iiii)" << "[Argument: (iiii) 12, 25, 0, 0]";
       
   498     QTest::newRow("datetime") << QVariant(QDateTime(date, time)) << "((iii)(iiii)i)"
       
   499         << "[Argument: ((iii)(iiii)i) [Argument: (iii) 2006, 6, 18], [Argument: (iiii) 12, 25, 0, 0], 0]";
       
   500 
       
   501     MyStruct ms = { 1, "Hello, World" };
       
   502     QTest::newRow("int-string") << qVariantFromValue(ms) << "(is)" << "[Argument: (is) 1, \"Hello, World\"]";
       
   503 
       
   504     MyVariantMapStruct mvms = { "Hello, World", QVariantMap() };
       
   505     QTest::newRow("string-variantmap") << qVariantFromValue(mvms) << "(sa{sv})" << "[Argument: (sa{sv}) \"Hello, World\", [Argument: a{sv} {}]]";
       
   506 
       
   507     // use only basic types, otherwise comparison will fail
       
   508     mvms.map["int"] = 42;
       
   509     mvms.map["uint"] = 42u;
       
   510     mvms.map["short"] = qVariantFromValue<short>(-47);
       
   511     mvms.map["bytearray"] = QByteArray("Hello, world");
       
   512     QTest::newRow("string-variantmap2") << qVariantFromValue(mvms) << "(sa{sv})" << "[Argument: (sa{sv}) \"Hello, World\", [Argument: a{sv} {\"bytearray\" = [Variant(QByteArray): {72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100}], \"int\" = [Variant(int): 42], \"short\" = [Variant(short): -47], \"uint\" = [Variant(uint): 42]}]]";
       
   513 
       
   514     QList<MyVariantMapStruct> list;
       
   515     QTest::newRow("empty-list-of-string-variantmap") << qVariantFromValue(list) << "a(sa{sv})" << "[Argument: a(sa{sv}) {}]";
       
   516     list << mvms;
       
   517     QTest::newRow("list-of-string-variantmap") << qVariantFromValue(list) << "a(sa{sv})" << "[Argument: a(sa{sv}) {[Argument: (sa{sv}) \"Hello, World\", [Argument: a{sv} {\"bytearray\" = [Variant(QByteArray): {72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100}], \"int\" = [Variant(int): 42], \"short\" = [Variant(short): -47], \"uint\" = [Variant(uint): 42]}]]}]";
       
   518 }
       
   519 
       
   520 void tst_QDBusMarshall::sendComplex_data()
       
   521 {
       
   522     QTest::addColumn<QVariant>("value");
       
   523     QTest::addColumn<QString>("sig");
       
   524     QTest::addColumn<QString>("stringResult");
       
   525 
       
   526     QList<QDateTime> dtlist;
       
   527     QTest::newRow("empty-datetimelist") << qVariantFromValue(dtlist) << "a((iii)(iiii)i)"
       
   528             << "[Argument: a((iii)(iiii)i) {}]";
       
   529     dtlist << QDateTime();
       
   530     QTest::newRow("list-of-emptydatetime") << qVariantFromValue(dtlist) << "a((iii)(iiii)i)"
       
   531             << "[Argument: a((iii)(iiii)i) {[Argument: ((iii)(iiii)i) [Argument: (iii) 0, 0, 0], [Argument: (iiii) -1, -1, -1, -1], 0]}]";
       
   532     dtlist << QDateTime(QDate(1977, 9, 13), QTime(0, 0, 0))
       
   533            << QDateTime(QDate(2006, 6, 18), QTime(13, 14, 0));
       
   534     QTest::newRow("datetimelist") << qVariantFromValue(dtlist) << "a((iii)(iiii)i)"
       
   535             << "[Argument: a((iii)(iiii)i) {[Argument: ((iii)(iiii)i) [Argument: (iii) 0, 0, 0], [Argument: (iiii) -1, -1, -1, -1], 0], [Argument: ((iii)(iiii)i) [Argument: (iii) 1977, 9, 13], [Argument: (iiii) 0, 0, 0, 0], 0], [Argument: ((iii)(iiii)i) [Argument: (iii) 2006, 6, 18], [Argument: (iiii) 13, 14, 0, 0], 0]}]";
       
   536 
       
   537     QHash<qlonglong, QDateTime> lldtmap;
       
   538     QTest::newRow("empty-lldtmap") << qVariantFromValue(lldtmap) << "a{x((iii)(iiii)i)}"
       
   539             << "[Argument: a{x((iii)(iiii)i)} {}]";
       
   540     lldtmap[0] = QDateTime();
       
   541     lldtmap[1] = QDateTime(QDate(1970, 1, 1), QTime(0, 0, 1), Qt::UTC);
       
   542     lldtmap[1150629776] = QDateTime(QDate(2006, 6, 18), QTime(11, 22, 56), Qt::UTC);
       
   543     QTest::newRow("lldtmap") << qVariantFromValue(lldtmap) << "a{x((iii)(iiii)i)}"
       
   544             << "[Argument: a{x((iii)(iiii)i)} {0 = [Argument: ((iii)(iiii)i) [Argument: (iii) 0, 0, 0], [Argument: (iiii) -1, -1, -1, -1], 0], 1 = [Argument: ((iii)(iiii)i) [Argument: (iii) 1970, 1, 1], [Argument: (iiii) 0, 0, 1, 0], 1], 1150629776 = [Argument: ((iii)(iiii)i) [Argument: (iii) 2006, 6, 18], [Argument: (iiii) 11, 22, 56, 0], 1]}]";
       
   545 
       
   546 
       
   547     QMap<int, QString> ismap;
       
   548     ismap[1] = "a";
       
   549     ismap[2000] = "b";
       
   550     ismap[-47] = "c";
       
   551 
       
   552     QMap<QString, QString> ssmap;
       
   553     ssmap["a"] = "a";
       
   554     ssmap["c"] = "b";
       
   555     ssmap["b"] = "c";
       
   556 
       
   557     QHash<QDBusSignature, QString> gsmap;
       
   558     gsmap[QDBusSignature("i")] = "int32";
       
   559     gsmap[QDBusSignature("s")] = "string";
       
   560     gsmap[QDBusSignature("a{gs}")] = "array of dict_entry of (signature, string)";
       
   561 
       
   562     QVariantMap svmap;
       
   563     svmap["a"] = 1;
       
   564     svmap["c"] = "b";
       
   565     svmap["b"] = QByteArray("c");
       
   566     svmap["d"] = 42U;
       
   567     svmap["e"] = qVariantFromValue(short(-47));
       
   568     svmap["f"] = qVariantFromValue(QDBusVariant(0));
       
   569     svmap["date"] = QDate(1977, 1, 1);
       
   570     svmap["time"] = QTime(8, 58, 0);
       
   571     svmap["datetime"] = QDateTime(QDate(13, 9, 2008), QTime(8, 59, 31));
       
   572     svmap["pointf"] = QPointF(0.5, -0.5);
       
   573     svmap["ismap"] = qVariantFromValue(ismap);
       
   574     svmap["ssmap"] = qVariantFromValue(ssmap);
       
   575     svmap["gsmap"] = qVariantFromValue(gsmap);
       
   576     svmap["dtlist"] = qVariantFromValue(dtlist);
       
   577     svmap["lldtmap"] = qVariantFromValue(lldtmap);
       
   578     QTest::newRow("sv-map") << qVariantFromValue(svmap) << "a{sv}"
       
   579             << "[Argument: a{sv} {\"a\" = [Variant(int): 1], \"b\" = [Variant(QByteArray): {99}], \"c\" = [Variant(QString): \"b\"], \"d\" = [Variant(uint): 42], \"date\" = [Variant: [Argument: (iii) 1977, 1, 1]], \"datetime\" = [Variant: [Argument: ((iii)(iiii)i) [Argument: (iii) 0, 0, 0], [Argument: (iiii) 8, 59, 31, 0], 0]], \"dtlist\" = [Variant: [Argument: a((iii)(iiii)i) {[Argument: ((iii)(iiii)i) [Argument: (iii) 0, 0, 0], [Argument: (iiii) -1, -1, -1, -1], 0], [Argument: ((iii)(iiii)i) [Argument: (iii) 1977, 9, 13], [Argument: (iiii) 0, 0, 0, 0], 0], [Argument: ((iii)(iiii)i) [Argument: (iii) 2006, 6, 18], [Argument: (iiii) 13, 14, 0, 0], 0]}]], \"e\" = [Variant(short): -47], \"f\" = [Variant: [Variant(int): 0]], \"gsmap\" = [Variant: [Argument: a{gs} {[Signature: a{gs}] = \"array of dict_entry of (signature, string)\", [Signature: i] = \"int32\", [Signature: s] = \"string\"}]], \"ismap\" = [Variant: [Argument: a{is} {-47 = \"c\", 1 = \"a\", 2000 = \"b\"}]], \"lldtmap\" = [Variant: [Argument: a{x((iii)(iiii)i)} {0 = [Argument: ((iii)(iiii)i) [Argument: (iii) 0, 0, 0], [Argument: (iiii) -1, -1, -1, -1], 0], 1 = [Argument: ((iii)(iiii)i) [Argument: (iii) 1970, 1, 1], [Argument: (iiii) 0, 0, 1, 0], 1], 1150629776 = [Argument: ((iii)(iiii)i) [Argument: (iii) 2006, 6, 18], [Argument: (iiii) 11, 22, 56, 0], 1]}]], \"pointf\" = [Variant: [Argument: (dd) 0.5, -0.5]], \"ssmap\" = [Variant: [Argument: a{ss} {\"a\" = \"a\", \"b\" = \"c\", \"c\" = \"b\"}]], \"time\" = [Variant: [Argument: (iiii) 8, 58, 0, 0]]}]";
       
   580 }
       
   581 
       
   582 void tst_QDBusMarshall::sendArgument_data()
       
   583 {
       
   584     QTest::addColumn<QVariant>("value");
       
   585     QTest::addColumn<QString>("sig");
       
   586     QTest::addColumn<int>("classification");
       
   587 
       
   588     QDBusArgument();
       
   589     QDBusArgument arg;
       
   590 
       
   591     arg = QDBusArgument();
       
   592     arg << true;
       
   593     QTest::newRow("bool") << qVariantFromValue(arg) << "b" << int(QDBusArgument::BasicType);;
       
   594 
       
   595     arg = QDBusArgument();
       
   596     arg << false;
       
   597     QTest::newRow("bool2") << qVariantFromValue(arg) << "b" << int(QDBusArgument::BasicType);
       
   598 
       
   599     arg = QDBusArgument();
       
   600     arg << uchar(1);
       
   601     QTest::newRow("byte") << qVariantFromValue(arg) << "y" << int(QDBusArgument::BasicType);
       
   602 
       
   603     arg = QDBusArgument();
       
   604     arg << short(2);
       
   605     QTest::newRow("int16") << qVariantFromValue(arg) << "n" << int(QDBusArgument::BasicType);
       
   606 
       
   607     arg = QDBusArgument();
       
   608     arg << ushort(3);
       
   609     QTest::newRow("uint16") << qVariantFromValue(arg) << "q" << int(QDBusArgument::BasicType);
       
   610 
       
   611     arg = QDBusArgument();
       
   612     arg << 1;
       
   613     QTest::newRow("int32") << qVariantFromValue(arg) << "i" << int(QDBusArgument::BasicType);
       
   614 
       
   615     arg = QDBusArgument();
       
   616     arg << 2U;
       
   617     QTest::newRow("uint32") << qVariantFromValue(arg) << "u" << int(QDBusArgument::BasicType);
       
   618 
       
   619     arg = QDBusArgument();
       
   620     arg << Q_INT64_C(3);
       
   621     QTest::newRow("int64") << qVariantFromValue(arg) << "x" << int(QDBusArgument::BasicType);
       
   622 
       
   623     arg = QDBusArgument();
       
   624     arg << Q_UINT64_C(4);
       
   625     QTest::newRow("uint64") << qVariantFromValue(arg) << "t" << int(QDBusArgument::BasicType);
       
   626 
       
   627     arg = QDBusArgument();
       
   628     arg << 42.5;
       
   629     QTest::newRow("double") << qVariantFromValue(arg) << "d" << int(QDBusArgument::BasicType);
       
   630 
       
   631     arg = QDBusArgument();
       
   632     arg << QLatin1String("ping");
       
   633     QTest::newRow("string") << qVariantFromValue(arg) << "s" << int(QDBusArgument::BasicType);
       
   634 
       
   635     arg = QDBusArgument();
       
   636     arg << QDBusObjectPath("/org/kde");
       
   637     QTest::newRow("objectpath") << qVariantFromValue(arg) << "o" << int(QDBusArgument::BasicType);
       
   638 
       
   639     arg = QDBusArgument();
       
   640     arg << QDBusSignature("g");
       
   641     QTest::newRow("signature") << qVariantFromValue(arg) << "g" << int(QDBusArgument::BasicType);
       
   642 
       
   643     arg = QDBusArgument();
       
   644     arg << QLatin1String("");
       
   645     QTest::newRow("emptystring") << qVariantFromValue(arg) << "s" << int(QDBusArgument::BasicType);
       
   646 
       
   647     arg = QDBusArgument();
       
   648     arg << QString();
       
   649     QTest::newRow("nullstring") << qVariantFromValue(arg) << "s" << int(QDBusArgument::BasicType);
       
   650 
       
   651     arg = QDBusArgument();
       
   652     arg << QDBusVariant(1);
       
   653     QTest::newRow("variant") << qVariantFromValue(arg) << "v" << int(QDBusArgument::VariantType);
       
   654 
       
   655     arg = QDBusArgument();
       
   656     arg << QDBusVariant(qVariantFromValue(QDBusVariant(1)));
       
   657     QTest::newRow("variant-variant") << qVariantFromValue(arg) << "v" << int(QDBusArgument::VariantType);
       
   658 
       
   659     arg = QDBusArgument();
       
   660     arg.beginArray(QVariant::Int);
       
   661     arg << 1 << 2 << 3 << -4;
       
   662     arg.endArray();
       
   663     QTest::newRow("array-of-int") << qVariantFromValue(arg) << "ai" << int(QDBusArgument::ArrayType);
       
   664 
       
   665     arg = QDBusArgument();
       
   666     arg.beginMap(QVariant::Int, QVariant::UInt);
       
   667     arg.beginMapEntry();
       
   668     arg << 1 << 2U;
       
   669     arg.endMapEntry();
       
   670     arg.beginMapEntry();
       
   671     arg << 3 << 4U;
       
   672     arg.endMapEntry();
       
   673     arg.endMap();
       
   674     QTest::newRow("map") << qVariantFromValue(arg) << "a{iu}" << int(QDBusArgument::MapType);
       
   675 
       
   676     arg = QDBusArgument();
       
   677     arg.beginStructure();
       
   678     arg << 1 << 2U << short(-3) << ushort(4) << 5.0 << false;
       
   679     arg.endStructure();
       
   680     QTest::newRow("structure") << qVariantFromValue(arg) << "(iunqdb)" << int(QDBusArgument::StructureType);
       
   681 
       
   682 #if 0
       
   683     // this is now unsupported
       
   684     arg << 1 << 2U << short(-3) << ushort(4) << 5.0 << false;
       
   685     QTest::newRow("many-args") << qVariantFromValue(arg) << "(iunqdb)iunqdb";
       
   686 #endif
       
   687 }
       
   688 
       
   689 void tst_QDBusMarshall::sendBasic()
       
   690 {
       
   691     QFETCH(QVariant, value);
       
   692     QFETCH(QString, stringResult);
       
   693 
       
   694     QDBusConnection con = QDBusConnection::sessionBus();
       
   695 
       
   696     QVERIFY(con.isConnected());
       
   697 
       
   698     QDBusMessage msg = QDBusMessage::createMethodCall(serviceName,
       
   699                                                       objectPath, interfaceName, "ping");
       
   700     msg << value;
       
   701 
       
   702     QDBusMessage reply = con.call(msg);
       
   703     //qDebug() << reply;
       
   704 
       
   705     QCOMPARE(reply.arguments().count(), msg.arguments().count());
       
   706     QTEST(reply.signature(), "sig");
       
   707     for (int i = 0; i < reply.arguments().count(); ++i) {
       
   708         QVERIFY(compare(reply.arguments().at(i), msg.arguments().at(i)));
       
   709         //printf("\n! %s\n* %s\n", qPrintable(qDBusArgumentToString(reply.arguments().at(i))), qPrintable(stringResult));
       
   710         QCOMPARE(QDBusUtil::argumentToString(reply.arguments().at(i)), stringResult);
       
   711     }
       
   712 }
       
   713 
       
   714 void tst_QDBusMarshall::sendVariant()
       
   715 {
       
   716     QFETCH(QVariant, value);
       
   717 
       
   718     QDBusConnection con = QDBusConnection::sessionBus();
       
   719 
       
   720     QVERIFY(con.isConnected());
       
   721 
       
   722     QDBusMessage msg = QDBusMessage::createMethodCall(serviceName,
       
   723                                                       objectPath, interfaceName, "ping");
       
   724     msg << qVariantFromValue(QDBusVariant(value));
       
   725 
       
   726     QDBusMessage reply = con.call(msg);
       
   727  //   qDebug() << reply;
       
   728 
       
   729     QCOMPARE(reply.arguments().count(), msg.arguments().count());
       
   730     QCOMPARE(reply.signature(), QString("v"));
       
   731     for (int i = 0; i < reply.arguments().count(); ++i)
       
   732         QVERIFY(compare(reply.arguments().at(i), msg.arguments().at(i)));
       
   733 }
       
   734 
       
   735 void tst_QDBusMarshall::sendArrays()
       
   736 {
       
   737     sendBasic();
       
   738 }
       
   739 
       
   740 void tst_QDBusMarshall::sendArrayOfArrays()
       
   741 {
       
   742     sendBasic();
       
   743 }
       
   744 
       
   745 void tst_QDBusMarshall::sendMaps()
       
   746 {
       
   747     sendBasic();
       
   748 }
       
   749 
       
   750 void tst_QDBusMarshall::sendStructs()
       
   751 {
       
   752     sendBasic();
       
   753 }
       
   754 
       
   755 void tst_QDBusMarshall::sendComplex()
       
   756 {
       
   757     sendBasic();
       
   758 }
       
   759 
       
   760 void tst_QDBusMarshall::sendArgument()
       
   761 {
       
   762     QFETCH(QVariant, value);
       
   763     QFETCH(QString, sig);
       
   764 
       
   765     QDBusConnection con = QDBusConnection::sessionBus();
       
   766 
       
   767     QVERIFY(con.isConnected());
       
   768 
       
   769     QDBusMessage msg = QDBusMessage::createMethodCall(serviceName, objectPath,
       
   770                                                       interfaceName, "ping");
       
   771     msg << value;
       
   772 
       
   773     QDBusMessage reply = con.call(msg);
       
   774 
       
   775 //    QCOMPARE(reply.arguments().count(), msg.arguments().count());
       
   776     QCOMPARE(reply.signature(), sig);
       
   777 //    for (int i = 0; i < reply.arguments().count(); ++i)
       
   778 //        QVERIFY(compare(reply.arguments().at(i), msg.arguments().at(i)));
       
   779 
       
   780     // do it again inside a STRUCT now
       
   781     QDBusArgument sendArg;
       
   782     sendArg.beginStructure();
       
   783     sendArg.appendVariant(value);
       
   784     sendArg.endStructure();
       
   785     msg.setArguments(QVariantList() << qVariantFromValue(sendArg));
       
   786     reply = con.call(msg);
       
   787 
       
   788     QCOMPARE(reply.signature(), QString("(%1)").arg(sig));
       
   789     QCOMPARE(reply.arguments().at(0).userType(), qMetaTypeId<QDBusArgument>());
       
   790 
       
   791     const QDBusArgument arg = qvariant_cast<QDBusArgument>(reply.arguments().at(0));
       
   792     QCOMPARE(int(arg.currentType()), int(QDBusArgument::StructureType));
       
   793 
       
   794     arg.beginStructure();
       
   795     QVERIFY(!arg.atEnd());
       
   796     QCOMPARE(arg.currentSignature(), sig);
       
   797     QTEST(int(arg.currentType()), "classification");
       
   798 
       
   799     QVariant extracted = arg.asVariant();
       
   800     QVERIFY(arg.atEnd());
       
   801 
       
   802     arg.endStructure();
       
   803     QVERIFY(arg.atEnd());
       
   804     QCOMPARE(arg.currentType(), QDBusArgument::UnknownType);
       
   805 
       
   806     if (value.type() != QVariant::UserType)
       
   807         QCOMPARE(extracted, value);
       
   808 }
       
   809 
       
   810 void tst_QDBusMarshall::sendSignalErrors()
       
   811 {
       
   812     QDBusConnection con = QDBusConnection::sessionBus();
       
   813 
       
   814     QVERIFY(con.isConnected());
       
   815     QDBusMessage msg = QDBusMessage::createSignal("/foo", "local.interfaceName",
       
   816                                                   "signalName");
       
   817     msg << qVariantFromValue(QDBusObjectPath());
       
   818 
       
   819     QTest::ignoreMessage(QtWarningMsg, "QDBusConnection: error: could not send signal path \"/foo\" interface \"local.interfaceName\" member \"signalName\": Marshalling failed: Invalid object path passed in arguments");
       
   820     QVERIFY(!con.send(msg));
       
   821 
       
   822     msg.setArguments(QVariantList());
       
   823     QDBusObjectPath path;
       
   824 
       
   825     QTest::ignoreMessage(QtWarningMsg, "QDBusObjectPath: invalid path \"abc\"");
       
   826     path.setPath("abc");
       
   827     msg << qVariantFromValue(path);
       
   828 
       
   829     QTest::ignoreMessage(QtWarningMsg, "QDBusConnection: error: could not send signal path \"/foo\" interface \"local.interfaceName\" member \"signalName\": Marshalling failed: Invalid object path passed in arguments");
       
   830     QVERIFY(!con.send(msg));
       
   831 
       
   832     QDBusSignature sig;
       
   833     msg.setArguments(QVariantList() << qVariantFromValue(sig));
       
   834     QTest::ignoreMessage(QtWarningMsg, "QDBusConnection: error: could not send signal path \"/foo\" interface \"local.interfaceName\" member \"signalName\": Marshalling failed: Invalid signature passed in arguments");
       
   835     QVERIFY(!con.send(msg));
       
   836 
       
   837     QTest::ignoreMessage(QtWarningMsg, "QDBusSignature: invalid signature \"a\"");
       
   838     sig.setSignature("a");
       
   839     msg.setArguments(QVariantList());
       
   840     msg << qVariantFromValue(sig);
       
   841     QTest::ignoreMessage(QtWarningMsg, "QDBusConnection: error: could not send signal path \"/foo\" interface \"local.interfaceName\" member \"signalName\": Marshalling failed: Invalid signature passed in arguments");
       
   842     QVERIFY(!con.send(msg));
       
   843 }
       
   844 
       
   845 void tst_QDBusMarshall::sendCallErrors_data()
       
   846 {
       
   847     QTest::addColumn<QString>("service");
       
   848     QTest::addColumn<QString>("path");
       
   849     QTest::addColumn<QString>("interface");
       
   850     QTest::addColumn<QString>("method");
       
   851     QTest::addColumn<QVariantList>("arguments");
       
   852     QTest::addColumn<QString>("errorName");
       
   853     QTest::addColumn<QString>("errorMsg");
       
   854     QTest::addColumn<QString>("ignoreMsg");
       
   855 
       
   856     // this error comes from the bus server
       
   857     QTest::newRow("empty-service") << "" << objectPath << interfaceName << "ping" << QVariantList()
       
   858             << "org.freedesktop.DBus.Error.UnknownMethod"
       
   859             << "Method \"ping\" with signature \"\" on interface \"com.trolltech.autotests.qpong\" doesn't exist\n" << (const char*)0;
       
   860 
       
   861     QTest::newRow("invalid-service") << "this isn't valid" << objectPath << interfaceName << "ping" << QVariantList()
       
   862             << "com.trolltech.QtDBus.Error.InvalidService"
       
   863             << "Invalid service name: this isn't valid" << "";
       
   864 
       
   865     QTest::newRow("empty-path") << serviceName << "" << interfaceName << "ping" << QVariantList()
       
   866             << "com.trolltech.QtDBus.Error.InvalidObjectPath"
       
   867             << "Object path cannot be empty" << "";
       
   868     QTest::newRow("invalid-path") << serviceName << "//" << interfaceName << "ping" << QVariantList()
       
   869             << "com.trolltech.QtDBus.Error.InvalidObjectPath"
       
   870             << "Invalid object path: //" << "";
       
   871 
       
   872     // empty interfaces are valid
       
   873     QTest::newRow("invalid-interface") << serviceName << objectPath << "this isn't valid" << "ping" << QVariantList()
       
   874             << "com.trolltech.QtDBus.Error.InvalidInterface"
       
   875             << "Invalid interface class: this isn't valid" << "";
       
   876 
       
   877     QTest::newRow("empty-method") << serviceName << objectPath << interfaceName << "" << QVariantList()
       
   878             << "com.trolltech.QtDBus.Error.InvalidMember"
       
   879             << "method name cannot be empty" << "";
       
   880     QTest::newRow("invalid-method") << serviceName << objectPath << interfaceName << "this isn't valid" << QVariantList()
       
   881             << "com.trolltech.QtDBus.Error.InvalidMember"
       
   882             << "Invalid method name: this isn't valid" << "";
       
   883 
       
   884     QTest::newRow("invalid-variant1") << serviceName << objectPath << interfaceName << "ping"
       
   885             << (QVariantList() << QVariant())
       
   886             << "org.freedesktop.DBus.Error.Failed"
       
   887             << "Marshalling failed: Variant containing QVariant::Invalid passed in arguments"
       
   888             << "QDBusMarshaller: cannot add an invalid QVariant";
       
   889     QTest::newRow("invalid-variant1") << serviceName << objectPath << interfaceName << "ping"
       
   890             << (QVariantList() << qVariantFromValue(QDBusVariant()))
       
   891             << "org.freedesktop.DBus.Error.Failed"
       
   892             << "Marshalling failed: Variant containing QVariant::Invalid passed in arguments"
       
   893             << "QDBusMarshaller: cannot add a null QDBusVariant";
       
   894 
       
   895     QTest::newRow("builtin-unregistered") << serviceName << objectPath << interfaceName << "ping"
       
   896             << (QVariantList() << QLocale::c())
       
   897             << "org.freedesktop.DBus.Error.Failed"
       
   898             << "Marshalling failed: Unregistered type QLocale passed in arguments"
       
   899             << "QDBusMarshaller: type `QLocale' (18) is not registered with D-BUS. Use qDBusRegisterMetaType to register it";
       
   900 
       
   901     // this type is known to the meta type system, but not registered with D-Bus
       
   902     qRegisterMetaType<UnregisteredType>();
       
   903     QTest::newRow("extra-unregistered") << serviceName << objectPath << interfaceName << "ping"
       
   904             << (QVariantList() << qVariantFromValue(UnregisteredType()))
       
   905             << "org.freedesktop.DBus.Error.Failed"
       
   906             << "Marshalling failed: Unregistered type UnregisteredType passed in arguments"
       
   907             << QString("QDBusMarshaller: type `UnregisteredType' (%1) is not registered with D-BUS. Use qDBusRegisterMetaType to register it")
       
   908             .arg(qMetaTypeId<UnregisteredType>());
       
   909 }
       
   910 
       
   911 void tst_QDBusMarshall::sendCallErrors()
       
   912 {
       
   913     QDBusConnection con = QDBusConnection::sessionBus();
       
   914     QVERIFY(con.isConnected());
       
   915 
       
   916     QFETCH(QString, service);
       
   917     QFETCH(QString, path);
       
   918     QFETCH(QString, interface);
       
   919     QFETCH(QString, method);
       
   920     QFETCH(QVariantList, arguments);
       
   921     QFETCH(QString, errorMsg);
       
   922 
       
   923     QFETCH(QString, ignoreMsg);
       
   924     if (!ignoreMsg.isEmpty())
       
   925         QTest::ignoreMessage(QtWarningMsg, ignoreMsg.toLatin1());
       
   926     if (!ignoreMsg.isNull())
       
   927         QTest::ignoreMessage(QtWarningMsg,
       
   928                              QString("QDBusConnection: error: could not send message to service \"%1\" path \"%2\" interface \"%3\" member \"%4\": %5")
       
   929                              .arg(service, path, interface, method, errorMsg)
       
   930                              .toLatin1());
       
   931 
       
   932     QDBusMessage msg = QDBusMessage::createMethodCall(service, path, interface, method);
       
   933     msg.setArguments(arguments);
       
   934 
       
   935     QDBusMessage reply = con.call(msg, QDBus::Block);
       
   936     QCOMPARE(reply.type(), QDBusMessage::ErrorMessage);
       
   937     QTEST(reply.errorName(), "errorName");
       
   938     QCOMPARE(reply.errorMessage(), errorMsg);
       
   939 }
       
   940 
       
   941 QTEST_MAIN(tst_QDBusMarshall)
       
   942 #include "tst_qdbusmarshall.moc"