Packages
wallaby
0.5.0
0.31.0
0.30.12
0.30.11
0.30.10
0.30.9
0.30.8
0.30.7
0.30.6
0.30.5
0.30.4
0.30.3
0.30.2
0.30.1
0.30.0
0.29.1
0.29.0
0.28.1
0.28.0
0.27.0
0.26.2
0.26.1
0.26.0
0.25.1
0.25.0
0.24.1
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.17.0
0.16.1
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.1
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.1
0.3.0
0.2.0
0.1.0
0.0.1
Concurrent feature tests for elixir
Current section
Files
Jump to
Current section
Files
lib/wallaby/server.ex
defmodule Wallaby.Server do
use GenServer
def start_link(_args) do
GenServer.start_link(__MODULE__, [])
end
def get_base_url(server) do
GenServer.call(server, :get_base_url)
end
def init(_) do
port = find_available_port
command = "#{script_path} --webdriver=#{port}"
Port.open({:spawn, command}, [:binary, :stream, :use_stdio, :exit_status])
{:ok, %{running: false, awaiting_url: [], base_url: "http://localhost:#{port}/"}}
end
defp find_available_port do
{:ok, listen} = :gen_tcp.listen(0, [])
{:ok, port} = :inet.port(listen)
:gen_tcp.close(listen)
port
end
defp script_path do
Path.absname("priv/run_phantom.sh", Application.app_dir(:wallaby))
end
def handle_info({_port, {:data, output}}, %{running: false} = state) do
if output =~ "running on port" do
Enum.each state.awaiting_url, &GenServer.reply(&1, state.base_url)
{:noreply, %{state | running: true, awaiting_url: []}}
else
{:noreply, state}
end
end
def handle_info({_port, {:exit_status, status}}, state) do
{:stop, {:exit_status, status}, %{state | running: false}}
end
def handle_info(_msg, state) do
{:noreply, state}
end
def handle_call(:get_base_url, from, %{running: false} = state) do
awaiting_url = [from|state.awaiting_url]
{:noreply, %{state | awaiting_url: awaiting_url}}
end
def handle_call(:get_base_url, _from, state) do
{:reply, state.base_url, state}
end
end