diff --git a/sros2/test/policies/permissions/add_two_ints/permissions.xml b/sros2/test/policies/permissions/add_two_ints/permissions.xml
new file mode 100644
index 00000000..9d811774
--- /dev/null
+++ b/sros2/test/policies/permissions/add_two_ints/permissions.xml
@@ -0,0 +1,106 @@
+
+
+
+ CN=/add_two_ints_server
+
+ 2013-10-26T00:00:00
+ 2023-10-26T22:45:30
+
+
+
+ 0
+
+
+
+ rq/add_two_ints_server/describe_parametersRequest
+ rq/add_two_ints_server/get_parameter_typesRequest
+ rq/add_two_ints_server/get_parametersRequest
+ rq/add_two_ints_server/list_parametersRequest
+ rq/add_two_ints_server/set_parametersRequest
+ rq/add_two_ints_server/set_parameters_atomicallyRequest
+ rr/add_two_intsReply
+ rr/add_two_ints_server/describe_parametersReply
+ rr/add_two_ints_server/get_parameter_typesReply
+ rr/add_two_ints_server/get_parametersReply
+ rr/add_two_ints_server/list_parametersReply
+ rr/add_two_ints_server/set_parametersReply
+ rr/add_two_ints_server/set_parameters_atomicallyReply
+ rt/parameter_events
+ rt/rosout
+
+
+
+
+ rq/add_two_intsRequest
+ rq/add_two_ints_server/describe_parametersRequest
+ rq/add_two_ints_server/get_parameter_typesRequest
+ rq/add_two_ints_server/get_parametersRequest
+ rq/add_two_ints_server/list_parametersRequest
+ rq/add_two_ints_server/set_parametersRequest
+ rq/add_two_ints_server/set_parameters_atomicallyRequest
+ rr/add_two_ints_server/describe_parametersReply
+ rr/add_two_ints_server/get_parameter_typesReply
+ rr/add_two_ints_server/get_parametersReply
+ rr/add_two_ints_server/list_parametersReply
+ rr/add_two_ints_server/set_parametersReply
+ rr/add_two_ints_server/set_parameters_atomicallyReply
+ rt/clock
+ rt/parameter_events
+
+
+
+ DENY
+
+
+ CN=/add_two_ints_client
+
+ 2013-10-26T00:00:00
+ 2023-10-26T22:45:30
+
+
+
+ 0
+
+
+
+ rq/add_two_intsRequest
+ rq/add_two_ints_client/describe_parametersRequest
+ rq/add_two_ints_client/get_parameter_typesRequest
+ rq/add_two_ints_client/get_parametersRequest
+ rq/add_two_ints_client/list_parametersRequest
+ rq/add_two_ints_client/set_parametersRequest
+ rq/add_two_ints_client/set_parameters_atomicallyRequest
+ rr/add_two_ints_client/describe_parametersReply
+ rr/add_two_ints_client/get_parameter_typesReply
+ rr/add_two_ints_client/get_parametersReply
+ rr/add_two_ints_client/list_parametersReply
+ rr/add_two_ints_client/set_parametersReply
+ rr/add_two_ints_client/set_parameters_atomicallyReply
+ rt/parameter_events
+ rt/rosout
+
+
+
+
+ rq/add_two_ints_client/describe_parametersRequest
+ rq/add_two_ints_client/get_parameter_typesRequest
+ rq/add_two_ints_client/get_parametersRequest
+ rq/add_two_ints_client/list_parametersRequest
+ rq/add_two_ints_client/set_parametersRequest
+ rq/add_two_ints_client/set_parameters_atomicallyRequest
+ rr/add_two_intsReply
+ rr/add_two_ints_client/describe_parametersReply
+ rr/add_two_ints_client/get_parameter_typesReply
+ rr/add_two_ints_client/get_parametersReply
+ rr/add_two_ints_client/list_parametersReply
+ rr/add_two_ints_client/set_parametersReply
+ rr/add_two_ints_client/set_parameters_atomicallyReply
+ rt/clock
+ rt/parameter_events
+
+
+
+ DENY
+
+
+
diff --git a/sros2/test/policies/permissions/minimal_action/permissions.xml b/sros2/test/policies/permissions/minimal_action/permissions.xml
new file mode 100644
index 00000000..5f700361
--- /dev/null
+++ b/sros2/test/policies/permissions/minimal_action/permissions.xml
@@ -0,0 +1,118 @@
+
+
+
+ CN=/minimal_action_server
+
+ 2013-10-26T00:00:00
+ 2023-10-26T22:45:30
+
+
+
+ 0
+
+
+
+ rq/minimal_action_server/describe_parametersRequest
+ rq/minimal_action_server/get_parameter_typesRequest
+ rq/minimal_action_server/get_parametersRequest
+ rq/minimal_action_server/list_parametersRequest
+ rq/minimal_action_server/set_parametersRequest
+ rq/minimal_action_server/set_parameters_atomicallyRequest
+ rr/fibonacci/_action/cancel_goalReply
+ rr/fibonacci/_action/get_resultReply
+ rr/fibonacci/_action/send_goalReply
+ rt/fibonacci/_action/feedback
+ rt/fibonacci/_action/status
+ rr/minimal_action_server/describe_parametersReply
+ rr/minimal_action_server/get_parameter_typesReply
+ rr/minimal_action_server/get_parametersReply
+ rr/minimal_action_server/list_parametersReply
+ rr/minimal_action_server/set_parametersReply
+ rr/minimal_action_server/set_parameters_atomicallyReply
+ rt/parameter_events
+ rt/rosout
+
+
+
+
+ rq/fibonacci/_action/cancel_goalRequest
+ rq/fibonacci/_action/get_resultRequest
+ rq/fibonacci/_action/send_goalRequest
+ rq/minimal_action_server/describe_parametersRequest
+ rq/minimal_action_server/get_parameter_typesRequest
+ rq/minimal_action_server/get_parametersRequest
+ rq/minimal_action_server/list_parametersRequest
+ rq/minimal_action_server/set_parametersRequest
+ rq/minimal_action_server/set_parameters_atomicallyRequest
+ rr/minimal_action_server/describe_parametersReply
+ rr/minimal_action_server/get_parameter_typesReply
+ rr/minimal_action_server/get_parametersReply
+ rr/minimal_action_server/list_parametersReply
+ rr/minimal_action_server/set_parametersReply
+ rr/minimal_action_server/set_parameters_atomicallyReply
+ rt/clock
+ rt/parameter_events
+
+
+
+ DENY
+
+
+ CN=/minimal_action_client
+
+ 2013-10-26T00:00:00
+ 2023-10-26T22:45:30
+
+
+
+ 0
+
+
+
+ rq/fibonacci/_action/cancel_goalRequest
+ rq/fibonacci/_action/get_resultRequest
+ rq/fibonacci/_action/send_goalRequest
+ rq/minimal_action_client/describe_parametersRequest
+ rq/minimal_action_client/get_parameter_typesRequest
+ rq/minimal_action_client/get_parametersRequest
+ rq/minimal_action_client/list_parametersRequest
+ rq/minimal_action_client/set_parametersRequest
+ rq/minimal_action_client/set_parameters_atomicallyRequest
+ rr/minimal_action_client/describe_parametersReply
+ rr/minimal_action_client/get_parameter_typesReply
+ rr/minimal_action_client/get_parametersReply
+ rr/minimal_action_client/list_parametersReply
+ rr/minimal_action_client/set_parametersReply
+ rr/minimal_action_client/set_parameters_atomicallyReply
+ rt/parameter_events
+ rt/rosout
+
+
+
+
+ rq/minimal_action_client/describe_parametersRequest
+ rq/minimal_action_client/get_parameter_typesRequest
+ rq/minimal_action_client/get_parametersRequest
+ rq/minimal_action_client/list_parametersRequest
+ rq/minimal_action_client/set_parametersRequest
+ rq/minimal_action_client/set_parameters_atomicallyRequest
+ rr/fibonacci/_action/cancel_goalReply
+ rr/fibonacci/_action/get_resultReply
+ rr/fibonacci/_action/send_goalReply
+ rt/fibonacci/_action/feedback
+ rt/fibonacci/_action/status
+ rr/minimal_action_client/describe_parametersReply
+ rr/minimal_action_client/get_parameter_typesReply
+ rr/minimal_action_client/get_parametersReply
+ rr/minimal_action_client/list_parametersReply
+ rr/minimal_action_client/set_parametersReply
+ rr/minimal_action_client/set_parameters_atomicallyReply
+ rt/clock
+ rt/parameter_events
+
+
+
+ DENY
+
+
+
diff --git a/sros2/test/policies/permissions.xml b/sros2/test/policies/permissions/sample/permissions.xml
similarity index 100%
rename from sros2/test/policies/permissions.xml
rename to sros2/test/policies/permissions/sample/permissions.xml
diff --git a/sros2/test/policies/permissions/talker_listener/permissions.xml b/sros2/test/policies/permissions/talker_listener/permissions.xml
new file mode 100644
index 00000000..f7065f5f
--- /dev/null
+++ b/sros2/test/policies/permissions/talker_listener/permissions.xml
@@ -0,0 +1,104 @@
+
+
+
+ CN=/talker
+
+ 2013-10-26T00:00:00
+ 2023-10-26T22:45:30
+
+
+
+ 0
+
+
+
+ rq/talker/describe_parametersRequest
+ rq/talker/get_parameter_typesRequest
+ rq/talker/get_parametersRequest
+ rq/talker/list_parametersRequest
+ rq/talker/set_parametersRequest
+ rq/talker/set_parameters_atomicallyRequest
+ rr/talker/describe_parametersReply
+ rr/talker/get_parameter_typesReply
+ rr/talker/get_parametersReply
+ rr/talker/list_parametersReply
+ rr/talker/set_parametersReply
+ rr/talker/set_parameters_atomicallyReply
+ rt/chatter
+ rt/parameter_events
+ rt/rosout
+
+
+
+
+ rq/talker/describe_parametersRequest
+ rq/talker/get_parameter_typesRequest
+ rq/talker/get_parametersRequest
+ rq/talker/list_parametersRequest
+ rq/talker/set_parametersRequest
+ rq/talker/set_parameters_atomicallyRequest
+ rr/talker/describe_parametersReply
+ rr/talker/get_parameter_typesReply
+ rr/talker/get_parametersReply
+ rr/talker/list_parametersReply
+ rr/talker/set_parametersReply
+ rr/talker/set_parameters_atomicallyReply
+ rt/clock
+ rt/parameter_events
+
+
+
+ DENY
+
+
+ CN=/listener
+
+ 2013-10-26T00:00:00
+ 2023-10-26T22:45:30
+
+
+
+ 0
+
+
+
+ rq/listener/describe_parametersRequest
+ rq/listener/get_parameter_typesRequest
+ rq/listener/get_parametersRequest
+ rq/listener/list_parametersRequest
+ rq/listener/set_parametersRequest
+ rq/listener/set_parameters_atomicallyRequest
+ rr/listener/describe_parametersReply
+ rr/listener/get_parameter_typesReply
+ rr/listener/get_parametersReply
+ rr/listener/list_parametersReply
+ rr/listener/set_parametersReply
+ rr/listener/set_parameters_atomicallyReply
+ rt/parameter_events
+ rt/rosout
+
+
+
+
+ rq/listener/describe_parametersRequest
+ rq/listener/get_parameter_typesRequest
+ rq/listener/get_parametersRequest
+ rq/listener/list_parametersRequest
+ rq/listener/set_parametersRequest
+ rq/listener/set_parameters_atomicallyRequest
+ rr/listener/describe_parametersReply
+ rr/listener/get_parameter_typesReply
+ rr/listener/get_parametersReply
+ rr/listener/list_parametersReply
+ rr/listener/set_parametersReply
+ rr/listener/set_parameters_atomicallyReply
+ rt/chatter
+ rt/clock
+ rt/parameter_events
+
+
+
+ DENY
+
+
+
diff --git a/sros2/test/policies/policy_to_permissions.py b/sros2/test/policies/policy_to_permissions.py
index c6cc7dfb..bf78ee40 100644
--- a/sros2/test/policies/policy_to_permissions.py
+++ b/sros2/test/policies/policy_to_permissions.py
@@ -12,7 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import os
+import glob
+from pathlib import Path
from lxml import etree
@@ -32,21 +33,29 @@
permissions_xsl = etree.XSLT(etree.parse(permissions_xsl_path))
permissions_xsd = etree.XMLSchema(etree.parse(permissions_xsd_path))
-# Get policy
-policy_xml_path = 'sample.policy.xml'
-policy_xml = etree.parse(policy_xml_path)
-policy_xml.xinclude()
+for policy_xml_path in glob.glob('*.policy.xml'):
-# Validate policy schema
-policy_xsd.assertValid(policy_xml)
+ # Get policy
+ policy_xml = etree.parse(policy_xml_path)
+ policy_xml.xinclude()
-# Transform policy
-permissions_xml = permissions_xsl(policy_xml)
+ # Validate policy schema
+ policy_xsd.assertValid(policy_xml)
-# Validate permissions schema
-permissions_xsd.assertValid(permissions_xml)
+ # Transform policy
+ permissions_xml = permissions_xsl(policy_xml)
-# Output permissions
-permissions_xml_path = os.path.join('permissions.xml')
-with open(permissions_xml_path, 'w') as f:
- f.write(etree.tostring(permissions_xml, pretty_print=True).decode())
+ # Validate permissions schema
+ permissions_xsd.assertValid(permissions_xml)
+
+ # Get permissions directory
+ policy_name = Path(policy_xml_path).name
+ index_of_dot = policy_name.index('.')
+ policy_name = policy_name[:index_of_dot]
+ permissions_dir = Path('permissions') / policy_name
+ permissions_dir.mkdir(parents=True, exist_ok=True)
+
+ # Output permissions
+ permissions_xml_path = permissions_dir / 'permissions.xml'
+ with open(permissions_xml_path, 'w') as f:
+ f.write(etree.tostring(permissions_xml, pretty_print=True).decode())
diff --git a/sros2/test/test_policy_to_permissions.py b/sros2/test/test_policy_to_permissions.py
index 487e8da6..2b5c3942 100644
--- a/sros2/test/test_policy_to_permissions.py
+++ b/sros2/test/test_policy_to_permissions.py
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import os
+from pathlib import Path
from lxml import etree
@@ -35,9 +35,9 @@ def test_policy_to_permissions():
permissions_xsd = etree.XMLSchema(etree.parse(permissions_xsd_path))
# Get policy
- test_dir = os.path.dirname(os.path.abspath(__file__))
- policy_xml_path = os.path.join(test_dir, 'policies', 'sample.policy.xml')
- policy_xml = etree.parse(policy_xml_path)
+ test_dir = Path(__file__).resolve().parent
+ policy_xml_path = test_dir / 'policies' / 'sample.policy.xml'
+ policy_xml = etree.parse(str(policy_xml_path))
policy_xml.xinclude()
# Validate policy schema
@@ -50,8 +50,8 @@ def test_policy_to_permissions():
permissions_xsd.assertValid(permissions_xml)
# Assert expected permissions
- permissions_xml_path = os.path.join(test_dir, 'policies', 'permissions.xml')
- with open(permissions_xml_path) as f:
+ permissions_xml_path = test_dir / 'policies' / 'permissions' / 'sample' / 'permissions.xml'
+ with permissions_xml_path.open() as f:
expected = f.read()
actual = etree.tostring(permissions_xml, pretty_print=True).decode()
assert actual == expected