diff options
Diffstat (limited to 'test/web/fed_sockets')
| -rw-r--r-- | test/web/fed_sockets/fed_registry_test.exs | 124 | ||||
| -rw-r--r-- | test/web/fed_sockets/fetch_registry_test.exs | 67 | ||||
| -rw-r--r-- | test/web/fed_sockets/socket_info_test.exs | 118 | 
3 files changed, 309 insertions, 0 deletions
| diff --git a/test/web/fed_sockets/fed_registry_test.exs b/test/web/fed_sockets/fed_registry_test.exs new file mode 100644 index 000000000..19ac874d6 --- /dev/null +++ b/test/web/fed_sockets/fed_registry_test.exs @@ -0,0 +1,124 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FedSockets.FedRegistryTest do +  use ExUnit.Case + +  alias Pleroma.Web.FedSockets +  alias Pleroma.Web.FedSockets.FedRegistry +  alias Pleroma.Web.FedSockets.SocketInfo + +  @good_domain "http://good.domain" +  @good_domain_origin "good.domain:80" + +  setup do +    start_supervised({Pleroma.Web.FedSockets.Supervisor, []}) +    build_test_socket(@good_domain) +    Process.sleep(10) + +    :ok +  end + +  describe "add_fed_socket/1 without conflicting sockets" do +    test "can be added" do +      Process.sleep(10) +      assert {:ok, %SocketInfo{origin: origin}} = FedRegistry.get_fed_socket(@good_domain_origin) +      assert origin == "good.domain:80" +    end + +    test "multiple origins can be added" do +      build_test_socket("http://anothergood.domain") +      Process.sleep(10) + +      assert {:ok, %SocketInfo{origin: origin_1}} = +               FedRegistry.get_fed_socket(@good_domain_origin) + +      assert {:ok, %SocketInfo{origin: origin_2}} = +               FedRegistry.get_fed_socket("anothergood.domain:80") + +      assert origin_1 == "good.domain:80" +      assert origin_2 == "anothergood.domain:80" +      assert FedRegistry.list_all() |> Enum.count() == 2 +    end +  end + +  describe "add_fed_socket/1 when duplicate sockets conflict" do +    setup do +      build_test_socket(@good_domain) +      build_test_socket(@good_domain) +      Process.sleep(10) +      :ok +    end + +    test "will be ignored" do +      assert {:ok, %SocketInfo{origin: origin, pid: pid_one}} = +               FedRegistry.get_fed_socket(@good_domain_origin) + +      assert origin == "good.domain:80" + +      assert FedRegistry.list_all() |> Enum.count() == 1 +    end + +    test "the newer process will be closed" do +      pid_two = build_test_socket(@good_domain) + +      assert {:ok, %SocketInfo{origin: origin, pid: pid_one}} = +               FedRegistry.get_fed_socket(@good_domain_origin) + +      assert origin == "good.domain:80" +      Process.sleep(10) + +      refute Process.alive?(pid_two) + +      assert FedRegistry.list_all() |> Enum.count() == 1 +    end +  end + +  describe "get_fed_socket/1" do +    test "returns missing for unknown hosts" do +      assert {:error, :missing} = FedRegistry.get_fed_socket("not_a_dmoain") +    end + +    test "returns rejected for hosts previously rejected" do +      "rejected.domain:80" +      |> FedSockets.uri_for_origin() +      |> FedRegistry.set_host_rejected() + +      assert {:error, :rejected} = FedRegistry.get_fed_socket("rejected.domain:80") +    end + +    test "can retrieve a previously added SocketInfo" do +      build_test_socket(@good_domain) +      Process.sleep(10) +      assert {:ok, %SocketInfo{origin: origin}} = FedRegistry.get_fed_socket(@good_domain_origin) +      assert origin == "good.domain:80" +    end + +    test "removes references to SocketInfos when the process crashes" do +      assert {:ok, %SocketInfo{origin: origin, pid: pid}} = +               FedRegistry.get_fed_socket(@good_domain_origin) + +      assert origin == "good.domain:80" + +      Process.exit(pid, :testing) +      Process.sleep(100) +      assert {:error, :missing} = FedRegistry.get_fed_socket(@good_domain_origin) +    end +  end + +  def build_test_socket(uri) do +    Kernel.spawn(fn -> fed_socket_almost(uri) end) +  end + +  def fed_socket_almost(origin) do +    FedRegistry.add_fed_socket(origin) + +    receive do +      :close -> +        :ok +    after +      5_000 -> :timeout +    end +  end +end diff --git a/test/web/fed_sockets/fetch_registry_test.exs b/test/web/fed_sockets/fetch_registry_test.exs new file mode 100644 index 000000000..7bd2d995a --- /dev/null +++ b/test/web/fed_sockets/fetch_registry_test.exs @@ -0,0 +1,67 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FedSockets.FetchRegistryTest do +  use ExUnit.Case + +  alias Pleroma.Web.FedSockets.FetchRegistry +  alias Pleroma.Web.FedSockets.FetchRegistry.FetchRegistryData + +  @json_message "hello" +  @json_reply "hello back" + +  setup do +    start_supervised( +      {Pleroma.Web.FedSockets.Supervisor, +       [ +         ping_interval: 8, +         connection_duration: 15, +         rejection_duration: 5, +         fed_socket_fetches: [default: 10, interval: 10] +       ]} +    ) + +    :ok +  end + +  test "fetches can be stored" do +    uuid = FetchRegistry.register_fetch(@json_message) + +    assert {:error, :waiting} = FetchRegistry.check_fetch(uuid) +  end + +  test "fetches can return" do +    uuid = FetchRegistry.register_fetch(@json_message) +    task = Task.async(fn -> FetchRegistry.register_fetch_received(uuid, @json_reply) end) + +    assert {:error, :waiting} = FetchRegistry.check_fetch(uuid) +    Task.await(task) + +    assert {:ok, %FetchRegistryData{received_json: received_json}} = +             FetchRegistry.check_fetch(uuid) + +    assert received_json == @json_reply +  end + +  test "fetches are deleted once popped from stack" do +    uuid = FetchRegistry.register_fetch(@json_message) +    task = Task.async(fn -> FetchRegistry.register_fetch_received(uuid, @json_reply) end) +    Task.await(task) + +    assert {:ok, %FetchRegistryData{received_json: received_json}} = +             FetchRegistry.check_fetch(uuid) + +    assert received_json == @json_reply +    assert {:ok, @json_reply} = FetchRegistry.pop_fetch(uuid) + +    assert {:error, :missing} = FetchRegistry.check_fetch(uuid) +  end + +  test "fetches can time out" do +    uuid = FetchRegistry.register_fetch(@json_message) +    assert {:error, :waiting} = FetchRegistry.check_fetch(uuid) +    Process.sleep(500) +    assert {:error, :missing} = FetchRegistry.check_fetch(uuid) +  end +end diff --git a/test/web/fed_sockets/socket_info_test.exs b/test/web/fed_sockets/socket_info_test.exs new file mode 100644 index 000000000..db3d6edcd --- /dev/null +++ b/test/web/fed_sockets/socket_info_test.exs @@ -0,0 +1,118 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.FedSockets.SocketInfoTest do +  use ExUnit.Case + +  alias Pleroma.Web.FedSockets +  alias Pleroma.Web.FedSockets.SocketInfo + +  describe "uri_for_origin" do +    test "provides the fed_socket URL given the origin information" do +      endpoint = "example.com:4000" +      assert FedSockets.uri_for_origin(endpoint) =~ "ws://" +      assert FedSockets.uri_for_origin(endpoint) =~ endpoint +    end +  end + +  describe "origin" do +    test "will provide the origin field given a url" do +      endpoint = "example.com:4000" +      assert SocketInfo.origin("ws://#{endpoint}") == endpoint +      assert SocketInfo.origin("http://#{endpoint}") == endpoint +      assert SocketInfo.origin("https://#{endpoint}") == endpoint +    end + +    test "will proide the origin field given a uri" do +      endpoint = "example.com:4000" +      uri = URI.parse("http://#{endpoint}") + +      assert SocketInfo.origin(uri) == endpoint +    end +  end + +  describe "touch" do +    test "will update the TTL" do +      endpoint = "example.com:4000" +      socket = SocketInfo.build("ws://#{endpoint}") +      Process.sleep(2) +      touched_socket = SocketInfo.touch(socket) + +      assert socket.connected_until < touched_socket.connected_until +    end +  end + +  describe "expired?" do +    setup do +      start_supervised( +        {Pleroma.Web.FedSockets.Supervisor, +         [ +           ping_interval: 8, +           connection_duration: 5, +           rejection_duration: 5, +           fed_socket_rejections: [lazy: true] +         ]} +      ) + +      :ok +    end + +    test "tests if the TTL is exceeded" do +      endpoint = "example.com:4000" +      socket = SocketInfo.build("ws://#{endpoint}") +      refute SocketInfo.expired?(socket) +      Process.sleep(10) + +      assert SocketInfo.expired?(socket) +    end +  end + +  describe "creating outgoing connection records" do +    test "can be passed a string" do +      assert %{conn_pid: :pid, origin: _origin} = SocketInfo.build("example.com:4000", :pid) +    end + +    test "can be passed a URI" do +      uri = URI.parse("http://example.com:4000") +      assert %{conn_pid: :pid, origin: origin} = SocketInfo.build(uri, :pid) +      assert origin =~ "example.com:4000" +    end + +    test "will include the port number" do +      assert %{conn_pid: :pid, origin: origin} = SocketInfo.build("http://example.com:4000", :pid) + +      assert origin =~ ":4000" +    end + +    test "will provide the port if missing" do +      assert %{conn_pid: :pid, origin: "example.com:80"} = +               SocketInfo.build("http://example.com", :pid) + +      assert %{conn_pid: :pid, origin: "example.com:443"} = +               SocketInfo.build("https://example.com", :pid) +    end +  end + +  describe "creating incoming connection records" do +    test "can be passed a string" do +      assert %{pid: _, origin: _origin} = SocketInfo.build("example.com:4000") +    end + +    test "can be passed a URI" do +      uri = URI.parse("example.com:4000") +      assert %{pid: _, origin: _origin} = SocketInfo.build(uri) +    end + +    test "will include the port number" do +      assert %{pid: _, origin: origin} = SocketInfo.build("http://example.com:4000") + +      assert origin =~ ":4000" +    end + +    test "will provide the port if missing" do +      assert %{pid: _, origin: "example.com:80"} = SocketInfo.build("http://example.com") +      assert %{pid: _, origin: "example.com:443"} = SocketInfo.build("https://example.com") +    end +  end +end | 
