diff --git a/test/spell_check.words b/test/spell_check.words
index d20de34..b5f6f99 100644
--- a/test/spell_check.words
+++ b/test/spell_check.words
@@ -17,6 +17,7 @@ deps
descs
dpkg
dsetuptools
+foobar
github
https
iterdir
diff --git a/test/test_package_identification_ros.py b/test/test_package_identification_ros.py
new file mode 100644
index 0000000..80f5106
--- /dev/null
+++ b/test/test_package_identification_ros.py
@@ -0,0 +1,109 @@
+# Copyright 2016-2018 Dirk Thomas
+# Copyright 2024 Open Source Robotics Foundation, Inc.
+# Licensed under the Apache License, Version 2.0
+
+from pathlib import Path
+from tempfile import TemporaryDirectory
+
+from colcon_core.package_descriptor import PackageDescriptor
+from colcon_core.package_identification import IgnoreLocationException
+from colcon_ros.package_identification.ros import _cached_packages
+from colcon_ros.package_identification.ros import RosPackageIdentification
+import pytest
+
+
+def test_identify():
+ extension = RosPackageIdentification()
+ augmentation_extension = extension
+
+ with TemporaryDirectory(prefix='test_colcon_') as basepath:
+ desc = PackageDescriptor(basepath)
+ desc.type = 'other'
+ assert extension.identify(desc) is None
+ assert desc.name is None
+
+ _cached_packages.clear()
+ desc.type = None
+ assert extension.identify(desc) is None
+ assert desc.name is None
+ assert desc.type is None
+
+ _cached_packages.clear()
+ basepath = Path(basepath)
+ for marker in ('AMENT_IGNORE', 'CATKIN_IGNORE'):
+ marker_path = basepath / marker
+ marker_path.touch()
+ with pytest.raises(IgnoreLocationException):
+ extension.identify(desc)
+ marker_path.unlink()
+
+ _cached_packages.clear()
+ (basepath / 'package.xml').write_text(
+ '\n'
+ ' pkg-name\n'
+ ' 0.0.0\n'
+ ' test package\n'
+ ' Foo Bar\n'
+ ' Apache-2.0\n'
+ '\n')
+ assert extension.identify(desc) is None
+ assert desc.name == 'pkg-name'
+ assert desc.type == 'ros.catkin'
+ assert not desc.dependencies
+ assert not desc.metadata
+
+ augmentation_extension.augment_packages([desc])
+ assert desc.metadata['version'] == '0.0.0'
+ # TODO: This is a behavior deviation from colcon-core
+ # assert set(desc.dependencies.keys()) == {'build', 'run', 'test'}
+ assert not desc.dependencies['build']
+ assert not desc.dependencies['run']
+ assert not desc.dependencies['test']
+
+ _cached_packages.clear()
+ desc = PackageDescriptor(basepath)
+ (basepath / 'package.xml').write_text(
+ '\n'
+ ' other-name\n'
+ ' 0.0.0\n'
+ ' test package\n'
+ ' Foo Bar\n'
+ ' Apache-2.0\n'
+ ' build\n'
+ ' '
+ 'runA\n'
+ ' test\n'
+ ' runB\n'
+ ' \n'
+ ' ament_cmake\n'
+ ' \n'
+ '\n')
+ assert extension.identify(desc) is None
+ assert desc.name == 'other-name'
+ assert desc.type == 'ros.ament_cmake'
+ assert not desc.dependencies
+ assert not desc.metadata
+
+ augmentation_extension.augment_packages([desc])
+ assert desc.metadata['version'] == '0.0.0'
+ assert set(desc.dependencies.keys()) == {'build', 'run', 'test'}
+ assert desc.dependencies['build'] == {'build'}
+ assert desc.dependencies['run'] == {'runA', 'runB'}
+ dep = next(x for x in desc.dependencies['run'] if x == 'runA')
+ assert dep.metadata['version_gt'] == '1.2.3'
+ assert desc.dependencies['test'] == {'test'}
+
+ assert desc.metadata['maintainers'] == ['Foo Bar ']
+
+ _cached_packages.clear()
+ desc = PackageDescriptor(basepath)
+ (basepath / 'manifest.xml').touch()
+ assert extension.identify(desc) is None
+ assert desc.type == 'ros.ament_cmake'
+
+ _cached_packages.clear()
+ desc = PackageDescriptor(basepath)
+ (basepath / 'package.xml').unlink()
+ with pytest.raises(IgnoreLocationException):
+ extension.identify(desc)
+ (basepath / 'manifest.xml').unlink()