blob: e66f44437b69a77287a8bf4235628ef3953ce6ac (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
#include <QtTest>
#include "dummyresource/resourcefactory.h"
#include "resourcecontrol.h"
#include "store.h"
#include "testutils.h"
#include "test.h"
#include "resourceconfig.h"
/**
* Test starting and stopping of resources.
*/
class ResourceControlTest : public QObject
{
Q_OBJECT
KAsync::Job<bool> socketIsAvailable(const QByteArray &identifier)
{
return Sink::ResourceAccess::connectToServer(identifier)
.then<void, QSharedPointer<QLocalSocket>>(
[&](const KAsync::Error &error, QSharedPointer<QLocalSocket> socket) {
if (error) {
return KAsync::value(false);
}
socket->close();
return KAsync::value(true);
});
}
bool blockingSocketIsAvailable(const QByteArray &identifier)
{
auto job = socketIsAvailable(identifier);
auto future = job.exec();
future.waitForFinished();
return future.value();
}
private slots:
void initTestCase()
{
Sink::Test::initTest();
auto factory = Sink::ResourceFactory::load("sink.dummy");
QVERIFY(factory);
::DummyResource::removeFromDisk("sink.dummy.instance1");
ResourceConfig::addResource("sink.dummy.instance1", "sink.dummy");
::DummyResource::removeFromDisk("sink.dummy.instance2");
ResourceConfig::addResource("sink.dummy.instance2", "sink.dummy");
}
void testResourceStart()
{
VERIFYEXEC(Sink::ResourceControl::start("sink.dummy.instance1"));
QVERIFY(blockingSocketIsAvailable("sink.dummy.instance1"));
}
void testResourceShutdown()
{
QVERIFY(!blockingSocketIsAvailable("sink.dummy.instance2"));
VERIFYEXEC(Sink::ResourceControl::start("sink.dummy.instance2"));
QVERIFY(blockingSocketIsAvailable("sink.dummy.instance2"));
VERIFYEXEC(Sink::ResourceControl::shutdown("sink.dummy.instance2"));
QVERIFY(!blockingSocketIsAvailable("sink.dummy.instance2"));
}
//This will produce a race where the synchronize command starts the resource,
//the shutdown command doesn't shutdown because it doesn't realize that the resource is up,
//and the resource ends up getting started, but doing nothing.
void testResourceShutdownAfterStartByCommand()
{
QVERIFY(!blockingSocketIsAvailable("sink.dummy.instance2"));
auto future = Sink::Store::synchronize(Sink::SyncScope{}.resourceFilter("sink.dummy.instance2")).exec();
VERIFYEXEC(Sink::ResourceControl::shutdown("sink.dummy.instance2"));
QVERIFY(!blockingSocketIsAvailable("sink.dummy.instance2"));
}
};
QTEST_MAIN(ResourceControlTest)
#include "resourcecontroltest.moc"
|