wayfarer/test/wayfarer_test.exs
James Harton 4ad256acdd
All checks were successful
continuous-integration/drone/push Build is passing
feat: Add support for proxying websockets.
2024-08-17 18:50:43 +12:00

109 lines
3.2 KiB
Elixir

defmodule WayfarerTest do
@moduledoc false
use ExUnit.Case, async: false
doctest Wayfarer
alias Support.HttpServer
alias Wayfarer.Target.TotalConnections
use Support.HttpRequest
use Support.PortTracker
import IP.Sigil
setup do
start_supervised!(Wayfarer.Target.Supervisor)
start_supervised!(Wayfarer.Listener.Supervisor)
start_supervised!(Wayfarer.Server.Supervisor)
:ok
end
defmodule IntegrationProxy do
@moduledoc false
use Wayfarer.Server
end
describe "integration tests" do
test "round robin integration test" do
listener_port = random_port()
target0_port = random_port()
target1_port = random_port()
{:ok, _} = HttpServer.start_link(target0_port, 200, "OK", true)
{:ok, _} = HttpServer.start_link(target1_port, 200, "OK", true)
{:ok, _proxy} =
IntegrationProxy.start_link(
listeners: [[scheme: :http, address: ~i"127.0.0.1", port: listener_port]],
targets: [
[
scheme: :http,
address: ~i"127.0.0.1",
port: target0_port,
health_checks: [[interval: 100]]
],
[
scheme: :http,
address: ~i"127.0.0.1",
port: target1_port,
health_checks: [[interval: 100]]
]
],
routing_table: [
{{:http, ~i"127.0.0.1", listener_port}, {:http, ~i"127.0.0.1", target0_port, :auto},
["www.example.com"], :round_robin},
{{:http, ~i"127.0.0.1", listener_port}, {:http, ~i"127.0.0.1", target1_port, :auto},
["www.example.com"], :round_robin}
]
)
wait_for_target_state({IntegrationProxy, :http, ~i"127.0.0.1", target0_port}, :healthy)
wait_for_target_state({IntegrationProxy, :http, ~i"127.0.0.1", target1_port}, :healthy)
assert {:ok, %{status: 200}} =
request(:http, ~i"127.0.0.1", listener_port, host: "www.example.com")
assert {:ok, %{status: 200}} =
request(:http, ~i"127.0.0.1", listener_port, host: "www.example.com")
assert [1, 1] =
[
{:http, {127, 0, 0, 1}, target0_port, :auto},
{:http, {127, 0, 0, 1}, target1_port, :auto}
]
|> TotalConnections.proxy_count()
|> Enum.map(&elem(&1, 1))
for _ <- 1..10 do
assert {:ok, %{status: 200}} =
request(:http, ~i"127.0.0.1", listener_port, host: "www.example.com")
assert {:ok, %{status: 200}} =
request(:http, ~i"127.0.0.1", listener_port, host: "www.example.com")
end
assert [11, 11] =
[
{:http, {127, 0, 0, 1}, target0_port, :auto},
{:http, {127, 0, 0, 1}, target1_port, :auto}
]
|> TotalConnections.proxy_count()
|> Enum.map(&elem(&1, 1))
end
end
defp wait_for_target_state(key, state) do
case Wayfarer.Target.current_status(key) do
{:ok, ^state} ->
:ok
{:ok, _} ->
Process.sleep(100)
wait_for_target_state(key, state)
{:error, reason} ->
raise reason
end
end
end