From 2c3388b36cb3a32448260a95408b69a03c09681d Mon Sep 17 00:00:00 2001
From: Xavier Claessens <xavier.claessens@collabora.com>
Date: Wed, 23 Sep 2015 14:36:02 -0400
Subject: [PATCH] tracker: factor out a mixin to browse a grilo source

Reviewers: smcv, pwith

Differential Revision: https://phabricator.apertis.org/D544
---
 apertis_tests_lib/grilo.py        | 54 ++++++++++++++++++++++
 tracker/automated/test-tracker.py | 74 +++++++++++++------------------
 2 files changed, 84 insertions(+), 44 deletions(-)
 create mode 100644 apertis_tests_lib/grilo.py

diff --git a/apertis_tests_lib/grilo.py b/apertis_tests_lib/grilo.py
new file mode 100644
index 0000000..02606c8
--- /dev/null
+++ b/apertis_tests_lib/grilo.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+
+# Copyright © 2015 Collabora Ltd.
+#
+# SPDX-License-Identifier: MPL-2.0
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from gi.repository import Grl
+from gi.repository import GrlPls
+
+
+class GriloBrowserMixin:
+    def browse(self, source, prefix, pls=None):
+        self.source = source
+        self.prefix = 'file://%s/' % prefix
+        self.medias = {}
+
+        ops = self.source.supported_operations()
+        self.assertTrue((ops & Grl.SupportedOps.BROWSE) != 0)
+
+        self.__browse_recurse(None, pls)
+
+        return self.medias
+
+    def __browse_recurse(self, media, pls=None):
+        caps = self.source.get_caps(Grl.SupportedOps.BROWSE)
+        options = Grl.OperationOptions.new(caps)
+        options.set_resolution_flags(Grl.ResolutionFlags.IDLE_RELAY)
+
+        keys = [Grl.METADATA_KEY_TITLE,
+                Grl.METADATA_KEY_ALBUM,
+                Grl.METADATA_KEY_ARTIST,
+                Grl.METADATA_KEY_THUMBNAIL,
+                Grl.METADATA_KEY_URL,
+                Grl.METADATA_KEY_CHILDCOUNT]
+
+        if pls is not None:
+            medias = GrlPls.browse_sync(self.source, pls, keys, options, None)
+        else:
+            medias = self.source.browse_sync(media, keys, options)
+
+        for media in medias:
+            if isinstance(media, Grl.MediaBox):
+                self.__browse_recurse(media)
+                continue
+
+            url = media.get_url()
+            if url.startswith(self.prefix):
+                suffix = url[len(self.prefix):]
+
+                print("GriloBrowserMixin: add media", suffix)
+                self.medias[suffix] = media
diff --git a/tracker/automated/test-tracker.py b/tracker/automated/test-tracker.py
index 785bee9..371f543 100755
--- a/tracker/automated/test-tracker.py
+++ b/tracker/automated/test-tracker.py
@@ -21,14 +21,16 @@ from gi.repository import Grl
 sys.path.insert(0, os.path.join(os.path.dirname(__file__),
                                 os.pardir, os.pardir))
 from apertis_tests_lib.tracker import TrackerIndexerMixin
+from apertis_tests_lib.grilo import GriloBrowserMixin
 from apertis_tests_lib import ApertisTest
 from apertis_tests_lib import LONG_JPEG_NAME
 
 
-class TrackerTest(ApertisTest, TrackerIndexerMixin):
+class TrackerTest(ApertisTest, TrackerIndexerMixin, GriloBrowserMixin):
     def __init__(self, *args, **kwargs):
         ApertisTest.__init__(self, *args, **kwargs)
         TrackerIndexerMixin.__init__(self)
+        GriloBrowserMixin.__init__(self)
 
     def setUp(self):
         self.loop = GLib.MainLoop.new(None, False)
@@ -162,51 +164,35 @@ class TrackerTest(ApertisTest, TrackerIndexerMixin):
         self.assert_has_thumbnail('Pictures/collabora-logo-big.png')
         self.assert_has_thumbnail('Videos/big_buck_bunny_smaller.ogv')
 
-    def grl_browse_source(self, source, media):
-        ops = source.supported_operations()
-        self.assertTrue((ops & Grl.SupportedOps.BROWSE) != 0)
-
-        caps = source.get_caps(Grl.SupportedOps.BROWSE)
-        options = Grl.OperationOptions.new(caps)
-        options.set_count(10)
-        options.set_resolution_flags(Grl.ResolutionFlags.IDLE_RELAY)
-
-        keys = [Grl.METADATA_KEY_TITLE,
-                Grl.METADATA_KEY_ALBUM,
-                Grl.METADATA_KEY_ARTIST,
-                Grl.METADATA_KEY_THUMBNAIL,
-                Grl.METADATA_KEY_URL,
-                Grl.METADATA_KEY_CHILDCOUNT]
-
-        medias = source.browse_sync(media, keys, options)
-
-        for media in medias:
-            if isinstance(media, Grl.MediaBox):
-                self.grl_browse_source(source, media)
-                continue
-
-            url = media.get_url()
-            prefix = 'file://' + self.homedir + '/'
-            if not url.startswith(prefix):
-                continue
-
-            filename = url[len(prefix):]
-            if filename in ['Music/generic.oga',
-                            'Music/generic.mp3',
-                            'Music/generic.flac',
-                            'Music/generic-no-artwork.mp3']:
-                self.assertEqual(media.get_title(), 'GNOME Generic Sound')
-                self.assertEqual(media.get_artist(), 'Conrad Parker')
-                self.assertEqual(media.get_album(), 'GNOME Audio')
-            elif filename in ['Music/generic.wav',
-                              'Pictures/' + LONG_JPEG_NAME,
-                              'Pictures/collabora-logo-big.png',
-                              'Videos/big_buck_bunny_smaller.ogv']:
-                title = filename.split('/')[1]
-                self.assertEqual(media.get_title(), title)
+    def grl_assert_common(self, medias, filename):
+        self.assertTrue(filename in medias)
+        media = medias[filename]
+
+        # 'file:///foo/generic.mp3' -> 'generic.mp3'
+        url = media.get_url()
+        title = url[url.rfind('/') + 1:]
+        self.assertEqual(media.get_title(), title)
+
+    def grl_assert_music(self, medias, filename):
+        self.assertTrue(filename in medias)
+        media = medias[filename]
+
+        self.assertTrue(isinstance(media, Grl.MediaAudio))
+        self.assertEqual(media.get_title(), 'GNOME Generic Sound')
+        self.assertEqual(media.get_artist(), 'Conrad Parker')
+        self.assertEqual(media.get_album(), 'GNOME Audio')
 
     def grl_source_added_cb(self, registry, source):
-        self.grl_browse_source(source, None)
+        medias = self.browse(source, self.homedir)
+        self.grl_assert_music(medias, 'Music/generic.mp3')
+        self.grl_assert_music(medias, 'Music/generic.flac')
+        self.grl_assert_music(medias, 'Music/generic-no-artwork.mp3')
+        self.grl_assert_music(medias, 'Music/generic.oga')
+        self.grl_assert_common(medias, 'Music/generic.wav')
+        self.grl_assert_common(medias, 'Pictures/' + LONG_JPEG_NAME)
+        self.grl_assert_common(medias, 'Pictures/collabora-logo-big.png')
+        self.grl_assert_common(medias, 'Videos/big_buck_bunny_smaller.ogv')
+
         self.loop.quit()
 
     def tracker_grilo_tests(self):
-- 
GitLab