feat(agent): Shell.run wrapper for testable external commands
This commit is contained in:
parent
30b507ba6b
commit
6fca450d7e
2 changed files with 43 additions and 0 deletions
24
agent/lib/proxmox_agent/shell.ex
Normal file
24
agent/lib/proxmox_agent/shell.ex
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
defmodule ProxmoxAgent.Shell do
|
||||||
|
@moduledoc """
|
||||||
|
Thin wrapper over System.cmd for testability. Collectors accept an optional
|
||||||
|
:runner function of this shape so tests can inject fixture-backed fakes.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@type result :: {:ok, String.t()} | {:error, term()}
|
||||||
|
|
||||||
|
@spec run(String.t(), [String.t()]) :: result
|
||||||
|
def run(command, args) do
|
||||||
|
try do
|
||||||
|
case System.cmd(command, args, stderr_to_stdout: true) do
|
||||||
|
{output, 0} -> {:ok, output}
|
||||||
|
{output, code} -> {:error, {:nonzero_exit, code, output}}
|
||||||
|
end
|
||||||
|
rescue
|
||||||
|
e in ErlangError ->
|
||||||
|
case e.original do
|
||||||
|
:enoent -> {:error, {:enoent, command}}
|
||||||
|
other -> {:error, {:system_error, other}}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
19
agent/test/proxmox_agent/shell_test.exs
Normal file
19
agent/test/proxmox_agent/shell_test.exs
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
defmodule ProxmoxAgent.ShellTest do
|
||||||
|
use ExUnit.Case, async: true
|
||||||
|
|
||||||
|
alias ProxmoxAgent.Shell
|
||||||
|
|
||||||
|
test "run/2 returns {:ok, output} on zero exit" do
|
||||||
|
assert {:ok, output} = Shell.run("/bin/echo", ["hello"])
|
||||||
|
assert String.trim(output) == "hello"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "run/2 returns {:error, {:nonzero_exit, code, output}} on non-zero exit" do
|
||||||
|
assert {:error, {:nonzero_exit, code, _}} = Shell.run("/bin/sh", ["-c", "exit 7"])
|
||||||
|
assert code == 7
|
||||||
|
end
|
||||||
|
|
||||||
|
test "run/2 returns {:error, {:enoent, _}} when binary is missing" do
|
||||||
|
assert {:error, {:enoent, _}} = Shell.run("/does/not/exist/nope", [])
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Add table
Add a link
Reference in a new issue