add tests for serial

pull/276/head
connor rigby 2017-03-20 11:53:37 -07:00
parent 3b174ae126
commit 0d29b163b2
14 changed files with 154 additions and 110 deletions

View File

@ -19,6 +19,7 @@ before_install:
before_script:
- export PATH=`pwd`/elixir/bin:$PATH
script:
- scripts/tty0tty.sh
- mix local.hex --force
- mix local.rebar --force
- mix archive.install https://github.com/nerves-project/archives/raw/master/nerves_bootstrap.ez --force

View File

@ -13,3 +13,5 @@ config :farmbot, auth_callbacks: []
# frontend <-> bot transports.
config :farmbot, transports: []
config :farmbot, logger: false

File diff suppressed because one or more lines are too long

View File

@ -31,7 +31,7 @@ defmodule Farmbot.HTTP do
def process_request_options(opts),
do: opts
|> Keyword.merge(@http_config, fn(_key, user_provided, _default) ->
|> Keyword.merge(@http_config, fn(_key, user_provided, _default) ->
user_provided
end)

View File

@ -4,6 +4,8 @@ defmodule Farmbot.BotState.Supervisor do
things can subscribe too.
"""
@use_logger Application.get_env(:farmbot, :logger, true)
use Supervisor
require Logger
alias Farmbot.EasterEggs
@ -37,7 +39,7 @@ defmodule Farmbot.BotState.Supervisor do
# like position and some configuraion.
sup = Supervisor.start_link(__MODULE__, args, name: __MODULE__)
EasterEggs.start_cron_job
Logger.add_backend(Farmbot.Logger)
if @use_logger, do: Logger.add_backend(Farmbot.Logger)
sup
end
end

View File

@ -21,11 +21,7 @@ defmodule Farmbot.CeleryScript.Command.ConfigUpdate do
blah = pairs_to_tuples(config_pairs)
current = Farmbot.BotState.get_all_mcu_params
# we only want to update the params that changed. This makes this operation
# way more stable.
params = Enum.filter(blah, fn({param_str, val}) ->
current[param_str] != val
end)
params = filter_params(blah, current)
for {param_str, val} <- params do
param_int = GParser.parse_param(param_str)
@ -50,4 +46,11 @@ defmodule Farmbot.CeleryScript.Command.ConfigUpdate do
end
end
@spec filter_params([{binary, any}], map) :: [{binary, any}]
defp filter_params(blah, current) do
Enum.filter(blah, fn({param_str, val}) ->
current[param_str] != val
end)
end
end

View File

@ -53,10 +53,16 @@ defmodule Farmbot.Serial.Handler do
Checks if we have a handler available
"""
@spec available?(handler) :: boolean
def available?(handler \\ __MODULE__) do
def available?(handler \\ __MODULE__)
def available?(handler) when is_pid(handler) do
GenServer.call(handler, :available?)
end
def available?(handler) do
uh = Process.whereis(handler)
if uh do
GenServer.call(uh, :available?)
available?(uh)
else
false
end

View File

@ -15,13 +15,6 @@ defmodule Farmbot.Serial.Supervisor do
Supervisor.start_link(__MODULE__, [], name: __MODULE__)
end
@doc """
Stop the Serial Supervisor
"""
def stop do
Supervisor.stop(__MODULE__)
end
def init([]) do
children = [
worker(Task, [__MODULE__, :open_ttys, [__MODULE__]], restart: :transient)

11
scripts/tty0tty.sh 100755
View File

@ -0,0 +1,11 @@
#!/bin/sh
CWD=`pwd`
mkdir /tmp/tty0tty
cd /tmp/tty0tty
git clone https://github.com/freemed/tty0tty .
cd module
make
sudo cp tty0tty.ko /lib/modules/$(uname -r)/kernel/drivers/misc/
sudo depmod
sudo modprobe tty0tty
cd $CWD

View File

@ -1,10 +0,0 @@
defmodule Farmbot.CeleryScript.Command.ConfigUpdateTest do
use ExUnit.Case
alias Farmbot.CeleryScript.Ast
alias Farmbot.CeleryScript.Command
test "the truth" do
# TODO(Connor) fix the truth in ConfigUpdate
assert true == false
end
end

View File

@ -1,10 +0,0 @@
defmodule Farmbot.CeleryScript.Command.FactoryResetTest do
use ExUnit.Case
alias Farmbot.CeleryScript.Ast
alias Farmbot.CeleryScript.Command
test "the truth" do
# TODO(Connor) fix the truth in FactoryReset
assert true == false
end
end

View File

@ -5,7 +5,11 @@ defmodule Farmbot.LoggerTest do
require Logger
setup_all do
Logger.flush()
Logger.add_backend(Farmbot.Logger)
on_exit(fn() ->
Logger.remove_backend(Farmbot.Logger)
end)
use_cassette "good_login" do
:ok = Auth.interim("admin@admin.com", "password123", "http://localhost:3000")
{:ok, token} = Auth.try_log_in
@ -19,7 +23,7 @@ defmodule Farmbot.LoggerTest do
for i <- 0..51 do
Logger.info "Farmbot can count to: #{i}"
end
Process.sleep(3000)
Process.sleep(100)
r = Farmbot.HTTP.get! "/api/logs"
body = Poison.decode!(r.body)

View File

@ -1,41 +1,73 @@
defmodule Farmbot.Serial.HandlerTest do
# this is set async false because all the commands coming over the serial line
# Will only ever be one at a time
use ExUnit.Case, async: false
def fix_race, do: Process.sleep(10)
# def send_fake_msg(msg) do
# GenServer.cast(Nerves.FakeUART, {:fake_message, msg<>"\r\n"})
# end
#
# def set_param(param, value) do
# send_fake_msg("R21 P#{param} V#{value}")
# end
use ExUnit.Case
alias Nerves.UART
alias Farmbot.Serial.Handler
# test "sets position" do
# send_fake_msg("R82 X-20 Y0 Z0")
# # Just pretend this isnt here
# fix_race
# pos = Farmbot.BotState.get_current_pos
# assert(pos == [-20,0,0])
# end
#
# test "sets some params" do
# set_param("0", 123)
# set_param("103", 1)
# set_param("32", 0)
#
# fix_race # shhhh
#
# version = Farmbot.BotState.get_fw_version
# assert(version == 123)
#
# # 103
# zencen = Farmbot.BotState.get_param :encoder_enabled_z
# assert(zencen == 1)
#
# # 32
# whatever = Farmbot.BotState.get_param :movement_invert_motor_y
# assert(whatever == 0)
# end
defmodule GcodeMock do
@moduledoc false
use GenServer
def start_link(tty) do
GenServer.start_link(__MODULE__, tty)
end
def init(tty) do
{:ok, uart} = UART.start_link()
UART.open(uart, tty)
UART.configure(uart,
framing: {UART.Framing.Line, separator: "\r\n"},
active: true,
rx_framing_timeout: 500)
{:ok, %{uart: uart}}
end
def handle_info({:nerves_uart, "/dev/tnt1", code}, state) do
handle_code(code, state.uart)
{:noreply, state}
end
def handle_info(thing, state) do
IO.inspect thing
{:noreply, state}
end
def handle_code("F83 Q" <> code, uart) do
UART.write(uart, "R83 mock_fw Q#{code}")
end
def handle_code(code, _uart) do
IO.warn "whoops!: #{inspect code}"
end
end
setup_all do
{:ok, mock} = GcodeMock.start_link("/dev/tnt1")
# start a nerves genserver
{:ok, nerves} = UART.start_link()
{:ok, handler} = Handler.start_link(nerves, "/dev/tnt0")
on_exit(fn() ->
if Process.alive?(mock) do
GenServer.stop(mock, :normal)
end
if Process.alive?(handler) do
GenServer.stop(handler, :normal)
end
end)
{:ok, mock: mock, handler: handler, handler_nerves: nerves}
end
test "checks serial availablity", %{handler: handler} do
bool = Handler.available?(handler)
assert bool == true
end
test "gets the state", %{handler: handler, handler_nerves: nerves} do
state = Handler.get_state(handler)
assert state.nerves == nerves
assert state.tty == "/dev/tnt0"
end
end

View File

@ -1,8 +1,14 @@
ExUnit.start
IO.puts "deleting config and secret"
Mix.shell.info [:green, "deleting config and secret"]
File.rm_rf! "/tmp/config.json"
File.rm_rf! "/tmp/secret"
File.rm_rf! "/tmp/farmware"
Mix.shell.info [:green, "Setting up faker"]
Faker.start
Mix.shell.info [:green, "Setting up vcr"]
ExVCR.Config.cassette_library_dir("fixture/cassettes")
:ok = Logger.remove_backend Farmbot.Logger
Mix.shell.info [:green, "removeing logger"]
Logger.remove_backend Farmbot.Logger