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