diff options
Diffstat (limited to 'test/testxmlparse.cpp')
-rw-r--r-- | test/testxmlparse.cpp | 445 |
1 files changed, 445 insertions, 0 deletions
diff --git a/test/testxmlparse.cpp b/test/testxmlparse.cpp new file mode 100644 index 000000000..a5b66aab2 --- /dev/null +++ b/test/testxmlparse.cpp @@ -0,0 +1,445 @@ +/* + * This software is in the public domain, furnished "as is", without technical + * support, and with no warranty, express or implied, as to its usefulness for + * any purpose. + * */ + +#include <QtTest> + +#include "networkjobs.h" + +using namespace OCC; + +class TestXmlParse : public QObject +{ + Q_OBJECT + +private: + bool _success; + QStringList _subdirs; + QStringList _items; + +public slots: + void slotDirectoryListingSubFolders(const QStringList& list) + { + qDebug() << "subfolders: " << list; + _subdirs.append(list); + } + + void slotDirectoryListingIterated(const QString& item, const QMap<QString,QString>& ) + { + qDebug() << " item: " << item; + _items.append(item); + } + + void slotFinishedSuccessfully() + { + _success = true; + } + +private slots: + void init() { + qDebug() << Q_FUNC_INFO; + _success = false; + _subdirs.clear(); + _items.clear(); + } + + void cleanup() { + } + + + void testParser1() { + const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>" + "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">" + "<d:response>" + "<d:href>/oc/remote.php/webdav/sharefolder/</d:href>" + "<d:propstat>" + "<d:prop>" + "<oc:id>00004213ocobzus5kn6s</oc:id>" + "<oc:permissions>RDNVCK</oc:permissions>" + "<oc:size>121780</oc:size>" + "<d:getetag>\"5527beb0400b0\"</d:getetag>" + "<d:resourcetype>" + "<d:collection/>" + "</d:resourcetype>" + "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>" + "</d:prop>" + "<d:status>HTTP/1.1 200 OK</d:status>" + "</d:propstat>" + "<d:propstat>" + "<d:prop>" + "<d:getcontentlength/>" + "<oc:downloadURL/>" + "<oc:dDC/>" + "</d:prop>" + "<d:status>HTTP/1.1 404 Not Found</d:status>" + "</d:propstat>" + "</d:response>" + "<d:response>" + "<d:href>/oc/remote.php/webdav/sharefolder/quitte.pdf</d:href>" + "<d:propstat>" + "<d:prop>" + "<oc:id>00004215ocobzus5kn6s</oc:id>" + "<oc:permissions>RDNVW</oc:permissions>" + "<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>" + "<d:resourcetype/>" + "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>" + "<d:getcontentlength>121780</d:getcontentlength>" + "</d:prop>" + "<d:status>HTTP/1.1 200 OK</d:status>" + "</d:propstat>" + "<d:propstat>" + "<d:prop>" + "<oc:downloadURL/>" + "<oc:dDC/>" + "</d:prop>" + "<d:status>HTTP/1.1 404 Not Found</d:status>" + "</d:propstat>" + "</d:response>" + "</d:multistatus>"; + + + LsColXMLParser parser; + + connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)), + this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) ); + connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)), + this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) ); + connect( &parser, SIGNAL(finishedWithoutError()), + this, SLOT(slotFinishedSuccessfully()) ); + + QHash <QString, qint64> sizes; + QVERIFY(parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" )); + + QVERIFY(_success); + QCOMPARE(sizes.size(), 1 ); // Quota info in the XML + + QVERIFY(_items.contains("/oc/remote.php/webdav/sharefolder/quitte.pdf")); + QVERIFY(_items.contains("/oc/remote.php/webdav/sharefolder")); + QVERIFY(_items.size() == 2 ); + + QVERIFY(_subdirs.contains("/oc/remote.php/webdav/sharefolder/")); + QVERIFY(_subdirs.size() == 1); + } + + void testParserBrokenXml() { + const QByteArray testXml = "X<?xml version='1.0' encoding='utf-8'?>" + "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">" + "<d:response>" + "<d:href>/oc/remote.php/webdav/sharefolder/</d:href>" + "<d:propstat>" + "<d:prop>" + "<oc:id>00004213ocobzus5kn6s</oc:id>" + "<oc:permissions>RDNVCK</oc:permissions>" + "<oc:size>121780</oc:size>" + "<d:getetag>\"5527beb0400b0\"</d:getetag>" + "<d:resourcetype>" + "<d:collection/>" + "</d:resourcetype>" + "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>" + "</d:prop>" + "<d:status>HTTP/1.1 200 OK</d:status>" + "</d:propstat>" + "<d:propstat>" + "<d:prop>" + "<d:getcontentlength/>" + "<oc:downloadURL/>" + "<oc:dDC/>" + "</d:prop>" + "<d:status>HTTP/1.1 404 Not Found</d:status>" + "</d:propstat>" + "</d:response>" + "<d:response>" + "<d:href>/oc/remote.php/webdav/sharefolder/quitte.pdf</d:href>" + "<d:propstat>" + "<d:prop>" + "<oc:id>00004215ocobzus5kn6s</oc:id>" + "<oc:permissions>RDNVW</oc:permissions>" + "<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>" + "<d:resourcetype/>" + "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>" + "<d:getcontentlength>121780</d:getcontentlength>" + "</d:prop>" + "<d:status>HTTP/1.1 200 OK</d:status>" + "</d:propstat>" + "<d:propstat>" + "<d:prop>" + "<oc:downloadURL/>" + "<oc:dDC/>" + "</d:prop>" + "<d:status>HTTP/1.1 404 Not Found</d:status>" + "</d:propstat>" + "</d:response>" + "</d:multistatus>"; + + + LsColXMLParser parser; + + connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)), + this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) ); + connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)), + this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) ); + connect( &parser, SIGNAL(finishedWithoutError()), + this, SLOT(slotFinishedSuccessfully()) ); + + QHash <QString, qint64> sizes; + QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" )); // verify false + + QVERIFY(!_success); + QVERIFY(sizes.size() == 0 ); // No quota info in the XML + + QVERIFY(_items.size() == 0 ); // FIXME: We should change the parser to not emit during parsing but at the end + + QVERIFY(_subdirs.size() == 0); + } + + void testParserEmptyXmlNoDav() { + const QByteArray testXml = "<html><body>I am under construction</body></html>"; + + LsColXMLParser parser; + + connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)), + this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) ); + connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)), + this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) ); + connect( &parser, SIGNAL(finishedWithoutError()), + this, SLOT(slotFinishedSuccessfully()) ); + + QHash <QString, qint64> sizes; + QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" )); // verify false + + QVERIFY(!_success); + QVERIFY(sizes.size() == 0 ); // No quota info in the XML + + QVERIFY(_items.size() == 0 ); // FIXME: We should change the parser to not emit during parsing but at the end + QVERIFY(_subdirs.size() == 0); + } + + void testParserEmptyXml() { + const QByteArray testXml = ""; + + LsColXMLParser parser; + + connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)), + this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) ); + connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)), + this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) ); + connect( &parser, SIGNAL(finishedWithoutError()), + this, SLOT(slotFinishedSuccessfully()) ); + + QHash <QString, qint64> sizes; + QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" )); // verify false + + QVERIFY(!_success); + QVERIFY(sizes.size() == 0 ); // No quota info in the XML + + QVERIFY(_items.size() == 0 ); // FIXME: We should change the parser to not emit during parsing but at the end + QVERIFY(_subdirs.size() == 0); + } + + void testParserBogfusHref1() { + const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>" + "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">" + "<d:response>" + "<d:href>http://127.0.0.1:81/oc/remote.php/webdav/sharefolder/</d:href>" + "<d:propstat>" + "<d:prop>" + "<oc:id>00004213ocobzus5kn6s</oc:id>" + "<oc:permissions>RDNVCK</oc:permissions>" + "<oc:size>121780</oc:size>" + "<d:getetag>\"5527beb0400b0\"</d:getetag>" + "<d:resourcetype>" + "<d:collection/>" + "</d:resourcetype>" + "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>" + "</d:prop>" + "<d:status>HTTP/1.1 200 OK</d:status>" + "</d:propstat>" + "<d:propstat>" + "<d:prop>" + "<d:getcontentlength/>" + "<oc:downloadURL/>" + "<oc:dDC/>" + "</d:prop>" + "<d:status>HTTP/1.1 404 Not Found</d:status>" + "</d:propstat>" + "</d:response>" + "<d:response>" + "<d:href>http://127.0.0.1:81/oc/remote.php/webdav/sharefolder/quitte.pdf</d:href>" + "<d:propstat>" + "<d:prop>" + "<oc:id>00004215ocobzus5kn6s</oc:id>" + "<oc:permissions>RDNVW</oc:permissions>" + "<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>" + "<d:resourcetype/>" + "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>" + "<d:getcontentlength>121780</d:getcontentlength>" + "</d:prop>" + "<d:status>HTTP/1.1 200 OK</d:status>" + "</d:propstat>" + "<d:propstat>" + "<d:prop>" + "<oc:downloadURL/>" + "<oc:dDC/>" + "</d:prop>" + "<d:status>HTTP/1.1 404 Not Found</d:status>" + "</d:propstat>" + "</d:response>" + "</d:multistatus>"; + + + LsColXMLParser parser; + + connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)), + this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) ); + connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)), + this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) ); + connect( &parser, SIGNAL(finishedWithoutError()), + this, SLOT(slotFinishedSuccessfully()) ); + + QHash <QString, qint64> sizes; + QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" )); + QVERIFY(!_success); + } + + void testParserBogfusHref2() { + const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>" + "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">" + "<d:response>" + "<d:href>/sharefolder</d:href>" + "<d:propstat>" + "<d:prop>" + "<oc:id>00004213ocobzus5kn6s</oc:id>" + "<oc:permissions>RDNVCK</oc:permissions>" + "<oc:size>121780</oc:size>" + "<d:getetag>\"5527beb0400b0\"</d:getetag>" + "<d:resourcetype>" + "<d:collection/>" + "</d:resourcetype>" + "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>" + "</d:prop>" + "<d:status>HTTP/1.1 200 OK</d:status>" + "</d:propstat>" + "<d:propstat>" + "<d:prop>" + "<d:getcontentlength/>" + "<oc:downloadURL/>" + "<oc:dDC/>" + "</d:prop>" + "<d:status>HTTP/1.1 404 Not Found</d:status>" + "</d:propstat>" + "</d:response>" + "<d:response>" + "<d:href>/sharefolder/quitte.pdf</d:href>" + "<d:propstat>" + "<d:prop>" + "<oc:id>00004215ocobzus5kn6s</oc:id>" + "<oc:permissions>RDNVW</oc:permissions>" + "<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>" + "<d:resourcetype/>" + "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>" + "<d:getcontentlength>121780</d:getcontentlength>" + "</d:prop>" + "<d:status>HTTP/1.1 200 OK</d:status>" + "</d:propstat>" + "<d:propstat>" + "<d:prop>" + "<oc:downloadURL/>" + "<oc:dDC/>" + "</d:prop>" + "<d:status>HTTP/1.1 404 Not Found</d:status>" + "</d:propstat>" + "</d:response>" + "</d:multistatus>"; + + + LsColXMLParser parser; + + connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)), + this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) ); + connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)), + this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) ); + connect( &parser, SIGNAL(finishedWithoutError()), + this, SLOT(slotFinishedSuccessfully()) ); + + QHash <QString, qint64> sizes; + QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/webdav/sharefolder" )); + QVERIFY(!_success); + } + + void testHrefUrlEncoding() { + const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>" + "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">" + "<d:response>" + "<d:href>/%C3%A4</d:href>" // a-umlaut utf8 + "<d:propstat>" + "<d:prop>" + "<oc:id>00004213ocobzus5kn6s</oc:id>" + "<oc:permissions>RDNVCK</oc:permissions>" + "<oc:size>121780</oc:size>" + "<d:getetag>\"5527beb0400b0\"</d:getetag>" + "<d:resourcetype>" + "<d:collection/>" + "</d:resourcetype>" + "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>" + "</d:prop>" + "<d:status>HTTP/1.1 200 OK</d:status>" + "</d:propstat>" + "<d:propstat>" + "<d:prop>" + "<d:getcontentlength/>" + "<oc:downloadURL/>" + "<oc:dDC/>" + "</d:prop>" + "<d:status>HTTP/1.1 404 Not Found</d:status>" + "</d:propstat>" + "</d:response>" + "<d:response>" + "<d:href>/%C3%A4/%C3%A4.pdf</d:href>" + "<d:propstat>" + "<d:prop>" + "<oc:id>00004215ocobzus5kn6s</oc:id>" + "<oc:permissions>RDNVW</oc:permissions>" + "<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>" + "<d:resourcetype/>" + "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>" + "<d:getcontentlength>121780</d:getcontentlength>" + "</d:prop>" + "<d:status>HTTP/1.1 200 OK</d:status>" + "</d:propstat>" + "<d:propstat>" + "<d:prop>" + "<oc:downloadURL/>" + "<oc:dDC/>" + "</d:prop>" + "<d:status>HTTP/1.1 404 Not Found</d:status>" + "</d:propstat>" + "</d:response>" + "</d:multistatus>"; + + LsColXMLParser parser; + + connect( &parser, SIGNAL(directoryListingSubfolders(const QStringList&)), + this, SLOT(slotDirectoryListingSubFolders(const QStringList&)) ); + connect( &parser, SIGNAL(directoryListingIterated(const QString&, const QMap<QString,QString>&)), + this, SLOT(slotDirectoryListingIterated(const QString&, const QMap<QString,QString>&)) ); + connect( &parser, SIGNAL(finishedWithoutError()), + this, SLOT(slotFinishedSuccessfully()) ); + + QHash <QString, qint64> sizes; + QVERIFY(parser.parse( testXml, &sizes, QString::fromUtf8("/ä") )); + QVERIFY(_success); + + QVERIFY(_items.contains(QString::fromUtf8("/ä/ä.pdf"))); + QVERIFY(_items.contains(QString::fromUtf8("/ä"))); + QVERIFY(_items.size() == 2 ); + + QVERIFY(_subdirs.contains(QString::fromUtf8("/ä"))); + QVERIFY(_subdirs.size() == 1); + } + +}; + +QTEST_MAIN(TestXmlParse) +#include "testxmlparse.moc" |