quality/tres: Add handler testcases

This commit is contained in:
Eishun Kondoh 2019-05-08 01:31:27 +09:00
parent 0a6d7f31d6
commit 4965bc60ec
9 changed files with 273 additions and 98 deletions

View file

@ -7,33 +7,50 @@ defmodule Tres.ExampleHandler do
defmodule State do
defstruct datapath_id: nil,
aux_id: nil,
conn_ref: nil
queue: :queue.new(),
client: nil
end
# API functions
@spec send(String.t(), map()) :: :ok
def send(datapath_id, msg), do: send_message(msg, datapath_id)
@spec get(datapath_id :: String.t()) :: map() | nil
def get(datapath_id) do
datapath_id
|> lookup_handler_pid()
|> GenServer.call(:get)
end
def start_link(datapath, args) do
GenServer.start_link(__MODULE__, [datapath, args])
end
# GenServer callbacks
def init([{datapath_id, aux_id}, _args]) do
info(
"Switch Ready: " <>
"datapath_id: #{datapath_id} " <> "aux_id: #{aux_id} " <> "on #{inspect(self())}"
)
_ = send_desc_stats_request(datapath_id)
_ = send_port_desc_stats_request(datapath_id)
state = %State{datapath_id: datapath_id, aux_id: aux_id}
{:ok, state}
:ok = info("datapath connected: #{datapath_id}")
:ok = send_flow_mod_add(datapath_id, priority: 0)
{:ok, %State{datapath_id: datapath_id, aux_id: aux_id}}
end
def handle_info(%PortDesc.Reply{datapath_id: datapath_id} = desc, state) do
handle_port_desc_stats_reply(desc, datapath_id)
{:noreply, state}
def handle_call(:get, from, %State{queue: {[], []}} = state) do
{:noreply, %{state | client: from}}
end
def handle_info(%Desc.Reply{datapath_id: datapath_id} = desc, state) do
handle_desc_stats_reply(desc, datapath_id)
{:noreply, state}
def handle_call(:get, _from, %State{} = state) do
{{:value, msg}, new_queue} = :queue.out(state.queue)
{:reply, msg, %{state | queue: new_queue}}
end
def handle_info(%{datapath_id: _datapath_id} = msg, %State{client: nil} = state) do
{:noreply, %{state | queue: :queue.in(msg, state.queue)}}
end
def handle_info(%{datapath_id: _datapath_id} = msg, state) do
GenServer.reply(state.client, msg)
{:noreply, %{state | client: nil}}
end
def handle_info({:switch_disconnected, _reason}, state) do
@ -41,47 +58,10 @@ defmodule Tres.ExampleHandler do
{:stop, :normal, state}
end
def handle_info({:switch_hang, _datapath_id}, state) do
:ok = warn("Switch possible hang: datapath_id: #{state.datapath_id}")
{:noreply, state}
end
# `Catch all` function is required.
def handle_info(info, state) do
:ok = warn("unhandled message #{inspect(info)}: #{state.datapath_id}")
{:noreply, state}
end
# private functions
defp send_desc_stats_request(datapath_id) do
Desc.Request.new()
|> send_message(datapath_id)
end
defp send_port_desc_stats_request(datapath_id) do
PortDesc.Request.new()
|> send_message(datapath_id)
end
defp handle_desc_stats_reply(desc, datapath_id) do
info(
"Switch Desc: " <>
"mfr = #{desc.mfr_desc} " <>
"hw = #{desc.hw_desc} " <> "sw = #{desc.sw_desc} " <> "for #{datapath_id}"
)
end
defp handle_port_desc_stats_reply(port_desc, datapath_id) do
for port <- port_desc.ports do
info(
"Switch has port: " <>
"number = #{port.number} " <>
"hw_addr = #{port.hw_addr} " <>
"name = #{port.name} " <>
"config = #{inspect(port.config)} " <>
"current_speed = #{port.current_speed} " <> "on #{datapath_id}"
)
end
end
end