diff options
| author | Egor Kislitsyn <egor@kislitsyn.com> | 2020-06-01 17:38:57 +0400 | 
|---|---|---|
| committer | Egor Kislitsyn <egor@kislitsyn.com> | 2020-06-01 17:38:57 +0400 | 
| commit | 6b84c62d4a51cb17192945d1b67999b2c56a23d2 (patch) | |
| tree | 53744600bd910bb0a62be6ab5884c6972da2ffce /test/http | |
| parent | cb8236cda62cddb72f4320af6347defae44b81ca (diff) | |
| parent | e96765df6b04fe5e9766271a9c62e559392758b2 (diff) | |
| download | pleroma-6b84c62d4a51cb17192945d1b67999b2c56a23d2.tar.gz pleroma-6b84c62d4a51cb17192945d1b67999b2c56a23d2.zip | |
Merge remote-tracking branch 'origin/develop' into feature/embeddable-posts
Diffstat (limited to 'test/http')
| -rw-r--r-- | test/http/adapter_helper/gun_test.exs | 258 | ||||
| -rw-r--r-- | test/http/adapter_helper/hackney_test.exs | 35 | ||||
| -rw-r--r-- | test/http/adapter_helper_test.exs | 28 | ||||
| -rw-r--r-- | test/http/connection_test.exs | 135 | ||||
| -rw-r--r-- | test/http/request_builder_test.exs | 47 | 
5 files changed, 470 insertions, 33 deletions
| diff --git a/test/http/adapter_helper/gun_test.exs b/test/http/adapter_helper/gun_test.exs new file mode 100644 index 000000000..2e961826e --- /dev/null +++ b/test/http/adapter_helper/gun_test.exs @@ -0,0 +1,258 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.AdapterHelper.GunTest do +  use ExUnit.Case, async: true +  use Pleroma.Tests.Helpers + +  import Mox + +  alias Pleroma.Config +  alias Pleroma.Gun.Conn +  alias Pleroma.HTTP.AdapterHelper.Gun +  alias Pleroma.Pool.Connections + +  setup :verify_on_exit! + +  defp gun_mock(_) do +    gun_mock() +    :ok +  end + +  defp gun_mock do +    Pleroma.GunMock +    |> stub(:open, fn _, _, _ -> Task.start_link(fn -> Process.sleep(1000) end) end) +    |> stub(:await_up, fn _, _ -> {:ok, :http} end) +    |> stub(:set_owner, fn _, _ -> :ok end) +  end + +  describe "options/1" do +    setup do: clear_config([:http, :adapter], a: 1, b: 2) + +    test "https url with default port" do +      uri = URI.parse("https://example.com") + +      opts = Gun.options([receive_conn: false], uri) +      assert opts[:certificates_verification] +      assert opts[:tls_opts][:log_level] == :warning +    end + +    test "https ipv4 with default port" do +      uri = URI.parse("https://127.0.0.1") + +      opts = Gun.options([receive_conn: false], uri) +      assert opts[:certificates_verification] +      assert opts[:tls_opts][:log_level] == :warning +    end + +    test "https ipv6 with default port" do +      uri = URI.parse("https://[2a03:2880:f10c:83:face:b00c:0:25de]") + +      opts = Gun.options([receive_conn: false], uri) +      assert opts[:certificates_verification] +      assert opts[:tls_opts][:log_level] == :warning +    end + +    test "https url with non standart port" do +      uri = URI.parse("https://example.com:115") + +      opts = Gun.options([receive_conn: false], uri) + +      assert opts[:certificates_verification] +    end + +    test "get conn on next request" do +      gun_mock() +      level = Application.get_env(:logger, :level) +      Logger.configure(level: :debug) +      on_exit(fn -> Logger.configure(level: level) end) +      uri = URI.parse("http://some-domain2.com") + +      opts = Gun.options(uri) + +      assert opts[:conn] == nil +      assert opts[:close_conn] == nil + +      Process.sleep(50) +      opts = Gun.options(uri) + +      assert is_pid(opts[:conn]) +      assert opts[:close_conn] == false +    end + +    test "merges with defaul http adapter config" do +      defaults = Gun.options([receive_conn: false], URI.parse("https://example.com")) +      assert Keyword.has_key?(defaults, :a) +      assert Keyword.has_key?(defaults, :b) +    end + +    test "default ssl adapter opts with connection" do +      gun_mock() +      uri = URI.parse("https://some-domain.com") + +      :ok = Conn.open(uri, :gun_connections) + +      opts = Gun.options(uri) + +      assert opts[:certificates_verification] +      refute opts[:tls_opts] == [] + +      assert opts[:close_conn] == false +      assert is_pid(opts[:conn]) +    end + +    test "parses string proxy host & port" do +      proxy = Config.get([:http, :proxy_url]) +      Config.put([:http, :proxy_url], "localhost:8123") +      on_exit(fn -> Config.put([:http, :proxy_url], proxy) end) + +      uri = URI.parse("https://some-domain.com") +      opts = Gun.options([receive_conn: false], uri) +      assert opts[:proxy] == {'localhost', 8123} +    end + +    test "parses tuple proxy scheme host and port" do +      proxy = Config.get([:http, :proxy_url]) +      Config.put([:http, :proxy_url], {:socks, 'localhost', 1234}) +      on_exit(fn -> Config.put([:http, :proxy_url], proxy) end) + +      uri = URI.parse("https://some-domain.com") +      opts = Gun.options([receive_conn: false], uri) +      assert opts[:proxy] == {:socks, 'localhost', 1234} +    end + +    test "passed opts have more weight than defaults" do +      proxy = Config.get([:http, :proxy_url]) +      Config.put([:http, :proxy_url], {:socks5, 'localhost', 1234}) +      on_exit(fn -> Config.put([:http, :proxy_url], proxy) end) +      uri = URI.parse("https://some-domain.com") +      opts = Gun.options([receive_conn: false, proxy: {'example.com', 4321}], uri) + +      assert opts[:proxy] == {'example.com', 4321} +    end +  end + +  describe "options/1 with receive_conn parameter" do +    setup :gun_mock + +    test "receive conn by default" do +      uri = URI.parse("http://another-domain.com") +      :ok = Conn.open(uri, :gun_connections) + +      received_opts = Gun.options(uri) +      assert received_opts[:close_conn] == false +      assert is_pid(received_opts[:conn]) +    end + +    test "don't receive conn if receive_conn is false" do +      uri = URI.parse("http://another-domain.com") +      :ok = Conn.open(uri, :gun_connections) + +      opts = [receive_conn: false] +      received_opts = Gun.options(opts, uri) +      assert received_opts[:close_conn] == nil +      assert received_opts[:conn] == nil +    end +  end + +  describe "after_request/1" do +    setup :gun_mock + +    test "body_as not chunks" do +      uri = URI.parse("http://some-domain.com") +      :ok = Conn.open(uri, :gun_connections) +      opts = Gun.options(uri) +      :ok = Gun.after_request(opts) +      conn = opts[:conn] + +      assert %Connections{ +               conns: %{ +                 "http:some-domain.com:80" => %Pleroma.Gun.Conn{ +                   conn: ^conn, +                   conn_state: :idle, +                   used_by: [] +                 } +               } +             } = Connections.get_state(:gun_connections) +    end + +    test "body_as chunks" do +      uri = URI.parse("http://some-domain.com") +      :ok = Conn.open(uri, :gun_connections) +      opts = Gun.options([body_as: :chunks], uri) +      :ok = Gun.after_request(opts) +      conn = opts[:conn] +      self = self() + +      assert %Connections{ +               conns: %{ +                 "http:some-domain.com:80" => %Pleroma.Gun.Conn{ +                   conn: ^conn, +                   conn_state: :active, +                   used_by: [{^self, _}] +                 } +               } +             } = Connections.get_state(:gun_connections) +    end + +    test "with no connection" do +      uri = URI.parse("http://uniq-domain.com") + +      :ok = Conn.open(uri, :gun_connections) + +      opts = Gun.options([body_as: :chunks], uri) +      conn = opts[:conn] +      opts = Keyword.delete(opts, :conn) +      self = self() + +      :ok = Gun.after_request(opts) + +      assert %Connections{ +               conns: %{ +                 "http:uniq-domain.com:80" => %Pleroma.Gun.Conn{ +                   conn: ^conn, +                   conn_state: :active, +                   used_by: [{^self, _}] +                 } +               } +             } = Connections.get_state(:gun_connections) +    end + +    test "with ipv4" do +      uri = URI.parse("http://127.0.0.1") +      :ok = Conn.open(uri, :gun_connections) +      opts = Gun.options(uri) +      :ok = Gun.after_request(opts) +      conn = opts[:conn] + +      assert %Connections{ +               conns: %{ +                 "http:127.0.0.1:80" => %Pleroma.Gun.Conn{ +                   conn: ^conn, +                   conn_state: :idle, +                   used_by: [] +                 } +               } +             } = Connections.get_state(:gun_connections) +    end + +    test "with ipv6" do +      uri = URI.parse("http://[2a03:2880:f10c:83:face:b00c:0:25de]") +      :ok = Conn.open(uri, :gun_connections) +      opts = Gun.options(uri) +      :ok = Gun.after_request(opts) +      conn = opts[:conn] + +      assert %Connections{ +               conns: %{ +                 "http:2a03:2880:f10c:83:face:b00c:0:25de:80" => %Pleroma.Gun.Conn{ +                   conn: ^conn, +                   conn_state: :idle, +                   used_by: [] +                 } +               } +             } = Connections.get_state(:gun_connections) +    end +  end +end diff --git a/test/http/adapter_helper/hackney_test.exs b/test/http/adapter_helper/hackney_test.exs new file mode 100644 index 000000000..f2361ff0b --- /dev/null +++ b/test/http/adapter_helper/hackney_test.exs @@ -0,0 +1,35 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.AdapterHelper.HackneyTest do +  use ExUnit.Case, async: true +  use Pleroma.Tests.Helpers + +  alias Pleroma.HTTP.AdapterHelper.Hackney + +  setup_all do +    uri = URI.parse("http://domain.com") +    {:ok, uri: uri} +  end + +  describe "options/2" do +    setup do: clear_config([:http, :adapter], a: 1, b: 2) + +    test "add proxy and opts from config", %{uri: uri} do +      opts = Hackney.options([proxy: "localhost:8123"], uri) + +      assert opts[:a] == 1 +      assert opts[:b] == 2 +      assert opts[:proxy] == "localhost:8123" +    end + +    test "respect connection opts and no proxy", %{uri: uri} do +      opts = Hackney.options([a: 2, b: 1], uri) + +      assert opts[:a] == 2 +      assert opts[:b] == 1 +      refute Keyword.has_key?(opts, :proxy) +    end +  end +end diff --git a/test/http/adapter_helper_test.exs b/test/http/adapter_helper_test.exs new file mode 100644 index 000000000..24d501ad5 --- /dev/null +++ b/test/http/adapter_helper_test.exs @@ -0,0 +1,28 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.AdapterHelperTest do +  use ExUnit.Case, async: true + +  alias Pleroma.HTTP.AdapterHelper + +  describe "format_proxy/1" do +    test "with nil" do +      assert AdapterHelper.format_proxy(nil) == nil +    end + +    test "with string" do +      assert AdapterHelper.format_proxy("127.0.0.1:8123") == {{127, 0, 0, 1}, 8123} +    end + +    test "localhost with port" do +      assert AdapterHelper.format_proxy("localhost:8123") == {'localhost', 8123} +    end + +    test "tuple" do +      assert AdapterHelper.format_proxy({:socks4, :localhost, 9050}) == +               {:socks4, 'localhost', 9050} +    end +  end +end diff --git a/test/http/connection_test.exs b/test/http/connection_test.exs new file mode 100644 index 000000000..7c94a50b2 --- /dev/null +++ b/test/http/connection_test.exs @@ -0,0 +1,135 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.ConnectionTest do +  use ExUnit.Case +  use Pleroma.Tests.Helpers + +  import ExUnit.CaptureLog + +  alias Pleroma.Config +  alias Pleroma.HTTP.Connection + +  describe "parse_host/1" do +    test "as atom to charlist" do +      assert Connection.parse_host(:localhost) == 'localhost' +    end + +    test "as string to charlist" do +      assert Connection.parse_host("localhost.com") == 'localhost.com' +    end + +    test "as string ip to tuple" do +      assert Connection.parse_host("127.0.0.1") == {127, 0, 0, 1} +    end +  end + +  describe "parse_proxy/1" do +    test "ip with port" do +      assert Connection.parse_proxy("127.0.0.1:8123") == {:ok, {127, 0, 0, 1}, 8123} +    end + +    test "host with port" do +      assert Connection.parse_proxy("localhost:8123") == {:ok, 'localhost', 8123} +    end + +    test "as tuple" do +      assert Connection.parse_proxy({:socks4, :localhost, 9050}) == +               {:ok, :socks4, 'localhost', 9050} +    end + +    test "as tuple with string host" do +      assert Connection.parse_proxy({:socks5, "localhost", 9050}) == +               {:ok, :socks5, 'localhost', 9050} +    end +  end + +  describe "parse_proxy/1 errors" do +    test "ip without port" do +      capture_log(fn -> +        assert Connection.parse_proxy("127.0.0.1") == {:error, :invalid_proxy} +      end) =~ "parsing proxy fail \"127.0.0.1\"" +    end + +    test "host without port" do +      capture_log(fn -> +        assert Connection.parse_proxy("localhost") == {:error, :invalid_proxy} +      end) =~ "parsing proxy fail \"localhost\"" +    end + +    test "host with bad port" do +      capture_log(fn -> +        assert Connection.parse_proxy("localhost:port") == {:error, :invalid_proxy_port} +      end) =~ "parsing port in proxy fail \"localhost:port\"" +    end + +    test "ip with bad port" do +      capture_log(fn -> +        assert Connection.parse_proxy("127.0.0.1:15.9") == {:error, :invalid_proxy_port} +      end) =~ "parsing port in proxy fail \"127.0.0.1:15.9\"" +    end + +    test "as tuple without port" do +      capture_log(fn -> +        assert Connection.parse_proxy({:socks5, :localhost}) == {:error, :invalid_proxy} +      end) =~ "parsing proxy fail {:socks5, :localhost}" +    end + +    test "with nil" do +      assert Connection.parse_proxy(nil) == nil +    end +  end + +  describe "options/3" do +    setup do: clear_config([:http, :proxy_url]) + +    test "without proxy_url in config" do +      Config.delete([:http, :proxy_url]) + +      opts = Connection.options(%URI{}) +      refute Keyword.has_key?(opts, :proxy) +    end + +    test "parses string proxy host & port" do +      Config.put([:http, :proxy_url], "localhost:8123") + +      opts = Connection.options(%URI{}) +      assert opts[:proxy] == {'localhost', 8123} +    end + +    test "parses tuple proxy scheme host and port" do +      Config.put([:http, :proxy_url], {:socks, 'localhost', 1234}) + +      opts = Connection.options(%URI{}) +      assert opts[:proxy] == {:socks, 'localhost', 1234} +    end + +    test "passed opts have more weight than defaults" do +      Config.put([:http, :proxy_url], {:socks5, 'localhost', 1234}) + +      opts = Connection.options(%URI{}, proxy: {'example.com', 4321}) + +      assert opts[:proxy] == {'example.com', 4321} +    end +  end + +  describe "format_host/1" do +    test "with domain" do +      assert Connection.format_host("example.com") == 'example.com' +    end + +    test "with idna domain" do +      assert Connection.format_host("ですexample.com") == 'xn--example-183fne.com' +    end + +    test "with ipv4" do +      assert Connection.format_host("127.0.0.1") == '127.0.0.1' +    end + +    test "with ipv6" do +      assert Connection.format_host("2a03:2880:f10c:83:face:b00c:0:25de") == +               '2a03:2880:f10c:83:face:b00c:0:25de' +    end +  end +end diff --git a/test/http/request_builder_test.exs b/test/http/request_builder_test.exs index bf3a15ebe..fab909905 100644 --- a/test/http/request_builder_test.exs +++ b/test/http/request_builder_test.exs @@ -3,57 +3,38 @@  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.HTTP.RequestBuilderTest do -  use ExUnit.Case, async: true +  use ExUnit.Case    use Pleroma.Tests.Helpers +  alias Pleroma.HTTP.Request    alias Pleroma.HTTP.RequestBuilder    describe "headers/2" do -    setup do: clear_config([:http, :send_user_agent]) -    setup do: clear_config([:http, :user_agent]) -      test "don't send pleroma user agent" do -      assert RequestBuilder.headers(%{}, []) == %{headers: []} +      assert RequestBuilder.headers(%Request{}, []) == %Request{headers: []}      end      test "send pleroma user agent" do -      Pleroma.Config.put([:http, :send_user_agent], true) -      Pleroma.Config.put([:http, :user_agent], :default) +      clear_config([:http, :send_user_agent], true) +      clear_config([:http, :user_agent], :default) -      assert RequestBuilder.headers(%{}, []) == %{ -               headers: [{"User-Agent", Pleroma.Application.user_agent()}] +      assert RequestBuilder.headers(%Request{}, []) == %Request{ +               headers: [{"user-agent", Pleroma.Application.user_agent()}]               }      end      test "send custom user agent" do -      Pleroma.Config.put([:http, :send_user_agent], true) -      Pleroma.Config.put([:http, :user_agent], "totally-not-pleroma") +      clear_config([:http, :send_user_agent], true) +      clear_config([:http, :user_agent], "totally-not-pleroma") -      assert RequestBuilder.headers(%{}, []) == %{ -               headers: [{"User-Agent", "totally-not-pleroma"}] +      assert RequestBuilder.headers(%Request{}, []) == %Request{ +               headers: [{"user-agent", "totally-not-pleroma"}]               }      end    end -  describe "add_optional_params/3" do -    test "don't add if keyword is empty" do -      assert RequestBuilder.add_optional_params(%{}, %{}, []) == %{} -    end - -    test "add query parameter" do -      assert RequestBuilder.add_optional_params( -               %{}, -               %{query: :query, body: :body, another: :val}, -               [ -                 {:query, "param1=val1¶m2=val2"}, -                 {:body, "some body"} -               ] -             ) == %{query: "param1=val1¶m2=val2", body: "some body"} -    end -  end -    describe "add_param/4" do      test "add file parameter" do -      %{ +      %Request{          body: %Tesla.Multipart{            boundary: _,            content_type_params: [], @@ -70,7 +51,7 @@ defmodule Pleroma.HTTP.RequestBuilderTest do              }            ]          } -      } = RequestBuilder.add_param(%{}, :file, "filename.png", "some-path/filename.png") +      } = RequestBuilder.add_param(%Request{}, :file, "filename.png", "some-path/filename.png")      end      test "add key to body" do @@ -82,7 +63,7 @@ defmodule Pleroma.HTTP.RequestBuilderTest do              %Tesla.Multipart.Part{                body: "\"someval\"",                dispositions: [name: "somekey"], -              headers: ["Content-Type": "application/json"] +              headers: [{"content-type", "application/json"}]              }            ]          } | 
