More tests: FarmbotFirmware.UARTTransport.{open, reset}

pull/1113/head
Rick Carlino 2020-01-13 14:11:15 -06:00
parent 8d731d1590
commit 87398438b4
7 changed files with 57 additions and 25 deletions

View File

@ -1,22 +1,17 @@
defmodule FarmbotFirmware.UartAdapter do
@type gcode :: String.t()
@type device_path :: String.t()
@type uart_pid :: pid()
alias Circuits.UART
@type uart_pid :: GenServer.server()
@type device_path :: binary()
@type gcode :: iodata()
@type not_known :: any()
@type uart_opts :: any()
@type uart_opts :: [UART.uart_option()]
@type uart_op_result :: :ok | {:error, term()}
@type uart_start_link_result :: {:ok, pid()} | {:error, term()}
@callback start_link() :: not_known
@callback open(uart_pid, device_path, uart_opts) :: not_known
@callback stop(uart_pid) :: not_known
@callback write(uart_pid, gcode) :: not_known
@callback generate_opts() :: not_known
def adapter do
raise("FIX THIS")
# Application.get_env(:farmbot, :muon_trap_adapter, Avrdude.MuonTrapDefaultAdapter)
end
def cmd(exe, args, options) do
adapter().cmd(exe, args, options)
end
@callback open(uart_pid, device_path, uart_opts) :: uart_op_result
@callback start_link() :: uart_start_link_result
@callback stop(uart_pid) :: :ok
@callback write(uart_pid, gcode) :: uart_op_result
end

View File

@ -3,23 +3,29 @@ defmodule FarmbotFirmware.UartDefaultAdapter do
A thin wrapper of Circuits.UART to simplify testing.
"""
alias Circuits.UART
@behaviour FarmbotFirmware.UartAdapter
@impl FarmbotFirmware.UartAdapter
def start_link do
UART.start_link()
end
@impl FarmbotFirmware.UartAdapter
def open(uart_pid, device_path, opts) do
UART.open(uart_pid, device_path, opts)
end
@impl FarmbotFirmware.UartAdapter
def stop(uart_pid) do
UART.stop(uart_pid)
end
@impl FarmbotFirmware.UartAdapter
def write(uart_pid, str) do
UART.write(uart_pid, str)
end
@impl FarmbotFirmware.UartAdapter
def generate_opts do
[
active: true,

View File

@ -14,16 +14,16 @@ defmodule FarmbotFirmware.UARTTransport do
device = Keyword.fetch!(args, :device)
handle_gcode = Keyword.fetch!(args, :handle_gcode)
reset = Keyword.get(args, :reset)
{:ok, uart} = UartDefaultAdapter.start_link()
{:ok, uart} = uart_adapter().start_link()
{:ok, %{uart: uart, device: device, open: false, handle_gcode: handle_gcode, reset: reset}, 0}
end
def terminate(_, state) do
UartDefaultAdapter.stop(state.uart)
uart_adapter().stop(state.uart)
end
def handle_info(:timeout, %{open: false} = state) do
opts = UartDefaultAdapter.generate_opts()
opts = uart_adapter().generate_opts()
with :ok <- open(state.uart, state.device, opts),
:ok <- reset(state) do
@ -47,7 +47,7 @@ defmodule FarmbotFirmware.UARTTransport do
def handle_call(code, _from, state) do
str = GCODE.encode(code)
r = UartDefaultAdapter.write(state.uart, str)
r = uart_adapter().write(state.uart, str)
{:reply, r, state}
end
@ -60,6 +60,10 @@ defmodule FarmbotFirmware.UARTTransport do
end
def open(uart_pid, device_path, opts) do
UartDefaultAdapter.open(uart_pid, device_path, opts)
uart_adapter().open(uart_pid, device_path, opts)
end
def uart_adapter() do
Application.get_env(:farmbot_firmware, :uart_adapter, UartDefaultAdapter)
end
end

View File

@ -52,6 +52,7 @@ defmodule FarmbotFirmware.MixProject do
{:circuits_uart, "~> 1.4.0"},
{:excoveralls, "~> 0.10", only: [:test], targets: [:host]},
{:dialyxir, "~> 1.0.0-rc.3", only: [:dev], targets: [:host], runtime: false},
{:mox, "~> 0.5.1", only: :test},
{:ex_doc, "~> 0.21.2", only: [:dev], targets: [:host], runtime: false}
]
end

View File

@ -25,6 +25,7 @@
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"},
"mime": {:hex, :mime, "1.3.0", "5e8d45a39e95c650900d03f897fbf99ae04f60ab1daa4a34c7a20a5151b7a5fe", [:mix], [], "hexpm"},
"mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm"},
"mox": {:hex, :mox, "0.5.1", "f86bb36026aac1e6f924a4b6d024b05e9adbed5c63e8daa069bd66fb3292165b", [:mix], [], "hexpm"},
"nerves_uart": {:hex, :nerves_uart, "1.2.0", "195424116b925cd3bf9d666be036c2a80655e6ca0f8d447e277667a60005c50e", [:mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"},
"nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm"},
"parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"},

View File

@ -1,9 +1,33 @@
Mox.defmock(FarmbotFirmware.UartTestAdapter, for: FarmbotFirmware.UartAdapter)
defmodule FarmbotFirmware.UARTTransportTest do
use ExUnit.Case
import Mox
setup [:verify_on_exit!]
doctest FarmbotFirmware.UARTTransport
test "FarmbotFirmware.UARTTransportTest.open/2" do
FarmbotFirmware.UARTTransport.open(self(), "B", [])
IO.puts("HEYOOO")
test "FarmbotFirmware.UARTTransport.open/2" do
me = self()
expect(FarmbotFirmware.UartTestAdapter, :open, fn pid, path, opts ->
assert pid == me
assert path == "/dev/null"
assert opts == [a: :b]
end)
FarmbotFirmware.UARTTransport.open(me, "/dev/null", a: :b)
end
defmodule FakeReseter do
def reset do
:fake_reset
end
end
test "FarmbotFirmware.UARTTransport.reset/2" do
empty_state = %{reset: nil}
ok_state = %{reset: FakeReseter}
assert :ok == FarmbotFirmware.UARTTransport.reset(empty_state)
assert :fake_reset == FarmbotFirmware.UARTTransport.reset(ok_state)
end
end

View File

@ -1 +1,2 @@
Application.ensure_all_started(:mox)
ExUnit.start()