From c1129ff6746b20b164b7bc6dadf851f396ef29ad Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 18 Dec 2020 11:53:43 +0100 Subject: Tests: Reset all cachex caches between synchronous tests Don't bother in the async case, it doesn't make sense there. --- test/support/conn_case.ex | 3 +-- test/support/data_case.ex | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) (limited to 'test/support') diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index 47cb65a80..b5bd71809 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -116,12 +116,11 @@ defmodule Pleroma.Web.ConnCase do end setup tags do - Cachex.clear(:user_cache) - Cachex.clear(:object_cache) :ok = Ecto.Adapters.SQL.Sandbox.checkout(Pleroma.Repo) unless tags[:async] do Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, {:shared, self()}) + Pleroma.DataCase.clear_cachex() end if tags[:needs_streamer] do diff --git a/test/support/data_case.ex b/test/support/data_case.ex index d5456521c..1f1d40863 100644 --- a/test/support/data_case.ex +++ b/test/support/data_case.ex @@ -45,13 +45,29 @@ defmodule Pleroma.DataCase do end end + def clear_cachex do + Pleroma.Supervisor + |> Supervisor.which_children() + |> Enum.each(fn + {name, _, _, [Cachex]} -> + name + |> to_string + |> String.trim_leading("cachex_") + |> Kernel.<>("_cache") + |> String.to_existing_atom() + |> Cachex.clear() + + _ -> + nil + end) + end + setup tags do - Cachex.clear(:user_cache) - Cachex.clear(:object_cache) :ok = Ecto.Adapters.SQL.Sandbox.checkout(Pleroma.Repo) unless tags[:async] do Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, {:shared, self()}) + clear_cachex() end if tags[:needs_streamer] do -- cgit v1.2.3 From 95a9bdfc374a013be47e74b25bdba5d91f51948b Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 18 Dec 2020 19:49:01 +0100 Subject: Tests: Use NullCache for async tests. Caching can't work in async tests, so for them it is mocked to a null cache that is always empty. Synchronous tests are stubbed with the real Cachex, which is emptied after every test. --- test/support/cachex_proxy.ex | 40 +++++++++++++++++++++++++++++++++++++ test/support/channel_case.ex | 8 +++++++- test/support/conn_case.ex | 7 ++++++- test/support/data_case.ex | 7 ++++++- test/support/mocks.ex | 5 +++++ test/support/null_cache.ex | 47 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 test/support/cachex_proxy.ex create mode 100644 test/support/mocks.ex create mode 100644 test/support/null_cache.ex (limited to 'test/support') diff --git a/test/support/cachex_proxy.ex b/test/support/cachex_proxy.ex new file mode 100644 index 000000000..e296b5c6a --- /dev/null +++ b/test/support/cachex_proxy.ex @@ -0,0 +1,40 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.CachexProxy do + @behaviour Pleroma.Caching + + @impl true + defdelegate get!(cache, key), to: Cachex + + @impl true + defdelegate stream!(cache, key), to: Cachex + + @impl true + defdelegate put(cache, key, value, options), to: Cachex + + @impl true + defdelegate put(cache, key, value), to: Cachex + + @impl true + defdelegate get_and_update(cache, key, func), to: Cachex + + @impl true + defdelegate get(cache, key), to: Cachex + + @impl true + defdelegate fetch!(cache, key, func), to: Cachex + + @impl true + defdelegate expire_at(cache, str, num), to: Cachex + + @impl true + defdelegate exists?(cache, key), to: Cachex + + @impl true + defdelegate del(cache, key), to: Cachex + + @impl true + defdelegate execute!(cache, func), to: Cachex +end diff --git a/test/support/channel_case.ex b/test/support/channel_case.ex index 114184a9f..f4696adb3 100644 --- a/test/support/channel_case.ex +++ b/test/support/channel_case.ex @@ -33,8 +33,14 @@ defmodule Pleroma.Web.ChannelCase do setup tags do :ok = Ecto.Adapters.SQL.Sandbox.checkout(Pleroma.Repo) - unless tags[:async] do + if tags[:async] do + Mox.stub_with(Pleroma.CachexMock, Pleroma.NullCache) + Mox.set_mox_private() + else Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, {:shared, self()}) + Mox.stub_with(Pleroma.CachexMock, Pleroma.CachexProxy) + Mox.set_mox_global() + Pleroma.DataCase.clear_cachex() end :ok diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index b5bd71809..a7cebf971 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -118,8 +118,13 @@ defmodule Pleroma.Web.ConnCase do setup tags do :ok = Ecto.Adapters.SQL.Sandbox.checkout(Pleroma.Repo) - unless tags[:async] do + if tags[:async] do + Mox.stub_with(Pleroma.CachexMock, Pleroma.NullCache) + Mox.set_mox_private() + else Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, {:shared, self()}) + Mox.stub_with(Pleroma.CachexMock, Pleroma.CachexProxy) + Mox.set_mox_global() Pleroma.DataCase.clear_cachex() end diff --git a/test/support/data_case.ex b/test/support/data_case.ex index 1f1d40863..a3ce9e282 100644 --- a/test/support/data_case.ex +++ b/test/support/data_case.ex @@ -65,8 +65,13 @@ defmodule Pleroma.DataCase do setup tags do :ok = Ecto.Adapters.SQL.Sandbox.checkout(Pleroma.Repo) - unless tags[:async] do + if tags[:async] do + Mox.stub_with(Pleroma.CachexMock, Pleroma.NullCache) + Mox.set_mox_private() + else Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, {:shared, self()}) + Mox.stub_with(Pleroma.CachexMock, Pleroma.CachexProxy) + Mox.set_mox_global() clear_cachex() end diff --git a/test/support/mocks.ex b/test/support/mocks.ex new file mode 100644 index 000000000..d790553cd --- /dev/null +++ b/test/support/mocks.ex @@ -0,0 +1,5 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +Mox.defmock(Pleroma.CachexMock, for: Pleroma.Caching) diff --git a/test/support/null_cache.ex b/test/support/null_cache.ex new file mode 100644 index 000000000..72e7c996a --- /dev/null +++ b/test/support/null_cache.ex @@ -0,0 +1,47 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.NullCache do + @moduledoc """ + A module simulating a permanently empty cache. + """ + @behaviour Pleroma.Caching + + @impl true + def get!(_, _), do: nil + + @impl true + def put(_, _, _, _ \\ nil), do: {:ok, true} + + @impl true + def stream!(_, _), do: [] + + @impl true + def get(_, _), do: {:ok, nil} + + @impl true + def fetch!(_, _, func) do + {_, res} = func.() + res + end + + @impl true + def get_and_update(_, _, func) do + func.(nil) + end + + @impl true + def expire_at(_, _, _), do: {:ok, true} + + @impl true + def exists?(_, _), do: {:ok, false} + + @impl true + def execute!(_, func) do + func.(:nothing) + end + + @impl true + def del(_, _), do: {:ok, true} +end -- cgit v1.2.3 From ee81a94ab2631e994f7d963d74fadf1ce0704837 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 21 Dec 2020 11:42:53 +0100 Subject: Caching: Add caching behavior, add null implementation. --- test/support/null_cache.ex | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'test/support') diff --git a/test/support/null_cache.ex b/test/support/null_cache.ex index 72e7c996a..c63df6a39 100644 --- a/test/support/null_cache.ex +++ b/test/support/null_cache.ex @@ -21,9 +21,11 @@ defmodule Pleroma.NullCache do def get(_, _), do: {:ok, nil} @impl true - def fetch!(_, _, func) do - {_, res} = func.() - res + def fetch!(_, key, func) do + case func.(key) do + {_, res} -> res + res -> res + end end @impl true -- cgit v1.2.3 From 0ef0aed205f7298d82649f55615193baac4b3667 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 16 Dec 2020 10:39:36 +0100 Subject: Tests: Add a helper method to reduce sleeping times in test. This will 'time travel', i.e. change the inserted_at and update_at fields of the object in question. This is used to backdate things were we used sleeping before to ensure time differences. --- test/support/helpers.ex | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'test/support') diff --git a/test/support/helpers.ex b/test/support/helpers.ex index 224034521..15e8cbd9d 100644 --- a/test/support/helpers.ex +++ b/test/support/helpers.ex @@ -55,6 +55,14 @@ defmodule Pleroma.Tests.Helpers do clear_config: 2 ] + def time_travel(entity, seconds) do + new_time = NaiveDateTime.add(entity.inserted_at, seconds) + + entity + |> Ecto.Changeset.change(%{inserted_at: new_time, updated_at: new_time}) + |> Pleroma.Repo.update() + end + def to_datetime(%NaiveDateTime{} = naive_datetime) do naive_datetime |> DateTime.from_naive!("Etc/UTC") -- cgit v1.2.3 From 5db1e6c8d37ea114433afe0a9247314ab92cc52f Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 16 Dec 2020 17:51:48 +0100 Subject: Pipeline test: Switch from Mock to Mox. Speeds up the test and makes it possible to run async. --- test/support/mocks.ex | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'test/support') diff --git a/test/support/mocks.ex b/test/support/mocks.ex index d790553cd..a600a6458 100644 --- a/test/support/mocks.ex +++ b/test/support/mocks.ex @@ -3,3 +3,23 @@ # SPDX-License-Identifier: AGPL-3.0-only Mox.defmock(Pleroma.CachexMock, for: Pleroma.Caching) + +Mox.defmock(Pleroma.Web.ActivityPub.ObjectValidatorMock, + for: Pleroma.Web.ActivityPub.ObjectValidator.Validating +) + +Mox.defmock(Pleroma.Web.ActivityPub.MRFMock, + for: Pleroma.Web.ActivityPub.MRF.PipelineFiltering +) + +Mox.defmock(Pleroma.Web.ActivityPub.ActivityPubMock, + for: Pleroma.Web.ActivityPub.ActivityPub.Persisting +) + +Mox.defmock(Pleroma.Web.ActivityPub.SideEffectsMock, + for: Pleroma.Web.ActivityPub.SideEffects.Handling +) + +Mox.defmock(Pleroma.Web.FederatorMock, for: Pleroma.Web.Federator.Publishing) + +Mox.defmock(Pleroma.ConfigMock, for: Pleroma.Config.Getting) -- cgit v1.2.3 From 1a3da01a6505262443d58aba525eda702d7ee575 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 21 Dec 2020 16:38:34 +0100 Subject: Tests: Stub the pipeline in all tests. Restores the old un-moxed behavior. --- test/support/conn_case.ex | 2 ++ test/support/data_case.ex | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) (limited to 'test/support') diff --git a/test/support/conn_case.ex b/test/support/conn_case.ex index a7cebf971..02f49c590 100644 --- a/test/support/conn_case.ex +++ b/test/support/conn_case.ex @@ -136,6 +136,8 @@ defmodule Pleroma.Web.ConnCase do }) end + Pleroma.DataCase.stub_pipeline() + {:ok, conn: Phoenix.ConnTest.build_conn()} end end diff --git a/test/support/data_case.ex b/test/support/data_case.ex index a3ce9e282..5c657c1d9 100644 --- a/test/support/data_case.ex +++ b/test/support/data_case.ex @@ -83,9 +83,25 @@ defmodule Pleroma.DataCase do }) end + stub_pipeline() + :ok end + def stub_pipeline do + Mox.stub_with(Pleroma.Web.ActivityPub.SideEffectsMock, Pleroma.Web.ActivityPub.SideEffects) + + Mox.stub_with( + Pleroma.Web.ActivityPub.ObjectValidatorMock, + Pleroma.Web.ActivityPub.ObjectValidator + ) + + Mox.stub_with(Pleroma.Web.ActivityPub.MRFMock, Pleroma.Web.ActivityPub.MRF) + Mox.stub_with(Pleroma.Web.ActivityPub.ActivityPubMock, Pleroma.Web.ActivityPub.ActivityPub) + Mox.stub_with(Pleroma.Web.FederatorMock, Pleroma.Web.Federator) + Mox.stub_with(Pleroma.ConfigMock, Pleroma.Config) + end + def ensure_local_uploader(context) do test_uploader = Map.get(context, :uploader, Pleroma.Uploaders.Local) uploader = Pleroma.Config.get([Pleroma.Upload, :uploader]) -- cgit v1.2.3