summaryrefslogtreecommitdiff
path: root/lib/ssl/test/dtls_api_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ssl/test/dtls_api_SUITE.erl')
-rw-r--r--lib/ssl/test/dtls_api_SUITE.erl144
1 files changed, 123 insertions, 21 deletions
diff --git a/lib/ssl/test/dtls_api_SUITE.erl b/lib/ssl/test/dtls_api_SUITE.erl
index f6dab82bd0..611c552858 100644
--- a/lib/ssl/test/dtls_api_SUITE.erl
+++ b/lib/ssl/test/dtls_api_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2019-2022. All Rights Reserved.
+%% Copyright Ericsson AB 2019-2023. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -52,7 +52,8 @@
dtls_listen_two_sockets_5/1,
dtls_listen_two_sockets_6/0,
dtls_listen_two_sockets_6/1,
- client_restarts/0, client_restarts/1
+ client_restarts/0, client_restarts/1,
+ client_restarts_multiple_acceptors/1
]).
-include_lib("ssl/src/ssl_internal.hrl").
@@ -84,7 +85,8 @@ api_tests() ->
dtls_listen_two_sockets_4,
dtls_listen_two_sockets_5,
dtls_listen_two_sockets_6,
- client_restarts
+ client_restarts,
+ client_restarts_multiple_acceptors
].
init_per_suite(Config0) ->
@@ -354,59 +356,159 @@ client_restarts() ->
[{doc, "Test re-connection "}].
client_restarts(Config) ->
- ClientOpts = ssl_test_lib:ssl_options(client_rsa_opts, Config),
+ ClientOpts0 = ssl_test_lib:ssl_options(client_rsa_opts, Config),
ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
{ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ ClientOpts = [{verify, verify_none},{reuse_sessions, save} | ClientOpts0],
Server =
ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
{from, self()},
{mfa, {ssl_test_lib, no_result, []}},
- {options, ServerOpts}]),
+ {options, [{verify, verify_none}|ServerOpts]}]),
Port = ssl_test_lib:inet_port(Server),
Client0 = ssl_test_lib:start_client([{node, ClientNode},
{port, Port}, {host, Hostname},
{mfa, {ssl_test_lib, no_result, []}},
{from, self()},
- {options, [{reuse_sessions, save} | ClientOpts]}]),
+ {options, ClientOpts}]),
+
+ ssl_test_lib:send(Client0, Msg1 = "from client 0"),
+ ssl_test_lib:send(Server, Msg2 = "from server to client 0"),
+
+ Server ! {active_receive, Msg1},
+ Client0 ! {active_receive, Msg2},
+
+ Msgs = lists:sort([{Server, Msg1}, {Client0, Msg2}]),
+ Msgs = lists:sort(flush()),
+
ReConnect = %% Whitebox re-connect test
fun({sslsocket, {gen_udp,_,dtls_gen_connection}, [Pid]} = Socket, ssl) ->
ct:log("~p Client Socket: ~p ~n", [self(), Socket]),
- {ok, {{Address,CPort},UDPSocket}=IntSocket} = gen_statem:call(Pid, {downgrade, self()}),
-
+ {ok, IntSocket} = gen_statem:call(Pid, {downgrade, self()}),
+ {{Address,CPort},UDPSocket}=IntSocket,
ct:log("Info: ~p~n", [inet:info(UDPSocket)]),
{ok, #config{transport_info = CbInfo, connection_cb = ConnectionCb,
- ssl = SslOpts0}} = ssl:handle_options(ClientOpts, client, Address),
+ ssl = SslOpts0}} =
+ ssl:handle_options(ClientOpts, client, Address),
SslOpts = {SslOpts0, #socket_options{}, undefined},
ct:sleep(250),
ct:log("Client second connect: ~p ~p~n", [Socket, CbInfo]),
- Res = ssl_gen_statem:connect(ConnectionCb, Address, CPort, IntSocket, SslOpts, self(), CbInfo, infinity),
- {Res, Pid}
+ {ok, NewSocket} = ssl_gen_statem:connect(ConnectionCb, Address, CPort, IntSocket,
+ SslOpts, self(), CbInfo, infinity),
+ {replace, NewSocket}
end,
Client0 ! {apply, self(), ReConnect},
receive
- {apply_res, {Res, _Prev}} ->
+ {apply_res, {replace, Res}} ->
ct:log("Apply res: ~p~n", [Res]),
ok;
- Msg ->
- ct:log("Unhandled: ~p~n", [Msg]),
- ct:fail({wrong_msg, Msg})
+ ErrMsg ->
+ ct:log("Unhandled: ~p~n", [ErrMsg]),
+ ct:fail({wrong_msg, ErrMsg})
end,
+ ssl_test_lib:send(Client0, Msg1 = "from client 0"),
+ ssl_test_lib:send(Server, Msg2 = "from server to client 0"),
+
+ Server ! {active_receive, Msg1},
+ Client0 ! {active_receive, Msg2},
+
+ Msgs = lists:sort(flush()),
+
+ ssl_test_lib:close(Server),
+ ssl_test_lib:close(Client0),
+ ok.
+
+
+flush() ->
+ receive Msg -> [Msg|flush()]
+ after 500 -> []
+ end.
+
+client_restarts_multiple_acceptors(Config) ->
+ %% Can also be tested with openssl by connecting a client and hit
+ %% Ctrl-C to kill openssl process, so that the connection is not
+ %% closed.
+ %% Then do a new openssl connect with the same client port.
+
+ ClientOpts0 = ssl_test_lib:ssl_options(client_rsa_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+
+ ClientOpts = [{verify, verify_none},{reuse_sessions, save} | ClientOpts0],
+ Server =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl_test_lib, no_result, []}},
+ {accepters, 2},
+ {options, [{verify, verify_none}|ServerOpts]}]),
+ Port = ssl_test_lib:inet_port(Server),
+ Client0 = ssl_test_lib:start_client([{node, ClientNode},
+ {port, Port}, {host, Hostname},
+ {mfa, {ssl_test_lib, no_result, []}},
+ {from, self()},
+ {options, ClientOpts}]),
+
+ Server2 = receive {accepter, 2, Server2Pid} -> Server2Pid
+ after 5000 -> ct:fail(msg_timeout)
+ end,
+
+ ssl_test_lib:send(Client0, Msg1 = "from client 0"),
+ ssl_test_lib:send(Server, Msg2 = "from server to client 0"),
+
+ Server ! {active_receive, Msg1},
+ Client0 ! {active_receive, Msg2},
+
+ Msgs = lists:sort([{Server, Msg1}, {Client0, Msg2}]),
+ Msgs = lists:sort(flush()),
+
+ ReConnect = %% Whitebox re-connect test
+ fun({sslsocket, {gen_udp,_,dtls_gen_connection}, [Pid]} = Socket, ssl) ->
+ ct:log("~p Client Socket: ~p ~n", [self(), Socket]),
+ {ok, IntSocket} = gen_statem:call(Pid, {downgrade, self()}),
+ {{Address,CPort},UDPSocket}=IntSocket,
+ ct:log("Info: ~p~n", [inet:info(UDPSocket)]),
+
+ {ok, #config{transport_info = CbInfo, connection_cb = ConnectionCb,
+ ssl = SslOpts0}} =
+ ssl:handle_options(ClientOpts, client, Address),
+ SslOpts = {SslOpts0, #socket_options{}, undefined},
+
+ ct:sleep(250),
+ ct:log("Client second connect: ~p ~p~n", [Socket, CbInfo]),
+ {ok, NewSocket} = ssl_gen_statem:connect(ConnectionCb, Address, CPort, IntSocket,
+ SslOpts, self(), CbInfo, infinity),
+ {replace, NewSocket}
+ end,
+
+ Client0 ! {apply, self(), ReConnect},
receive
- Msg2 ->
- ct:log("Unhandled: ~p~n", [Msg2]),
- ct:fail({wrong_msg, Msg2})
- after 200 ->
- ct:log("Nothing received~n", [])
+ {apply_res, {replace, Res}} ->
+ ct:log("Apply res: ~p~n", [Res]),
+ ok;
+ ErrMsg ->
+ ct:log("Unhandled: ~p~n", [ErrMsg]),
+ ct:fail({wrong_msg, ErrMsg})
end,
+ ok = ssl_test_lib:send(Client0, Msg3 = "from client 2"),
+ ok = ssl_test_lib:send(Server2, Msg4 = "from server 2 to client 2"),
+ {error, closed} = ssl_test_lib:send(Server, "Should be closed"),
+
+ Msgs2 = lists:sort([{Server2, Msg3}, {Client0, Msg4}]),
+
+ Server2 ! {active_receive, Msg3},
+ Client0 ! {active_receive, Msg4},
+
+ Msgs2 = lists:sort(flush()),
+
ssl_test_lib:close(Server),
+ ssl_test_lib:close(Server2),
ssl_test_lib:close(Client0),
-
ok.
%%--------------------------------------------------------------------