testxmlparse.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
  1. /*
  2. * This software is in the public domain, furnished "as is", without technical
  3. * support, and with no warranty, express or implied, as to its usefulness for
  4. * any purpose.
  5. * */
  6. #include <QtTest>
  7. #include "networkjobs.h"
  8. using namespace OCC;
  9. class TestXmlParse : public QObject
  10. {
  11. Q_OBJECT
  12. private:
  13. bool _success = false;
  14. QStringList _subdirs;
  15. QStringList _items;
  16. public slots:
  17. void slotDirectoryListingSubFolders(const QStringList& list)
  18. {
  19. qDebug() << "subfolders: " << list;
  20. _subdirs.append(list);
  21. }
  22. void slotDirectoryListingIterated(const QString& item, const QMap<QString,QString>& )
  23. {
  24. qDebug() << " item: " << item;
  25. _items.append(item);
  26. }
  27. void slotFinishedSuccessfully()
  28. {
  29. _success = true;
  30. }
  31. private slots:
  32. void init() {
  33. qDebug() << Q_FUNC_INFO;
  34. _success = false;
  35. _subdirs.clear();
  36. _items.clear();
  37. }
  38. void cleanup() {
  39. }
  40. void testParser1() {
  41. const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
  42. "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
  43. "<d:response>"
  44. "<d:href>/oc/remote.php/dav/sharefolder/</d:href>"
  45. "<d:propstat>"
  46. "<d:prop>"
  47. "<oc:id>00004213ocobzus5kn6s</oc:id>"
  48. "<oc:permissions>RDNVCK</oc:permissions>"
  49. "<oc:size>121780</oc:size>"
  50. "<d:getetag>\"5527beb0400b0\"</d:getetag>"
  51. "<d:resourcetype>"
  52. "<d:collection/>"
  53. "</d:resourcetype>"
  54. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  55. "</d:prop>"
  56. "<d:status>HTTP/1.1 200 OK</d:status>"
  57. "</d:propstat>"
  58. "<d:propstat>"
  59. "<d:prop>"
  60. "<d:getcontentlength/>"
  61. "<oc:downloadURL/>"
  62. "<oc:dDC/>"
  63. "</d:prop>"
  64. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  65. "</d:propstat>"
  66. "</d:response>"
  67. "<d:response>"
  68. "<d:href>/oc/remote.php/dav/sharefolder/quitte.pdf</d:href>"
  69. "<d:propstat>"
  70. "<d:prop>"
  71. "<oc:id>00004215ocobzus5kn6s</oc:id>"
  72. "<oc:permissions>RDNVW</oc:permissions>"
  73. "<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
  74. "<d:resourcetype/>"
  75. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  76. "<d:getcontentlength>121780</d:getcontentlength>"
  77. "</d:prop>"
  78. "<d:status>HTTP/1.1 200 OK</d:status>"
  79. "</d:propstat>"
  80. "<d:propstat>"
  81. "<d:prop>"
  82. "<oc:downloadURL/>"
  83. "<oc:dDC/>"
  84. "</d:prop>"
  85. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  86. "</d:propstat>"
  87. "</d:response>"
  88. "</d:multistatus>";
  89. LsColXMLParser parser;
  90. connect( &parser, &LsColXMLParser::directoryListingSubfolders,
  91. this, &TestXmlParse::slotDirectoryListingSubFolders );
  92. connect( &parser, &LsColXMLParser::directoryListingIterated,
  93. this, &TestXmlParse::slotDirectoryListingIterated );
  94. connect( &parser, &LsColXMLParser::finishedWithoutError,
  95. this, &TestXmlParse::slotFinishedSuccessfully );
  96. QHash <QString, ExtraFolderInfo> sizes;
  97. QVERIFY(parser.parse( testXml, &sizes, "/oc/remote.php/dav/sharefolder" ));
  98. QVERIFY(_success);
  99. QCOMPARE(sizes.size(), 1 ); // Quota info in the XML
  100. QVERIFY(_items.contains("/oc/remote.php/dav/sharefolder/quitte.pdf"));
  101. QVERIFY(_items.contains("/oc/remote.php/dav/sharefolder"));
  102. QVERIFY(_items.size() == 2 );
  103. QVERIFY(_subdirs.contains("/oc/remote.php/dav/sharefolder/"));
  104. QVERIFY(_subdirs.size() == 1);
  105. }
  106. void testParserBrokenXml() {
  107. const QByteArray testXml = "X<?xml version='1.0' encoding='utf-8'?>"
  108. "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
  109. "<d:response>"
  110. "<d:href>/oc/remote.php/dav/sharefolder/</d:href>"
  111. "<d:propstat>"
  112. "<d:prop>"
  113. "<oc:id>00004213ocobzus5kn6s</oc:id>"
  114. "<oc:permissions>RDNVCK</oc:permissions>"
  115. "<oc:size>121780</oc:size>"
  116. "<d:getetag>\"5527beb0400b0\"</d:getetag>"
  117. "<d:resourcetype>"
  118. "<d:collection/>"
  119. "</d:resourcetype>"
  120. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  121. "</d:prop>"
  122. "<d:status>HTTP/1.1 200 OK</d:status>"
  123. "</d:propstat>"
  124. "<d:propstat>"
  125. "<d:prop>"
  126. "<d:getcontentlength/>"
  127. "<oc:downloadURL/>"
  128. "<oc:dDC/>"
  129. "</d:prop>"
  130. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  131. "</d:propstat>"
  132. "</d:response>"
  133. "<d:response>"
  134. "<d:href>/oc/remote.php/dav/sharefolder/quitte.pdf</d:href>"
  135. "<d:propstat>"
  136. "<d:prop>"
  137. "<oc:id>00004215ocobzus5kn6s</oc:id>"
  138. "<oc:permissions>RDNVW</oc:permissions>"
  139. "<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
  140. "<d:resourcetype/>"
  141. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  142. "<d:getcontentlength>121780</d:getcontentlength>"
  143. "</d:prop>"
  144. "<d:status>HTTP/1.1 200 OK</d:status>"
  145. "</d:propstat>"
  146. "<d:propstat>"
  147. "<d:prop>"
  148. "<oc:downloadURL/>"
  149. "<oc:dDC/>"
  150. "</d:prop>"
  151. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  152. "</d:propstat>"
  153. "</d:response>"
  154. "</d:multistatus>";
  155. LsColXMLParser parser;
  156. connect( &parser, &LsColXMLParser::directoryListingSubfolders,
  157. this, &TestXmlParse::slotDirectoryListingSubFolders );
  158. connect( &parser, &LsColXMLParser::directoryListingIterated,
  159. this, &TestXmlParse::slotDirectoryListingIterated );
  160. connect( &parser, &LsColXMLParser::finishedWithoutError,
  161. this, &TestXmlParse::slotFinishedSuccessfully );
  162. QHash <QString, ExtraFolderInfo> sizes;
  163. QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/dav/sharefolder" )); // verify false
  164. QVERIFY(!_success);
  165. QVERIFY(sizes.size() == 0 ); // No quota info in the XML
  166. QVERIFY(_items.size() == 0 ); // FIXME: We should change the parser to not emit during parsing but at the end
  167. QVERIFY(_subdirs.size() == 0);
  168. }
  169. void testParserEmptyXmlNoDav() {
  170. const QByteArray testXml = "<html><body>I am under construction</body></html>";
  171. LsColXMLParser parser;
  172. connect( &parser, &LsColXMLParser::directoryListingSubfolders,
  173. this, &TestXmlParse::slotDirectoryListingSubFolders );
  174. connect( &parser, &LsColXMLParser::directoryListingIterated,
  175. this, &TestXmlParse::slotDirectoryListingIterated );
  176. connect( &parser, &LsColXMLParser::finishedWithoutError,
  177. this, &TestXmlParse::slotFinishedSuccessfully );
  178. QHash <QString, ExtraFolderInfo> sizes;
  179. QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/dav/sharefolder" )); // verify false
  180. QVERIFY(!_success);
  181. QVERIFY(sizes.size() == 0 ); // No quota info in the XML
  182. QVERIFY(_items.size() == 0 ); // FIXME: We should change the parser to not emit during parsing but at the end
  183. QVERIFY(_subdirs.size() == 0);
  184. }
  185. void testParserEmptyXml() {
  186. const QByteArray testXml = "";
  187. LsColXMLParser parser;
  188. connect( &parser, &LsColXMLParser::directoryListingSubfolders,
  189. this, &TestXmlParse::slotDirectoryListingSubFolders );
  190. connect( &parser, &LsColXMLParser::directoryListingIterated,
  191. this, &TestXmlParse::slotDirectoryListingIterated );
  192. connect( &parser, &LsColXMLParser::finishedWithoutError,
  193. this, &TestXmlParse::slotFinishedSuccessfully );
  194. QHash <QString, ExtraFolderInfo> sizes;
  195. QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/dav/sharefolder" )); // verify false
  196. QVERIFY(!_success);
  197. QVERIFY(sizes.size() == 0 ); // No quota info in the XML
  198. QVERIFY(_items.size() == 0 ); // FIXME: We should change the parser to not emit during parsing but at the end
  199. QVERIFY(_subdirs.size() == 0);
  200. }
  201. void testParserTruncatedXml() {
  202. const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
  203. "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
  204. "<d:response>"
  205. "<d:href>/oc/remote.php/dav/sharefolder/</d:href>"
  206. "<d:propstat>"
  207. "<d:prop>"
  208. "<oc:id>00004213ocobzus5kn6s</oc:id>"
  209. "<oc:permissions>RDNVCK</oc:permissions>"
  210. "<oc:size>121780</oc:size>"
  211. "<d:getetag>\"5527beb0400b0\"</d:getetag>"
  212. "<d:resourcetype>"
  213. "<d:collection/>"
  214. "</d:resourcetype>"
  215. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  216. "</d:prop>"
  217. "<d:status>HTTP/1.1 200 OK</d:status>"
  218. "</d:propstat>"; // no proper end here
  219. LsColXMLParser parser;
  220. connect( &parser, &LsColXMLParser::directoryListingSubfolders,
  221. this, &TestXmlParse::slotDirectoryListingSubFolders );
  222. connect( &parser, &LsColXMLParser::directoryListingIterated,
  223. this, &TestXmlParse::slotDirectoryListingIterated );
  224. connect( &parser, &LsColXMLParser::finishedWithoutError,
  225. this, &TestXmlParse::slotFinishedSuccessfully );
  226. QHash <QString, ExtraFolderInfo> sizes;
  227. QVERIFY(!parser.parse( testXml, &sizes, "/oc/remote.php/dav/sharefolder" ));
  228. QVERIFY(!_success);
  229. }
  230. void testParserBogfusHref1() {
  231. const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
  232. "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
  233. "<d:response>"
  234. "<d:href>http://127.0.0.1:81/oc/remote.php/dav/sharefolder/</d:href>"
  235. "<d:propstat>"
  236. "<d:prop>"
  237. "<oc:id>00004213ocobzus5kn6s</oc:id>"
  238. "<oc:permissions>RDNVCK</oc:permissions>"
  239. "<oc:size>121780</oc:size>"
  240. "<d:getetag>\"5527beb0400b0\"</d:getetag>"
  241. "<d:resourcetype>"
  242. "<d:collection/>"
  243. "</d:resourcetype>"
  244. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  245. "</d:prop>"
  246. "<d:status>HTTP/1.1 200 OK</d:status>"
  247. "</d:propstat>"
  248. "<d:propstat>"
  249. "<d:prop>"
  250. "<d:getcontentlength/>"
  251. "<oc:downloadURL/>"
  252. "<oc:dDC/>"
  253. "</d:prop>"
  254. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  255. "</d:propstat>"
  256. "</d:response>"
  257. "<d:response>"
  258. "<d:href>http://127.0.0.1:81/oc/remote.php/dav/sharefolder/quitte.pdf</d:href>"
  259. "<d:propstat>"
  260. "<d:prop>"
  261. "<oc:id>00004215ocobzus5kn6s</oc:id>"
  262. "<oc:permissions>RDNVW</oc:permissions>"
  263. "<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
  264. "<d:resourcetype/>"
  265. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  266. "<d:getcontentlength>121780</d:getcontentlength>"
  267. "</d:prop>"
  268. "<d:status>HTTP/1.1 200 OK</d:status>"
  269. "</d:propstat>"
  270. "<d:propstat>"
  271. "<d:prop>"
  272. "<oc:downloadURL/>"
  273. "<oc:dDC/>"
  274. "</d:prop>"
  275. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  276. "</d:propstat>"
  277. "</d:response>"
  278. "</d:multistatus>";
  279. LsColXMLParser parser;
  280. connect( &parser, &LsColXMLParser::directoryListingSubfolders,
  281. this, &TestXmlParse::slotDirectoryListingSubFolders );
  282. connect( &parser, &LsColXMLParser::directoryListingIterated,
  283. this, &TestXmlParse::slotDirectoryListingIterated );
  284. connect( &parser, &LsColXMLParser::finishedWithoutError,
  285. this, &TestXmlParse::slotFinishedSuccessfully );
  286. QHash <QString, ExtraFolderInfo> sizes;
  287. QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/dav/sharefolder" ));
  288. QVERIFY(!_success);
  289. }
  290. void testParserBogfusHref2() {
  291. const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
  292. "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
  293. "<d:response>"
  294. "<d:href>/sharefolder</d:href>"
  295. "<d:propstat>"
  296. "<d:prop>"
  297. "<oc:id>00004213ocobzus5kn6s</oc:id>"
  298. "<oc:permissions>RDNVCK</oc:permissions>"
  299. "<oc:size>121780</oc:size>"
  300. "<d:getetag>\"5527beb0400b0\"</d:getetag>"
  301. "<d:resourcetype>"
  302. "<d:collection/>"
  303. "</d:resourcetype>"
  304. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  305. "</d:prop>"
  306. "<d:status>HTTP/1.1 200 OK</d:status>"
  307. "</d:propstat>"
  308. "<d:propstat>"
  309. "<d:prop>"
  310. "<d:getcontentlength/>"
  311. "<oc:downloadURL/>"
  312. "<oc:dDC/>"
  313. "</d:prop>"
  314. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  315. "</d:propstat>"
  316. "</d:response>"
  317. "<d:response>"
  318. "<d:href>/sharefolder/quitte.pdf</d:href>"
  319. "<d:propstat>"
  320. "<d:prop>"
  321. "<oc:id>00004215ocobzus5kn6s</oc:id>"
  322. "<oc:permissions>RDNVW</oc:permissions>"
  323. "<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
  324. "<d:resourcetype/>"
  325. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  326. "<d:getcontentlength>121780</d:getcontentlength>"
  327. "</d:prop>"
  328. "<d:status>HTTP/1.1 200 OK</d:status>"
  329. "</d:propstat>"
  330. "<d:propstat>"
  331. "<d:prop>"
  332. "<oc:downloadURL/>"
  333. "<oc:dDC/>"
  334. "</d:prop>"
  335. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  336. "</d:propstat>"
  337. "</d:response>"
  338. "</d:multistatus>";
  339. LsColXMLParser parser;
  340. connect( &parser, &LsColXMLParser::directoryListingSubfolders,
  341. this, &TestXmlParse::slotDirectoryListingSubFolders );
  342. connect( &parser, &LsColXMLParser::directoryListingIterated,
  343. this, &TestXmlParse::slotDirectoryListingIterated );
  344. connect( &parser, &LsColXMLParser::finishedWithoutError,
  345. this, &TestXmlParse::slotFinishedSuccessfully );
  346. QHash <QString, ExtraFolderInfo> sizes;
  347. QVERIFY(false == parser.parse( testXml, &sizes, "/oc/remote.php/dav/sharefolder" ));
  348. QVERIFY(!_success);
  349. }
  350. void testParserDenormalizedPath() {
  351. const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
  352. "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
  353. "<d:response>"
  354. "<d:href>/oc/remote.php/dav/sharefolder/</d:href>"
  355. "<d:propstat>"
  356. "<d:prop>"
  357. "<oc:id>00004213ocobzus5kn6s</oc:id>"
  358. "<oc:permissions>RDNVCK</oc:permissions>"
  359. "<oc:size>121780</oc:size>"
  360. "<d:getetag>\"5527beb0400b0\"</d:getetag>"
  361. "<d:resourcetype>"
  362. "<d:collection/>"
  363. "</d:resourcetype>"
  364. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  365. "</d:prop>"
  366. "<d:status>HTTP/1.1 200 OK</d:status>"
  367. "</d:propstat>"
  368. "<d:propstat>"
  369. "<d:prop>"
  370. "<d:getcontentlength/>"
  371. "<oc:downloadURL/>"
  372. "<oc:dDC/>"
  373. "</d:prop>"
  374. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  375. "</d:propstat>"
  376. "</d:response>"
  377. "<d:response>"
  378. "<d:href>/oc/remote.php/dav/sharefolder/../sharefolder/quitte.pdf</d:href>"
  379. "<d:propstat>"
  380. "<d:prop>"
  381. "<oc:id>00004215ocobzus5kn6s</oc:id>"
  382. "<oc:permissions>RDNVW</oc:permissions>"
  383. "<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
  384. "<d:resourcetype/>"
  385. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  386. "<d:getcontentlength>121780</d:getcontentlength>"
  387. "</d:prop>"
  388. "<d:status>HTTP/1.1 200 OK</d:status>"
  389. "</d:propstat>"
  390. "<d:propstat>"
  391. "<d:prop>"
  392. "<oc:downloadURL/>"
  393. "<oc:dDC/>"
  394. "</d:prop>"
  395. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  396. "</d:propstat>"
  397. "</d:response>"
  398. "</d:multistatus>";
  399. LsColXMLParser parser;
  400. connect( &parser, &LsColXMLParser::directoryListingSubfolders,
  401. this, &TestXmlParse::slotDirectoryListingSubFolders );
  402. connect( &parser, &LsColXMLParser::directoryListingIterated,
  403. this, &TestXmlParse::slotDirectoryListingIterated );
  404. connect( &parser, &LsColXMLParser::finishedWithoutError,
  405. this, &TestXmlParse::slotFinishedSuccessfully );
  406. QHash <QString, ExtraFolderInfo> sizes;
  407. QVERIFY(parser.parse( testXml, &sizes, "/oc/remote.php/dav/sharefolder" ));
  408. QVERIFY(_success);
  409. QCOMPARE(sizes.size(), 1 ); // Quota info in the XML
  410. QVERIFY(_items.contains("/oc/remote.php/dav/sharefolder/quitte.pdf"));
  411. QVERIFY(_items.contains("/oc/remote.php/dav/sharefolder"));
  412. QVERIFY(_items.size() == 2 );
  413. QVERIFY(_subdirs.contains("/oc/remote.php/dav/sharefolder/"));
  414. QVERIFY(_subdirs.size() == 1);
  415. }
  416. void testParserDenormalizedPathOutsideNamespace() {
  417. const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
  418. "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
  419. "<d:response>"
  420. "<d:href>/oc/remote.php/dav/sharefolder/</d:href>"
  421. "<d:propstat>"
  422. "<d:prop>"
  423. "<oc:id>00004213ocobzus5kn6s</oc:id>"
  424. "<oc:permissions>RDNVCK</oc:permissions>"
  425. "<oc:size>121780</oc:size>"
  426. "<d:getetag>\"5527beb0400b0\"</d:getetag>"
  427. "<d:resourcetype>"
  428. "<d:collection/>"
  429. "</d:resourcetype>"
  430. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  431. "</d:prop>"
  432. "<d:status>HTTP/1.1 200 OK</d:status>"
  433. "</d:propstat>"
  434. "<d:propstat>"
  435. "<d:prop>"
  436. "<d:getcontentlength/>"
  437. "<oc:downloadURL/>"
  438. "<oc:dDC/>"
  439. "</d:prop>"
  440. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  441. "</d:propstat>"
  442. "</d:response>"
  443. "<d:response>"
  444. "<d:href>/oc/remote.php/dav/sharefolder/../quitte.pdf</d:href>"
  445. "<d:propstat>"
  446. "<d:prop>"
  447. "<oc:id>00004215ocobzus5kn6s</oc:id>"
  448. "<oc:permissions>RDNVW</oc:permissions>"
  449. "<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
  450. "<d:resourcetype/>"
  451. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  452. "<d:getcontentlength>121780</d:getcontentlength>"
  453. "</d:prop>"
  454. "<d:status>HTTP/1.1 200 OK</d:status>"
  455. "</d:propstat>"
  456. "<d:propstat>"
  457. "<d:prop>"
  458. "<oc:downloadURL/>"
  459. "<oc:dDC/>"
  460. "</d:prop>"
  461. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  462. "</d:propstat>"
  463. "</d:response>"
  464. "</d:multistatus>";
  465. LsColXMLParser parser;
  466. connect( &parser, &LsColXMLParser::directoryListingSubfolders,
  467. this, &TestXmlParse::slotDirectoryListingSubFolders );
  468. connect( &parser, &LsColXMLParser::directoryListingIterated,
  469. this, &TestXmlParse::slotDirectoryListingIterated );
  470. connect( &parser, &LsColXMLParser::finishedWithoutError,
  471. this, &TestXmlParse::slotFinishedSuccessfully );
  472. QHash <QString, ExtraFolderInfo> sizes;
  473. QVERIFY(!parser.parse( testXml, &sizes, "/oc/remote.php/dav/sharefolder" ));
  474. QVERIFY(!_success);
  475. }
  476. void testHrefUrlEncoding() {
  477. const QByteArray testXml = "<?xml version='1.0' encoding='utf-8'?>"
  478. "<d:multistatus xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\" xmlns:oc=\"http://owncloud.org/ns\">"
  479. "<d:response>"
  480. "<d:href>/%C3%A4</d:href>" // a-umlaut utf8
  481. "<d:propstat>"
  482. "<d:prop>"
  483. "<oc:id>00004213ocobzus5kn6s</oc:id>"
  484. "<oc:permissions>RDNVCK</oc:permissions>"
  485. "<oc:size>121780</oc:size>"
  486. "<d:getetag>\"5527beb0400b0\"</d:getetag>"
  487. "<d:resourcetype>"
  488. "<d:collection/>"
  489. "</d:resourcetype>"
  490. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  491. "</d:prop>"
  492. "<d:status>HTTP/1.1 200 OK</d:status>"
  493. "</d:propstat>"
  494. "<d:propstat>"
  495. "<d:prop>"
  496. "<d:getcontentlength/>"
  497. "<oc:downloadURL/>"
  498. "<oc:dDC/>"
  499. "</d:prop>"
  500. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  501. "</d:propstat>"
  502. "</d:response>"
  503. "<d:response>"
  504. "<d:href>/%C3%A4/%C3%A4.pdf</d:href>"
  505. "<d:propstat>"
  506. "<d:prop>"
  507. "<oc:id>00004215ocobzus5kn6s</oc:id>"
  508. "<oc:permissions>RDNVW</oc:permissions>"
  509. "<d:getetag>\"2fa2f0d9ed49ea0c3e409d49e652dea0\"</d:getetag>"
  510. "<d:resourcetype/>"
  511. "<d:getlastmodified>Fri, 06 Feb 2015 13:49:55 GMT</d:getlastmodified>"
  512. "<d:getcontentlength>121780</d:getcontentlength>"
  513. "</d:prop>"
  514. "<d:status>HTTP/1.1 200 OK</d:status>"
  515. "</d:propstat>"
  516. "<d:propstat>"
  517. "<d:prop>"
  518. "<oc:downloadURL/>"
  519. "<oc:dDC/>"
  520. "</d:prop>"
  521. "<d:status>HTTP/1.1 404 Not Found</d:status>"
  522. "</d:propstat>"
  523. "</d:response>"
  524. "</d:multistatus>";
  525. LsColXMLParser parser;
  526. connect( &parser, &LsColXMLParser::directoryListingSubfolders,
  527. this, &TestXmlParse::slotDirectoryListingSubFolders );
  528. connect( &parser, &LsColXMLParser::directoryListingIterated,
  529. this, &TestXmlParse::slotDirectoryListingIterated );
  530. connect( &parser, &LsColXMLParser::finishedWithoutError,
  531. this, &TestXmlParse::slotFinishedSuccessfully );
  532. QHash <QString, ExtraFolderInfo> sizes;
  533. QVERIFY(parser.parse( testXml, &sizes, QString::fromUtf8("/ä") ));
  534. QVERIFY(_success);
  535. QVERIFY(_items.contains(QString::fromUtf8("/ä/ä.pdf")));
  536. QVERIFY(_items.contains(QString::fromUtf8("/ä")));
  537. QVERIFY(_items.size() == 2 );
  538. QVERIFY(_subdirs.contains(QString::fromUtf8("/ä")));
  539. QVERIFY(_subdirs.size() == 1);
  540. }
  541. };
  542. QTEST_GUILESS_MAIN(TestXmlParse)
  543. #include "testxmlparse.moc"