File indexing completed on 2024-05-12 04:39:06
0001 /* 0002 This file was partly taken from KDevelop's cvs plugin 0003 SPDX-FileCopyrightText: 2007 Robert Gruber <rgruber@users.sourceforge.net> 0004 0005 Adapted for Git 0006 SPDX-FileCopyrightText: 2008 Evgeniy Ivanov <powerfox@kde.ru> 0007 0008 Adapted for Bazaar 0009 SPDX-FileCopyrightText: 2014 Maciej Poleski 0010 0011 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0012 */ 0013 0014 #include "test_bazaar.h" 0015 0016 #include <tests/testcore.h> 0017 #include <tests/autotestshell.h> 0018 #include <QDir> 0019 #include <QFileInfo> 0020 #include <QUrl> 0021 #include <QDebug> 0022 0023 #include <KIO/DeleteJob> 0024 0025 #include <vcs/dvcs/dvcsjob.h> 0026 #include <vcs/vcsannotation.h> 0027 #include "../bazaarplugin.h" 0028 0029 #include <QTest> 0030 0031 #define VERIFYJOB(j) \ 0032 do { QVERIFY(j); QVERIFY(j->exec()); QVERIFY((j)->status() == KDevelop::VcsJob::JobSucceeded); } while(0) 0033 0034 using namespace KDevelop; 0035 0036 TestBazaar::TestBazaar() 0037 : tempDir{QDir::tempPath()} 0038 , bazaarTest_BaseDir{tempDir + QLatin1String("/kdevBazaar_testdir/")} 0039 , bazaarRepo{bazaarTest_BaseDir + QLatin1String(".bzr")} 0040 , bazaarSrcDir{bazaarTest_BaseDir + QLatin1String("src/")} 0041 , bazaarTest_FileName{QStringLiteral("testfile")} 0042 , bazaarTest_FileName2{QStringLiteral("foo")} 0043 , bazaarTest_FileName3{QStringLiteral("bar")} 0044 { 0045 } 0046 0047 void TestBazaar::initTestCase() 0048 { 0049 AutoTestShell::init({QStringLiteral("kdevbazaar")}); 0050 TestCore::initialize(Core::NoUi); 0051 0052 m_plugin = new BazaarPlugin(TestCore::self()); 0053 } 0054 0055 void TestBazaar::cleanupTestCase() 0056 { 0057 delete m_plugin; 0058 0059 TestCore::shutdown(); 0060 } 0061 0062 void TestBazaar::init() 0063 { 0064 // Now create the basic directory structure 0065 QDir tmpdir(tempDir); 0066 tmpdir.mkdir(bazaarTest_BaseDir); 0067 tmpdir.mkdir(bazaarSrcDir); 0068 } 0069 0070 void TestBazaar::cleanup() 0071 { 0072 removeTempDirs(); 0073 } 0074 0075 void TestBazaar::repoInit() 0076 { 0077 qDebug() << "Trying to init repo"; 0078 // make job that creates the local repository 0079 VcsJob* j = m_plugin->init(QUrl::fromLocalFile(bazaarTest_BaseDir)); 0080 VERIFYJOB(j); 0081 0082 //check if the .bzr directory in the new local repository exists now 0083 QVERIFY(QFileInfo::exists(bazaarRepo)); 0084 } 0085 0086 void TestBazaar::addFiles() 0087 { 0088 qDebug() << "Adding files to the repo"; 0089 0090 //we start it after repoInit, so we still have empty bazaar repo 0091 QFile f(bazaarTest_BaseDir + bazaarTest_FileName); 0092 0093 if (f.open(QIODevice::WriteOnly)) { 0094 QTextStream input(&f); 0095 input << "HELLO WORLD"; 0096 } 0097 0098 f.close(); 0099 f.setFileName(bazaarTest_BaseDir + bazaarTest_FileName2); 0100 0101 if (f.open(QIODevice::WriteOnly)) { 0102 QTextStream input(&f); 0103 input << "No, bar()!"; 0104 } 0105 0106 f.close(); 0107 0108 //test bzr-status exitCode (see DVcsJob::setExitCode). 0109 VcsJob* j = m_plugin->status(QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir)); 0110 VERIFYJOB(j); 0111 0112 // /tmp/kdevBazaar_testdir/ and testfile 0113 j = m_plugin->add(QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir + bazaarTest_FileName)); 0114 VERIFYJOB(j); 0115 0116 f.setFileName(bazaarSrcDir + bazaarTest_FileName3); 0117 0118 if (f.open(QIODevice::WriteOnly)) { 0119 QTextStream input(&f); 0120 input << "No, foo()! It's bar()!"; 0121 } 0122 0123 f.close(); 0124 0125 //test bzr-status exitCode again 0126 j = m_plugin->status(QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir)); 0127 VERIFYJOB(j); 0128 0129 //repository path without trailing slash and a file in a parent directory 0130 // /tmp/repo and /tmp/repo/src/bar 0131 j = m_plugin->add(QList<QUrl>() << QUrl::fromLocalFile(bazaarSrcDir + bazaarTest_FileName3)); 0132 VERIFYJOB(j); 0133 0134 //let's use absolute path, because it's used in ContextMenus 0135 j = m_plugin->add(QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir + bazaarTest_FileName2)); 0136 VERIFYJOB(j); 0137 0138 //Now let's create several files and try "bzr add file1 file2 file3" 0139 const QStringList files{QStringLiteral("file1"), QStringLiteral("file2"), QStringLiteral("la la")}; 0140 QList<QUrl> multipleFiles; 0141 for (const QString& file : files) { 0142 QFile f(bazaarTest_BaseDir + file); 0143 QVERIFY(f.open(QIODevice::WriteOnly)); 0144 QTextStream input(&f); 0145 input << file; 0146 f.close(); 0147 multipleFiles << QUrl::fromLocalFile(bazaarTest_BaseDir + file); 0148 } 0149 j = m_plugin->add(multipleFiles); 0150 VERIFYJOB(j); 0151 } 0152 0153 void TestBazaar::prepareWhoamiInformations() 0154 { 0155 auto* whoamiJob = new DVcsJob(bazaarTest_BaseDir, m_plugin); 0156 *whoamiJob<<"bzr"<<"whoami"<<"--branch"<<"kdevbazaar-test identity <>"; 0157 VERIFYJOB(whoamiJob); 0158 } 0159 0160 void TestBazaar::commitFiles() 0161 { 0162 prepareWhoamiInformations(); 0163 qDebug() << "Committing..."; 0164 //we start it after addFiles, so we just have to commit 0165 VcsJob* j = m_plugin->commit(QStringLiteral("Test commit"), QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir)); 0166 VERIFYJOB(j); 0167 0168 //test bzr-status exitCode one more time. 0169 j = m_plugin->status(QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir)); 0170 VERIFYJOB(j); 0171 0172 //since we committed the file to the "pure" repository, .bzr/repository/indices should exist 0173 //TODO: maybe other method should be used 0174 QString headRefName(bazaarRepo + "/repository/indices"); 0175 QVERIFY(QFileInfo::exists(headRefName)); 0176 0177 //Test the results of the "bzr add" 0178 auto* jobLs = new DVcsJob(bazaarTest_BaseDir, m_plugin); 0179 *jobLs << "bzr" << "ls" << "-R"; 0180 0181 if (jobLs->exec() && jobLs->status() == KDevelop::VcsJob::JobSucceeded) { 0182 QStringList files = jobLs->output().split('\n'); 0183 QVERIFY(files.contains(bazaarTest_FileName)); 0184 QVERIFY(files.contains(bazaarTest_FileName2)); 0185 QVERIFY(files.contains("src/" + bazaarTest_FileName3)); 0186 } 0187 0188 qDebug() << "Committing one more time"; 0189 //let's try to change the file and test "bzr commit" 0190 QFile f(bazaarTest_BaseDir + bazaarTest_FileName); 0191 0192 if (f.open(QIODevice::WriteOnly)) { 0193 QTextStream input(&f); 0194 input << "Just another HELLO WORLD\n"; 0195 } 0196 0197 f.close(); 0198 0199 //add changes 0200 j = m_plugin->add(QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir + bazaarTest_FileName)); 0201 VERIFYJOB(j); 0202 0203 j = m_plugin->commit(QStringLiteral("KDevelop's Test commit2"), QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir)); 0204 VERIFYJOB(j); 0205 } 0206 0207 void TestBazaar::testInit() 0208 { 0209 repoInit(); 0210 } 0211 0212 void TestBazaar::testAdd() 0213 { 0214 repoInit(); 0215 addFiles(); 0216 } 0217 0218 void TestBazaar::testCommit() 0219 { 0220 repoInit(); 0221 addFiles(); 0222 commitFiles(); 0223 } 0224 0225 void TestBazaar::testAnnotation() 0226 { 0227 repoInit(); 0228 addFiles(); 0229 commitFiles(); 0230 0231 // called after commitFiles 0232 QFile f(bazaarTest_BaseDir + bazaarTest_FileName); 0233 QVERIFY(f.open(QIODevice::Append)); 0234 QTextStream input(&f); 0235 input << "An appended line"; 0236 f.close(); 0237 0238 VcsJob* j = m_plugin->commit(QStringLiteral("KDevelop's Test commit3"), QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir)); 0239 VERIFYJOB(j); 0240 0241 j = m_plugin->annotate(QUrl::fromLocalFile(bazaarTest_BaseDir + bazaarTest_FileName), VcsRevision::createSpecialRevision(VcsRevision::Head)); 0242 VERIFYJOB(j); 0243 0244 QList<QVariant> results = j->fetchResults().toList(); 0245 QCOMPARE(results.size(), 2); 0246 QVERIFY(results.at(0).canConvert<VcsAnnotationLine>()); 0247 VcsAnnotationLine annotation = results.at(0).value<VcsAnnotationLine>(); 0248 QCOMPARE(annotation.lineNumber(), 0); 0249 QCOMPARE(annotation.commitMessage(), QStringLiteral("KDevelop's Test commit2")); 0250 0251 QVERIFY(results.at(1).canConvert<VcsAnnotationLine>()); 0252 annotation = results.at(1).value<VcsAnnotationLine>(); 0253 QCOMPARE(annotation.lineNumber(), 1); 0254 QCOMPARE(annotation.commitMessage(), QStringLiteral("KDevelop's Test commit3")); 0255 } 0256 0257 void TestBazaar::testRemoveEmptyFolder() 0258 { 0259 repoInit(); 0260 0261 QDir d(bazaarTest_BaseDir); 0262 d.mkdir(QStringLiteral("emptydir")); 0263 0264 VcsJob* j = m_plugin->remove(QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir+"emptydir/")); 0265 if (j) VERIFYJOB(j); 0266 0267 QVERIFY(!d.exists("emptydir")); 0268 } 0269 0270 void TestBazaar::testRemoveEmptyFolderInFolder() 0271 { 0272 repoInit(); 0273 0274 QDir d(bazaarTest_BaseDir); 0275 d.mkdir(QStringLiteral("dir")); 0276 0277 QDir d2(bazaarTest_BaseDir+"dir"); 0278 d2.mkdir(QStringLiteral("emptydir")); 0279 0280 VcsJob* j = m_plugin->remove(QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir+"dir/")); 0281 if (j) VERIFYJOB(j); 0282 0283 QVERIFY(!d.exists("dir")); 0284 } 0285 0286 void TestBazaar::testRemoveUnindexedFile() 0287 { 0288 repoInit(); 0289 0290 QFile f(bazaarTest_BaseDir + bazaarTest_FileName); 0291 QVERIFY(f.open(QIODevice::Append)); 0292 QTextStream input(&f); 0293 input << "An appended line"; 0294 f.close(); 0295 0296 VcsJob* j = m_plugin->remove(QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir + bazaarTest_FileName)); 0297 if (j) VERIFYJOB(j); 0298 0299 QVERIFY(!QFile::exists(bazaarTest_BaseDir + bazaarTest_FileName)); 0300 } 0301 0302 void TestBazaar::testRemoveFolderContainingUnversionedFiles() 0303 { 0304 repoInit(); 0305 0306 QDir d(bazaarTest_BaseDir); 0307 d.mkdir(QStringLiteral("dir")); 0308 0309 { 0310 QFile f(bazaarTest_BaseDir + "dir/foo"); 0311 QVERIFY(f.open(QIODevice::Append)); 0312 QTextStream input(&f); 0313 input << "An appended line"; 0314 f.close(); 0315 } 0316 VcsJob* j = m_plugin->add(QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir+"dir"), IBasicVersionControl::NonRecursive); 0317 VERIFYJOB(j); 0318 prepareWhoamiInformations(); 0319 j = m_plugin->commit(QStringLiteral("initial commit"), QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir)); 0320 VERIFYJOB(j); 0321 0322 { 0323 QFile f(bazaarTest_BaseDir + "dir/bar"); 0324 QVERIFY(f.open(QIODevice::Append)); 0325 QTextStream input(&f); 0326 input << "An appended line"; 0327 f.close(); 0328 } 0329 0330 j = m_plugin->remove(QList<QUrl>() << QUrl::fromLocalFile(bazaarTest_BaseDir + "dir")); 0331 if (j) VERIFYJOB(j); 0332 0333 QVERIFY(!QFile::exists(bazaarTest_BaseDir + "dir")); 0334 0335 } 0336 0337 0338 void TestBazaar::removeTempDirs() 0339 { 0340 if (QFileInfo::exists(bazaarTest_BaseDir)) 0341 if (!(KIO::del(QUrl::fromLocalFile(bazaarTest_BaseDir))->exec())) 0342 qDebug() << "KIO::del(" << bazaarTest_BaseDir << ") returned false"; 0343 } 0344 0345 QTEST_MAIN(TestBazaar) 0346 0347 #include "moc_test_bazaar.cpp"