defmodule CServerLifecycleTest do use ExUnit.Case doctest Opex62541 setup do executable = :code.priv_dir(:opex62541) ++ '/opc_ua_server' port = Port.open({:spawn_executable, executable}, [ {:args, []}, {:packet, 2}, :use_stdio, :binary, :exit_status ]) %{port: port} end test "Set/Get client config", state do desired_config = %{ "application_description" => %{ "application_uri" => "urn:open62541.server.application", "discovery_url" => [], "name" => "open62541-based OPC UA Application", "product_uri" => "http://open62541.org", "server" => "urn:open62541.server.application", "type" => "server" }, "endpoint_description" => [ %{ "endpoint_url" => "", "security_level" => 1, "security_mode" => "none", "security_profile_uri" => "http://opcfoundation.org/UA/SecurityPolicy#None", "transport_profile_uri" => "http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary" } ], "hostname" => "localhost", "n_threads" => 1 } msg = {:set_default_server_config, 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 == :ok msg = {:get_server_config, 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 == {:ok, desired_config} end test "Set hostname", state do msg = {:set_default_server_config, 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 == :ok msg = {:set_hostname, "alde103"} 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 == :ok msg = {:get_server_config, 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 {:ok, server_config} = c_response assert server_config["hostname"] == "alde103" end test "Set port_number", state do msg = {:set_default_server_config, 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 == :ok msg = {:set_port, 4040} 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 == :ok end test "Set users", state do msg = {:set_default_server_config, 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 == :ok msg = {:set_users, [{4, "alde", 4, "edla"}, {5, "pedro", 5, "ordep"}]} 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 == :ok end test "start_server", state do msg = {:set_default_server_config, 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 == :ok msg = {:start_server, 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 == :ok end end