add a job queue

This commit is contained in:
Egor Kislitsyn 2019-01-28 22:17:17 +07:00
commit 55affbca7f
15 changed files with 358 additions and 142 deletions

83
test/jobs_test.exs Normal file
View file

@ -0,0 +1,83 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.JobsTest do
use ExUnit.Case, async: true
alias Pleroma.Jobs
alias Jobs.WorkerMock
setup do
state = %{
queues: Enum.into([Jobs.create_queue(:testing)], %{}),
refs: %{}
}
[state: state]
end
test "creates queue" do
queue = Jobs.create_queue(:foobar)
assert {:foobar, set} = queue
assert :set == elem(set, 0) |> elem(0)
end
test "enqueues an element according to priority" do
queue = [%{item: 1, priority: 2}]
new_queue = Jobs.enqueue_sorted(queue, 2, 1)
assert new_queue == [%{item: 2, priority: 1}, %{item: 1, priority: 2}]
new_queue = Jobs.enqueue_sorted(queue, 2, 3)
assert new_queue == [%{item: 1, priority: 2}, %{item: 2, priority: 3}]
end
test "pop first item" do
queue = [%{item: 2, priority: 1}, %{item: 1, priority: 2}]
assert {2, [%{item: 1, priority: 2}]} = Jobs.queue_pop(queue)
end
test "enqueue a job", %{state: state} do
assert {:noreply, new_state} =
Jobs.handle_cast({:enqueue, :testing, WorkerMock, [:test_job, :foo, :bar], 3}, state)
assert %{queues: %{testing: {running_jobs, []}}, refs: _} = new_state
assert :sets.size(running_jobs) == 1
assert [ref] = :sets.to_list(running_jobs)
assert %{refs: %{^ref => :testing}} = new_state
end
test "max jobs setting", %{state: state} do
max_jobs = Pleroma.Config.get([Jobs, :testing, :max_jobs])
{:noreply, state} =
Enum.reduce(1..(max_jobs + 1), {:noreply, state}, fn _, {:noreply, state} ->
Jobs.handle_cast({:enqueue, :testing, WorkerMock, [:test_job, :foo, :bar], 3}, state)
end)
assert %{
queues: %{
testing:
{running_jobs, [%{item: {WorkerMock, [:test_job, :foo, :bar]}, priority: 3}]}
}
} = state
assert :sets.size(running_jobs) == max_jobs
end
test "remove job after it finished", %{state: state} do
{:noreply, new_state} =
Jobs.handle_cast({:enqueue, :testing, WorkerMock, [:test_job, :foo, :bar], 3}, state)
%{queues: %{testing: {running_jobs, []}}} = new_state
[ref] = :sets.to_list(running_jobs)
assert {:noreply, %{queues: %{testing: {running_jobs, []}}, refs: %{}}} =
Jobs.handle_info({:DOWN, ref, :process, nil, nil}, new_state)
assert :sets.size(running_jobs) == 0
end
end

View file

@ -0,0 +1,19 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Jobs.WorkerMock do
require Logger
def perform(:test_job, arg, arg2) do
Logger.debug({:perform, :test_job, arg, arg2})
end
def perform(:test_job, payload) do
Logger.debug({:perform, :test_job, payload})
end
def test_job(payload) do
Pleroma.Jobs.enqueue(:testing, __MODULE__, [:test_job, payload])
end
end

View file

@ -14,22 +14,6 @@ defmodule Pleroma.Web.FederatorTest do
:ok
end
test "enqueues an element according to priority" do
queue = [%{item: 1, priority: 2}]
new_queue = Federator.enqueue_sorted(queue, 2, 1)
assert new_queue == [%{item: 2, priority: 1}, %{item: 1, priority: 2}]
new_queue = Federator.enqueue_sorted(queue, 2, 3)
assert new_queue == [%{item: 1, priority: 2}, %{item: 2, priority: 3}]
end
test "pop first item" do
queue = [%{item: 2, priority: 1}, %{item: 1, priority: 2}]
assert {2, [%{item: 1, priority: 2}]} = Federator.queue_pop(queue)
end
describe "Publish an activity" do
setup do
user = insert(:user)
@ -49,7 +33,7 @@ defmodule Pleroma.Web.FederatorTest do
relay_mock: relay_mock
} do
with_mocks([relay_mock]) do
Federator.handle(:publish, activity)
Federator.publish(activity)
end
assert_received :relay_publish
@ -62,7 +46,7 @@ defmodule Pleroma.Web.FederatorTest do
Pleroma.Config.put([:instance, :allow_relay], false)
with_mocks([relay_mock]) do
Federator.handle(:publish, activity)
Federator.publish(activity)
end
refute_received :relay_publish
@ -87,7 +71,7 @@ defmodule Pleroma.Web.FederatorTest do
"to" => ["https://www.w3.org/ns/activitystreams#Public"]
}
{:ok, _activity} = Federator.handle(:incoming_ap_doc, params)
{:ok, _activity} = Federator.incoming_ap_doc(params)
end
test "rejects incoming AP docs with incorrect origin" do
@ -105,7 +89,7 @@ defmodule Pleroma.Web.FederatorTest do
"to" => ["https://www.w3.org/ns/activitystreams#Public"]
}
:error = Federator.handle(:incoming_ap_doc, params)
:error = Federator.incoming_ap_doc(params)
end
end
end