diff --git a/features/test/ros2/assets/minimal_package/CMakeLists.txt b/features/test/ros2/assets/minimal_package/CMakeLists.txt
new file mode 100644
index 0000000..7c67ae5
--- /dev/null
+++ b/features/test/ros2/assets/minimal_package/CMakeLists.txt
@@ -0,0 +1,14 @@
+cmake_minimum_required(VERSION 3.8)
+project(devcontainers_minimal)
+
+find_package(ament_cmake REQUIRED)
+
+add_executable(devcontainers_minimal_node src/main.cpp)
+install(TARGETS devcontainers_minimal_node DESTINATION lib/${PROJECT_NAME})
+
+if(BUILD_TESTING)
+ find_package(ament_cmake_gtest REQUIRED)
+ ament_add_gtest(devcontainers_minimal_test test/test_main.cpp)
+endif()
+
+ament_package()
diff --git a/features/test/ros2/assets/minimal_package/package.xml b/features/test/ros2/assets/minimal_package/package.xml
new file mode 100644
index 0000000..e6bcf2b
--- /dev/null
+++ b/features/test/ros2/assets/minimal_package/package.xml
@@ -0,0 +1,15 @@
+
+
+ devcontainers_minimal
+ 0.0.0
+ Minimal package used to validate the ROS 2 development environment.
+ Devcontainers test
+ Apache-2.0
+
+ ament_cmake
+ ament_cmake_gtest
+
+
+ ament_cmake
+
+
diff --git a/features/test/ros2/assets/minimal_package/src/main.cpp b/features/test/ros2/assets/minimal_package/src/main.cpp
new file mode 100644
index 0000000..cf76d03
--- /dev/null
+++ b/features/test/ros2/assets/minimal_package/src/main.cpp
@@ -0,0 +1,7 @@
+#include
+
+int main()
+{
+ std::cout << "ROS 2 development environment is ready" << std::endl;
+ return 0;
+}
diff --git a/features/test/ros2/assets/minimal_package/test/test_main.cpp b/features/test/ros2/assets/minimal_package/test/test_main.cpp
new file mode 100644
index 0000000..32f8580
--- /dev/null
+++ b/features/test/ros2/assets/minimal_package/test/test_main.cpp
@@ -0,0 +1,6 @@
+#include
+
+TEST(DevcontainersMinimal, BuildsAndRuns)
+{
+ EXPECT_EQ(2 + 2, 4);
+}
diff --git a/features/test/ros2/test.sh b/features/test/ros2/test.sh
index 4646e8a..c52c94a 100755
--- a/features/test/ros2/test.sh
+++ b/features/test/ros2/test.sh
@@ -15,4 +15,22 @@ check "absent overlay does not break shell startup" bash -lc 'command -v ros2 >/
check "effective user bashrc sources ROS profile once" bash -lc 'test "$(grep -Fc "[ -f /etc/profile.d/ros2.sh ] && . /etc/profile.d/ros2.sh" /home/vscode/.bashrc)" -eq 1'
check "colcon completion is enabled" bash -ic 'complete -p colcon >/dev/null'
+test_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+workspace="/tmp/ros2_minimal_workspace"
+
+mkdir -p "${workspace}/src"
+cp -R "${test_dir}/assets/minimal_package" "${workspace}/src/"
+cd "${workspace}"
+
+check "rosdep metadata can be updated" rosdep update
+check "workspace dependencies can be resolved" rosdep install --from-paths src --ignore-src --rosdistro "${ROS_DISTRO}" -y
+check "minimal workspace builds" colcon build --event-handlers console_direct+
+
+# shellcheck disable=SC1091
+source install/setup.bash
+
+check "minimal workspace tests run" colcon test --event-handlers console_direct+
+check "minimal workspace tests pass" colcon test-result --verbose
+check "installed workspace executable runs" "${workspace}/install/devcontainers_minimal/lib/devcontainers_minimal/devcontainers_minimal_node"
+
reportResults