~ci-train-bot/mediascanner2/mediascanner2-ubuntu-yakkety-landing-063

« back to all changes in this revision

Viewing changes to test/basic.cc

  • Committer: CI Train Bot
  • Author(s): James Henstridge
  • Date: 2015-11-09 01:56:37 UTC
  • mfrom: (288.1.28 external-metadata)
  • Revision ID: ci-train-bot@canonical.com-20151109015637-q4ixft4f3l2t1r3m
Move the metadata extractor to a separate process to isolate bugs in media codecs. Fixes: #1508142
Approved by: PS Jenkins bot

Show diffs side-by-side

added added

removed removed

Lines of Context:
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>
27
28
 
28
29
#include "test_config.h"
29
30
 
32
33
#include<string>
33
34
#include<unistd.h>
34
35
#include<sys/stat.h>
35
 
#include<gst/gst.h>
 
36
#include<gio/gio.h>
36
37
#include <gtest/gtest.h>
37
38
 
38
39
using namespace std;
39
40
using namespace mediascanner;
40
41
 
41
42
class ScanTest : public ::testing::Test {
42
 
 protected:
43
 
  ScanTest() {
44
 
  }
45
 
 
46
 
  virtual ~ScanTest() {
47
 
  }
48
 
 
49
 
  virtual void SetUp() {
50
 
  }
51
 
 
52
 
  virtual void TearDown() {
53
 
  }
 
43
protected:
 
44
    ScanTest() :
 
45
        test_dbus(nullptr, g_object_unref),
 
46
        session_bus(nullptr, g_object_unref) {
 
47
    }
 
48
 
 
49
    virtual ~ScanTest() {
 
50
    }
 
51
 
 
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());
 
56
 
 
57
        GError *error = nullptr;
 
58
        session_bus.reset(g_bus_get_sync(G_BUS_TYPE_SESSION, nullptr, &error));
 
59
        if (!session_bus) {
 
60
            std::string errortxt(error->message);
 
61
            g_error_free(error);
 
62
            throw std::runtime_error(
 
63
                std::string("Failed to connect to session bus: ") + errortxt);
 
64
        }
 
65
    }
 
66
 
 
67
    virtual void TearDown() override {
 
68
        session_bus.reset();
 
69
        g_test_dbus_down(test_dbus.get());
 
70
        test_dbus.reset();
 
71
    }
 
72
 
 
73
    unique_ptr<GTestDBus,decltype(&g_object_unref)> test_dbus;
 
74
    unique_ptr<GDBusConnection,decltype(&g_object_unref)> session_bus;
54
75
};
55
76
 
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);
61
82
}
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);
142
163
}
143
164
 
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);
148
169
    try {
149
170
        while(true) {
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);
181
202
 
182
203
    delete store;
185
206
    store->pruneDeleted();
186
207
    ASSERT_EQ(store->size(), 0);
187
208
    delete store;
188
 
 
189
209
}
190
210
 
191
211
TEST_F(ScanTest, scan_skips_unchanged_files) {
197
217
    copy_file(testfile, outfile);
198
218
 
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);
202
222
 
203
223
    /* Modify the metadata for this file in the database */
209
229
    store.insert(mfb.build());
210
230
 
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");
215
235
 
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");
223
243
}
224
244
 
225
 
TEST(Mediascanner, root_skip) {
226
 
    MetadataExtractor e;
 
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);
229
249
    while (true) {
236
256
    }
237
257
}
238
258
 
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);
246
266
 
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);
262
282
}
263
283
 
264
284
int main(int argc, char **argv) {
265
 
    gst_init (&argc, &argv);
266
285
    ::testing::InitGoogleTest(&argc, argv);
267
286
    return RUN_ALL_TESTS();
268
287
}