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 <usermetricsservice/DBusUserMetrics.h>
20
#include <usermetricsservice/DBusDataSource.h>
21
#include <usermetricsservice/DBusUserData.h>
22
#include <usermetricsservice/DBusDataSet.h>
23
#include <libusermetricscommon/DateFactory.h>
25
#include <testutils/DBusTest.h>
26
#include <testutils/QStringPrinter.h>
27
#include <testutils/QVariantListPrinter.h>
31
#include <QSqlDatabase>
32
#include <QtCore/QVariantList>
34
#include <gtest/gtest.h>
35
#include <gmock/gmock.h>
38
using namespace testing;
39
using namespace UserMetricsCommon;
40
using namespace UserMetricsService;
41
using namespace UserMetricsTestUtils;
45
class MockDateFactory: public DateFactory {
47
MOCK_CONST_METHOD0(currentDate, QDate());
50
class TestUserMetricsService: public DBusTest {
52
TestUserMetricsService() :
54
QSqlDatabase::addDatabase("QSQLITE",
55
"test-user-metrics-service")), dateFactory(
56
new NiceMock<MockDateFactory>()) {
57
db.setDatabaseName(":memory:");
59
throw logic_error("couldn't open database");
62
ON_CALL(*dateFactory, currentDate()).WillByDefault(
63
Return(QDate(2001, 01, 07)));
65
// QDjango::setDebugEnabled(true);
66
QDjango::setDatabase(db);
69
virtual ~TestUserMetricsService() {
70
QDjango::dropTables();
72
QSqlDatabase::removeDatabase("test-user-metrics-service");
77
QSharedPointer<MockDateFactory> dateFactory;
80
TEST_F(TestUserMetricsService, PersistsDataSourcesBetweenRestart) {
82
DBusUserMetrics userMetrics(*connection, dateFactory);
84
EXPECT_TRUE(userMetrics.dataSources().empty());
86
EXPECT_EQ(QString("/com/canonical/UserMetrics/DataSource/1"),
87
userMetrics.createDataSource("facebook", "%1 messages received").path());
89
DBusDataSourcePtr facebook(userMetrics.dataSource("facebook"));
90
EXPECT_EQ(QString("facebook"), facebook->name());
91
EXPECT_EQ(QString("%1 messages received"), facebook->formatString());
93
QList<QDBusObjectPath> dataSources(userMetrics.dataSources());
94
EXPECT_EQ(1, dataSources.size());
95
EXPECT_EQ(QString("/com/canonical/UserMetrics/DataSource/1"),
96
dataSources.first().path());
100
DBusUserMetrics userMetrics(*connection, dateFactory);
102
QList<QDBusObjectPath> dataSources(userMetrics.dataSources());
103
EXPECT_EQ(1, dataSources.size());
104
EXPECT_EQ(QString("/com/canonical/UserMetrics/DataSource/1"),
105
dataSources.first().path());
107
DBusDataSourcePtr facebook(userMetrics.dataSource("facebook"));
108
EXPECT_EQ(QString("facebook"), facebook->name());
109
EXPECT_EQ(QString("%1 messages received"), facebook->formatString());
113
TEST_F(TestUserMetricsService, UpdatesFormatString) {
115
DBusUserMetrics userMetrics(*connection, dateFactory);
117
userMetrics.createDataSource("twitter", "%1 tweets received");
119
DBusDataSourcePtr twitter(userMetrics.dataSource("twitter"));
120
EXPECT_EQ(QString("%1 tweets received"), twitter->formatString());
122
twitter->setFormatString("%1 new format string");
123
EXPECT_EQ(QString("%1 new format string"), twitter->formatString());
127
DBusUserMetrics userMetrics(*connection, dateFactory);
129
DBusDataSourcePtr twitter(userMetrics.dataSource("twitter"));
130
EXPECT_EQ(QString("%1 new format string"), twitter->formatString());
134
TEST_F(TestUserMetricsService, PersistsUserDataBetweenRestart) {
136
DBusUserMetrics userMetrics(*connection, dateFactory);
138
EXPECT_TRUE(userMetrics.dataSources().empty());
140
EXPECT_EQ(QString("/com/canonical/UserMetrics/UserData/1"),
141
userMetrics.createUserData("alice").path());
143
DBusUserDataPtr alice(userMetrics.userData("alice"));
144
EXPECT_EQ(QString("alice"), alice->username());
146
QList<QDBusObjectPath> userData(userMetrics.userDatas());
147
EXPECT_EQ(1, userData.size());
148
EXPECT_EQ(QString("/com/canonical/UserMetrics/UserData/1"),
149
userData.first().path());
153
DBusUserMetrics userMetrics(*connection, dateFactory);
155
QList<QDBusObjectPath> userData(userMetrics.userDatas());
156
EXPECT_EQ(1, userData.size());
157
EXPECT_EQ(QString("/com/canonical/UserMetrics/UserData/1"),
158
userData.first().path());
160
DBusUserDataPtr alice(userMetrics.userData("alice"));
161
EXPECT_EQ(QString("alice"), alice->username());
165
TEST_F(TestUserMetricsService, PersistsDataSetsBetweenRestart) {
166
QVariantList data( { 100.0, 50.0, 0.0, -50.0, -100.0 });
169
DBusUserMetrics userMetrics(*connection, dateFactory);
171
userMetrics.createDataSource("twitter", "%1 tweets received");
172
userMetrics.createUserData("alice");
174
DBusUserDataPtr alice(userMetrics.userData("alice"));
176
EXPECT_TRUE(alice->dataSets().empty());
178
// should re-use the same data set
179
EXPECT_EQ(QString("/com/canonical/UserMetrics/DataSet/1"),
180
alice->createDataSet("twitter").path());;
181
EXPECT_EQ(QString("/com/canonical/UserMetrics/DataSet/1"),
182
alice->createDataSet("twitter").path());;
184
DBusDataSetPtr twitter(alice->dataSet("twitter"));
185
EXPECT_EQ(1, twitter->id());
187
QList<QDBusObjectPath> dataSets(alice->dataSets());
188
EXPECT_EQ(1, dataSets.size());
189
EXPECT_EQ(QString("/com/canonical/UserMetrics/DataSet/1"),
190
dataSets.first().path());
192
twitter->update(data);
196
DBusUserMetrics userMetrics(*connection, dateFactory);
198
DBusUserDataPtr alice(userMetrics.userData("alice"));
199
EXPECT_EQ(QString("alice"), alice->username());
201
QList<QDBusObjectPath> dataSets(alice->dataSets());
202
EXPECT_EQ(1, dataSets.size());
203
EXPECT_EQ(QString("/com/canonical/UserMetrics/DataSet/1"),
204
dataSets.first().path());
206
DBusDataSetPtr twitter(alice->dataSet("twitter"));
207
EXPECT_EQ(1, twitter->id());
209
EXPECT_EQ(data, twitter->data());
213
TEST_F(TestUserMetricsService, CreateDataSetsWithUnknownSourceFailsGracefully) {
214
DBusUserMetrics userMetrics(*connection, dateFactory);
216
userMetrics.createUserData("bob");
217
DBusUserDataPtr bob(userMetrics.userData("bob"));
219
EXPECT_EQ(QString(), bob->createDataSet("twitter").path());
222
TEST_F(TestUserMetricsService, UpdateData) {
223
EXPECT_CALL(*dateFactory, currentDate()).Times(2).WillOnce(
224
Return(QDate(2001, 01, 5))).WillOnce(Return(QDate(2001, 01, 8)));
226
DBusUserMetrics userMetrics(*connection, dateFactory);
227
userMetrics.createDataSource("twitter", "foo");
229
userMetrics.createUserData("bob");
230
DBusUserDataPtr bob(userMetrics.userData("bob"));
232
bob->createDataSet("twitter");
233
DBusDataSetPtr twitter(bob->dataSet("twitter"));
235
QVariantList first( { 5.0, 4.0, 3.0, 2.0, 1.0 });
236
QVariantList second( { 10.0, 9.0, 8.0, 7.0, 6.0 });
237
QVariantList expected( { 10.0, 9.0, 8.0, 7.0, 6.0, 3.0, 2.0, 1.0 });
239
// first update happens on the 5th of the month
240
twitter->update(first);
241
EXPECT_EQ(first, twitter->data());
242
EXPECT_EQ(QDate(2001, 01, 5), twitter->lastUpdatedDate());
244
// second update happens on the 8th of the month
245
// -> 3 new data points and 2 overwritten
246
twitter->update(second);
247
EXPECT_EQ(expected, twitter->data());
248
EXPECT_EQ(QDate(2001, 01, 8), twitter->lastUpdatedDate());
251
TEST_F(TestUserMetricsService, UpdateDataWithGap) {
252
EXPECT_CALL(*dateFactory, currentDate()).Times(2).WillOnce(
253
Return(QDate(2001, 01, 5))).WillOnce(Return(QDate(2001, 01, 15)));
255
DBusUserMetrics userMetrics(*connection, dateFactory);
256
userMetrics.createDataSource("twitter", "foo");
258
userMetrics.createUserData("bob");
259
DBusUserDataPtr bob(userMetrics.userData("bob"));
261
bob->createDataSet("twitter");
262
DBusDataSetPtr twitter(bob->dataSet("twitter"));
264
QVariantList first( { 5.0, 4.0, 3.0, 2.0, 1.0 });
265
QVariantList second( { 10.0, 9.0, 8.0, 7.0, 6.0 });
266
QVariantList expected;
267
expected.append(second);
268
for (int i(0); i < 5; ++i) {
269
expected.append(QVariant(""));
271
expected.append(first);
273
// first update happens on the 5th of the month
274
twitter->update(first);
275
EXPECT_EQ(first, twitter->data());
276
EXPECT_EQ(QDate(2001, 01, 5), twitter->lastUpdatedDate());
278
// second update happens on the 15th of the month
279
// -> 5 new data points, 5 nulls, and none overwritten
280
twitter->update(second);
281
EXPECT_EQ(expected, twitter->data());
282
EXPECT_EQ(QDate(2001, 01, 15), twitter->lastUpdatedDate());
285
TEST_F(TestUserMetricsService, UpdateDataTotallyOverwrite) {
286
EXPECT_CALL(*dateFactory, currentDate()).Times(2).WillOnce(
287
Return(QDate(2001, 01, 5))).WillOnce(Return(QDate(2001, 01, 7)));
289
DBusUserMetrics userMetrics(*connection, dateFactory);
290
userMetrics.createDataSource("twitter", "foo");
292
userMetrics.createUserData("bob");
293
DBusUserDataPtr bob(userMetrics.userData("bob"));
295
bob->createDataSet("twitter");
296
DBusDataSetPtr twitter(bob->dataSet("twitter"));
298
QVariantList first( { 3.0, 2.0, 1.0 });
299
QVariantList second( { 10.0, 9.0, 8.0, 7.0, 6.0, 5.0, 4.0 });
300
QVariantList &expected(second);
302
// first update happens on the 5th of the month
303
twitter->update(first);
304
EXPECT_EQ(first, twitter->data());
305
EXPECT_EQ(QDate(2001, 01, 5), twitter->lastUpdatedDate());
307
// second update happens on the 7th of the month
308
// -> 2 new data points, 3 overwrites, and 2 new appends
309
twitter->update(second);
310
EXPECT_EQ(expected, twitter->data());
311
EXPECT_EQ(QDate(2001, 01, 7), twitter->lastUpdatedDate());