Merge branch 'fix/debian-install-libmagic-typo' into 'develop'
[akkoma] / test / pleroma / web / fed_sockets / fed_registry_test.exs
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Web.FedSockets.FedRegistryTest do
6 use ExUnit.Case
7
8 alias Pleroma.Web.FedSockets
9 alias Pleroma.Web.FedSockets.FedRegistry
10 alias Pleroma.Web.FedSockets.SocketInfo
11
12 @good_domain "http://good.domain"
13 @good_domain_origin "good.domain:80"
14
15 setup do
16 start_supervised({Pleroma.Web.FedSockets.Supervisor, []})
17 build_test_socket(@good_domain)
18 Process.sleep(10)
19
20 :ok
21 end
22
23 describe "add_fed_socket/1 without conflicting sockets" do
24 test "can be added" do
25 Process.sleep(10)
26 assert {:ok, %SocketInfo{origin: origin}} = FedRegistry.get_fed_socket(@good_domain_origin)
27 assert origin == "good.domain:80"
28 end
29
30 test "multiple origins can be added" do
31 build_test_socket("http://anothergood.domain")
32 Process.sleep(10)
33
34 assert {:ok, %SocketInfo{origin: origin_1}} =
35 FedRegistry.get_fed_socket(@good_domain_origin)
36
37 assert {:ok, %SocketInfo{origin: origin_2}} =
38 FedRegistry.get_fed_socket("anothergood.domain:80")
39
40 assert origin_1 == "good.domain:80"
41 assert origin_2 == "anothergood.domain:80"
42 assert FedRegistry.list_all() |> Enum.count() == 2
43 end
44 end
45
46 describe "add_fed_socket/1 when duplicate sockets conflict" do
47 setup do
48 build_test_socket(@good_domain)
49 build_test_socket(@good_domain)
50 Process.sleep(10)
51 :ok
52 end
53
54 test "will be ignored" do
55 assert {:ok, %SocketInfo{origin: origin, pid: _pid_one}} =
56 FedRegistry.get_fed_socket(@good_domain_origin)
57
58 assert origin == "good.domain:80"
59
60 assert FedRegistry.list_all() |> Enum.count() == 1
61 end
62
63 test "the newer process will be closed" do
64 pid_two = build_test_socket(@good_domain)
65
66 assert {:ok, %SocketInfo{origin: origin, pid: _pid_one}} =
67 FedRegistry.get_fed_socket(@good_domain_origin)
68
69 assert origin == "good.domain:80"
70 Process.sleep(10)
71
72 refute Process.alive?(pid_two)
73
74 assert FedRegistry.list_all() |> Enum.count() == 1
75 end
76 end
77
78 describe "get_fed_socket/1" do
79 test "returns missing for unknown hosts" do
80 assert {:error, :missing} = FedRegistry.get_fed_socket("not_a_dmoain")
81 end
82
83 test "returns rejected for hosts previously rejected" do
84 "rejected.domain:80"
85 |> FedSockets.uri_for_origin()
86 |> FedRegistry.set_host_rejected()
87
88 assert {:error, :rejected} = FedRegistry.get_fed_socket("rejected.domain:80")
89 end
90
91 test "can retrieve a previously added SocketInfo" do
92 build_test_socket(@good_domain)
93 Process.sleep(10)
94 assert {:ok, %SocketInfo{origin: origin}} = FedRegistry.get_fed_socket(@good_domain_origin)
95 assert origin == "good.domain:80"
96 end
97
98 test "removes references to SocketInfos when the process crashes" do
99 assert {:ok, %SocketInfo{origin: origin, pid: pid}} =
100 FedRegistry.get_fed_socket(@good_domain_origin)
101
102 assert origin == "good.domain:80"
103
104 Process.exit(pid, :testing)
105 Process.sleep(100)
106 assert {:error, :missing} = FedRegistry.get_fed_socket(@good_domain_origin)
107 end
108 end
109
110 def build_test_socket(uri) do
111 Kernel.spawn(fn -> fed_socket_almost(uri) end)
112 end
113
114 def fed_socket_almost(origin) do
115 FedRegistry.add_fed_socket(origin)
116
117 receive do
118 :close ->
119 :ok
120 after
121 5_000 -> :timeout
122 end
123 end
124 end