on xenial help sign in
Fix window state storage tests
6931e29Rodney Dawes
debian/control+1
@@ -32,6 +32,7 @@ Build-Depends: cmake,
32 libqmenumodel-dev (>= 0.2.12),
32 libqmenumodel-dev (>= 0.2.12),
33 libqtdbusmock1-dev (>= 0.7),
33 libqtdbusmock1-dev (>= 0.7),
34 libqtdbustest1-dev,
34 libqtdbustest1-dev,
35+ libqt5sql5-sqlite,
35 libqt5svg5-dev,
36 libqt5svg5-dev,
36 libqt5xmlpatterns5-dev,
37 libqt5xmlpatterns5-dev,
37 libsystemsettings-dev,
38 libsystemsettings-dev,
plugins/Utils/windowstatestorage.cpp+13−31
@@ -18,7 +18,6 @@
18
18
19#include <QtConcurrent>
19#include <QtConcurrent>
20#include <QDebug>
20#include <QDebug>
21−#include <QFutureSynchronizer>
22#include <QSqlQuery>
21#include <QSqlQuery>
23#include <QSqlError>
22#include <QSqlError>
24#include <QSqlResult>
23#include <QSqlResult>
@@ -33,24 +32,23 @@ inline QString sanitiseString(QString string) {
33 .remove(QLatin1Char('\\'));
32 .remove(QLatin1Char('\\'));
34}
33}
35
34
36−WindowStateStorage::WindowStateStorage(QObject *parent):
35+WindowStateStorage::WindowStateStorage(const QString& dbName, QObject *parent):
37 QObject(parent)
36 QObject(parent)
38{
37{
39 const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral("/unity8/");
38 const QString dbPath = QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QStringLiteral("/unity8/");
40 m_db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"));
39 m_db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"));
41 QDir dir;
40 QDir dir;
42 dir.mkpath(dbPath);
41 dir.mkpath(dbPath);
42+ if (dbName != nullptr) {
43+ m_db.setDatabaseName(dbName);
44+ } else {
43− m_db.setDatabaseName(dbPath + "windowstatestorage.sqlite");
45+ m_db.setDatabaseName(dbPath + "windowstatestorage.sqlite");
46+ }
44 initdb();
47 initdb();
45}
48}
46
49
47WindowStateStorage::~WindowStateStorage()
50WindowStateStorage::~WindowStateStorage()
48{
51{
49− QFutureSynchronizer<void> futureSync;
50− for (int i = 0; i < m_asyncQueries.count(); ++i) {
51− futureSync.addFuture(m_asyncQueries[i]);
52− }
53− futureSync.waitForFinished();
54 m_db.close();
52 m_db.close();
55}
53}
56
54
@@ -110,19 +108,6 @@ int WindowStateStorage::getStage(const QString &appId, int defaultValue) const
110 return query.value("stage").toInt();
108 return query.value("stage").toInt();
111}
109}
112
110
113−void WindowStateStorage::executeAsyncQuery(const QString &queryString)
114−{
115− QMutexLocker l(&s_mutex);
116− QSqlQuery query;
117−
118− bool ok = query.exec(queryString);
119− if (!ok) {
120− qWarning() << "Error executing query" << queryString
121− << "Driver error:" << query.lastError().driverText()
122− << "Database error:" << query.lastError().databaseText();
123− }
124−}
125−
126QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue) const
111QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue) const
127{
112{
128 QString queryString = QStringLiteral("SELECT * FROM geometry WHERE windowId = '%1';")
113 QString queryString = QStringLiteral("SELECT * FROM geometry WHERE windowId = '%1';")
@@ -171,16 +156,13 @@ void WindowStateStorage::initdb()
171void WindowStateStorage::saveValue(const QString &queryString)
156void WindowStateStorage::saveValue(const QString &queryString)
172{
157{
173 QMutexLocker mutexLocker(&s_mutex);
158 QMutexLocker mutexLocker(&s_mutex);
174−
159+ QSqlQuery query;
175− QFuture<void> future = QtConcurrent::run(&m_threadPool, executeAsyncQuery, queryString);
160+ auto ok = query.exec(queryString);
176− m_asyncQueries.append(future);
161+ if (!ok) {
177−
162+ qWarning() << "Error executing query" << queryString
178− QFutureWatcher<void> *futureWatcher = new QFutureWatcher<void>();
163+ << "Driver error:" << query.lastError().driverText()
179− futureWatcher->setFuture(future);
164+ << "Database error:" << query.lastError().databaseText();
180− connect(futureWatcher, &QFutureWatcher<void>::finished,
165+ }
181− this,
182− [=](){ m_asyncQueries.removeAll(futureWatcher->future());
183− futureWatcher->deleteLater(); });
184}
166}
185
167
186QSqlQuery WindowStateStorage::getValue(const QString &queryString) const
168QSqlQuery WindowStateStorage::getValue(const QString &queryString) const
plugins/Utils/windowstatestorage.h+1−7
@@ -17,8 +17,6 @@
17#include <QObject>
17#include <QObject>
18#include <QSqlDatabase>
18#include <QSqlDatabase>
19#include <QMutex>
19#include <QMutex>
20−#include <QFuture>
21−#include <QThreadPool>
22
20
23// unity-api
21// unity-api
24#include <unity/shell/application/Mir.h>
22#include <unity/shell/application/Mir.h>
@@ -46,7 +44,7 @@ public:
46 Q_DECLARE_FLAGS(WindowStates, WindowState)
44 Q_DECLARE_FLAGS(WindowStates, WindowState)
47 Q_FLAG(WindowStates)
45 Q_FLAG(WindowStates)
48
46
49− WindowStateStorage(QObject *parent = nullptr);
47+ WindowStateStorage(const QString& dbName = nullptr, QObject *parent = nullptr);
50 virtual ~WindowStateStorage();
48 virtual ~WindowStateStorage();
51
49
52 Q_INVOKABLE void saveState(const QString &windowId, WindowState state);
50 Q_INVOKABLE void saveState(const QString &windowId, WindowState state);
@@ -66,12 +64,8 @@ private:
66 void saveValue(const QString &queryString);
64 void saveValue(const QString &queryString);
67 QSqlQuery getValue(const QString &queryString) const;
65 QSqlQuery getValue(const QString &queryString) const;
68
66
69− static void executeAsyncQuery(const QString &queryString);
70 static QMutex s_mutex;
67 static QMutex s_mutex;
71
68
72 // NB: This is accessed from threads. Make sure to mutex it.
69 // NB: This is accessed from threads. Make sure to mutex it.
73 QSqlDatabase m_db;
70 QSqlDatabase m_db;
74−
75− QList<QFuture<void>> m_asyncQueries;
76− QThreadPool m_threadPool;
77};
71};
tests/plugins/Utils/WindowStateStorageTest.cpp+1−1
@@ -30,7 +30,7 @@ private Q_SLOTS:
30
30
31 void init()
31 void init()
32 {
32 {
33− storage = new WindowStateStorage(this);
33+ storage = new WindowStateStorage(":memory:", this);
34 }
34 }
35
35
36 void cleanup()
36 void cleanup()