Skip to content

Commit

Permalink
Fix plugin xml parsing with multiple library tags (#268)
Browse files Browse the repository at this point in the history
* Fix plugin xml parsing with multiple library tags

* Add bazel_ros2_rules tests to CI
  • Loading branch information
sloretz authored Mar 27, 2023
1 parent 8ee3f11 commit 14d52a3
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 6 deletions.
15 changes: 12 additions & 3 deletions .github/workflows/bazelized.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@ jobs:
run: du -hs $(readlink -f /home/runner/.cache/ci)
- name: Simplify apt upgrades
run: .github/simplify_apt_and_upgrades.sh
- name: Configure Bazel for CI
- name: Configure Bazel for CI (bazel_ros2_rules)
run: ln -s ../.github/ci.bazelrc ./user.bazelrc
working-directory: bazel_ros2_rules
- name: Configure Bazel for CI (ros2_example_bazel_installed)
run: ln -s ../.github/ci.bazelrc ./user.bazelrc
working-directory: ros2_example_bazel_installed
- name: Install prerequisites
Expand All @@ -43,9 +46,15 @@ jobs:
- name: Test lint
run: ./fix_bazel_lint.sh --test
working-directory: .
- name: Build Bazel workspace
- name: Build Bazel workspace (bazel_ros2_rules)
run: bazel build //...
working-directory: bazel_ros2_rules
- name: Test Bazel workspace (bazel_ros2_rules)
run: bazel test //...
working-directory: bazel_ros2_rules
- name: Build Bazel workspace (ros2_example_installed)
run: bazel build //...
working-directory: ros2_example_bazel_installed
- name: Test Bazel workspace
- name: Test Bazel workspace (ros2_example_installed)
run: bazel test //... @ros2//...
working-directory: ros2_example_bazel_installed
21 changes: 21 additions & 0 deletions bazel_ros2_rules/ros2/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,24 @@ py_library(
)

run_calculate_rosidl_capitalization_tests()

py_library(
name = "cmake_tools_py",
srcs = glob(["resources/cmake_tools/**/*.py"]),
imports = ["resources"],
visibility = ["//visibility:private"],
)

py_library(
name = "ros2bzl_py",
srcs = glob(["resources/ros2bzl/**/*.py"]),
imports = ["resources"],
visibility = ["//visibility:private"],
deps = [":cmake_tools_py"],
)

py_test(
name = "plugin_xml_parsing_test",
srcs = ["plugin_xml_parsing_test.py"],
deps = [":ros2bzl_py"],
)
62 changes: 62 additions & 0 deletions bazel_ros2_rules/ros2/plugin_xml_parsing_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import tempfile
import unittest

from ros2bzl.scraping.metadata import parse_plugins_description_xml


class PluginXmlParsingTest(unittest.TestCase):

def test_one_library(self):
with tempfile.NamedTemporaryFile(mode='w') as pxml:
pxml.write("""
<library path="foobar">
<class type="pkg::FooBar" base_class_type="pkg::World">
<description>baz</description>
</class>
</library>
""")
pxml.flush()
result = parse_plugins_description_xml(pxml.name)
self.assertIn('plugin_libraries', result)
self.assertEqual(['foobar'], result['plugin_libraries'])

def test_class_libraries_one_library(self):
with tempfile.NamedTemporaryFile(mode='w') as pxml:
pxml.write("""
<class_libraries>
<library path="foobar">
<class type="pkg::FooBar" base_class_type="pkg::World">
<description>foobar?</description>
</class>
</library>
</class_libraries>
""")
pxml.flush()
result = parse_plugins_description_xml(pxml.name)
self.assertIn('plugin_libraries', result)
self.assertEqual(['foobar'], result['plugin_libraries'])

def test_class_libraries_two_library(self):
with tempfile.NamedTemporaryFile(mode='w') as pxml:
pxml.write("""
<class_libraries>
<library path="foobar">
<class type="pkg::FooBar" base_class_type="pkg::World">
<description>foobar?</description>
</class>
</library>
<library path="bazfoo">
<class type="pkg::BazFoo" base_class_type="pkg::World">
<description>bazfoo?</description>
</class>
</library>
</class_libraries>
""")
pxml.flush()
result = parse_plugins_description_xml(pxml.name)
self.assertIn('plugin_libraries', result)
self.assertEqual(['foobar', 'bazfoo'], result['plugin_libraries'])


if __name__ == '__main__':
unittest.main()
7 changes: 6 additions & 1 deletion bazel_ros2_rules/ros2/resources/ros2bzl/scraping/__init__.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import os

import ament_index_python
import cmake_tools

from ros2bzl.scraping.metadata import collect_cmake_package_metadata
from ros2bzl.scraping.metadata import collect_ros_package_metadata


def list_all_executables():
# Delay import to allow testing most of ros2bzl without a ros2 workspace
import ament_index_python
executables = {}
for prefix in ament_index_python.get_packages_with_prefixes().values():
bindir = os.path.join(prefix, 'bin')
Expand All @@ -23,6 +24,8 @@ def list_all_executables():


def index_all_packages():
# Delay import to allow testing most of ros2bzl without a ros2 workspace
import ament_index_python
packages = {
name: collect_ros_package_metadata(name, prefix)
for name, prefix in
Expand Down Expand Up @@ -87,6 +90,8 @@ def build_dependency_graph(packages, include=None, exclude=None):


def scrape_distribution(include=None, exclude=None):
# Delay import to allow testing most of ros2bzl without a ros2 workspace
import ament_index_python
packages, dependency_graph = build_dependency_graph(
index_all_packages(), include, exclude)
executables = list_all_executables()
Expand Down
11 changes: 9 additions & 2 deletions bazel_ros2_rules/ros2/resources/ros2bzl/scraping/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,15 @@ def parse_package_xml(path_to_package_xml):
def parse_plugins_description_xml(path_to_plugins_description_xml):
plugins_description_xml = ET.parse(path_to_plugins_description_xml)
root = plugins_description_xml.getroot()
assert root.tag == 'library'
return dict(plugin_libraries=[root.attrib['path']])
libraries = []
assert root.tag in ['class_libraries', 'library']
if 'class_libraries' == root.tag:
for child in root.findall('library'):
libraries.append(child.attrib['path'])
else:
libraries.append(root.attrib['path'])
assert libraries
return dict(plugin_libraries=libraries)


def find_executables(base_path):
Expand Down
1 change: 1 addition & 0 deletions run_all_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ cd $(dirname "$me")
set -x
(./fix_bazel_lint.sh --test ) && \
(cd bazel_ros2_rules && bazel build //...) && \
(cd bazel_ros2_rules && bazel test //...) && \
(cd drake_ros && bazel test //...) && \
(cd drake_ros_examples && bazel test //...) && \
(cd ros2_example_bazel_installed && bazel test //... @ros2//...) && \
Expand Down

0 comments on commit 14d52a3

Please sign in to comment.