summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-03-13 14:04:03 +0100
committerCarlos Garnacho <carlosg@gnome.org>2022-03-13 15:28:15 +0100
commit02129107d36c0bd5d7ac15f580f71739b9471aa4 (patch)
treeeda53bcb1dc2799be8d8bba2e6c65a254e832145
parent38b337e06202419d2a50202981abc14aa5b9d1a2 (diff)
downloadtracker-02129107d36c0bd5d7ac15f580f71739b9471aa4.tar.gz
tests: Add more thorough portal tests
Test all corners in graph lookups, and whether visibility changes accordingly with graph modifications.
-rw-r--r--tests/functional-tests/portal.py324
1 files changed, 318 insertions, 6 deletions
diff --git a/tests/functional-tests/portal.py b/tests/functional-tests/portal.py
index 373bf8d5b..057ea3f10 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,308 @@ 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 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')
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u ?fn { GRAPH tracker:Disallowed { ?u nie:isStoredAs/nfo:fileName ?fn } }')
+ self.assertEqual(len(res), 0)
+
+ # 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)
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?u { GRAPH tracker:Disallowed { ?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')
+
+ res = self.query(
+ 'org.freedesktop.PortalTest',
+ 'select ?s { GRAPH tracker:Disallowed { ?s ?p "A" } }')
+ 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 ?s { ?s ?p "A" }')
+ self.assertEqual(len(res), 0)
+
+
if __name__ == '__main__':
fixtures.tracker_test_main()