Skip to content

Commit

Permalink
Allow use Phoenix.Tracker
Browse files Browse the repository at this point in the history
  • Loading branch information
José Valim committed Jun 28, 2019
1 parent c0ef041 commit 1bc0b25
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 16 deletions.
30 changes: 25 additions & 5 deletions lib/phoenix/tracker.ex
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,7 @@ defmodule Phoenix.Tracker do
behaviour callbacks. An example of a minimal tracker could include:
defmodule MyTracker do
use GenServer
@behaviour Phoenix.Tracker
use Phoenix.Tracker
def start_link(opts) do
opts = Keyword.merge([name: __MODULE__], opts)
Expand Down Expand Up @@ -106,8 +104,6 @@ defmodule Phoenix.Tracker do
crash the tracker server, so operations that may crash the server should be
offloaded with a `Task.Supervisor` spawned process.
"""
use Supervisor

alias Phoenix.Tracker.Shard
require Logger

Expand All @@ -117,6 +113,30 @@ defmodule Phoenix.Tracker do
@callback init(Keyword.t) :: {:ok, state :: term} | {:error, reason :: term}
@callback handle_diff(%{topic => {joins :: [presence], leaves :: [presence]}}, state :: term) :: {:ok, state :: term}

defmacro __using__(_opts) do
quote location: :keep do
@behaviour Phoenix.Tracker

if Module.get_attribute(__MODULE__, :doc) == nil do
@doc """
Returns a specification to start this module under a supervisor.
See `Supervisor`.
"""
end

def child_spec(init_arg) do
default = %{
id: __MODULE__,
start: {__MODULE__, :start_link, [init_arg]},
type: :supervisor
}
end

defoverridable child_spec: 1
end
end

## Client

@doc """
Expand Down
16 changes: 16 additions & 0 deletions test/phoenix/tracker/shard_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
defmodule Phoenix.Tracker.ShardTest do
use ExUnit.Case, async: true
@opts [pubsub_server: nil, name: nil]

test "validates down_period" do
opts = Keyword.merge(@opts, [down_period: 1])
assert Phoenix.Tracker.Shard.init([nil, nil, opts]) ==
{:error, "down_period must be at least twice as large as the broadcast_period"}
end

test "validates permdown_period" do
opts = Keyword.merge(@opts, [permdown_period: 1_200_00, down_period: 1_200_000])
assert Phoenix.Tracker.Shard.init([nil, nil, opts]) ==
{:error, "permdown_period must be at least larger than the down_period"}
end
end
1 change: 0 additions & 1 deletion test/phoenix/tracker/state_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -409,5 +409,4 @@ defmodule Phoenix.Tracker.StateTest do
end)
end)
end

end
21 changes: 11 additions & 10 deletions test/phoenix/tracker_test.exs
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
defmodule Phoenix.Tracker.ShardTest do
defmodule Phoenix.TrackerTest do
use ExUnit.Case, async: true
@opts [pubsub_server: nil, name: nil]

test "validates down_period" do
opts = Keyword.merge(@opts, [down_period: 1])
assert Phoenix.Tracker.Shard.init([nil, nil, opts]) ==
{:error, "down_period must be at least twice as large as the broadcast_period"}
defmodule MyTracker do
use Phoenix.Tracker
def init(state), do: {:ok, state}
def handle_diff(_diff, state), do: {:ok, state}
end

test "validates permdown_period" do
opts = Keyword.merge(@opts, [permdown_period: 1_200_00, down_period: 1_200_000])
assert Phoenix.Tracker.Shard.init([nil, nil, opts]) ==
{:error, "permdown_period must be at least larger than the down_period"}
test "generates child spec" do
assert MyTracker.child_spec([]) == %{
id: Phoenix.TrackerTest.MyTracker,
start: {Phoenix.TrackerTest.MyTracker, :start_link, [[]]},
type: :supervisor
}
end
end

0 comments on commit 1bc0b25

Please sign in to comment.