2
* Copyright (C) 2013 Canonical, Ltd.
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; version 3.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU General Public License for more details.
13
* You should have received a copy of the GNU General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
* Author: Pete Woods <pete.woods@canonical.com>
19
#include <libusermetricsoutput/SyncedUserMetricsStore.h>
20
#include <libusermetricscommon/UserMetricsInterface.h>
21
#include <libusermetricscommon/UserDataInterface.h>
22
#include <libusermetricscommon/DataSetInterface.h>
23
#include <libusermetricscommon/DataSourceInterface.h>
24
#include <libusermetricscommon/DBusPaths.h>
26
#include <testutils/DBusTest.h>
27
#include <testutils/QStringPrinter.h>
28
#include <testutils/QVariantPrinter.h>
29
#include <testutils/QVariantListPrinter.h>
31
#include <QtTest/QSignalSpy>
33
#include <gtest/gtest.h>
36
using namespace UserMetricsCommon;
37
using namespace UserMetricsOutput;
38
using namespace UserMetricsTestUtils;
42
class TestSyncedUserMetricsStore: public DBusTest {
44
TestSyncedUserMetricsStore() {
47
virtual ~TestSyncedUserMetricsStore() {
51
TEST_F(TestSyncedUserMetricsStore, LoadsDataSourcesAtStartup) {
52
com::canonical::UserMetrics userMetricsInterface(DBusPaths::serviceName(),
53
DBusPaths::userMetrics(), *connection);
55
QDBusObjectPath dataSourcePath1(
56
userMetricsInterface.createDataSource("data-source-one",
57
"format string one %1"));
58
ASSERT_EQ(DBusPaths::dataSource(1), dataSourcePath1.path());
60
QDBusObjectPath dataSourcePath2(
61
userMetricsInterface.createDataSource("data-source-two",
62
"format string two %1"));
63
ASSERT_EQ(DBusPaths::dataSource(2), dataSourcePath2.path());
65
SyncedUserMetricsStore store(*connection);
68
DataSourcePtr dataSource(store.dataSource("data-source-one"));
69
EXPECT_EQ(QString("format string one %1"), dataSource->formatString());
73
DataSourcePtr dataSource(store.dataSource("data-source-two"));
74
EXPECT_EQ(QString("format string two %1"), dataSource->formatString());
78
TEST_F(TestSyncedUserMetricsStore, SyncsNewDataSources) {
79
com::canonical::UserMetrics userMetricsInterface(DBusPaths::serviceName(),
80
DBusPaths::userMetrics(), *connection);
82
QDBusObjectPath dataSourcePath1(
83
userMetricsInterface.createDataSource("data-source-one",
84
"format string one %1"));
85
ASSERT_EQ(DBusPaths::dataSource(1), dataSourcePath1.path());
87
SyncedUserMetricsStore store(*connection);
90
DataSourcePtr dataSource(store.dataSource("data-source-one"));
91
ASSERT_FALSE(dataSource.isNull());
92
EXPECT_EQ(QString("format string one %1"), dataSource->formatString());
96
DataSourcePtr dataSource(store.dataSource("data-source-two"));
97
ASSERT_TRUE(dataSource.isNull());
100
QSignalSpy spy(&userMetricsInterface,
101
SIGNAL(dataSourceAdded(const QString &, const QDBusObjectPath &)));
103
QDBusObjectPath dataSourcePath2(
104
userMetricsInterface.createDataSource("data-source-two",
105
"format string two %1"));
106
ASSERT_EQ(DBusPaths::dataSource(2), dataSourcePath2.path());
111
DataSourcePtr dataSource(store.dataSource("data-source-one"));
112
ASSERT_FALSE(dataSource.isNull());
113
EXPECT_EQ(QString("format string one %1"), dataSource->formatString());
117
DataSourcePtr dataSource(store.dataSource("data-source-two"));
118
ASSERT_FALSE(dataSource.isNull());
119
EXPECT_EQ(QString("format string two %1"), dataSource->formatString());
123
TEST_F(TestSyncedUserMetricsStore, LoadsUserDataAtStartup) {
124
com::canonical::UserMetrics userMetricsInterface(DBusPaths::serviceName(),
125
DBusPaths::userMetrics(), *connection);
127
QDBusObjectPath userDataPath(
128
userMetricsInterface.createUserData("username1"));
129
ASSERT_EQ(DBusPaths::userData(1), userDataPath.path());
131
QDBusObjectPath userDataPath2(
132
userMetricsInterface.createUserData("username2"));
133
ASSERT_EQ(DBusPaths::userData(2), userDataPath2.path());
135
SyncedUserMetricsStore store(*connection);
138
UserMetricsStore::const_iterator it(store.constFind("username1"));
139
ASSERT_NE(it, store.constEnd());
140
EXPECT_EQ(QString("username1"), it.key());
144
UserMetricsStore::const_iterator it(store.constFind("username2"));
145
ASSERT_NE(it, store.constEnd());
146
EXPECT_EQ(QString("username2"), it.key());
150
TEST_F(TestSyncedUserMetricsStore, SyncsNewUserData) {
151
com::canonical::UserMetrics userMetricsInterface(DBusPaths::serviceName(),
152
DBusPaths::userMetrics(), *connection);
154
QDBusObjectPath userDataPath(
155
userMetricsInterface.createUserData("username1"));
156
ASSERT_EQ(DBusPaths::userData(1), userDataPath.path());
158
SyncedUserMetricsStore store(*connection);
161
UserMetricsStore::const_iterator it(store.constFind("username1"));
162
ASSERT_NE(it, store.constEnd());
163
EXPECT_EQ(QString("username1"), it.key());
167
UserMetricsStore::const_iterator it(store.constFind("username2"));
168
ASSERT_EQ(it, store.constEnd());
171
QSignalSpy spy(&userMetricsInterface,
172
SIGNAL(userDataAdded(const QString &, const QDBusObjectPath &)));
174
QDBusObjectPath userDataPath2(
175
userMetricsInterface.createUserData("username2"));
176
ASSERT_EQ(DBusPaths::userData(2), userDataPath2.path());
181
UserMetricsStore::const_iterator it(store.constFind("username1"));
182
ASSERT_NE(it, store.constEnd());
183
EXPECT_EQ(QString("username1"), it.key());
187
UserMetricsStore::const_iterator it(store.constFind("username2"));
188
ASSERT_NE(it, store.constEnd());
189
EXPECT_EQ(QString("username2"), it.key());
193
TEST_F(TestSyncedUserMetricsStore, LoadsDataSetsAtStartup) {
194
com::canonical::UserMetrics userMetricsInterface(DBusPaths::serviceName(),
195
DBusPaths::userMetrics(), *connection);
197
QDBusObjectPath twitterPath(
198
userMetricsInterface.createDataSource("twitter",
199
"twitter format string"));
200
ASSERT_EQ(DBusPaths::dataSource(1), twitterPath.path());
202
QDBusObjectPath userDataPath(
203
userMetricsInterface.createUserData("username"));
204
ASSERT_EQ(DBusPaths::userData(1), userDataPath.path());
206
com::canonical::usermetrics::UserData userDataInterface(
207
DBusPaths::serviceName(), DBusPaths::userData(1), *connection);
208
QDBusObjectPath twitterDataPath(userDataInterface.createDataSet("twitter"));
209
ASSERT_EQ(DBusPaths::dataSet(1), twitterDataPath.path());
211
QVariantList data( { 100.0, 50.0, "", -50.0, -100.0 });
212
QVariantList expected( { 100.0, 50.0, QVariant(), -50.0, -100.0 });
214
com::canonical::usermetrics::DataSet dataSetInterface(
215
DBusPaths::serviceName(), DBusPaths::dataSet(1), *connection);
216
dataSetInterface.update(data);
218
SyncedUserMetricsStore store(*connection);
220
UserMetricsStore::const_iterator userDataIterator(
221
store.constFind("username"));
222
ASSERT_NE(userDataIterator, store.constEnd());
223
EXPECT_EQ(QString("username"), userDataIterator.key());
224
UserDataPtr userData(*userDataIterator);
226
UserData::const_iterator dataSetIterator(userData->constBegin());
227
ASSERT_NE(dataSetIterator, userData->constEnd());
228
DataSetPtr dataSet(*dataSetIterator);
229
EXPECT_EQ(expected, dataSet->data());
230
EXPECT_EQ(QDate::currentDate(), dataSet->lastUpdated());
233
TEST_F(TestSyncedUserMetricsStore, SyncsNewDataSets) {
234
com::canonical::UserMetrics userMetricsInterface(DBusPaths::serviceName(),
235
DBusPaths::userMetrics(), *connection);
237
QDBusObjectPath twitterPath(
238
userMetricsInterface.createDataSource("twitter",
239
"twitter format string"));
240
ASSERT_EQ(DBusPaths::dataSource(1), twitterPath.path());
242
QDBusObjectPath facebookPath(
243
userMetricsInterface.createDataSource("facebook",
244
"facebook format string"));
245
ASSERT_EQ(DBusPaths::dataSource(2), facebookPath.path());
247
QDBusObjectPath userDataPath(
248
userMetricsInterface.createUserData("username"));
249
ASSERT_EQ(DBusPaths::userData(1), userDataPath.path());
251
com::canonical::usermetrics::UserData userDataInterface(
252
DBusPaths::serviceName(), DBusPaths::userData(1), *connection);
254
QDBusObjectPath twitterDataPath(userDataInterface.createDataSet("twitter"));
255
ASSERT_EQ(DBusPaths::dataSet(1), twitterDataPath.path());
257
SyncedUserMetricsStore store(*connection);
260
UserMetricsStore::const_iterator userDataIterator(
261
store.constFind("username"));
262
ASSERT_NE(userDataIterator, store.constEnd());
263
EXPECT_EQ(QString("username"), userDataIterator.key());
264
UserDataPtr userData(*userDataIterator);
266
UserData::const_iterator dataSetIterator(userData->constBegin());
267
ASSERT_NE(dataSetIterator, userData->constEnd());
268
EXPECT_EQ(QString("twitter"), dataSetIterator.key());
271
ASSERT_EQ(dataSetIterator, userData->constEnd());
274
QSignalSpy spy(&userDataInterface,
275
SIGNAL(dataSetAdded(const QString &, const QDBusObjectPath &)));
277
QDBusObjectPath facebookDataPath(
278
userDataInterface.createDataSet("facebook"));
279
ASSERT_EQ(DBusPaths::dataSet(2), facebookDataPath.path());
284
UserMetricsStore::const_iterator userDataIterator(
285
store.constFind("username"));
286
ASSERT_NE(userDataIterator, store.constEnd());
287
EXPECT_EQ(QString("username"), userDataIterator.key());
288
UserDataPtr userData(*userDataIterator);
290
UserData::const_iterator dataSetIterator(userData->constBegin());
292
ASSERT_NE(dataSetIterator, userData->constEnd());
293
EXPECT_EQ(QString("facebook"), dataSetIterator.key());
296
ASSERT_NE(dataSetIterator, userData->constEnd());
297
EXPECT_EQ(QString("twitter"), dataSetIterator.key());
300
ASSERT_EQ(dataSetIterator, userData->constEnd());