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"