21
21
#include <mediascanner/MediaFileBuilder.hh>
22
22
#include <mediascanner/MediaStore.hh>
23
23
#include <daemon/InvalidationSender.hh>
24
#include <daemon/MetadataExtractor.hh>
25
24
#include <daemon/SubtreeWatcher.hh>
26
25
#include <daemon/Scanner.hh>
26
#include <extractor/DetectedFile.hh>
27
#include <extractor/MetadataExtractor.hh>
28
29
#include "test_config.h"
34
35
#include<sys/stat.h>
36
37
#include <gtest/gtest.h>
38
39
using namespace std;
39
40
using namespace mediascanner;
41
42
class ScanTest : public ::testing::Test {
49
virtual void SetUp() {
52
virtual void TearDown() {
45
test_dbus(nullptr, g_object_unref),
46
session_bus(nullptr, g_object_unref) {
52
virtual void SetUp() override{
53
test_dbus.reset(g_test_dbus_new(G_TEST_DBUS_NONE));
54
g_test_dbus_add_service_dir(test_dbus.get(), TEST_DIR "/services");
55
g_test_dbus_up(test_dbus.get());
57
GError *error = nullptr;
58
session_bus.reset(g_bus_get_sync(G_BUS_TYPE_SESSION, nullptr, &error));
60
std::string errortxt(error->message);
62
throw std::runtime_error(
63
std::string("Failed to connect to session bus: ") + errortxt);
67
virtual void TearDown() override {
69
g_test_dbus_down(test_dbus.get());
73
unique_ptr<GTestDBus,decltype(&g_object_unref)> test_dbus;
74
unique_ptr<GDBusConnection,decltype(&g_object_unref)> session_bus;
56
77
TEST_F(ScanTest, init) {
57
78
MediaStore store(":memory:", MS_READ_WRITE);
58
MetadataExtractor extractor;
79
MetadataExtractor extractor(session_bus.get());
59
80
InvalidationSender invalidator;
60
81
SubtreeWatcher watcher(store, extractor, invalidator);
97
118
clear_dir(subdir);
98
119
ASSERT_GE(mkdir(subdir.c_str(), S_IRUSR | S_IWUSR | S_IXUSR), 0);
99
120
MediaStore store(":memory:", MS_READ_WRITE);
100
MetadataExtractor extractor;
121
MetadataExtractor extractor(session_bus.get());
101
122
InvalidationSender invalidator;
102
123
SubtreeWatcher watcher(store, extractor, invalidator);
103
124
watcher.addDir(subdir);
119
140
clear_dir(testdir);
120
141
ASSERT_GE(mkdir(testdir.c_str(), S_IRUSR | S_IWUSR | S_IXUSR), 0);
121
142
MediaStore store(":memory:", MS_READ_WRITE);
122
MetadataExtractor extractor;
143
MetadataExtractor extractor(session_bus.get());
123
144
InvalidationSender invalidator;
124
145
SubtreeWatcher watcher(store, extractor, invalidator);
125
146
ASSERT_EQ(watcher.directoryCount(), 0);
144
165
// FIXME move this somewhere in the implementation.
145
void scanFiles(MediaStore &store, const string &subdir, const MediaType type) {
146
MetadataExtractor extractor;
166
void scanFiles(GDBusConnection *session_bus, MediaStore &store, const string &subdir, const MediaType type) {
167
MetadataExtractor extractor(session_bus);
147
168
Scanner s(&extractor, subdir, type);
176
197
ASSERT_GE(mkdir(testdir.c_str(), S_IRUSR | S_IWUSR | S_IXUSR), 0);
177
198
copy_file(testfile, outfile);
178
199
MediaStore *store = new MediaStore(dbname, MS_READ_WRITE);
179
scanFiles(*store, testdir, AudioMedia);
200
scanFiles(session_bus.get(), *store, testdir, AudioMedia);
180
201
ASSERT_EQ(store->size(), 1);
197
217
copy_file(testfile, outfile);
199
219
MediaStore store(":memory:", MS_READ_WRITE);
200
scanFiles(store, testdir, AudioMedia);
220
scanFiles(session_bus.get(), store, testdir, AudioMedia);
201
221
ASSERT_EQ(store.size(), 1);
203
223
/* Modify the metadata for this file in the database */
209
229
store.insert(mfb.build());
211
231
/* Scan again, and note that the data hasn't been updated */
212
scanFiles(store, testdir, AudioMedia);
232
scanFiles(session_bus.get(), store, testdir, AudioMedia);
213
233
media = store.lookup(outfile);
214
234
EXPECT_EQ(media.getTitle(), "something else");
217
237
MediaFileBuilder mfb2(media);
218
238
mfb2.setETag("old-etag");
219
239
store.insert(mfb2.build());
220
scanFiles(store, testdir, AudioMedia);
240
scanFiles(session_bus.get(), store, testdir, AudioMedia);
221
241
media = store.lookup(outfile);
222
242
EXPECT_EQ(media.getTitle(), "track1");
225
TEST(Mediascanner, root_skip) {
245
TEST_F(ScanTest, root_skip) {
246
MetadataExtractor e(session_bus.get());
227
247
string root(SOURCE_DIR "/media");
228
248
Scanner s(&e, root, AudioMedia);
239
TEST(Mediascanner, scan_files_found_in_new_dir) {
259
TEST_F(ScanTest, scan_files_found_in_new_dir) {
240
260
string testdir = TEST_DIR "/testdir";
241
261
string subdir = testdir + "/subdir";
242
262
string testfile = SOURCE_DIR "/media/testfile.ogg";
245
265
ASSERT_GE(mkdir(testdir.c_str(), S_IRUSR | S_IWUSR | S_IXUSR), 0);
247
267
MediaStore store(":memory:", MS_READ_WRITE);
248
MetadataExtractor extractor;
268
MetadataExtractor extractor(session_bus.get());
249
269
InvalidationSender invalidator;
250
270
SubtreeWatcher watcher(store, extractor, invalidator);
251
271
watcher.addDir(testdir);