Skip to content

Commit 4f598f4

Browse files
committed
feat: make start session return an error tuple instead of raising
1 parent 3be56f4 commit 4f598f4

File tree

3 files changed

+52
-33
lines changed

3 files changed

+52
-33
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ erl_crash.dump
55
.DS_Store
66
doc/
77
screenshot-*.png
8+
.elixir_ls

lib/hound/helpers/session.ex

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ defmodule Hound.Helpers.Session do
4444
change_session_to(session_name)
4545
result = apply(func, [])
4646
change_session_to(previous_session_name)
47-
result
47+
result
4848
end
4949

5050

@@ -117,9 +117,7 @@ defmodule Hound.Helpers.Session do
117117

118118
@doc false
119119
def current_session_name do
120-
Hound.SessionServer.current_session_name(self()) ||
121-
raise "could not find a session for process #{inspect self()}"
122-
123-
120+
Hound.SessionServer.current_session_name(self()) ||
121+
raise "could not find a session for process #{inspect self()}"
124122
end
125123
end

lib/hound/session_server.ex

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
defmodule Hound.SessionServer do
22
@moduledoc false
33

4+
require Logger
5+
46
use GenServer
57
@name __MODULE__
68

@@ -10,13 +12,15 @@ defmodule Hound.SessionServer do
1012

1113

1214
def session_for_pid(pid, opts) do
13-
current_session_id(pid) ||
15+
IO.inspect(pid, label: "session_for_pid")
16+
{:ok, current_session_id(pid)} ||
1417
change_current_session_for_pid(pid, :default, opts)
1518
end
1619

1720

1821
def current_session_id(pid) do
19-
case :ets.lookup(@name, pid) do
22+
IO.inspect pid, label: "current_session_id"
23+
case :ets.lookup(@name, pid) |> IO.inspect do
2024
[{^pid, _ref, session_id, _all_sessions}] -> session_id
2125
[] -> nil
2226
end
@@ -58,34 +62,53 @@ defmodule Hound.SessionServer do
5862
{:ok, state}
5963
end
6064

65+
def handle_call({:destroy_sessions, pid}, _from, state) do
66+
destroy_sessions(pid)
67+
{:reply, :ok, state}
68+
end
6169

6270
def handle_call({:change_session, pid, session_name, opts}, _from, state) do
63-
{:ok, driver_info} = Hound.driver_info
64-
65-
{ref, sessions} =
66-
case :ets.lookup(@name, pid) do
67-
[{^pid, ref, _session_id, sessions}] ->
68-
{ref, sessions}
69-
[] ->
70-
{Process.monitor(pid), %{}}
71-
end
72-
73-
{session_id, sessions} =
74-
case Map.fetch(sessions, session_name) do
75-
{:ok, session_id} ->
76-
{session_id, sessions}
77-
:error ->
78-
session_id = create_session(driver_info, opts)
79-
{session_id, Map.put(sessions, session_name, session_id)}
80-
end
71+
{ref, sessions} = case :ets.lookup(@name, pid) do
72+
[{^pid, ref, _session_id, sessions}] ->
73+
{ref, sessions}
74+
[] ->
75+
{Process.monitor(pid), %{}}
76+
end
77+
78+
79+
case find_existing_session(sessions, session_name) do
80+
{:ok, {session_id, sessions}} ->
81+
Logger.debug("Found exsisting session #{session_name} - #{session_id}")
82+
83+
add_session_to_table(pid, ref, session_id, sessions)
84+
85+
{:reply, {:ok, session_id}, Map.put(state, ref, pid)}
86+
87+
:error ->
88+
{:ok, driver_info} = Hound.driver_info()
8189

90+
case create_session(driver_info, opts) do
91+
{:error, _} = e -> {:reply, e, state}
92+
93+
{:ok, session_id} ->
94+
Logger.debug("Started new session #{session_name} - #{session_id}")
95+
96+
sessions = Map.put(sessions, session_name, session_id)
97+
add_session_to_table(pid, ref, session_id, sessions)
98+
99+
{:reply, {:ok, session_id}, Map.put(state, ref, pid)}
100+
end
101+
end
102+
end
103+
104+
defp add_session_to_table(pid, ref, session_id, sessions) do
82105
:ets.insert(@name, {pid, ref, session_id, sessions})
83-
{:reply, session_id, Map.put(state, ref, pid)}
84106
end
85107

86-
def handle_call({:destroy_sessions, pid}, _from, state) do
87-
destroy_sessions(pid)
88-
{:reply, :ok, state}
108+
defp find_existing_session(sessions, session_name) do
109+
with {:ok, session_id} <- Map.fetch(sessions, session_name) do
110+
{:ok, {session_id, sessions}}
111+
end
89112
end
90113

91114
def handle_info({:DOWN, ref, _, _, _}, state) do
@@ -96,10 +119,7 @@ defmodule Hound.SessionServer do
96119
end
97120

98121
defp create_session(driver_info, opts) do
99-
case Hound.Session.create_session(driver_info[:browser], opts) do
100-
{:ok, session_id} -> session_id
101-
{:error, reason} -> raise "could not create a new session: #{reason}, check webdriver is running"
102-
end
122+
Hound.Session.create_session(driver_info[:browser], opts)
103123
end
104124

105125
defp destroy_sessions(pid) do

0 commit comments

Comments
 (0)