1defmodule ClusterTest do
2  use ExUnit.Case
3
4  defmodule ClusterServer do
5    use ExActor.GenServer, export: :cluster_pid
6
7    defstart start, do: initial_state(nil)
8    defmulticall sum(x, y), do: reply(x + y)
9
10    defmulticall timeout1, timeout: 10, do: (:timer.sleep(100); reply(:ok))
11    defmulticall timeout2, timeout: foo, do: (:timer.sleep(100); reply(:ok))
12    defmulticall timeout3, timeout: foo \\ 10, do: (:timer.sleep(100); reply(:ok))
13
14    def diff(x, y), do: do_diff(x, y)
15    defmulticallp do_diff(x, y), do: reply(x - y)
16
17    defcall get, state: state, do: reply(state)
18    defabcast set(x), do: new_state(x)
19
20    def set2(x), do: do_set2(x)
21    defabcastp do_set2(x), do: new_state(2 * x)
22  end
23
24  test "cluster pid" do
25    ClusterServer.start
26    assert ClusterServer.sum(3, 2) == {[{:"nonode@nohost", 5}], []}
27    assert ClusterServer.sum([node()], 3, 2) == {[{:"nonode@nohost", 5}], []}
28    assert ClusterServer.sum([:unknown_node], 3, 2) == {[], [:unknown_node]}
29    assert ClusterServer.sum([], 3, 2) == {[], []}
30    assert catch_error(ClusterServer.do_diff(3, 2)) == :undef
31    assert ClusterServer.diff(3, 2) == {[{:"nonode@nohost", 1}], []}
32
33    assert ClusterServer.timeout1 == {[], [node()]}
34    assert ClusterServer.timeout1 == {[], [node()]}
35    assert ClusterServer.timeout2(10) == {[], [node()]}
36    assert ClusterServer.timeout2(2000) == {[{node(), :ok}], []}
37    assert ClusterServer.timeout3 == {[], [node()]}
38    assert ClusterServer.timeout3([node()], 10) == {[], [node()]}
39    assert ClusterServer.timeout3([node()], 2000) == {[{node(), :ok}], []}
40
41    assert ClusterServer.set(4) == :abcast
42    assert ClusterServer.get == 4
43
44    assert catch_error(ClusterServer.do_set2(3)) == :undef
45    assert ClusterServer.set2(4) == :abcast
46    assert ClusterServer.get == 8
47  end
48
49
50
51  defmodule NonRegisteredClusterServer do
52    use ExActor.GenServer
53
54    defstart start do
55      Process.register(self(), :nrca)
56      initial_state(nil)
57    end
58
59    defmulticall sum(x, y), do: reply(x + y)
60
61    def diff(x, y), do: do_diff(:nrca, x, y)
62    defmulticallp do_diff(x, y), do: reply(x - y)
63
64    defcall get, state: state, do: reply(state)
65    defabcast set(x), do: new_state(x)
66
67    def set2(x), do: do_set2(:nrca, x)
68    defabcastp do_set2(x), do: new_state(2 * x)
69  end
70
71  test "non registered cluster pid" do
72    NonRegisteredClusterServer.start
73    assert NonRegisteredClusterServer.sum(:nrca, 3, 2) == {[{:"nonode@nohost", 5}], []}
74    assert NonRegisteredClusterServer.sum([node()], :nrca, 3, 2) == {[{:"nonode@nohost", 5}], []}
75    assert NonRegisteredClusterServer.sum([:unknown_node], :nrca, 3, 2) == {[], [:unknown_node]}
76    assert NonRegisteredClusterServer.sum([], :nrca, 3, 2) == {[], []}
77    assert catch_error(NonRegisteredClusterServer.do_diff(:nrca, 3, 2)) == :undef
78    assert NonRegisteredClusterServer.diff(3, 2) == {[{:"nonode@nohost", 1}], []}
79
80    assert NonRegisteredClusterServer.set(:nrca, 4) == :abcast
81    assert NonRegisteredClusterServer.get(:nrca) == 4
82
83    assert catch_error(NonRegisteredClusterServer.do_set2(:nrca, 3)) == :undef
84    assert NonRegisteredClusterServer.set2(4) == :abcast
85    assert NonRegisteredClusterServer.get(:nrca) == 8
86  end
87end
88