Files
Курнат Андрей 2315f25754 Initial QSfera import
2026-06-07 10:20:04 +03:00

135 lines
3.7 KiB
C++

/*
* 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 "jobqueue.h"
#include "abstractnetworkjob.h"
#include "account.h"
#include "testutils/syncenginetestutils.h"
#include <QTest>
using namespace OCC;
class TestJob : public AbstractNetworkJob
{
// AbstractNetworkJob interface
public:
// TODO: davurl
TestJob(AccountPtr account)
: AbstractNetworkJob(account, OCC::TestUtils::dummyDavUrl(), QStringLiteral("/A/a1"))
{
}
void start() override
{
QNetworkRequest req;
req.setRawHeader("Depth", "0");
QByteArray xml("<?xml version=\"1.0\" ?>\n"
"<d:propfind xmlns:d=\"DAV:\">\n"
" <d:prop>\n"
" <d:getetag/>\n"
" </d:prop>\n"
"</d:propfind>\n");
auto buf = std::make_unique<QBuffer>();
buf->setData(xml);
buf->open(QIODevice::ReadOnly);
// assumes ownership
sendRequest("PROPFIND", req, std::move(buf));
AbstractNetworkJob::start();
}
protected:
void finished() override
{
}
};
class TestJobQueue : public QObject
{
Q_OBJECT
private Q_SLOTS:
void testQueue()
{
FakeFolder fakeFolder { FileInfo::A12_B12_C12_S12() };
auto queue = fakeFolder.account()->jobQueue();
JobQueueGuard queueGuard(queue);
QVERIFY(!queue->isBlocked());
TestJob *job = new TestJob(fakeFolder.account());
QVERIFY(!queue->enqueue(job));
QCOMPARE(queue->size(), 0);
QVERIFY(queueGuard.block());
QVERIFY(queue->isBlocked());
job->start();
QCOMPARE(queue->size(), 1);
QVERIFY(queueGuard.unblock());
QVERIFY(!queue->isBlocked());
QCOMPARE(queue->size(), 0);
QCOMPARE(job->retryCount(), 1);
QVERIFY(!queueGuard.unblock());
QVERIFY(!queue->isBlocked());
}
void testMultiBlock()
{
FakeFolder fakeFolder { FileInfo::A12_B12_C12_S12() };
auto queue = fakeFolder.account()->jobQueue();
JobQueueGuard queueGuard(queue);
TestJob *job = new TestJob(fakeFolder.account());
QVERIFY(!queue->enqueue(job));
QCOMPARE(queue->size(), 0);
QVERIFY(queueGuard.block());
QVERIFY(!queueGuard.block());
job->start();
QCOMPARE(queue->size(), 1);
QVERIFY(queueGuard.unblock());
QCOMPARE(queue->size(), 0);
QVERIFY(!queueGuard.unblock());
QCOMPARE(job->retryCount(), 1);
}
void testMultiBlock2()
{
FakeFolder fakeFolder { FileInfo::A12_B12_C12_S12() };
auto queue = fakeFolder.account()->jobQueue();
JobQueueGuard queueGuard1(queue);
TestJob *job = new TestJob(fakeFolder.account());
{
JobQueueGuard queueGuard2(queue);
QVERIFY(!queue->enqueue(job));
QCOMPARE(queue->size(), 0);
QVERIFY(queueGuard1.block());
QVERIFY(queueGuard2.block());
job->start();
QVERIFY(queue->isBlocked());
QCOMPARE(queue->size(), 1);
QVERIFY(queueGuard1.unblock());
QVERIFY(queue->isBlocked());
QCOMPARE(queue->size(), 1);
QVERIFY(queueGuard2.unblock());
QVERIFY(!queue->isBlocked());
QCOMPARE(queue->size(), 0);
QCOMPARE(job->retryCount(), 1);
QVERIFY(queueGuard2.block());
QVERIFY(queue->isBlocked());
}
QVERIFY(!queue->isBlocked());
}
};
QTEST_GUILESS_MAIN(TestJobQueue)
#include "testjobqueue.moc"