Skip to content

Commit 5a9904d

Browse files
committed
Make handle_timeout/1 return {:error, :closed}. Extend tests by roles
1 parent e92bba3 commit 5a9904d

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

c_src/ex_dtls/native.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,7 @@ UNIFEX_TERM handle_read_error(State *state, int ret) {
391391
int error = SSL_get_error(state->ssl, ret);
392392
switch (error) {
393393
case SSL_ERROR_ZERO_RETURN:
394+
state->closed = 1;
394395
return handle_data_result_error_peer_closed_for_writing(state->env);
395396
case SSL_ERROR_WANT_READ:
396397
DEBUG("SSL WANT READ. This is workaround. Did we get retransmission?");
@@ -492,6 +493,10 @@ UNIFEX_TERM handle_handshake_in_progress(State *state, int ret) {
492493
}
493494

494495
UNIFEX_TERM handle_timeout(UnifexEnv *env, State *state) {
496+
if (state->closed == 1) {
497+
return handle_timeout_result_error_closed(env);
498+
}
499+
495500
long result = DTLSv1_handle_timeout(state->ssl);
496501
if (result != 1)
497502
return handle_timeout_result_ok(env);

test/integration_test.exs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,35 @@ defmodule ExDTLS.IntegrationTest do
6060
assert {:error, :handshake_error} = feed_packets(tx_dtls, packets)
6161
end
6262

63-
describe "disconnect" do
64-
test "before handshake has finished" do
63+
describe "close/1" do
64+
test "before handshake has finished (client mode)" do
6565
dtls = ExDTLS.init(mode: :client, dtls_srtp: true, verify_peer: true)
6666
assert {:ok, []} = ExDTLS.close(dtls)
6767
# assert that handshake can't be started
6868
assert {:error, :closed} = ExDTLS.do_handshake(dtls)
6969
end
7070

71-
test "after handshake has finished" do
71+
test "before handshake has finished (server mode)" do
72+
dtls = ExDTLS.init(mode: :server, dtls_srtp: true, verify_peer: true)
73+
assert {:ok, []} = ExDTLS.close(dtls)
74+
# assert that handshake can't be started
75+
assert {:error, :closed} = ExDTLS.do_handshake(dtls)
76+
end
77+
78+
test "after handshake has finished (client mode)" do
79+
rx_dtls = ExDTLS.init(mode: :server, dtls_srtp: true, verify_peer: true)
80+
tx_dtls = ExDTLS.init(mode: :client, dtls_srtp: true, verify_peer: true)
81+
82+
{:ok, packets, _timeout} = ExDTLS.do_handshake(tx_dtls)
83+
84+
assert :ok == loop({rx_dtls, false}, {tx_dtls, false}, packets)
85+
assert {:ok, [packet]} = ExDTLS.close(tx_dtls)
86+
assert {:error, :peer_closed_for_writing} = ExDTLS.handle_data(rx_dtls, packet)
87+
assert {:error, :closed} = ExDTLS.handle_timeout(tx_dtls)
88+
assert {:error, :closed} = ExDTLS.handle_timeout(rx_dtls)
89+
end
90+
91+
test "after handshake has finished (server mode)" do
7292
rx_dtls = ExDTLS.init(mode: :server, dtls_srtp: true, verify_peer: true)
7393
tx_dtls = ExDTLS.init(mode: :client, dtls_srtp: true, verify_peer: true)
7494

@@ -77,6 +97,8 @@ defmodule ExDTLS.IntegrationTest do
7797
assert :ok == loop({rx_dtls, false}, {tx_dtls, false}, packets)
7898
assert {:ok, [packet]} = ExDTLS.close(rx_dtls)
7999
assert {:error, :peer_closed_for_writing} = ExDTLS.handle_data(tx_dtls, packet)
100+
assert {:error, :closed} = ExDTLS.handle_timeout(tx_dtls)
101+
assert {:error, :closed} = ExDTLS.handle_timeout(rx_dtls)
80102
end
81103
end
82104

0 commit comments

Comments
 (0)