defmodule ShardTest.Conn do use ExUnit.Case doctest Shard.Application require Salty.Box.Curve25519xchacha20poly1305, as: Box require Salty.Sign.Ed25519, as: Sign test "crypto connection" do {srv_pkey, srv_skey} = Shard.Identity.get_keypair {:ok, sess_pkey, sess_skey} = Box.keypair {:ok, challenge} = Salty.Random.buf 32 {:ok, socket} = :gen_tcp.connect {127,0,0,1}, 4045, [:binary, packet: 2, active: false] hello = {srv_pkey, sess_pkey, challenge, 0} :gen_tcp.send(socket, :erlang.term_to_binary hello) {:ok, pkt} = :gen_tcp.recv(socket, 0) {cli_pkey, cli_sess_pkey, cli_challenge, _his_port} = :erlang.binary_to_term(pkt, [:safe]) {:ok, cli_challenge_sign} = Sign.sign_detached(cli_challenge, srv_skey) sendmsg(socket, cli_challenge_sign, cli_sess_pkey, sess_skey) challenge_sign = recvmsg(socket, cli_sess_pkey, sess_skey) :ok = Sign.verify_detached(challenge_sign, challenge, cli_pkey) pkt = :erlang.binary_to_term(recvmsg(socket, cli_sess_pkey, sess_skey), [:safe]) IO.puts (inspect pkt) end defp sendmsg(sock, msg, pk, sk) do {:ok, n} = Salty.Random.buf Box.noncebytes {:ok, msg} = Box.easy(msg, n, pk, sk) :gen_tcp.send(sock, n <> msg) end defp recvmsg(sock, pk, sk) do {:ok, pkt} = :gen_tcp.recv(sock, 0) n = binary_part(pkt, 0, Box.noncebytes) enc = binary_part(pkt, Box.noncebytes, (byte_size pkt) - Box.noncebytes) {:ok, msg} = Box.open_easy(enc, n, pk, sk) msg end test "set nickname" do Shard.Identity.set_nickname "test bot" end test "connect to other instance" do Shard.Manager.add_peer({127, 0, 0, 1}, 4045) receive do after 100 -> nil end end @tag :skip test "connect to chat rooms" do {:ok, pid1} = DynamicSupervisor.start_child(Shard.DynamicSupervisor, {SApp.Chat, "test"}) {:ok, pid2} = DynamicSupervisor.start_child(Shard.DynamicSupervisor, {SApp.Chat, "other_test"}) GenServer.cast(pid1, {:chat_send, "test msg 1"}) GenServer.cast(pid2, {:chat_send, "test msg 2"}) {:error, :redundant} = DynamicSupervisor.start_child(Shard.DynamicSupervisor, {SApp.Chat, "test"}) end end