diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2022-03-13 14:04:03 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2022-03-13 15:28:15 +0100 |
commit | 02129107d36c0bd5d7ac15f580f71739b9471aa4 (patch) | |
tree | eda53bcb1dc2799be8d8bba2e6c65a254e832145 | |
parent | 38b337e06202419d2a50202981abc14aa5b9d1a2 (diff) | |
download | tracker-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.py | 324 |
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() |