Skip to content

Commit

Permalink
Apply requested changes
Browse files Browse the repository at this point in the history
  • Loading branch information
LVala committed Nov 21, 2023
1 parent 16f95d6 commit eafd2c3
Showing 1 changed file with 44 additions and 33 deletions.
77 changes: 44 additions & 33 deletions test/ex_webrtc/dtls_transport_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -7,36 +7,49 @@ defmodule ExWebRTC.DTLSTransportTest do
use GenServer

def start_link(_mode, config) do
GenServer.start_link(__MODULE__, config)
GenServer.start_link(__MODULE__, {self(), config})
end

def send_data(ice_agent, data) do
GenServer.cast(ice_agent, {:send_data, data})
end

def send_dtls(ice_agent, data) do
GenServer.cast(ice_agent, {:send_dtls, data})
end

@impl true
def init({dtls, tester: tester}),
do: {:ok, %{dtls: dtls, tester: tester}}

@impl true
def init(tester: tester), do: {:ok, tester}
def handle_cast({:send_data, data}, state) do
send(state.tester, {:fake_ice, data})
{:noreply, state}
end

@impl true
def handle_cast({:send_data, data}, tester) do
send(tester, {:fake_ice, data})
{:noreply, tester}
def handle_cast({:send_dtls, data}, state) do
send(state.dtls, {:ex_ice, self(), data})
{:noreply, state}
end
end

setup do
assert {:ok, dtls} = DTLSTransport.start_link([tester: self()], FakeICEAgent)
ice = DTLSTransport.get_ice_agent(dtls)
assert is_pid(ice)

%{dtls: dtls}
%{dtls: dtls, ice: ice}
end

test "forwards non-data ICE messages", %{dtls: dtls} do
message = "test message"
test "forwards non-data ICE messages", %{ice: ice} do
message = :connected

send_ice(dtls, message)
FakeICEAgent.send_dtls(ice, message)
assert_receive {:ex_ice, _from, ^message}

send_ice(dtls, {:data, <<1, 2, 3>>})
FakeICEAgent.send_dtls(ice, {:data, <<1, 2, 3>>})
refute_receive {:ex_ice, _from, _msg}
end

Expand All @@ -51,82 +64,80 @@ defmodule ExWebRTC.DTLSTransportTest do
assert {:error, :already_started} = DTLSTransport.start_dtls(dtls, :passive)
end

test "initiates DTLS handshake when in active mode", %{dtls: dtls} do
test "initiates DTLS handshake when in active mode", %{dtls: dtls, ice: ice} do
:ok = DTLSTransport.start_dtls(dtls, :active)

send_ice(dtls, :connected)
FakeICEAgent.send_dtls(ice, :connected)

assert_receive {:fake_ice, packets}
assert is_binary(packets)
end

test "won't initiate DTLS handshake when in passive mode", %{dtls: dtls} do
test "won't initiate DTLS handshake when in passive mode", %{dtls: dtls, ice: ice} do
:ok = DTLSTransport.start_dtls(dtls, :passive)

send_ice(dtls, :connected)
FakeICEAgent.send_dtls(ice, :connected)

refute_receive({:fake_ice, _msg})
end

test "will retransmit after initiating handshake", %{dtls: dtls} do
test "will retransmit after initiating handshake", %{dtls: dtls, ice: ice} do
:ok = DTLSTransport.start_dtls(dtls, :active)

send_ice(dtls, :connected)
FakeICEAgent.send_dtls(ice, :connected)

assert_receive {:fake_ice, _packets}
assert_receive {:fake_ice, _retransmited}, 1200
assert_receive {:fake_ice, _retransmited}, 1100
end

test "will buffer packets and send when connected", %{dtls: dtls} do
test "will buffer packets and send when connected", %{dtls: dtls, ice: ice} do
:ok = DTLSTransport.start_dtls(dtls, :passive)

remote_dtls = ExDTLS.init(client_mode: true, dtls_srtp: true)
{packets, _timeout} = ExDTLS.do_handshake(remote_dtls)

send_ice(dtls, {:data, packets})
FakeICEAgent.send_dtls(ice, {:data, packets})
refute_receive {:fake_ice, _packets}

send_ice(dtls, :connected)
FakeICEAgent.send_dtls(ice, :connected)
assert_receive {:fake_ice, packets}
assert is_binary(packets)
end

test "finishes handshake in actice mode", %{dtls: dtls} do
test "finishes handshake in active mode", %{dtls: dtls, ice: ice} do
:ok = DTLSTransport.start_dtls(dtls, :active)
remote_dtls = ExDTLS.init(client_mode: false, dtls_srtp: true)

send_ice(dtls, :connected)
FakeICEAgent.send_dtls(ice, :connected)

assert :ok = check_handshake(dtls, remote_dtls)
assert :ok = check_handshake(dtls, ice, remote_dtls)
end

test "finishes handshake in passive mode", %{dtls: dtls} do
test "finishes handshake in passive mode", %{dtls: dtls, ice: ice} do
:ok = DTLSTransport.start_dtls(dtls, :passive)
send_ice(dtls, :connected)
FakeICEAgent.send_dtls(ice, :connected)

remote_dtls = ExDTLS.init(client_mode: true, dtls_srtp: true)
{packets, _timeout} = ExDTLS.do_handshake(remote_dtls)
send_ice(dtls, {:data, packets})
FakeICEAgent.send_dtls(ice, {:data, packets})

assert :ok == check_handshake(dtls, remote_dtls)
assert :ok == check_handshake(dtls, ice, remote_dtls)
end

defp check_handshake(dtls, remote_dtls) do
defp check_handshake(dtls, ice, remote_dtls) do
assert_receive {:fake_ice, packets}

case ExDTLS.handle_data(remote_dtls, packets) do
{:handshake_packets, packets, _timeout} ->
send_ice(dtls, {:data, packets})
check_handshake(dtls, remote_dtls)
FakeICEAgent.send_dtls(ice, {:data, packets})
check_handshake(dtls, ice, remote_dtls)

{:handshake_finished, _, _, _, packets} ->
send_ice(dtls, {:data, packets})
FakeICEAgent.send_dtls(ice, {:data, packets})
:ok

{:handshake_finished, _, _, _} ->
:ok
end
end

defp send_ice(dtls, msg), do: send(dtls, {:ex_ice, "dummy_pid", msg})
end

0 comments on commit eafd2c3

Please sign in to comment.