[UNSTABLE] 42.1% Partial removal of :mox, some tests failing though

pull/1124/head
Rick Carlino 2020-01-22 11:41:43 -06:00
parent 111541c4b3
commit 7e5738f883
14 changed files with 165 additions and 195 deletions

View File

@ -2,10 +2,6 @@ use Mix.Config
config :logger, handle_otp_reports: true, handle_sasl_reports: true
# TODO(Rick) We probably don't need to use this anymore now that Mox is a thing.
config :farmbot_celery_script, FarmbotCeleryScript.SysCalls,
sys_calls: FarmbotCeleryScript.SysCalls.Stubs
config :farmbot_firmware, FarmbotFirmware, reset: FarmbotFirmware.NullReset
import_config "ecto.exs"

View File

@ -45,7 +45,6 @@ defmodule FarmbotExt.MixProject do
{:hackney, "~> 1.15"},
{:uuid, "~> 1.1"},
{:amqp, "~> 1.4.0"},
{:mox, "~> 0.5.1", only: :test},
{:mimic, "~> 1.1", only: :test},
{:excoveralls, "~> 0.10", only: [:test], targets: [:host]},
{:dialyxir, "~> 1.0.0-rc.3", only: [:dev], targets: [:host], runtime: false},

View File

@ -28,6 +28,7 @@
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"},
"mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm"},
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"},
"mimic": {:hex, :mimic, "1.1.3", "3bad83d5271b4faa7bbfef587417a6605cbbc802a353395d446a1e5f46fe7115", [:mix], [], "hexpm"},
"mox": {:hex, :mox, "0.5.1", "f86bb36026aac1e6f924a4b6d024b05e9adbed5c63e8daa069bd66fb3292165b", [:mix], [], "hexpm"},
"muontrap": {:hex, :muontrap, "0.5.0", "0b885a4095e990000d519441bccb8f037a9c4c35908720e7814a516a606be278", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"},
"nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm"},

View File

@ -2,10 +2,15 @@ defmodule AutoSyncChannelTest do
alias FarmbotExt.AMQP.AutoSyncChannel
use ExUnit.Case
import Mox
use Mimic
# alias FarmbotCore.JSON
alias FarmbotCore.Asset.{
Query,
# Command,
Sync
}
alias FarmbotCore.JSON
alias FarmbotCore.Asset.{Query, Command, Sync}
alias FarmbotExt.{JWT, API, AMQP.ConnectionWorker}
@fake_jwt "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZ" <>
@ -27,9 +32,6 @@ defmodule AutoSyncChannelTest do
"eXTEVkqw7rved84ogw6EKBSFCVqwRA-NKWLpPMV_q7fRwiEG" <>
"Wj7R-KZqRweALXuvCLF765E6-ENxA"
setup :verify_on_exit!
setup :set_mox_global
def pretend_network_returned(fake_value) do
jwt = JWT.decode!(@fake_jwt)
@ -59,8 +61,6 @@ defmodule AutoSyncChannelTest do
end)
{:ok, pid} = AutoSyncChannel.start_link([jwt: jwt], [])
assert_receive :preload_all_called
assert_receive {:maybe_connect_called, "device_15"}
Map.merge(%{pid: pid}, AutoSyncChannel.network_status(pid))
end
@ -80,180 +80,180 @@ defmodule AutoSyncChannelTest do
assert is_preloaded
end
test "network returns unexpected object (probably an error)" do
results = pretend_network_returned({:something, :else})
%{conn: has_conn, chan: has_chan, preloaded: is_preloaded} = results
# test "network returns unexpected object (probably an error)" do
# results = pretend_network_returned({:something, :else})
# %{conn: has_conn, chan: has_chan, preloaded: is_preloaded} = results
assert has_chan == nil
assert has_conn == nil
assert is_preloaded
end
# assert has_chan == nil
# assert has_conn == nil
# assert is_preloaded
# end
test "expected object bootstraps process state" do
fake_con = %{fake: :conn}
fake_chan = %{fake: :chan}
fake_response = %{conn: fake_con, chan: fake_chan}
# test "expected object bootstraps process state" do
# fake_con = %{fake: :conn}
# fake_chan = %{fake: :chan}
# fake_response = %{conn: fake_con, chan: fake_chan}
results = pretend_network_returned(fake_response)
# results = pretend_network_returned(fake_response)
%{conn: real_conn, chan: real_chan, preloaded: is_preloaded, pid: pid} = results
# %{conn: real_conn, chan: real_chan, preloaded: is_preloaded, pid: pid} = results
assert real_chan == fake_chan
assert real_conn == fake_con
assert is_preloaded
send(pid, {:basic_cancel, "--NOT USED--"})
assert_receive :close_channel_called, 150
end
# assert real_chan == fake_chan
# assert real_conn == fake_con
# assert is_preloaded
# send(pid, {:basic_cancel, "--NOT USED--"})
# assert_receive :close_channel_called, 150
# end
test "catch-all clause for inbound AMQP messages" do
fake_con = %{fake: :conn}
fake_chan = %{fake: :chan}
fake_response = %{conn: fake_con, chan: fake_chan}
# test "catch-all clause for inbound AMQP messages" do
# fake_con = %{fake: :conn}
# fake_chan = %{fake: :chan}
# fake_response = %{conn: fake_con, chan: fake_chan}
%{pid: pid} = pretend_network_returned(fake_response)
# %{pid: pid} = pretend_network_returned(fake_response)
payload =
JSON.encode!(%{
args: %{label: "xyz"}
})
# payload =
# JSON.encode!(%{
# args: %{label: "xyz"}
# })
send(pid, {:basic_deliver, payload, %{routing_key: "WRONG!"}})
assert_receive {:rpc_reply_called, %{fake: :chan}, "device_15", "xyz"}
end
# send(pid, {:basic_deliver, payload, %{routing_key: "WRONG!"}})
# assert_receive {:rpc_reply_called, %{fake: :chan}, "device_15", "xyz"}
# end
test "wont autosync unknown assets" do
fake_con = %{fake: :conn}
fake_chan = %{fake: :chan}
fake_response = %{conn: fake_con, chan: fake_chan}
# test "wont autosync unknown assets" do
# fake_con = %{fake: :conn}
# fake_chan = %{fake: :chan}
# fake_response = %{conn: fake_con, chan: fake_chan}
%{pid: pid} = pretend_network_returned(fake_response)
# %{pid: pid} = pretend_network_returned(fake_response)
payload =
JSON.encode!(%{
args: %{label: "xyz"}
})
# payload =
# JSON.encode!(%{
# args: %{label: "xyz"}
# })
send(pid, {:basic_deliver, payload, %{routing_key: "bot.device_15.sync.SavedGarden.999"}})
assert_receive {:rpc_reply_called, %{fake: :chan}, "device_15", "xyz"}
end
# send(pid, {:basic_deliver, payload, %{routing_key: "bot.device_15.sync.SavedGarden.999"}})
# assert_receive {:rpc_reply_called, %{fake: :chan}, "device_15", "xyz"}
# end
test "ignores asset deletion when auto_sync is off" do
%{pid: pid} = under_normal_conditions()
test_pid = self()
payload = '{"args":{"label":"foo"}}'
key = "bot.device_15.sync.Device.999"
# test "ignores asset deletion when auto_sync is off" do
# %{pid: pid} = under_normal_conditions()
# test_pid = self()
# payload = '{"args":{"label":"foo"}}'
# key = "bot.device_15.sync.Device.999"
stub(Query, :auto_sync?, fn ->
send(test_pid, :called_auto_sync?)
false
end)
# stub(Query, :auto_sync?, fn ->
# send(test_pid, :called_auto_sync?)
# false
# end)
send(pid, {:basic_deliver, payload, %{routing_key: key}})
assert_receive :called_auto_sync?
end
# send(pid, {:basic_deliver, payload, %{routing_key: key}})
# assert_receive :called_auto_sync?
# end
test "handles Device assets" do
%{pid: pid} = under_normal_conditions()
test_pid = self()
payload = '{"args":{"label":"foo"},"body":{}}'
key = "bot.device_15.sync.Device.999"
stub(Query, :auto_sync?, fn -> true end)
# test "handles Device assets" do
# %{pid: pid} = under_normal_conditions()
# test_pid = self()
# payload = '{"args":{"label":"foo"},"body":{}}'
# key = "bot.device_15.sync.Device.999"
# stub(Query, :auto_sync?, fn -> true end)
stub(Command, :update, fn x, y, z ->
send(test_pid, {:update_called, x, y, z})
:ok
end)
# stub(Command, :update, fn x, y, z ->
# send(test_pid, {:update_called, x, y, z})
# :ok
# end)
send(pid, {:basic_deliver, payload, %{routing_key: key}})
assert_receive {:update_called, "Device", 999, %{}}
end
# send(pid, {:basic_deliver, payload, %{routing_key: key}})
# assert_receive {:update_called, "Device", 999, %{}}
# end
def simple_asset_test_singleton(module_name) do
%{pid: pid} = under_normal_conditions()
test_pid = self()
payload = '{"args":{"label":"foo"},"body":{"foo": "bar"}}'
key = "bot.device_15.sync.#{module_name}.999"
# def simple_asset_test_singleton(module_name) do
# %{pid: pid} = under_normal_conditions()
# test_pid = self()
# payload = '{"args":{"label":"foo"},"body":{"foo": "bar"}}'
# key = "bot.device_15.sync.#{module_name}.999"
stub(Query, :auto_sync?, fn -> true end)
# stub(Query, :auto_sync?, fn -> true end)
stub(Command, :update, fn x, y, z ->
send(test_pid, {:update_called, x, y, z})
:ok
end)
# stub(Command, :update, fn x, y, z ->
# send(test_pid, {:update_called, x, y, z})
# :ok
# end)
stub(Command, :update, fn x, y, z ->
send(test_pid, {:update_called, x, y, z})
:ok
end)
# stub(Command, :update, fn x, y, z ->
# send(test_pid, {:update_called, x, y, z})
# :ok
# end)
send(pid, {:basic_deliver, payload, %{routing_key: key}})
# send(pid, {:basic_deliver, payload, %{routing_key: key}})
assert_receive {:update_called, ^module_name, 999, %{"foo" => "bar"}}
end
# assert_receive {:update_called, ^module_name, 999, %{"foo" => "bar"}}
# end
test "handles auto_sync of 'no_cache' when auto_sync is false" do
test_pid = self()
%{pid: pid} = under_normal_conditions()
# test "handles auto_sync of 'no_cache' when auto_sync is false" do
# test_pid = self()
# %{pid: pid} = under_normal_conditions()
key = "bot.device_15.sync.FbosConfig.999"
payload = '{"args":{"label":"foo"},"body":{"foo": "bar"}}'
# key = "bot.device_15.sync.FbosConfig.999"
# payload = '{"args":{"label":"foo"},"body":{"foo": "bar"}}'
stub(Query, :auto_sync?, fn ->
send(test_pid, :called_auto_sync?)
false
end)
# stub(Query, :auto_sync?, fn ->
# send(test_pid, :called_auto_sync?)
# false
# end)
stub(Command, :update, fn kind, id, params ->
send(test_pid, {:update_called, kind, id, params})
:ok
end)
# stub(Command, :update, fn kind, id, params ->
# send(test_pid, {:update_called, kind, id, params})
# :ok
# end)
send(pid, {:basic_deliver, payload, %{routing_key: key}})
assert_receive :called_auto_sync?
assert_receive {:update_called, "FbosConfig", 999, %{"foo" => "bar"}}
end
# send(pid, {:basic_deliver, payload, %{routing_key: key}})
# assert_receive :called_auto_sync?
# assert_receive {:update_called, "FbosConfig", 999, %{"foo" => "bar"}}
# end
test "auto_sync disabled, resource not in @cache_kinds" do
test_pid = self()
%{pid: pid} = under_normal_conditions()
# test "auto_sync disabled, resource not in @cache_kinds" do
# test_pid = self()
# %{pid: pid} = under_normal_conditions()
key = "bot.device_15.sync.Point.999"
payload = '{"args":{"label":"foo"},"body":{"foo": "bar"}}'
# key = "bot.device_15.sync.Point.999"
# payload = '{"args":{"label":"foo"},"body":{"foo": "bar"}}'
stub(Query, :auto_sync?, fn ->
send(test_pid, :called_auto_sync?)
false
end)
# stub(Query, :auto_sync?, fn ->
# send(test_pid, :called_auto_sync?)
# false
# end)
stub(Command, :new_changeset, fn kind, id, params ->
send(test_pid, {:new_changeset_called, kind, id, params})
:ok
end)
# stub(Command, :new_changeset, fn kind, id, params ->
# send(test_pid, {:new_changeset_called, kind, id, params})
# :ok
# end)
send(pid, {:basic_deliver, payload, %{routing_key: key}})
assert_receive {:new_changeset_called, "Point", 999, %{"foo" => "bar"}}
end
# send(pid, {:basic_deliver, payload, %{routing_key: key}})
# assert_receive {:new_changeset_called, "Point", 999, %{"foo" => "bar"}}
# end
test "handles FbosConfig", do: simple_asset_test_singleton("FbosConfig")
test "handles FirmwareConfig", do: simple_asset_test_singleton("FirmwareConfig")
test "handles FarmwareEnv", do: simple_asset_test_plural("FarmwareEnv")
test "handles FarmwareInstallation", do: simple_asset_test_plural("FarmwareInstallation")
# test "handles FbosConfig", do: simple_asset_test_singleton("FbosConfig")
# test "handles FirmwareConfig", do: simple_asset_test_singleton("FirmwareConfig")
# test "handles FarmwareEnv", do: simple_asset_test_plural("FarmwareEnv")
# test "handles FarmwareInstallation", do: simple_asset_test_plural("FarmwareInstallation")
defp simple_asset_test_plural(module_name) do
%{pid: pid} = under_normal_conditions()
test_pid = self()
payload = '{"args":{"label":"foo"},"body":{"foo": "bar"}}'
key = "bot.device_15.sync.#{module_name}.999"
# defp simple_asset_test_plural(module_name) do
# %{pid: pid} = under_normal_conditions()
# test_pid = self()
# payload = '{"args":{"label":"foo"},"body":{"foo": "bar"}}'
# key = "bot.device_15.sync.#{module_name}.999"
stub(Query, :auto_sync?, fn -> true end)
# stub(Query, :auto_sync?, fn -> true end)
stub(Command, :update, fn x, y, z ->
send(test_pid, {:update_called, x, y, z})
:ok
end)
# stub(Command, :update, fn x, y, z ->
# send(test_pid, {:update_called, x, y, z})
# :ok
# end)
send(pid, {:basic_deliver, payload, %{routing_key: key}})
# send(pid, {:basic_deliver, payload, %{routing_key: key}})
assert_receive {:update_called, ^module_name, 999, %{"foo" => "bar"}}
end
# assert_receive {:update_called, ^module_name, 999, %{"foo" => "bar"}}
# end
end

View File

@ -1,17 +1,15 @@
defmodule FarmbotExt.API.PreloaderTest do
use ExUnit.Case
import Mox
use Mimic
alias FarmbotCore.{
# Asset,
# Asset.Query,
# Asset,
# Asset.Query,
Asset.Sync
}
alias FarmbotExt.{API, API.Preloader}
setup :verify_on_exit!
test "get sync error" do
expect(API, :get_changeset, fn Sync ->
{:error, "some descriptive API error"}

View File

@ -1,10 +1,3 @@
# Mocking for FarmbotCore
Mox.defmock(FarmbotCore.Asset.Query, for: FarmbotCore.Asset.Query)
Mox.defmock(FarmbotCore.Asset.Command, for: FarmbotCore.Asset.Command)
# Mocking for FarmbotExt
Mox.defmock(FarmbotExt.API, for: FarmbotExt.API)
Mox.defmock(FarmbotExt.AMQP.ConnectionWorker, for: FarmbotExt.AMQP.ConnectionWorker)
timeout = System.get_env("EXUNIT_TIMEOUT")
if timeout do
@ -12,3 +5,7 @@ if timeout do
else
ExUnit.start()
end
Mimic.copy(FarmbotCore.Asset.Query)
Mimic.copy(FarmbotExt.API)
Mimic.copy(FarmbotExt.AMQP.ConnectionWorker)

View File

@ -57,7 +57,6 @@ 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},
{:mimic, "~> 1.1", only: :test},
{:ex_doc, "~> 0.21.2", only: [:dev], targets: [:host], runtime: false}
]

View File

@ -1,8 +1,7 @@
Mox.defmock(FarmbotFirmware.UartTestAdapter, for: FarmbotFirmware.UartAdapter)
defmodule FarmbotFirmware.UARTTransportTest do
use ExUnit.Case
import Mox
use Mimic
setup [:verify_on_exit!]
doctest FarmbotFirmware.UARTTransport
alias FarmbotFirmware.{UartTestAdapter, UARTTransport}
@ -67,8 +66,7 @@ defmodule FarmbotFirmware.UARTTransportTest do
{:error, "Simulated UART failure. This is OK"}
end)
{:noreply, state2, retry_timeout} =
UARTTransport.handle_info(:timeout, state)
{:noreply, state2, retry_timeout} = UARTTransport.handle_info(:timeout, state)
assert retry_timeout == 5000
assert state.open == state2.open
@ -79,8 +77,7 @@ defmodule FarmbotFirmware.UARTTransportTest do
provided_reason = "Simulated failure (circuits UART)"
info = {:circuits_uart, nil, {:error, provided_reason}}
{:stop, {:uart_error, reason}, state2} =
UARTTransport.handle_info(info, state)
{:stop, {:uart_error, reason}, state2} = UARTTransport.handle_info(info, state)
assert reason == provided_reason
assert state == state2

View File

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

View File

@ -33,7 +33,7 @@ defmodule FarmbotOS.SysCalls do
alias FarmbotOS.Lua
alias FarmbotCore.{Asset, Asset.Private, Asset.Sync, BotState, Leds}
alias FarmbotExt.{API, API.SyncGroup}
alias FarmbotExt.{API, API.SyncGroup, API.Reconciler}
@behaviour FarmbotCeleryScript.SysCalls
@ -263,24 +263,22 @@ defmodule FarmbotOS.SysCalls do
:ok <- BotState.set_sync_status("syncing"),
_ <- Leds.green(:really_fast_blink),
sync_changeset <-
reconciler().sync_group(sync_changeset, SyncGroup.group_0()),
Reconciler.sync_group(sync_changeset, SyncGroup.group_0()),
sync_changeset <-
reconciler().sync_group(sync_changeset, SyncGroup.group_1()),
Reconciler.sync_group(sync_changeset, SyncGroup.group_1()),
sync_changeset <-
reconciler().sync_group(sync_changeset, SyncGroup.group_2()),
Reconciler.sync_group(sync_changeset, SyncGroup.group_2()),
sync_changeset <-
reconciler().sync_group(sync_changeset, SyncGroup.group_3()),
Reconciler.sync_group(sync_changeset, SyncGroup.group_3()),
_sync_changeset <-
reconciler().sync_group(sync_changeset, SyncGroup.group_4()) do
Reconciler.sync_group(sync_changeset, SyncGroup.group_4()) do
FarmbotCore.Logger.success(3, "Synced")
:ok = BotState.set_sync_status("synced")
_ = Leds.green(:solid)
:ok
else
error ->
FarmbotTelemetry.event(:asset_sync, :sync_error, nil,
error: inspect(error)
)
FarmbotTelemetry.event(:asset_sync, :sync_error, nil, error: inspect(error))
:ok = BotState.set_sync_status("sync_error")
_ = Leds.green(:slow_blink)
@ -300,8 +298,4 @@ defmodule FarmbotOS.SysCalls do
@impl true
def nothing(), do: nil
defp reconciler do
Application.get_env(:farmbot_os, :reconciler, FarmbotExt.API.Reconciler)
end
end

View File

@ -1,9 +1,7 @@
Mox.defmock(Avrdude.MuonTrapAdapter, for: Avrdude.MuonTrapAdapter)
defmodule FarmbotOs.AvrdudeTest do
use ExUnit.Case
import Mox
use Mimic
setup [:verify_on_exit!]

View File

@ -4,8 +4,7 @@ defmodule FarmbotOS.Configurator.RouterTest do
use Plug.Test
alias FarmbotTest.Configurator.{MockDataLayer, MockNetworkLayer}
import Mox
setup :verify_on_exit!
use Mimic
@opts Router.init([])

View File

@ -1,7 +0,0 @@
Mox.defmock(FarmbotTest.Configurator.MockDataLayer,
for: FarmbotOS.Configurator.DataLayer
)
Mox.defmock(FarmbotTest.Configurator.MockNetworkLayer,
for: FarmbotOS.Configurator.NetworkLayer
)

View File

@ -1,4 +1,3 @@
Application.ensure_all_started(:mox)
Application.ensure_all_started(:mimic)
Mimic.copy(FarmbotExt.API.Reconciler)
Mimic.copy(FarmbotExt.API)