From edfd972114af590379a862c9f79ce20c8f476b56 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Fri, 21 Aug 2026 16:38:39 +0100 Subject: [PATCH 1/2] Initialize viewport cache before missing-viewport handling --- .../python/nodes/OgnIsaacGetViewportRenderProduct.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/extensions/isaacsim.core.nodes/python/nodes/OgnIsaacGetViewportRenderProduct.py b/source/extensions/isaacsim.core.nodes/python/nodes/OgnIsaacGetViewportRenderProduct.py index 34da2f4123..ededb09840 100644 --- a/source/extensions/isaacsim.core.nodes/python/nodes/OgnIsaacGetViewportRenderProduct.py +++ b/source/extensions/isaacsim.core.nodes/python/nodes/OgnIsaacGetViewportRenderProduct.py @@ -27,7 +27,7 @@ class OgnIsaacGetViewportRenderProductInternalState: """Per-instance cache for the viewport API resolved from the input window name.""" def __init__(self) -> None: - viewport = None + self.viewport = None class OgnIsaacGetViewportRenderProduct: @@ -60,7 +60,7 @@ def compute(db: Any) -> bool: if viewport_api: db.per_instance_state.viewport = viewport_api if db.per_instance_state.viewport is None: - carb.log_warn("viewport name {db.inputs.viewport} not found") + carb.log_warn(f"viewport name {db.inputs.viewport} not found") db.per_instance_state.initialized = False return False From b0a01cd9cf1801b3892768139c595b203cec8acc Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Fri, 21 Aug 2026 16:42:41 +0100 Subject: [PATCH 2/2] Add missing viewport regression coverage --- ...est_get_viewport_render_product_missing.py | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 source/extensions/isaacsim.core.nodes/python/tests/test_get_viewport_render_product_missing.py diff --git a/source/extensions/isaacsim.core.nodes/python/tests/test_get_viewport_render_product_missing.py b/source/extensions/isaacsim.core.nodes/python/tests/test_get_viewport_render_product_missing.py new file mode 100644 index 0000000000..58070e248e --- /dev/null +++ b/source/extensions/isaacsim.core.nodes/python/tests/test_get_viewport_render_product_missing.py @@ -0,0 +1,40 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Regression coverage for missing viewport lookup state.""" + +import importlib.util +from pathlib import Path +from types import SimpleNamespace +from unittest.mock import patch + +import omni.kit.test + + +_MODULE_PATH = Path(__file__).resolve().parents[1] / "nodes" / "OgnIsaacGetViewportRenderProduct.py" +_SPEC = importlib.util.spec_from_file_location("_ogn_get_viewport_render_product_test", _MODULE_PATH) +_MODULE = importlib.util.module_from_spec(_SPEC) +assert _SPEC.loader is not None +_SPEC.loader.exec_module(_MODULE) + + +class TestGetViewportRenderProductMissing(omni.kit.test.AsyncTestCase): + """Verify a missing viewport follows the documented False-return path.""" + + async def test_missing_viewport_does_not_raise_for_uninitialized_cache(self) -> None: + state = _MODULE.OgnIsaacGetViewportRenderProductInternalState() + db = SimpleNamespace( + per_instance_state=state, + inputs=SimpleNamespace(viewport="MissingViewport"), + outputs=SimpleNamespace(), + ) + + with patch.object(_MODULE, "get_viewport_from_window_name", return_value=None), patch.object( + _MODULE.carb, "log_warn" + ) as log_warn: + result = _MODULE.OgnIsaacGetViewportRenderProduct.compute(db) + + self.assertFalse(result) + self.assertIsNone(state.viewport) + self.assertFalse(state.initialized) + log_warn.assert_called_once_with("viewport name MissingViewport not found")