2020-09-18 11:58:22 +00:00
|
|
|
# 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
|
2020-10-22 20:33:52 +00:00
|
|
|
assert {:ok, %SocketInfo{origin: origin, pid: _pid_one}} =
|
2020-09-18 11:58:22 +00:00
|
|
|
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)
|
|
|
|
|
2020-10-22 20:33:52 +00:00
|
|
|
assert {:ok, %SocketInfo{origin: origin, pid: _pid_one}} =
|
2020-09-18 11:58:22 +00:00
|
|
|
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
|