7#include <QMimeDatabase>
9#include <QTemporaryFile>
13#include "wayland/datasource.h"
17#include "KWayland/Client/connection_thread.h"
18#include "KWayland/Client/datadevicemanager.h"
19#include "KWayland/Client/datasource.h"
20#include "KWayland/Client/event_queue.h"
21#include "KWayland/Client/registry.h"
24#include <wayland-client.h>
34 void testTargetAccepts_data();
35 void testTargetAccepts();
36 void testRequestSend();
43 KWayland::Client::ConnectionThread *m_connection =
nullptr;
44 KWayland::Client::DataDeviceManager *m_dataDeviceManager =
nullptr;
45 KWayland::Client::EventQueue *m_queue =
nullptr;
46 QThread *m_thread =
nullptr;
49static const QString s_socketName = QStringLiteral(
"kwayland-test-wayland-datasource-0");
51void TestDataSource::init()
61 m_connection =
new KWayland::Client::ConnectionThread;
62 QSignalSpy connectedSpy(m_connection, &KWayland::Client::ConnectionThread::connected);
63 m_connection->setSocketName(s_socketName);
65 m_thread =
new QThread(
this);
66 m_connection->moveToThread(m_thread);
69 m_connection->initConnection();
70 QVERIFY(connectedSpy.wait());
72 m_queue =
new KWayland::Client::EventQueue(
this);
73 QVERIFY(!m_queue->isValid());
74 m_queue->setup(m_connection);
75 QVERIFY(m_queue->isValid());
77 KWayland::Client::Registry registry;
78 QSignalSpy dataDeviceManagerSpy(®istry, &KWayland::Client::Registry::dataDeviceManagerAnnounced);
79 QVERIFY(!registry.eventQueue());
80 registry.setEventQueue(m_queue);
81 QCOMPARE(registry.eventQueue(), m_queue);
82 registry.create(m_connection->display());
83 QVERIFY(registry.isValid());
88 QVERIFY(dataDeviceManagerSpy.wait());
90 registry.createDataDeviceManager(dataDeviceManagerSpy.first().first().value<quint32>(), dataDeviceManagerSpy.first().last().value<quint32>(),
this);
93void TestDataSource::cleanup()
95 if (m_dataDeviceManager) {
96 delete m_dataDeviceManager;
97 m_dataDeviceManager =
nullptr;
110 m_connection =
nullptr;
116void TestDataSource::testOffer()
118 using namespace KWin;
120 qRegisterMetaType<KWin::DataSourceInterface *>();
123 std::unique_ptr<KWayland::Client::DataSource> dataSource(m_dataDeviceManager->createDataSource());
124 QVERIFY(dataSource->isValid());
126 QVERIFY(dataSourceCreatedSpy.wait());
127 QCOMPARE(dataSourceCreatedSpy.count(), 1);
129 QPointer<DataSourceInterface> serverDataSource = dataSourceCreatedSpy.first().first().value<
DataSourceInterface *>();
130 QVERIFY(!serverDataSource.isNull());
131 QCOMPARE(serverDataSource->mimeTypes().count(), 0);
135 const QString plain = QStringLiteral(
"text/plain");
137 dataSource->offer(db.mimeTypeForName(plain));
139 QVERIFY(offeredSpy.wait());
140 QCOMPARE(offeredSpy.count(), 1);
141 QCOMPARE(offeredSpy.last().first().toString(), plain);
142 QCOMPARE(serverDataSource->mimeTypes().count(), 1);
143 QCOMPARE(serverDataSource->mimeTypes().first(), plain);
145 const QString html = QStringLiteral(
"text/html");
146 dataSource->offer(db.mimeTypeForName(html));
148 QVERIFY(offeredSpy.wait());
149 QCOMPARE(offeredSpy.count(), 2);
150 QCOMPARE(offeredSpy.first().first().toString(), plain);
151 QCOMPARE(offeredSpy.last().first().toString(), html);
152 QCOMPARE(serverDataSource->mimeTypes().count(), 2);
153 QCOMPARE(serverDataSource->mimeTypes().first(), plain);
154 QCOMPARE(serverDataSource->mimeTypes().last(), html);
158 QVERIFY(!serverDataSource.isNull());
159 wl_display_flush(m_connection->display());
160 QCoreApplication::processEvents();
161 QVERIFY(serverDataSource.isNull());
164void TestDataSource::testTargetAccepts_data()
166 QTest::addColumn<QString>(
"mimeType");
168 QTest::newRow(
"empty") << QString();
169 QTest::newRow(
"text/plain") << QStringLiteral(
"text/plain");
172void TestDataSource::testTargetAccepts()
174 using namespace KWin;
178 std::unique_ptr<KWayland::Client::DataSource> dataSource(m_dataDeviceManager->createDataSource());
179 QVERIFY(dataSource->isValid());
181 QSignalSpy targetAcceptsSpy(dataSource.get(), &KWayland::Client::DataSource::targetAccepts);
183 QVERIFY(dataSourceCreatedSpy.wait());
184 QCOMPARE(dataSourceCreatedSpy.count(), 1);
186 QFETCH(QString, mimeType);
189 QVERIFY(targetAcceptsSpy.wait());
190 QCOMPARE(targetAcceptsSpy.count(), 1);
191 QCOMPARE(targetAcceptsSpy.first().first().toString(), mimeType);
194void TestDataSource::testRequestSend()
196 using namespace KWin;
200 std::unique_ptr<KWayland::Client::DataSource> dataSource(m_dataDeviceManager->createDataSource());
201 QVERIFY(dataSource->isValid());
202 QSignalSpy sendRequestedSpy(dataSource.get(), &KWayland::Client::DataSource::sendDataRequested);
204 const QString plain = QStringLiteral(
"text/plain");
205 QVERIFY(dataSourceCreatedSpy.wait());
206 QCOMPARE(dataSourceCreatedSpy.count(), 1);
208 QVERIFY(file.open());
211 QVERIFY(sendRequestedSpy.wait());
212 QCOMPARE(sendRequestedSpy.count(), 1);
213 QCOMPARE(sendRequestedSpy.first().first().toString(), plain);
214 QCOMPARE(sendRequestedSpy.first().last().value<qint32>(), file.handle());
215 QVERIFY(sendRequestedSpy.first().last().value<qint32>() != -1);
218 QVERIFY(writeFile.open(sendRequestedSpy.first().last().value<qint32>(), QFile::WriteOnly, QFileDevice::AutoCloseHandle));
222void TestDataSource::testCancel()
224 using namespace KWin;
228 std::unique_ptr<KWayland::Client::DataSource> dataSource(m_dataDeviceManager->createDataSource());
229 QVERIFY(dataSource->isValid());
230 QSignalSpy cancelledSpy(dataSource.get(), &KWayland::Client::DataSource::cancelled);
232 QVERIFY(dataSourceCreatedSpy.wait());
234 QCOMPARE(cancelledSpy.count(), 0);
237 QVERIFY(cancelledSpy.wait());
238 QCOMPARE(cancelledSpy.count(), 1);
241void TestDataSource::testServerGet()
243 using namespace KWin;
247 std::unique_ptr<KWayland::Client::DataSource> dataSource(m_dataDeviceManager->createDataSource());
248 QVERIFY(dataSource->isValid());
250 QVERIFY(!DataSourceInterface::get(
nullptr));
251 QVERIFY(dataSourceCreatedSpy.wait());
254 QCOMPARE(DataSourceInterface::get(d->resource()), d);
255 QVERIFY(!DataSourceInterface::get(
nullptr));
259#include "test_datasource.moc"
void mimeTypeOffered(const QString &)
virtual void accept(const QString &mimeType)
Represents the Global for wl_data_device_manager interface.
void dataSourceCreated(KWin::DataSourceInterface *)
Represents the Resource for the wl_data_source interface.
Class holding the Wayland server display loop.
bool addSocketName(const QString &name=QString())
void requestData(const QString &mimeType, qint32 fd) override