diff --git a/source/extensions/isaacsim.core.nodes/python/impl/base_writer_node.py b/source/extensions/isaacsim.core.nodes/python/impl/base_writer_node.py index e23e955057..a9d8aa0cce 100644 --- a/source/extensions/isaacsim.core.nodes/python/impl/base_writer_node.py +++ b/source/extensions/isaacsim.core.nodes/python/impl/base_writer_node.py @@ -140,7 +140,12 @@ def _process_activation_requests(self, event: carb.eventdispatcher.Event) -> Non noop = rep.AnnotatorRegistry.get_annotator( "IsaacNoop", ) - noop.attach([request.render_product_path]) + render_products = ( + request.render_product_path + if isinstance(request.render_product_path, list) + else [request.render_product_path] + ) + noop.attach(render_products) carb.log_info(f"Attaching:\n{request}") else: request.writer.detach() diff --git a/source/extensions/isaacsim.core.nodes/python/tests/test_base_writer_node.py b/source/extensions/isaacsim.core.nodes/python/tests/test_base_writer_node.py new file mode 100644 index 0000000000..fd7d5de1fd --- /dev/null +++ b/source/extensions/isaacsim.core.nodes/python/tests/test_base_writer_node.py @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Tests for BaseWriterNode render-product attachment handling.""" + +from unittest.mock import MagicMock, patch + +import omni.kit.test +from isaacsim.core.nodes import BaseWriterNode, WriterRequest + + +class TestBaseWriterNode(omni.kit.test.AsyncTestCase): + """Validate writer activation requests.""" + + @patch("isaacsim.core.nodes.impl.base_writer_node.Usd.EditContext") + @patch("isaacsim.core.nodes.impl.base_writer_node.omni.usd.get_context") + @patch("isaacsim.core.nodes.impl.base_writer_node.rep.AnnotatorRegistry.get_annotator") + async def test_noop_annotator_preserves_render_product_list( + self, mock_get_annotator: MagicMock, mock_get_context: MagicMock, mock_edit_context: MagicMock + ) -> None: + """A list of render products must not be wrapped in another list.""" + stage = MagicMock() + mock_get_context.return_value.get_stage.return_value = stage + mock_edit_context.return_value.__enter__.return_value = None + mock_edit_context.return_value.__exit__.return_value = False + + writer = MagicMock() + writer.node_type_id = "TestWriter" + writer._kwargs = {} + writer._annotators = [] + noop = mock_get_annotator.return_value + + render_products = ["/Render/ProductA", "/Render/ProductB"] + node = BaseWriterNode() + node.post_attach = MagicMock() + node._requests = [WriterRequest(writer, render_products, True)] + + node._process_activation_requests(MagicMock()) + + writer.attach.assert_called_once_with(render_products) + noop.attach.assert_called_once_with(render_products)