Skip to content

Commit

Permalink
Merge pull request #18 from danschultzer/formatting
Browse files Browse the repository at this point in the history
Enforce elixir formatting
  • Loading branch information
danschultzer committed Nov 20, 2023
2 parents f485a5f + fb3efcf commit ad60a5d
Show file tree
Hide file tree
Showing 12 changed files with 635 additions and 553 deletions.
17 changes: 16 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,22 @@ on:
workflow_call:

jobs:
lint:
runs-on: ubuntu-latest
name: Linter
env:
MIX_ENV: test
steps:
- uses: actions/checkout@v3
- uses: erlef/setup-beam@v1
with:
otp-version: 26.0
elixir-version: 1.15
- run: mix deps.get
- run: mix compile --warnings-as-errors
- run: mix credo --strict --ignore design.alias
- run: mix format --check-formatted

test:
strategy:
matrix:
Expand All @@ -29,4 +45,3 @@ jobs:
elixir-version: ${{matrix.version.elixir}}
- run: mix deps.get mix compile --warnings-as-errors
- run: mix test
- run: mix credo
3 changes: 2 additions & 1 deletion lib/test_server.ex
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ defmodule TestServer do
@type websocket_socket :: {instance(), route()}
@type websocket_frame :: {atom(), any()}
@type websocket_state :: any()
@type websocket_reply :: {:reply, websocket_frame(), websocket_state()} | {:ok, websocket_state()}
@type websocket_reply ::
{:reply, websocket_frame(), websocket_state()} | {:ok, websocket_state()}

@doc """
Start a test server instance.
Expand Down
29 changes: 19 additions & 10 deletions lib/test_server/http_server.ex
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,21 @@ defmodule TestServer.HTTPServer do
@type options :: [tls: keyword(), ipfamily: :inet | :inet6]
@type server_options :: keyword()

@callback start(instance(), port_number(), scheme(), options(), server_options()) :: {:ok, pid(), server_options()} | {:error, any()}
@callback start(instance(), port_number(), scheme(), options(), server_options()) ::
{:ok, pid(), server_options()} | {:error, any()}
@callback stop(instance(), server_options()) :: :ok | {:error, any()}
@callback get_socket_pid(Plug.Conn.t()) :: pid()

@default_http_server Enum.find_value([
{Bandit, TestServer.HTTPServer.Bandit},
{Plug.Cowboy, TestServer.HTTPServer.Plug.Cowboy},
{:httpd, TestServer.HTTPServer.Httpd}
],
fn {dep, module} ->
if Code.ensure_loaded?(dep), do: {module, []}
end)
@default_http_server Enum.find_value(
[
{Bandit, TestServer.HTTPServer.Bandit},
{Plug.Cowboy, TestServer.HTTPServer.Plug.Cowboy},
{:httpd, TestServer.HTTPServer.Httpd}
],
fn {dep, module} ->
if Code.ensure_loaded?(dep), do: {module, []}
end
)

@doc false
@spec start(pid(), keyword()) :: {:ok, keyword()} | {:error, any()}
Expand All @@ -48,7 +51,13 @@ defmodule TestServer.HTTPServer do
{tls_options, x509_options} = maybe_generate_x509_suite(options, scheme)
ip_family = Keyword.get(options, :ipfamily, :inet)
test_server_options = [tls: tls_options, ipfamily: ip_family]
{mod, server_options} = Keyword.get(options, :http_server, Application.get_env(:test_server, :http_server, @default_http_server))

{mod, server_options} =
Keyword.get(
options,
:http_server,
Application.get_env(:test_server, :http_server, @default_http_server)
)

case mod.start(instance, port, scheme, test_server_options, server_options) do
{:ok, reference, server_options} ->
Expand Down
122 changes: 61 additions & 61 deletions lib/test_server/http_server/bandit.ex
Original file line number Diff line number Diff line change
@@ -1,74 +1,74 @@
if Code.ensure_loaded?(Bandit) do
defmodule TestServer.HTTPServer.Bandit do
@moduledoc false

alias TestServer.WebSocket

@behaviour TestServer.HTTPServer
@behaviour WebSock

@impl TestServer.HTTPServer
def start(instance, port, scheme, options, bandit_options) do
transport_options =
bandit_options
|> Keyword.get(:transport_options, [])
|> put_tls_options(scheme, options[:tls])

ipfamily_opts =
case options[:ipfamily] do
:inet -> []
ipfamily -> [ipfamily]
defmodule TestServer.HTTPServer.Bandit do
@moduledoc false

alias TestServer.WebSocket

@behaviour TestServer.HTTPServer
@behaviour WebSock

@impl TestServer.HTTPServer
def start(instance, port, scheme, options, bandit_options) do
transport_options =
bandit_options
|> Keyword.get(:transport_options, [])
|> put_tls_options(scheme, options[:tls])

ipfamily_opts =
case options[:ipfamily] do
:inet -> []
ipfamily -> [ipfamily]
end

thousand_islands_options =
bandit_options
|> Keyword.get(:thousand_island_options, [])
|> Keyword.put(:port, port)
|> Keyword.put(:transport_options, ipfamily_opts ++ transport_options)

bandit_options =
bandit_options
|> Keyword.put(:thousand_island_options, thousand_islands_options)
|> Keyword.put(:plug, {TestServer.HTTPServer.Bandit.Plug, {__MODULE__, [], instance}})
|> Keyword.put(:scheme, scheme)
|> Keyword.put_new(:startup_log, false)

case Bandit.start_link(bandit_options) do
{:ok, server_pid} -> {:ok, server_pid, bandit_options}
{:error, error} -> {:error, error}
end

thousand_islands_options =
bandit_options
|> Keyword.get(:thousand_island_options, [])
|> Keyword.put(:port, port)
|> Keyword.put(:transport_options, ipfamily_opts ++ transport_options)

bandit_options =
bandit_options
|> Keyword.put(:thousand_island_options, thousand_islands_options)
|> Keyword.put(:plug, {TestServer.HTTPServer.Bandit.Plug, {__MODULE__, [], instance}})
|> Keyword.put(:scheme, scheme)
|> Keyword.put_new(:startup_log, false)

case Bandit.start_link(bandit_options) do
{:ok, server_pid} -> {:ok, server_pid, bandit_options}
{:error, error} -> {:error, error}
end
end

defp put_tls_options(transport_options, :http, _tls_options), do: transport_options
defp put_tls_options(transport_options, :http, _tls_options), do: transport_options

defp put_tls_options(transport_options, :https, tls_options) do
Keyword.merge(transport_options, Keyword.put_new(tls_options, :log_level, :warning))
end
defp put_tls_options(transport_options, :https, tls_options) do
Keyword.merge(transport_options, Keyword.put_new(tls_options, :log_level, :warning))
end

@impl TestServer.HTTPServer
def stop(server_pid, _bandit_options) do
ThousandIsland.stop(server_pid)
end
@impl TestServer.HTTPServer
def stop(server_pid, _bandit_options) do
ThousandIsland.stop(server_pid)
end

@impl TestServer.HTTPServer
def get_socket_pid(conn), do: conn.owner
@impl TestServer.HTTPServer
def get_socket_pid(conn), do: conn.owner

# WebSocket
# WebSocket

@impl WebSock
def init({socket, state}) do
{:ok, {socket, state}}
end
@impl WebSock
def init({socket, state}) do
{:ok, {socket, state}}
end

@impl WebSock
def handle_in({data, opcode: opcode}, {socket, state}),
do: WebSocket.handle_frame({opcode, data}, {socket, state})
@impl WebSock
def handle_in({data, opcode: opcode}, {socket, state}),
do: WebSocket.handle_frame({opcode, data}, {socket, state})

@impl WebSock
def handle_info({callback, stacktrace}, {socket, state}),
do: WebSocket.handle_info({callback, stacktrace}, {socket, state})
@impl WebSock
def handle_info({callback, stacktrace}, {socket, state}),
do: WebSocket.handle_info({callback, stacktrace}, {socket, state})

@impl WebSock
def terminate(_reason, _state), do: :ok
end
@impl WebSock
def terminate(_reason, _state), do: :ok
end
end
17 changes: 12 additions & 5 deletions lib/test_server/http_server/bandit/http2_adapter.ex
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ if Code.ensure_loaded?(Bandit) do
@impl Plug.Conn.Adapter
def read_req_body({plug_pid, payload}, opts) do
with {:ok, data, payload} <-
send_and_receive(plug_pid, :read_req_body, [payload, opts]) do
send_and_receive(plug_pid, :read_req_body, [payload, opts]) do
{:ok, data, {plug_pid, payload}}
end
end
Expand All @@ -37,23 +37,30 @@ if Code.ensure_loaded?(Bandit) do
@impl Plug.Conn.Adapter
def send_resp({plug_pid, payload}, status, headers, body) do
with {:ok, sent_body, payload} <-
send_and_receive(plug_pid, :send_resp, [payload, status, headers, body]) do
send_and_receive(plug_pid, :send_resp, [payload, status, headers, body]) do
{:ok, sent_body, {plug_pid, payload}}
end
end

@impl Plug.Conn.Adapter
def send_file({plug_pid, payload}, status, headers, path, offset, length) do
with {:ok, sent_body, payload} <-
send_and_receive(plug_pid, :send_file, [payload, status, headers, path, offset, length]) do
send_and_receive(plug_pid, :send_file, [
payload,
status,
headers,
path,
offset,
length
]) do
{:ok, sent_body, {plug_pid, payload}}
end
end

@impl Plug.Conn.Adapter
def send_chunked({plug_pid, payload}, status, headers) do
with {:ok, sent_body, payload} <-
send_and_receive(plug_pid, :send_chunked, [payload, status, headers]) do
send_and_receive(plug_pid, :send_chunked, [payload, status, headers]) do
{:ok, sent_body, {plug_pid, payload}}
end
end
Expand Down Expand Up @@ -92,4 +99,4 @@ if Code.ensure_loaded?(Bandit) do
send_and_receive(plug_pid, :get_http_protocol, [payload])
end
end
end
end
18 changes: 10 additions & 8 deletions lib/test_server/http_server/bandit/plug.ex
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,22 @@
defmodule TestServer.HTTPServer.Bandit.Plug do
@moduledoc false

defdelegate init(opts), to: TestServer.Plug
defdelegate init(opts), to: TestServer.Plug

def call(%{adapter: {Bandit.HTTP2.Adapter, req}} = conn, {http_server, args, instance}) do
plug_pid = self()
conn = %{conn | adapter: {TestServer.HTTPServer.Bandit.HTTP2Adapter, {plug_pid, req}}}

loop(Task.async(fn ->
conn = call(conn, {http_server, args, instance})
loop(
Task.async(fn ->
conn = call(conn, {http_server, args, instance})

send(plug_pid, :done)
send(plug_pid, :done)

%{adapter: {_, {_, req}}} = conn
%{conn | adapter: {Bandit.HTTP2.Adapter, req}}
end))
%{adapter: {_, {_, req}}} = conn
%{conn | adapter: {Bandit.HTTP2.Adapter, req}}
end)
)
end

def call(conn, {http_server, args, instance}) do
Expand All @@ -28,7 +30,7 @@ defmodule TestServer.HTTPServer.Bandit.Plug do
Task.await(task)

{caller, {m, f, a}} ->
send caller, {:ok, {m, f, a}, apply(m, f, a)}
send(caller, {:ok, {m, f, a}, apply(m, f, a)})

loop(task)
end
Expand Down
Loading

0 comments on commit ad60a5d

Please sign in to comment.