testutility.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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 <QTemporaryDir>
  8. #include "common/utility.h"
  9. using namespace OCC::Utility;
  10. namespace OCC {
  11. OCSYNC_EXPORT extern bool fsCasePreserving_override;
  12. }
  13. class TestUtility : public QObject
  14. {
  15. Q_OBJECT
  16. private slots:
  17. void testFormatFingerprint()
  18. {
  19. QVERIFY2(formatFingerprint("68ac906495480a3404beee4874ed853a037a7a8f")
  20. == "68:ac:90:64:95:48:0a:34:04:be:ee:48:74:ed:85:3a:03:7a:7a:8f",
  21. "Utility::formatFingerprint() is broken");
  22. }
  23. void testOctetsToString()
  24. {
  25. QLocale::setDefault(QLocale("en"));
  26. QCOMPARE(octetsToString(999) , QString("999 B"));
  27. QCOMPARE(octetsToString(1024) , QString("1 KB"));
  28. QCOMPARE(octetsToString(1364) , QString("1 KB"));
  29. QCOMPARE(octetsToString(9110) , QString("9 KB"));
  30. QCOMPARE(octetsToString(9910) , QString("10 KB"));
  31. QCOMPARE(octetsToString(10240) , QString("10 KB"));
  32. QCOMPARE(octetsToString(123456) , QString("121 KB"));
  33. QCOMPARE(octetsToString(1234567) , QString("1.2 MB"));
  34. QCOMPARE(octetsToString(12345678) , QString("12 MB"));
  35. QCOMPARE(octetsToString(123456789) , QString("118 MB"));
  36. QCOMPARE(octetsToString(1000LL*1000*1000 * 5) , QString("4.7 GB"));
  37. QCOMPARE(octetsToString(1), QString("1 B"));
  38. QCOMPARE(octetsToString(2), QString("2 B"));
  39. QCOMPARE(octetsToString(1024), QString("1 KB"));
  40. QCOMPARE(octetsToString(1024*1024), QString("1 MB"));
  41. QCOMPARE(octetsToString(1024LL*1024*1024), QString("1 GB"));
  42. }
  43. void testLaunchOnStartup()
  44. {
  45. qsrand(QDateTime::currentDateTime().toTime_t());
  46. QString postfix = QString::number(qrand());
  47. const QString appName = QString::fromLatin1("testLaunchOnStartup.%1").arg(postfix);
  48. const QString guiName = "LaunchOnStartup GUI Name";
  49. QVERIFY(hasLaunchOnStartup(appName) == false);
  50. setLaunchOnStartup(appName, guiName, true);
  51. QVERIFY(hasLaunchOnStartup(appName) == true);
  52. setLaunchOnStartup(appName, guiName, false);
  53. QVERIFY(hasLaunchOnStartup(appName) == false);
  54. }
  55. void testDurationToDescriptiveString()
  56. {
  57. QLocale::setDefault(QLocale("C"));
  58. //NOTE: in order for the plural to work we would need to load the english translation
  59. quint64 sec = 1000;
  60. quint64 hour = 3600 * sec;
  61. QDateTime current = QDateTime::currentDateTimeUtc();
  62. QCOMPARE(durationToDescriptiveString2(0), QString("0 second(s)") );
  63. QCOMPARE(durationToDescriptiveString2(5), QString("0 second(s)") );
  64. QCOMPARE(durationToDescriptiveString2(1000), QString("1 second(s)") );
  65. QCOMPARE(durationToDescriptiveString2(1005), QString("1 second(s)") );
  66. QCOMPARE(durationToDescriptiveString2(56123), QString("56 second(s)") );
  67. QCOMPARE(durationToDescriptiveString2(90*sec), QString("1 minute(s) 30 second(s)") );
  68. QCOMPARE(durationToDescriptiveString2(3*hour), QString("3 hour(s)") );
  69. QCOMPARE(durationToDescriptiveString2(3*hour + 20*sec), QString("3 hour(s)") );
  70. QCOMPARE(durationToDescriptiveString2(3*hour + 70*sec), QString("3 hour(s) 1 minute(s)") );
  71. QCOMPARE(durationToDescriptiveString2(3*hour + 100*sec), QString("3 hour(s) 2 minute(s)") );
  72. QCOMPARE(durationToDescriptiveString2(current.msecsTo(current.addYears(4).addMonths(5).addDays(2).addSecs(23*60*60))),
  73. QString("4 year(s) 5 month(s)") );
  74. QCOMPARE(durationToDescriptiveString2(current.msecsTo(current.addDays(2).addSecs(23*60*60))),
  75. QString("2 day(s) 23 hour(s)") );
  76. QCOMPARE(durationToDescriptiveString1(0), QString("0 second(s)") );
  77. QCOMPARE(durationToDescriptiveString1(5), QString("0 second(s)") );
  78. QCOMPARE(durationToDescriptiveString1(1000), QString("1 second(s)") );
  79. QCOMPARE(durationToDescriptiveString1(1005), QString("1 second(s)") );
  80. QCOMPARE(durationToDescriptiveString1(56123), QString("56 second(s)") );
  81. QCOMPARE(durationToDescriptiveString1(90*sec), QString("2 minute(s)") );
  82. QCOMPARE(durationToDescriptiveString1(3*hour), QString("3 hour(s)") );
  83. QCOMPARE(durationToDescriptiveString1(3*hour + 20*sec), QString("3 hour(s)") );
  84. QCOMPARE(durationToDescriptiveString1(3*hour + 70*sec), QString("3 hour(s)") );
  85. QCOMPARE(durationToDescriptiveString1(3*hour + 100*sec), QString("3 hour(s)") );
  86. QCOMPARE(durationToDescriptiveString1(current.msecsTo(current.addYears(4).addMonths(5).addDays(2).addSecs(23*60*60))),
  87. QString("4 year(s)") );
  88. QCOMPARE(durationToDescriptiveString1(current.msecsTo(current.addDays(2).addSecs(23*60*60))),
  89. QString("3 day(s)") );
  90. }
  91. void testVersionOfInstalledBinary()
  92. {
  93. if( isLinux() ) {
  94. if ( qgetenv("DISPLAY").isEmpty() ) {
  95. // Current requires an X-Server
  96. return;
  97. }
  98. // pass the binary name owncloud to the next call. This brakes branding,
  99. // but branding is not supposed to work with this.
  100. QString ver = versionOfInstalledBinary(OWNCLOUD_BIN_PATH+QLatin1String("/nextcloud"));
  101. qDebug() << "Version of installed Nextcloud: " << ver;
  102. QVERIFY( !ver.isEmpty());
  103. QRegExp rx( R"(Nextcloud version \d+\.\d+\.\d+.*)" );
  104. QVERIFY( rx.exactMatch(ver));
  105. } else {
  106. QVERIFY( versionOfInstalledBinary().isEmpty());
  107. }
  108. }
  109. void testTimeAgo()
  110. {
  111. // Both times in same timezone
  112. QDateTime d1 = QDateTime::fromString("2015-01-24T09:20:30+01:00", Qt::ISODate);
  113. QDateTime d2 = QDateTime::fromString("2015-01-23T09:20:30+01:00", Qt::ISODate);
  114. QString s = timeAgoInWords(d2, d1);
  115. QCOMPARE(s, QLatin1String("1 day ago"));
  116. // Different timezones
  117. QDateTime earlyTS = QDateTime::fromString("2015-01-24T09:20:30+01:00", Qt::ISODate);
  118. QDateTime laterTS = QDateTime::fromString("2015-01-24T09:20:30-01:00", Qt::ISODate);
  119. s = timeAgoInWords(earlyTS, laterTS);
  120. QCOMPARE(s, QLatin1String("2 hours ago"));
  121. // 'Now' in whatever timezone
  122. earlyTS = QDateTime::currentDateTime();
  123. laterTS = earlyTS;
  124. s = timeAgoInWords(earlyTS, laterTS );
  125. QCOMPARE(s, QLatin1String("now"));
  126. earlyTS = earlyTS.addSecs(-6);
  127. s = timeAgoInWords(earlyTS, laterTS );
  128. QCOMPARE(s, QLatin1String("Less than a minute ago"));
  129. }
  130. void testFsCasePreserving()
  131. {
  132. QVERIFY(isMac() || isWindows() ? fsCasePreserving() : ! fsCasePreserving());
  133. QScopedValueRollback<bool> scope(OCC::fsCasePreserving_override);
  134. OCC::fsCasePreserving_override = true;
  135. QVERIFY(fsCasePreserving());
  136. OCC::fsCasePreserving_override = false;
  137. QVERIFY(! fsCasePreserving());
  138. }
  139. void testFileNamesEqual()
  140. {
  141. QTemporaryDir dir;
  142. QVERIFY(dir.isValid());
  143. QDir dir2(dir.path());
  144. QVERIFY(dir2.mkpath("test"));
  145. if( !fsCasePreserving() ) {
  146. QVERIFY(dir2.mkpath("TEST"));
  147. }
  148. QVERIFY(dir2.mkpath("test/TESTI"));
  149. QVERIFY(dir2.mkpath("TESTI"));
  150. QString a = dir.path();
  151. QString b = dir.path();
  152. QVERIFY(fileNamesEqual(a, b));
  153. QVERIFY(fileNamesEqual(a+"/test", b+"/test")); // both exist
  154. QVERIFY(fileNamesEqual(a+"/test/TESTI", b+"/test/../test/TESTI")); // both exist
  155. QScopedValueRollback<bool> scope(OCC::fsCasePreserving_override, true);
  156. QVERIFY(fileNamesEqual(a+"/test", b+"/TEST")); // both exist
  157. QVERIFY(!fileNamesEqual(a+"/test", b+"/test/TESTI")); // both are different
  158. dir.remove();
  159. }
  160. void testSanitizeForFileName_data()
  161. {
  162. QTest::addColumn<QString>("input");
  163. QTest::addColumn<QString>("output");
  164. QTest::newRow("")
  165. << "foobar"
  166. << "foobar";
  167. QTest::newRow("")
  168. << "a/b?c<d>e\\f:g*h|i\"j"
  169. << "abcdefghij";
  170. QTest::newRow("")
  171. << QString::fromLatin1("a\x01 b\x1f c\x80 d\x9f")
  172. << "a b c d";
  173. }
  174. void testSanitizeForFileName()
  175. {
  176. QFETCH(QString, input);
  177. QFETCH(QString, output);
  178. QCOMPARE(sanitizeForFileName(input), output);
  179. }
  180. };
  181. QTEST_GUILESS_MAIN(TestUtility)
  182. #include "testutility.moc"