otp_version refactor
authorAlexander Strizhakov <alex.strizhakov@gmail.com>
Tue, 3 Mar 2020 09:19:29 +0000 (12:19 +0300)
committerAlexander Strizhakov <alex.strizhakov@gmail.com>
Tue, 3 Mar 2020 09:21:10 +0000 (12:21 +0300)
lib/pleroma/application.ex
lib/pleroma/otp_version.ex
test/fixtures/warnings/otp_version/error [deleted file]
test/fixtures/warnings/otp_version/undefined [deleted file]
test/otp_version_test.exs

index 00e33d7acc0d2f6b64f7a59f45e75ce4cb28ccce..9b228d6b9a8cb9c6527a91bec55d9f2c457bfd64 100644 (file)
@@ -66,16 +66,23 @@ defmodule Pleroma.Application do
           Pleroma.Gopher.Server
         ]
 
-    case Pleroma.OTPVersion.check_version() do
-      :ok -> :ok
-      {:error, version} -> raise "
-        !!!OTP VERSION WARNING!!!
-        You are using gun adapter with OTP version #{version}, which doesn't support correct handling of unordered certificates chains.
-        "
-      :undefined -> raise "
-        !!!OTP VERSION WARNING!!!
-        To support correct handling of unordered certificates chains - OTP version must be > 22.2.
-        "
+    if adapter() == Tesla.Adapter.Gun do
+      case Pleroma.OTPVersion.check() do
+        :ok ->
+          :ok
+
+        {:error, version} ->
+          raise "
+            !!!OTP VERSION WARNING!!!
+            You are using gun adapter with OTP version #{version}, which doesn't support correct handling of unordered certificates chains.
+            "
+
+        :undefined ->
+          raise "
+            !!!OTP VERSION WARNING!!!
+            To support correct handling of unordered certificates chains - OTP version must be > 22.2.
+            "
+      end
     end
 
     # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
@@ -202,11 +209,7 @@ defmodule Pleroma.Application do
     [hackney_pool, Pleroma.Pool.Supervisor]
   end
 
-  defp http_pools_children(_) do
-    :tesla
-    |> Application.get_env(:adapter)
-    |> http_pools()
-  end
+  defp http_pools_children(_), do: http_pools(adapter())
 
   defp http_pools(Tesla.Adapter.Hackney) do
     pools = [:federation, :media]
@@ -227,4 +230,6 @@ defmodule Pleroma.Application do
   defp http_pools(Tesla.Adapter.Gun), do: [Pleroma.Pool.Supervisor]
 
   defp http_pools(_), do: []
+
+  defp adapter, do: Application.get_env(:tesla, :adapter)
 end
index 0be189304b9404240de3aabdaad0dc762698c1f7..54ceaff479ba6baf9186257e85654ab56a0812c8 100644 (file)
@@ -1,63 +1,53 @@
-defmodule Pleroma.OTPVersion do
-  @type check_status() :: :undefined | {:error, String.t()} | :ok
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
 
-  require Logger
+defmodule Pleroma.OTPVersion do
+  @type check_status() :: :ok | :undefined | {:error, String.t()}
 
-  @spec check_version() :: check_status()
-  def check_version do
+  @spec check() :: check_status()
+  def check do
     # OTP Version https://erlang.org/doc/system_principles/versions.html#otp-version
-    paths = [
+    [
       Path.join(:code.root_dir(), "OTP_VERSION"),
       Path.join([:code.root_dir(), "releases", :erlang.system_info(:otp_release), "OTP_VERSION"])
     ]
-
-    :tesla
-    |> Application.get_env(:adapter)
-    |> get_and_check_version(paths)
+    |> get_version_from_files()
+    |> do_check()
   end
 
-  @spec get_and_check_version(module(), [Path.t()]) :: check_status()
-  def get_and_check_version(Tesla.Adapter.Gun, paths) do
+  @spec check([Path.t()]) :: check_status()
+  def check(paths) do
     paths
-    |> check_files()
-    |> check_version()
+    |> get_version_from_files()
+    |> do_check()
   end
 
-  def get_and_check_version(_, _), do: :ok
-
-  defp check_files([]), do: nil
+  defp get_version_from_files([]), do: nil
 
-  defp check_files([path | paths]) do
+  defp get_version_from_files([path | paths]) do
     if File.exists?(path) do
       File.read!(path)
     else
-      check_files(paths)
+      get_version_from_files(paths)
     end
   end
 
-  defp check_version(nil), do: :undefined
-
-  defp check_version(version) do
-    try do
-      version = String.replace(version, ~r/\r|\n|\s/, "")
-
-      formatted =
-        version
-        |> String.split(".")
-        |> Enum.map(&String.to_integer/1)
-        |> Enum.take(2)
-
-      with [major, minor] when length(formatted) == 2 <- formatted,
-           true <- (major == 22 and minor >= 2) or major > 22 do
-        :ok
-      else
-        false -> {:error, version}
-        _ -> :undefined
-      end
-    rescue
-      _ -> :undefined
-    catch
-      _ -> :undefined
+  defp do_check(nil), do: :undefined
+
+  defp do_check(version) do
+    version = String.replace(version, ~r/\r|\n|\s/, "")
+
+    [major, minor] =
+      version
+      |> String.split(".")
+      |> Enum.map(&String.to_integer/1)
+      |> Enum.take(2)
+
+    if (major == 22 and minor >= 2) or major > 22 do
+      :ok
+    else
+      {:error, version}
     end
   end
 end
diff --git a/test/fixtures/warnings/otp_version/error b/test/fixtures/warnings/otp_version/error
deleted file mode 100644 (file)
index 8fdd954..0000000
+++ /dev/null
@@ -1 +0,0 @@
-22
\ No newline at end of file
diff --git a/test/fixtures/warnings/otp_version/undefined b/test/fixtures/warnings/otp_version/undefined
deleted file mode 100644 (file)
index 66dc905..0000000
+++ /dev/null
@@ -1 +0,0 @@
-undefined
\ No newline at end of file
index f26b90f61f116386ddbc952c9e324fcd5cc792d6..af278cc729e90aee2eb04399ebf2616fb6962a54 100644 (file)
@@ -1,58 +1,38 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
 defmodule Pleroma.OTPVersionTest do
   use ExUnit.Case, async: true
 
   alias Pleroma.OTPVersion
 
-  describe "get_and_check_version/2" do
+  describe "check/1" do
     test "22.4" do
-      assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [
-               "test/fixtures/warnings/otp_version/22.4"
-             ]) == :ok
+      assert OTPVersion.check(["test/fixtures/warnings/otp_version/22.4"]) == :ok
     end
 
     test "22.1" do
-      assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [
-               "test/fixtures/warnings/otp_version/22.1"
-             ]) == {:error, "22.1"}
+      assert OTPVersion.check(["test/fixtures/warnings/otp_version/22.1"]) == {:error, "22.1"}
     end
 
     test "21.1" do
-      assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [
-               "test/fixtures/warnings/otp_version/21.1"
-             ]) == {:error, "21.1"}
+      assert OTPVersion.check(["test/fixtures/warnings/otp_version/21.1"]) == {:error, "21.1"}
     end
 
     test "23.0" do
-      assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [
-               "test/fixtures/warnings/otp_version/23.0"
-             ]) == :ok
-    end
-
-    test "undefined" do
-      assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [
-               "test/fixtures/warnings/otp_version/undefined"
-             ]) == :undefined
-    end
-
-    test "not parsable" do
-      assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [
-               "test/fixtures/warnings/otp_version/error"
-             ]) == :undefined
+      assert OTPVersion.check(["test/fixtures/warnings/otp_version/23.0"]) == :ok
     end
 
     test "with non existance file" do
-      assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, [
+      assert OTPVersion.check([
                "test/fixtures/warnings/otp_version/non-exising",
                "test/fixtures/warnings/otp_version/22.4"
              ]) == :ok
     end
 
     test "empty paths" do
-      assert OTPVersion.get_and_check_version(Tesla.Adapter.Gun, []) == :undefined
-    end
-
-    test "another adapter" do
-      assert OTPVersion.get_and_check_version(Tesla.Adapter.Hackney, []) == :ok
+      assert OTPVersion.check([]) == :undefined
     end
   end
 end