use ExUnit.Case, async: true
doctest Wampex
- alias Wampex.{Authentication, Realm}
- alias Wampex.Client
alias Wampex.Roles.{Broker, Callee, Caller, Dealer, Peer, Publisher, Subscriber}
- alias Wampex.Router
alias Wampex.Serializers.{JSON, MessagePack}
alias Broker.{Event, Published, Subscribed, Unsubscribed}
alias Callee.{Register, Unregister, Yield}
alias Caller.Call
- alias Client.Session
alias Dealer.{Invocation, Registered, Result, Unregistered}
alias Peer.{Authenticate, Goodbye, Hello}
alias Publisher.Publish
alias Subscriber.{Subscribe, Unsubscribe}
require Logger
- @url "ws://localhost:4000/ws"
- @authid "admin"
- @auth_password "test1234"
- @realm_uri "org.entropealabs.admin"
- @auth %Authentication{authid: @authid, authmethods: ["wampcra"], secret: @auth_password}
- @realm %Realm{name: @realm_uri, authentication: @auth}
- @roles [Callee, Caller, Publisher, Subscriber]
- @device "as987d9a8sd79a87ds"
-
- setup_all do
- topologies = Application.get_env(:cluster_kv, :topologies)
-
- [
- server:
- Router.start_link(
- name: TestRouter,
- port: 4000,
- topologies: topologies,
- replicas: 1,
- quorum: 1,
- admin_realm: @realm_uri,
- admin_authid: @authid,
- admin_password: @auth_password
- )
- ]
- end
-
- @session %Session{url: @url, realm: @realm, roles: @roles}
-
- @tag :client
- test "session_name" do
- assert Test.Session = Client.session_name(Test)
- end
-
- @tag :client
- test "subscriber_registry_name" do
- assert Test.SubscriberRegistry = Client.subscriber_registry_name(Test)
- end
-
- @tag :client
- test "callee_registry_name" do
- assert Test.CalleeRegistry = Client.callee_registry_name(Test)
- end
-
- @tag :client
- test "transport_name" do
- assert Test.Transport = Client.transport_name(Test)
- end
-
- @tag :client
test "Callee.add" do
assert %{callee: %{}} = Callee.add(%{})
end
- @tag :client
test "Callee.register" do
assert [64, %{}, "test"] = Callee.register(%Register{procedure: "test"})
end
- @tag :client
test "Callee.unregister" do
assert [66, 123_456] = Callee.unregister(%Unregister{registration_id: 123_456})
end
- @tag :client
test "Callee.yield" do
assert [70, 1234, %{}, [], %{}] = Callee.yield(%Yield{request_id: 1234})
assert [70, 1234, %{}, ["1"], %{}] = Callee.yield(%Yield{request_id: 1234, arg_list: ["1"]})
})
end
- @tag :client
test "Caller.add" do
assert %{caller: %{}} = Caller.add(%{})
end
})
end
- @tag :client
test "Peer.add" do
assert %{} = Caller.add(%{})
end
- @tag :client
test "Peer.hello" do
assert [1, "test", %{agent: "WAMPex", roles: %{callee: %{}}}] =
Peer.hello(%Hello{realm: "test", roles: [Callee]})
end
- @tag :client
test "Peer.authenticate" do
assert [5, "a-signa-ture", %{}] ==
Peer.authenticate(%Authenticate{signature: "a-signa-ture", extra: %{}})
end
- @tag :client
test "Peer.gooodbye" do
assert [6, %{}, "test"] = Peer.goodbye(%Goodbye{reason: "test"})
end
- @tag :client
test "Publisher.add" do
assert %{publisher: %{}} = Publisher.add(%{})
end
})
end
- @tag :client
test "Subscriber.add" do
assert %{subscriber: %{}} = Subscriber.add(%{})
end
- @tag :client
test "Subscriber.subscribe" do
assert [32, %{test: 1}, "test"] =
Subscriber.subscribe(%Subscribe{topic: "test", options: %{test: 1}})
end
- @tag :client
test "Subscriber.unsubscribe" do
assert [34, 1234] = Subscriber.unsubscribe(%Unsubscribe{subscription_id: 1234})
end
- @tag :router
test "Dealer.add" do
assert %{dealer: %{}} = Dealer.add(%{})
end
- @tag :router
test "Dealer.registered" do
assert [65, 123_456, 765_432] =
Dealer.registered(%Registered{request_id: 123_456, registration_id: 765_432})
end
- @tag :router
test "Dealer.unregistered" do
assert [67, 123_456] = Dealer.unregistered(%Unregistered{request_id: 123_456})
end
- @tag :router
test "Dealer.result" do
assert [50, 1234, %{}, [], %{}] = Dealer.result(%Result{request_id: 1234})
assert [50, 1234, %{}, ["1"], %{}] = Dealer.result(%Result{request_id: 1234, arg_list: ["1"]})
request_id: 1234,
arg_list: [2],
arg_kw: %{},
- options: %{test: 1}
+ details: %{test: 1}
})
end
- @tag :router
test "Dealer.invocation" do
assert [68, 1234, 1234, %{}, [], %{}] =
Dealer.invocation(%Invocation{request_id: 1234, registration_id: 1234})
registration_id: 1234,
arg_list: [2],
arg_kw: %{test: 2},
- options: %{test: 1}
+ details: %{test: 1}
})
end
- @tag :router
test "Broker.add" do
assert %{broker: %{}} = Broker.add(%{})
end
- @tag :router
test "Broker.event" do
assert [36, 123_456, 765_432, %{}, [], %{}] =
Broker.event(%Event{subscription_id: 123_456, publication_id: 765_432})
})
end
- @tag :router
test "Broker.subscribed" do
assert [33, 123_456, 123_456] =
Broker.subscribed(%Subscribed{request_id: 123_456, subscription_id: 123_456})
end
- @tag :router
test "Broker.unsubscribed" do
assert [35, 123_456] = Broker.unsubscribed(%Unsubscribed{request_id: 123_456})
end
- @tag :router
test "Broker.published" do
assert [17, 123_456, 654_321] =
Broker.published(%Published{request_id: 123_456, publication_id: 654_321})
end
- @tag :client
test "MessagePack Serializer" do
assert :binary = MessagePack.data_type()
assert "\x93\x05\xC4\t123456789\x80" = MessagePack.serialize!([5, "123456789", %{}])
assert {:ok, [5, "123456789", %{}]} = MessagePack.deserialize("\x93\x05\xC4\t123456789\x80")
end
- @tag :client
test "JSON Serializer" do
assert :text = JSON.data_type()
assert "[5,\"123456789\",{}]" = JSON.serialize!([5, "123456789", %{}])
assert [5, "123456789", %{}] = JSON.deserialize!("[5,\"123456789\",{}]")
assert {:ok, [5, "123456789", %{}]} = JSON.deserialize("[5,\"123456789\",{}]")
end
-
- @tag :client
- test "callee registration" do
- name = TestCalleeRegistration
- Client.start_link(name: name, session: @session)
- TestCallee.start_link(self(), name, @device)
- assert_receive {:registered, id}
- end
-
- @tag :router
- test "get wildcard key" do
- subscriber_name = TestSubscriber
- topic = ".test.light..status"
- {:ok, _pid} = Client.start_link(name: subscriber_name, session: @session)
-
- assert {:ok, id} =
- Client.send_request(
- subscriber_name,
- Subscriber.subscribe(%Subscribe{topic: topic, options: %{match: "wildcard"}})
- )
-
- assert :ok =
- Client.send_request(
- subscriber_name,
- Subscriber.unsubscribe(%Unsubscribe{subscription_id: id})
- )
- end
-
- @tag :abort
- test "abort" do
- Process.flag(:trap_exit, true)
- callee_name = TestAbort
- {:ok, pid} = Client.start_link(name: callee_name, session: @session)
- Client.cast_send_request(callee_name, Peer.hello(%Hello{realm: "test", roles: [Callee]}))
- assert_receive {:EXIT, ^pid, :shutdown}, 1000
- end
-
- @tag :client
- test "caller receives error when calling unknown procedure" do
- caller_name = TestExistCaller
- Client.start_link(name: caller_name, session: @session)
-
- assert {:error, 48, "wamp.error.no_registration", %{"procedure" => "this.should.not.exist"},
- [],
- %{}} =
- Client.send_request(
- caller_name,
- Caller.call(%Call{
- procedure: "this.should.not.exist",
- arg_list: [1],
- arg_kw: %{color: "#FFFFFF"}
- })
- )
- end
-
- @tag :client
- test "admin callee is invoked and responds and caller gets result" do
- caller_name = TestAdminCaller
- Client.start_link(name: caller_name, session: @session)
-
- {:ok, %{}, [id], %{}} =
- Client.send_request(
- caller_name,
- Caller.call(%Call{
- procedure: "admin.create_user",
- arg_kw: %{authid: "chris", password: "woot!", realm: @realm_uri}
- })
- )
-
- assert is_binary(id)
- end
-
- @tag :client
- test "admin callee is invoked and responds with error" do
- caller_name = TestAdminErrorCaller
- Client.start_link(name: caller_name, session: @session)
-
- assert {:error, 48, "Error registering user", %{}, [], %{}} =
- Client.send_request(
- caller_name,
- Caller.call(%Call{
- procedure: "admin.create_user",
- arg_kw: %{authid: "chris", password: "woot!", realm: "not.real"}
- })
- )
- end
-
- @tag :client
- test "callee is invoked and responds and caller gets result" do
- callee_name = TestCalleeRespond
- Client.start_link(name: callee_name, session: @session)
- TestCallee.start_link(self(), callee_name, @device)
- assert_receive {:registered, id}
- caller_name = TestCaller
- Client.start_link(name: caller_name, session: @session)
-
- {:ok, %{}, ["ok"], %{"color" => "#FFFFFF"}} =
- Client.send_request(
- caller_name,
- Caller.call(%Call{
- procedure: "com.actuator.#{@device}.light",
- arg_list: [1],
- arg_kw: %{color: "#FFFFFF"}
- })
- )
-
- assert_receive {:invocation, _, _, _, _, _}
- end
-
- @tag :client
- test "subscriber registration" do
- name = TestSubscriberRegister
- Client.start_link(name: name, session: @session)
- TestSubscriber.start_link(self(), name, "com.data.temp")
- assert_receive {:subscribed, id}
- end
-
- @tag :client
- test "subscriber receives events from publisher" do
- name = TestSubscriberEvents
- Client.start_link(name: name, session: @session)
- TestSubscriber.start_link(self(), name, "com.data.test.temp")
- assert_receive {:subscribed, id}
-
- Client.start_link(name: TestPublisher, session: @session)
-
- Client.cast_send_request(
- TestPublisher,
- Publisher.publish(%Publish{
- topic: "com.data.test.temp",
- arg_list: [12.5, 45.6, 87.5],
- arg_kw: %{loc: "60645"}
- })
- )
-
- assert_receive {:event, _, _, _, _, _}, 2000
- assert_receive {:event, _, _, _, _, _}, 2000
- assert_receive {:event, _, _, _, _, _}, 2000
- end
end