|
|
@@ -435,307 +435,6 @@ defmodule Pleroma.Pool.ConnectionsTest do |
|
|
|
} = Connections.get_state(name) |
|
|
|
end |
|
|
|
|
|
|
|
describe "integration test" do |
|
|
|
@describetag :integration |
|
|
|
|
|
|
|
clear_config(Pleroma.Gun) do |
|
|
|
Pleroma.Config.put(Pleroma.Gun, Pleroma.Gun.API) |
|
|
|
end |
|
|
|
|
|
|
|
test "opens connection and change owner", %{name: name} do |
|
|
|
url = "https://httpbin.org" |
|
|
|
:ok = Conn.open(url, name) |
|
|
|
conn = Connections.checkin(url, name) |
|
|
|
|
|
|
|
pid = Process.whereis(name) |
|
|
|
|
|
|
|
assert :gun.info(conn).owner == pid |
|
|
|
end |
|
|
|
|
|
|
|
test "opens connection and reuse it on next request", %{name: name} do |
|
|
|
url = "http://httpbin.org" |
|
|
|
:ok = Conn.open(url, name) |
|
|
|
Process.sleep(250) |
|
|
|
conn = Connections.checkin(url, name) |
|
|
|
|
|
|
|
assert is_pid(conn) |
|
|
|
assert Process.alive?(conn) |
|
|
|
|
|
|
|
reused_conn = Connections.checkin(url, name) |
|
|
|
|
|
|
|
assert conn == reused_conn |
|
|
|
|
|
|
|
%Connections{ |
|
|
|
conns: %{ |
|
|
|
"http:httpbin.org:80" => %Conn{ |
|
|
|
conn: ^conn, |
|
|
|
gun_state: :up |
|
|
|
} |
|
|
|
} |
|
|
|
} = Connections.get_state(name) |
|
|
|
end |
|
|
|
|
|
|
|
test "opens ssl connection and reuse it on next request", %{name: name} do |
|
|
|
url = "https://httpbin.org" |
|
|
|
:ok = Conn.open(url, name) |
|
|
|
Process.sleep(1_000) |
|
|
|
conn = Connections.checkin(url, name) |
|
|
|
|
|
|
|
assert is_pid(conn) |
|
|
|
assert Process.alive?(conn) |
|
|
|
|
|
|
|
reused_conn = Connections.checkin(url, name) |
|
|
|
|
|
|
|
assert conn == reused_conn |
|
|
|
|
|
|
|
%Connections{ |
|
|
|
conns: %{ |
|
|
|
"https:httpbin.org:443" => %Conn{ |
|
|
|
conn: ^conn, |
|
|
|
gun_state: :up |
|
|
|
} |
|
|
|
} |
|
|
|
} = Connections.get_state(name) |
|
|
|
end |
|
|
|
|
|
|
|
test "remove frequently used and idle", %{name: name} do |
|
|
|
self = self() |
|
|
|
https1 = "https://www.google.com" |
|
|
|
https2 = "https://httpbin.org" |
|
|
|
|
|
|
|
:ok = Conn.open(https1, name) |
|
|
|
:ok = Conn.open(https2, name) |
|
|
|
Process.sleep(1_500) |
|
|
|
conn = Connections.checkin(https1, name) |
|
|
|
|
|
|
|
for _ <- 1..4 do |
|
|
|
Connections.checkin(https2, name) |
|
|
|
end |
|
|
|
|
|
|
|
%Connections{ |
|
|
|
conns: %{ |
|
|
|
"https:httpbin.org:443" => %Conn{ |
|
|
|
conn: _, |
|
|
|
gun_state: :up |
|
|
|
}, |
|
|
|
"https:www.google.com:443" => %Conn{ |
|
|
|
conn: _, |
|
|
|
gun_state: :up |
|
|
|
} |
|
|
|
} |
|
|
|
} = Connections.get_state(name) |
|
|
|
|
|
|
|
:ok = Connections.checkout(conn, self, name) |
|
|
|
http = "http://httpbin.org" |
|
|
|
Process.sleep(1_000) |
|
|
|
:ok = Conn.open(http, name) |
|
|
|
conn = Connections.checkin(http, name) |
|
|
|
|
|
|
|
%Connections{ |
|
|
|
conns: %{ |
|
|
|
"http:httpbin.org:80" => %Conn{ |
|
|
|
conn: ^conn, |
|
|
|
gun_state: :up |
|
|
|
}, |
|
|
|
"https:httpbin.org:443" => %Conn{ |
|
|
|
conn: _, |
|
|
|
gun_state: :up |
|
|
|
} |
|
|
|
} |
|
|
|
} = Connections.get_state(name) |
|
|
|
end |
|
|
|
|
|
|
|
test "remove earlier used and idle", %{name: name} do |
|
|
|
self = self() |
|
|
|
|
|
|
|
https1 = "https://www.google.com" |
|
|
|
https2 = "https://httpbin.org" |
|
|
|
:ok = Conn.open(https1, name) |
|
|
|
:ok = Conn.open(https2, name) |
|
|
|
Process.sleep(1_500) |
|
|
|
|
|
|
|
Connections.checkin(https1, name) |
|
|
|
conn = Connections.checkin(https1, name) |
|
|
|
|
|
|
|
Process.sleep(1_000) |
|
|
|
Connections.checkin(https2, name) |
|
|
|
Connections.checkin(https2, name) |
|
|
|
|
|
|
|
%Connections{ |
|
|
|
conns: %{ |
|
|
|
"https:httpbin.org:443" => %Conn{ |
|
|
|
conn: _, |
|
|
|
gun_state: :up |
|
|
|
}, |
|
|
|
"https:www.google.com:443" => %Conn{ |
|
|
|
conn: ^conn, |
|
|
|
gun_state: :up |
|
|
|
} |
|
|
|
} |
|
|
|
} = Connections.get_state(name) |
|
|
|
|
|
|
|
:ok = Connections.checkout(conn, self, name) |
|
|
|
:ok = Connections.checkout(conn, self, name) |
|
|
|
|
|
|
|
http = "http://httpbin.org" |
|
|
|
:ok = Conn.open(http, name) |
|
|
|
Process.sleep(1_000) |
|
|
|
|
|
|
|
conn = Connections.checkin(http, name) |
|
|
|
|
|
|
|
%Connections{ |
|
|
|
conns: %{ |
|
|
|
"http:httpbin.org:80" => %Conn{ |
|
|
|
conn: ^conn, |
|
|
|
gun_state: :up |
|
|
|
}, |
|
|
|
"https:httpbin.org:443" => %Conn{ |
|
|
|
conn: _, |
|
|
|
gun_state: :up |
|
|
|
} |
|
|
|
} |
|
|
|
} = Connections.get_state(name) |
|
|
|
end |
|
|
|
|
|
|
|
test "doesn't open new conn on pool overflow", %{name: name} do |
|
|
|
self = self() |
|
|
|
|
|
|
|
https1 = "https://www.google.com" |
|
|
|
https2 = "https://httpbin.org" |
|
|
|
:ok = Conn.open(https1, name) |
|
|
|
:ok = Conn.open(https2, name) |
|
|
|
Process.sleep(1_000) |
|
|
|
Connections.checkin(https1, name) |
|
|
|
conn1 = Connections.checkin(https1, name) |
|
|
|
conn2 = Connections.checkin(https2, name) |
|
|
|
|
|
|
|
%Connections{ |
|
|
|
conns: %{ |
|
|
|
"https:httpbin.org:443" => %Conn{ |
|
|
|
conn: ^conn2, |
|
|
|
gun_state: :up, |
|
|
|
conn_state: :active, |
|
|
|
used_by: [{^self, _}] |
|
|
|
}, |
|
|
|
"https:www.google.com:443" => %Conn{ |
|
|
|
conn: ^conn1, |
|
|
|
gun_state: :up, |
|
|
|
conn_state: :active, |
|
|
|
used_by: [{^self, _}, {^self, _}] |
|
|
|
} |
|
|
|
} |
|
|
|
} = Connections.get_state(name) |
|
|
|
|
|
|
|
refute Connections.checkin("http://httpbin.org", name) |
|
|
|
|
|
|
|
%Connections{ |
|
|
|
conns: %{ |
|
|
|
"https:httpbin.org:443" => %Conn{ |
|
|
|
conn: ^conn2, |
|
|
|
gun_state: :up, |
|
|
|
conn_state: :active, |
|
|
|
used_by: [{^self, _}] |
|
|
|
}, |
|
|
|
"https:www.google.com:443" => %Conn{ |
|
|
|
conn: ^conn1, |
|
|
|
gun_state: :up, |
|
|
|
conn_state: :active, |
|
|
|
used_by: [{^self, _}, {^self, _}] |
|
|
|
} |
|
|
|
} |
|
|
|
} = Connections.get_state(name) |
|
|
|
end |
|
|
|
|
|
|
|
test "get idle connection with the smallest crf", %{ |
|
|
|
name: name |
|
|
|
} do |
|
|
|
self = self() |
|
|
|
|
|
|
|
https1 = "https://www.google.com" |
|
|
|
https2 = "https://httpbin.org" |
|
|
|
|
|
|
|
:ok = Conn.open(https1, name) |
|
|
|
:ok = Conn.open(https2, name) |
|
|
|
Process.sleep(1_500) |
|
|
|
Connections.checkin(https1, name) |
|
|
|
Connections.checkin(https2, name) |
|
|
|
Connections.checkin(https1, name) |
|
|
|
conn1 = Connections.checkin(https1, name) |
|
|
|
conn2 = Connections.checkin(https2, name) |
|
|
|
|
|
|
|
%Connections{ |
|
|
|
conns: %{ |
|
|
|
"https:httpbin.org:443" => %Conn{ |
|
|
|
conn: ^conn2, |
|
|
|
gun_state: :up, |
|
|
|
conn_state: :active, |
|
|
|
used_by: [{^self, _}, {^self, _}], |
|
|
|
crf: crf2 |
|
|
|
}, |
|
|
|
"https:www.google.com:443" => %Conn{ |
|
|
|
conn: ^conn1, |
|
|
|
gun_state: :up, |
|
|
|
conn_state: :active, |
|
|
|
used_by: [{^self, _}, {^self, _}, {^self, _}], |
|
|
|
crf: crf1 |
|
|
|
} |
|
|
|
} |
|
|
|
} = Connections.get_state(name) |
|
|
|
|
|
|
|
assert crf1 > crf2 |
|
|
|
|
|
|
|
:ok = Connections.checkout(conn1, self, name) |
|
|
|
:ok = Connections.checkout(conn1, self, name) |
|
|
|
:ok = Connections.checkout(conn1, self, name) |
|
|
|
|
|
|
|
:ok = Connections.checkout(conn2, self, name) |
|
|
|
:ok = Connections.checkout(conn2, self, name) |
|
|
|
|
|
|
|
%Connections{ |
|
|
|
conns: %{ |
|
|
|
"https:httpbin.org:443" => %Conn{ |
|
|
|
conn: ^conn2, |
|
|
|
gun_state: :up, |
|
|
|
conn_state: :idle, |
|
|
|
used_by: [] |
|
|
|
}, |
|
|
|
"https:www.google.com:443" => %Conn{ |
|
|
|
conn: ^conn1, |
|
|
|
gun_state: :up, |
|
|
|
conn_state: :idle, |
|
|
|
used_by: [] |
|
|
|
} |
|
|
|
} |
|
|
|
} = Connections.get_state(name) |
|
|
|
|
|
|
|
http = "http://httpbin.org" |
|
|
|
:ok = Conn.open(http, name) |
|
|
|
Process.sleep(1_000) |
|
|
|
conn = Connections.checkin(http, name) |
|
|
|
|
|
|
|
%Connections{ |
|
|
|
conns: %{ |
|
|
|
"https:www.google.com:443" => %Conn{ |
|
|
|
conn: ^conn1, |
|
|
|
gun_state: :up, |
|
|
|
conn_state: :idle, |
|
|
|
used_by: [], |
|
|
|
crf: crf1 |
|
|
|
}, |
|
|
|
"http:httpbin.org:80" => %Conn{ |
|
|
|
conn: ^conn, |
|
|
|
gun_state: :up, |
|
|
|
conn_state: :active, |
|
|
|
used_by: [{^self, _}], |
|
|
|
crf: crf |
|
|
|
} |
|
|
|
} |
|
|
|
} = Connections.get_state(name) |
|
|
|
|
|
|
|
assert crf1 > crf |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
describe "with proxy" do |
|
|
|
test "as ip", %{name: name} do |
|
|
|
url = "http://proxy-string.com" |
|
|
|