[tracker/wip/carlosg/more-tests: 5/6] tests: Add more thorough portal tests




commit b08e3e64b55997ed03384c0a543c7c1f0460c635
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun Mar 13 14:04:03 2022 +0100

    tests: Add more thorough portal tests
    
    Test all corners in graph lookups, and whether visibility changes
    accordingly with graph modifications.

 tests/functional-tests/portal.py | 309 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 303 insertions(+), 6 deletions(-)
---
diff --git a/tests/functional-tests/portal.py b/tests/functional-tests/portal.py
index 373bf8d5b..829d79d1e 100644
--- a/tests/functional-tests/portal.py
+++ b/tests/functional-tests/portal.py
@@ -90,6 +90,7 @@ class TestPortal(fixtures.TrackerPortalTest):
         self.fail("Timeout, the signal never came after %i seconds!" % configuration.DEFAULT_TIMEOUT)
 
     def __notifier_event_cb(self, notifier, service, graph, events):
+        self.notifier_events += events
         if self.timeout_id != 0:
             GLib.source_remove(self.timeout_id)
             self.timeout_id = 0
@@ -98,6 +99,7 @@ class TestPortal(fixtures.TrackerPortalTest):
     def test_05_local_connection_notifier(self):
         self.start_service('org.freedesktop.PortalTest')
 
+        self.notifier_events = []
         conn = self.create_local_connection()
         notifier = conn.create_notifier();
         notifier.connect('events', self.__notifier_event_cb)
@@ -106,20 +108,27 @@ class TestPortal(fixtures.TrackerPortalTest):
             'org.freedesktop.PortalTest',
             None,
             'tracker:Allowed')
+        signalId2 = notifier.signal_subscribe(
+            self.bus,
+            'org.freedesktop.PortalTest',
+            None,
+            'tracker:Disallowed')
 
+        self.update(
+            'org.freedesktop.PortalTest',
+            'INSERT { GRAPH tracker:Disallowed { <a> a nmm:MusicPiece } }')
         self.update(
             'org.freedesktop.PortalTest',
             'INSERT { GRAPH tracker:Allowed { <b> a nmm:MusicPiece } }')
 
         self.__wait_for_notifier()
         notifier.signal_unsubscribe(signalId);
-        conn.close()
+        notifier.signal_unsubscribe(signalId2);
 
-        res = self.query(
-            'org.freedesktop.PortalTest',
-            'select ?a { ?a a nmm:MusicPiece }')
-        self.assertEqual(len(res), 1)
-        self.assertEqual(res[0][0], 'b')
+        # Only one event is expected, from the allowed graph
+        self.assertEqual(len(self.notifier_events), 1);
+        self.assertEqual(self.notifier_events[0].get_urn(), 'b')
+        conn.close()
 
     def test_06_id_access(self):
         self.start_service('org.freedesktop.PortalTest')
@@ -141,5 +150,293 @@ class TestPortal(fixtures.TrackerPortalTest):
         self.assertNotEqual(res[0][0], '0')
         self.assertEqual(res[0][1], 'b')
 
+    def test_07_id_access_disallowed(self):
+        self.start_service('org.freedesktop.PortalTest')
+
+        # Insert resource into disallowed graph, ensure it is not visible
+        self.update(
+            'org.freedesktop.PortalTest',
+            'CREATE GRAPH tracker:Disallowed;' +
+            'INSERT { GRAPH tracker:Disallowed { <b> a nfo:FileDataObject } }')
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select tracker:id(<b>) tracker:uri(tracker:id(<b>)) { }')
+        self.assertEqual(len(res), 1)
+        self.assertEqual(res[0][0], '0')
+        self.assertIsNone(res[0][1])
+
+        # Insert same resource into allowed graph, ensure it is visible
+        self.update(
+            'org.freedesktop.PortalTest',
+            'CREATE GRAPH tracker:Allowed;' +
+            'INSERT { GRAPH tracker:Allowed { <b> a nfo:FileDataObject } }')
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select tracker:id(<b>) tracker:uri(tracker:id(<b>)) { }')
+        self.assertEqual(len(res), 1)
+        self.assertNotEqual(res[0][0], '0')
+        self.assertEqual(res[0][1], 'b')
+        resourceId = res[0][0];
+
+        # Delete resource from allowed graph, ensure it is not visible again
+        self.update(
+            'org.freedesktop.PortalTest',
+            'DELETE { GRAPH tracker:Allowed { <b> a rdfs:Resource } }')
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select tracker:id(<b>) tracker:uri(tracker:id(<b>)) tracker:uri(' + str(resourceId) + ') { }')
+        self.assertEqual(len(res), 1)
+        self.assertEqual(res[0][0], '0')
+        self.assertIsNone(res[0][1])
+        self.assertIsNone(res[0][2])
+
+    def test_08_local_connection_service(self):
+        self.start_service('org.freedesktop.PortalTest')
+
+        self.notifier_events = []
+        conn = self.create_local_connection()
+        self.update(
+            'org.freedesktop.PortalTest',
+            'INSERT { GRAPH tracker:Disallowed { <a> a nmm:MusicPiece } }')
+        self.update(
+            'org.freedesktop.PortalTest',
+            'INSERT { GRAPH tracker:Allowed { <b> a nmm:MusicPiece } }')
+
+        # Only one resource is expected, from the allowed graph
+        cursor = conn.query('select ?u { SERVICE <dbus:org.freedesktop.PortalTest> { ?u a nmm:MusicPiece } 
}')
+        self.assertTrue(cursor.next())
+        self.assertEqual(cursor.get_string(0)[0], 'b')
+        self.assertFalse(cursor.next())
+        cursor.close()
+        conn.close()
+
+    # Test that all ways to specify a graph in the query hit a dead end
+    def test_09_query_graphs(self):
+        self.start_service('org.freedesktop.PortalTest')
+        self.update(
+            'org.freedesktop.PortalTest',
+            'CREATE GRAPH tracker:Disallowed;' +
+            'INSERT { GRAPH tracker:Disallowed { <a> a nfo:FileDataObject } }')
+
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u from tracker:Disallowed { ?u a rdfs:Resource }')
+        self.assertEqual(len(res), 0)
+
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u { graph tracker:Disallowed { ?u a rdfs:Resource } }')
+        self.assertEqual(len(res), 0)
+
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'constraint graph tracker:Disallowed select ?u { ?u a rdfs:Resource }')
+        self.assertEqual(len(res), 0)
+
+    # Test that it is not possible to break through into other services
+    def test_10_query_services(self):
+        self.start_service('org.freedesktop.PortalTest')
+        self.start_service('org.freedesktop.InaccessibleService')
+        self.update(
+            'org.freedesktop.PortalTest',
+            'CREATE GRAPH tracker:Allowed;' +
+            'INSERT { GRAPH tracker:Allowed { <a> a nfo:FileDataObject } }')
+        self.update(
+            'org.freedesktop.InaccessibleService',
+            'CREATE GRAPH tracker:Allowed;' +
+            'INSERT { GRAPH tracker:Allowed { <b> a nfo:FileDataObject } }')
+
+        try:
+            exception = None
+            res = self.query(
+                'org.freedesktop.PortalTest',
+                'select ?u { service <dbus:org.freedesktop.InaccessibleService> { ?u a rdfs:Resource } }')
+        except Exception as e:
+             exception = e;
+        finally:
+            self.assertIsNotNone(exception)
+
+        try:
+            exception = None
+            res = self.query(
+                'org.freedesktop.InaccessibleService',
+                'select ?u { ?u a rdfs:Resource }')
+        except Exception as e:
+             exception = e;
+        finally:
+            self.assertIsNotNone(exception)
+
+    # Test that property paths resolve correctly across allowed
+    # and disallowed graphs
+    def test_11_query_property_paths(self):
+        self.start_service('org.freedesktop.PortalTest')
+        self.update(
+            'org.freedesktop.PortalTest',
+            'CREATE GRAPH tracker:Disallowed;' +
+            'INSERT { GRAPH tracker:Disallowed { ' +
+            '  <a> a nfo:FileDataObject ; nfo:fileName "A" ; nie:interpretedAs <b1> .' +
+            '  <b1> a nmm:MusicPiece ; nie:isStoredAs <a> ; nie:title "title2" } }')
+
+        # Test property paths with allowed/disallowed graphs in both ends
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u ?t { ?u nie:interpretedAs/nie:title ?t }')
+        self.assertEqual(len(res), 0)
+
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u ?fn { ?u nie:isStoredAs/nfo:fileName ?fn }')
+        self.assertEqual(len(res), 0)
+
+        # Insert a resource in the allowed graph
+        self.update(
+            'org.freedesktop.PortalTest',
+            'CREATE GRAPH tracker:Allowed;' +
+            'INSERT { GRAPH tracker:Allowed { ' +
+            '  <a> a nfo:FileDataObject ; nfo:fileName "A" ; nie:interpretedAs <a1> .' +
+            '  <a1> a nmm:MusicPiece ; nie:isStoredAs <a> ; nie:title "title1" } }')
+
+        # Try the same queries again
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u ?t { ?u nie:interpretedAs/nie:title ?t }')
+        self.assertEqual(len(res), 1)
+        self.assertEqual(res[0][0], 'a')
+        self.assertEqual(res[0][1], 'title1')
+
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u ?fn { ?u nie:isStoredAs/nfo:fileName ?fn }')
+        self.assertEqual(len(res), 1)
+        self.assertEqual(res[0][0], 'a1')
+        self.assertEqual(res[0][1], 'A')
+
+        # Delete the allowed resource again
+        self.update(
+            'org.freedesktop.PortalTest',
+            'DROP GRAPH tracker:Allowed')
+
+        # Query results should revert to the original values
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u ?t { ?u nie:interpretedAs/nie:title ?t }')
+        self.assertEqual(len(res), 0)
+
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u ?fn { ?u nie:isStoredAs/nfo:fileName ?fn }')
+        self.assertEqual(len(res), 0)
+
+    # Test that property paths resolve correctly across allowed
+    # and disallowed graphs
+    def test_12_query_fts(self):
+        self.start_service('org.freedesktop.PortalTest')
+        self.update(
+            'org.freedesktop.PortalTest',
+            'CREATE GRAPH tracker:Disallowed;' +
+            'INSERT { GRAPH tracker:Disallowed { ' +
+            '  <a> a nfo:FileDataObject ; nie:interpretedAs <b1> .' +
+            '  <b1> a nmm:MusicPiece ; nie:isStoredAs <a> ; nie:title "apples and oranges" } }')
+
+        # Query for both keywords, they are expected to be non-visible
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u { ?u fts:match "apples" }')
+        self.assertEqual(len(res), 0)
+
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u { ?u fts:match "oranges" }')
+        self.assertEqual(len(res), 0)
+
+        # Insert a resource in the allowed graph
+        self.update(
+            'org.freedesktop.PortalTest',
+            'CREATE GRAPH tracker:Allowed;' +
+            'INSERT { GRAPH tracker:Allowed { ' +
+            '  <a> a nfo:FileDataObject ; nfo:fileName "file name" ; nie:interpretedAs <a1> .' +
+            '  <a1> a nmm:MusicPiece ; nie:isStoredAs <a> ; nie:title "apples" } }')
+
+        # Try the queries again, we should get a match from the allowed graph for 'apples'
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u { ?u fts:match "apples" }')
+        self.assertEqual(len(res), 1)
+        self.assertEqual(res[0][0], 'a1')
+
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u { ?u fts:match "oranges" }')
+        self.assertEqual(len(res), 0)
+
+        # Delete the allowed resource again
+        self.update(
+            'org.freedesktop.PortalTest',
+            'DROP GRAPH tracker:Allowed')
+
+        # The query results should revert to the original values
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u { ?u fts:match "apples" }')
+        self.assertEqual(len(res), 0)
+
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?u { ?u fts:match "oranges" }')
+        self.assertEqual(len(res), 0)
+
+    # Test that property paths resolve correctly across allowed
+    # and disallowed graphs
+    def test_13_query_unrestricted_triples(self):
+        self.start_service('org.freedesktop.PortalTest')
+        self.update(
+            'org.freedesktop.PortalTest',
+            'CREATE GRAPH tracker:Disallowed;' +
+            'INSERT { GRAPH tracker:Disallowed { ' +
+            '  <a> a nfo:FileDataObject ; nfo:fileName "A" . } }')
+
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?s { ?s ?p "A" }')
+        self.assertEqual(len(res), 0)
+
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'ASK { <a> ?p "A" }')
+        self.assertEqual(len(res), 1)
+        self.assertNotEqual(res[0][0], 'true')
+
+        # Insert a resource in the allowed graph
+        self.update(
+            'org.freedesktop.PortalTest',
+            'CREATE GRAPH tracker:Allowed;' +
+            'INSERT { GRAPH tracker:Allowed { ' +
+            '  <a> a nfo:FileDataObject ; nfo:fileName "A" . } }')
+
+        # Try the queries again
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?s { ?s ?p "A" }')
+        self.assertEqual(len(res), 1)
+        self.assertEqual(res[0][0], 'a')
+
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'ASK { <a> ?p "A" }')
+        self.assertEqual(len(res), 1)
+        self.assertEqual(res[0][0], 'true')
+
+        # Delete the allowed resource again
+        self.update(
+            'org.freedesktop.PortalTest',
+            'DROP GRAPH tracker:Allowed')
+
+        # The query results should revert to the original values
+        res = self.query(
+            'org.freedesktop.PortalTest',
+            'select ?s { ?s ?p "A" }')
+        self.assertEqual(len(res), 0)
+
+
 if __name__ == '__main__':
     fixtures.tracker_test_main()


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]