Current section
Files
Jump to
Current section
Files
test/switch/alias_test.exs
defmodule SwitchAliasTest do
@moduledoc false
use ExUnit.Case, async: true
# import ExUnit.CaptureLog
use HelenTest
alias TimeSupport
alias Switch.Alias
alias Switch.Device
setup do
:ok
end
setup context do
setup_context(context)
end
@moduletag :switch_alias
setup_all do
# test aliases are setup for each test individually
:ok
end
@tag alias_num: 1
@tag add_alias: true
test "can add a new alias", %{
sa: {sa_rc, sa}
} do
assert sa_rc == :ok
assert %Alias{} = sa
end
@tag alias_num: 2
@tag add_alias: true
test "can get and set the position of an Alias",
%{alias_name: name, sa: {_rc, sa}} = r do
{rc1, initial_pos} = Alias.position(name)
assert rc1 == :ok
{rc2, res} = Alias.position(name, position: not initial_pos)
assert rc2 == :pending
assert is_list(res)
assert is_binary(Keyword.get(res, :refid))
ack_map = %{
refid: Keyword.get(res, :refid),
pio: Map.get(sa, :pio),
position: not initial_pos
}
{ack_rc, _res} = simulate_cmd_ack(r, ack_map)
assert ack_rc == :ok
end
@tag alias_num: 3
@tag add_alias: true
test "can get and set the position of an Alias without remote ack",
%{alias_name: name, sa: {_rc, _sa}} = _r do
{rc1, initial_pos} = Alias.position(name)
assert rc1 == :ok
{rc2, res} = Alias.position(name, position: not initial_pos, ack: false)
assert rc2 == :pending
assert is_list(res)
refid = Keyword.get(res, :refid)
assert is_binary(refid)
# because ack: false the command should be acked
assert Switch.Command.acked?(refid) == true
end
@tag alias_num: 4
@tag add_alias: true
test "can get and set the position of an Alias with lazy: false",
%{alias_name: name, sa: {_rc, _sa}} = _r do
{rc1, initial_pos} = Alias.position(name)
assert rc1 == :ok
{rc2, res} = Alias.position(name, position: initial_pos, lazy: false)
assert rc2 == :pending
assert is_list(res)
refid = Keyword.get(res, :refid)
assert is_binary(refid)
end
defp add_alias(%{
add_alias: true,
name: name,
pio: pio,
sd: {:ok, %Device{id: device_id}}
}) do
{rc, sa} =
sa_rc = Alias.upsert(%{device_id: device_id, name: name, pio: pio})
assert rc == :ok
assert %Alias{} = sa
sa_rc
end
defp add_alias(%{add_alias: _, device: _device, sd: _sd}) do
{:not_added, %Alias{}}
end
def setup_context(context) do
num = Map.get(context, :alias_num, 0)
num_sw_states = Map.get(context, :num_sw_states, 3)
num_str = ["0x", Integer.to_string(num, 16)] |> IO.iodata_to_binary()
alias_name = ["swalias_", num_str] |> IO.iodata_to_binary()
add_alias = Map.get(context, :add_alias, false)
alias_pio = Map.get(context, :alias_pio, 1)
host =
Map.get(
context,
:host,
["ruth.switch_alias", num_str] |> IO.iodata_to_binary()
)
rem_name =
Map.get(context, :name, ["rem_swalias", num_str] |> IO.iodata_to_binary())
device =
Map.get(
context,
:device,
["ds/swalias", num_str] |> IO.iodata_to_binary()
)
states =
for s <- 0..num_sw_states do
state = :rand.uniform(2) - 1
%{pio: s, state: if(state == 0, do: false, else: true)}
end
r = %{
processed: false,
type: "switch",
host: host,
name: rem_name,
hw: "esp32",
device: device,
pio_count: 3,
states: states,
vsn: "xxxxx",
ttl_ms: 30_000,
dev_latency_us: 1000,
mtime: TimeSupport.unix_now(:second),
log: false
}
{sd_rc, sd} =
sd_res =
if Map.get(context, :insert, true),
do: Device.upsert(r) |> Map.get(:processed),
else: nil
assert sd_rc == :ok
assert %Device{} = sd
sa_res =
add_alias(%{
add_alias: add_alias,
sd: {sd_rc, sd},
name: alias_name,
pio: alias_pio
})
{pos_rc, initial_pos} = Device.pio_state(sd, alias_pio)
assert pos_rc in [:ok, :ttl_expired]
# pio = context[:pio]
# device_pio = if pio, do: device_pio(n, pio), else: device_pio(n, 0)
{:ok,
r: r,
host: host,
rem_name: rem_name,
device: device,
device_id: Map.get(sd, :id),
sd: sd_res,
alias_name: alias_name,
add_alias: add_alias,
alias_pio: alias_pio,
initial_pos: initial_pos,
sa: sa_res}
end
end