"""A public command channel (napalm-device-types ``CommandChannelMixin``, netOrk #1113). netOrk sent UCI scripts and the wifi channel through the private ``_send_command``: an interactive shell with no exit code, where a file had to be typed in base64 chunks or ``printf`` lines. ``run_command`` runs on an SSH exec channel of its own, with stdin, stderr and the exit code -- a script is written with ``cat`` from stdin, and ``base64`` is needed for nothing. """ from __future__ import annotations from unittest.mock import MagicMock, patch import pytest from napalm.base.exceptions import ConnectionClosedException from napalm_device_types import CommandResult from napalm_openwrt.openwrt import OpenWrtDriver def _driver(username: str = "root") -> OpenWrtDriver: with patch("napalm_openwrt.openwrt.ConnectHandler"): drv = OpenWrtDriver(hostname="192.0.2.15", username=username, password="") drv.device = MagicMock() return drv def test_a_command_runs_on_the_ssh_transport_with_its_stdin(): drv = _driver() transport = drv.device.remote_conn_pre.get_transport.return_value done = CommandResult("", "", 0) with patch("napalm_openwrt.openwrt.run_on_transport", return_value=done) as run: result = drv.run_command("cat > /tmp/x.sh", stdin=b"uci commit\n", timeout=30) assert result is done run.assert_called_once_with(transport, "cat > /tmp/x.sh", stdin=b"uci commit\n", timeout=30) def test_root_runs_privileged_commands_as_they_are(): drv = _driver() with patch("napalm_openwrt.openwrt.run_on_transport") as run: drv.run_command("wifi", privileged=True) assert run.call_args.args[1] == "wifi" def test_a_login_other_than_root_cannot_gain_root(): """OpenWrt has no sudo: refused before anything runs, not half done.""" drv = _driver(username="admin") with patch("napalm_openwrt.openwrt.run_on_transport") as run, pytest.raises(PermissionError): drv.run_command("wifi", privileged=True) run.assert_not_called() def test_a_stream_on_the_same_transport(): drv = _driver() transport = drv.device.remote_conn_pre.get_transport.return_value with patch("napalm_openwrt.openwrt.open_stream_on_transport") as stream: drv.open_stream("logread -f") stream.assert_called_once_with(transport, "logread -f") def test_not_connected(): drv = _driver() drv.device = None with pytest.raises(ConnectionClosedException): drv.run_command("true") def test_no_warnings_of_its_own(): """base64 is no longer needed for anything, so a missing one is no warning; lldpd, auc and the updates are facts the caller reads (netOrk #1111).""" assert not any( "get_device_warnings" in vars(c) for c in OpenWrtDriver.__mro__ if c.__module__.startswith("napalm_openwrt") )