defmodule CliDirectoryTest do use ExUnit.Case doctest Snapex7 # We need to implement S7 Server behavior in order to make a proper tests. # we have a PLC that doesn't supports these functions (S7-1200). setup do snap7_dir = :code.priv_dir(:snapex7) |> List.to_string() System.put_env("LD_LIBRARY_PATH", snap7_dir) System.put_env("DYLD_LIBRARY_PATH", snap7_dir) executable = :code.priv_dir(:snapex7) ++ ~c"/s7_client.o" port = Port.open({:spawn_executable, executable}, [ {:args, []}, {:packet, 2}, :use_stdio, :binary, :exit_status ]) msg = {:connect_to, {"192.168.0.1", 0, 1}} send(port, {self(), {:command, :erlang.term_to_binary(msg)}}) status = receive do {_, {:data, <>}} -> :erlang.binary_to_term(response) after 10000 -> :error end %{port: port, status: status} end test "handler_list_blocks", state do case state.status do :ok -> msg = {:list_blocks, nil} send(state.port, {self(), {:command, :erlang.term_to_binary(msg)}}) c_response = receive do {_, {:data, <>}} -> :erlang.binary_to_term(response) x -> IO.inspect(x) :error after 1000 -> # Not sure how this can be recovered exit(:port_timed_out) end assert c_response == {:error, %{eiso: nil, es7: :errCliFunNotAvailable, etcp: nil}} _ -> IO.puts("(#{__MODULE__}) Not connected") end end test "handler_list_blocks_of_type", state do case state.status do :ok -> msg = {:list_blocks_of_type, {0x38, 2}} send(state.port, {self(), {:command, :erlang.term_to_binary(msg)}}) c_response = receive do {_, {:data, <>}} -> :erlang.binary_to_term(response) x -> IO.inspect(x) :error after 1000 -> # Not sure how this can be recovered exit(:port_timed_out) end assert c_response == {:error, %{eiso: nil, es7: :errCliItemNotAvailable, etcp: nil}} _ -> IO.puts("(#{__MODULE__}) Not connected") end end test "handler_get_ag_block_info test", state do case state.status do :ok -> msg = {:get_ag_block_info, {0x38, 2}} send(state.port, {self(), {:command, :erlang.term_to_binary(msg)}}) c_response = receive do {_, {:data, <>}} -> :erlang.binary_to_term(response) x -> IO.inspect(x) :error after 1000 -> # Not sure how this can be recovered exit(:port_timed_out) end assert c_response == {:error, %{eiso: nil, es7: :errCliFunNotAvailable, etcp: nil}} _ -> IO.puts("(#{__MODULE__}) Not connected") end end test "handler_get_pg_block_info test", state do case state.status do :ok -> msg = {:get_pg_block_info, {3, <<0x01, 0x02, 0x03>>}} send(state.port, {self(), {:command, :erlang.term_to_binary(msg)}}) c_response = receive do {_, {:data, <>}} -> :erlang.binary_to_term(response) x -> IO.inspect(x) :error after 1000 -> # Not sure how this can be recovered exit(:port_timed_out) end assert c_response == {:error, %{eiso: nil, es7: :errCliInvalidBlockSize, etcp: nil}} _ -> IO.puts("(#{__MODULE__}) Not connected") end end end