diff options
author | Micael Karlberg <[email protected]> | 2019-07-18 14:28:53 +0200 |
---|---|---|
committer | Micael Karlberg <[email protected]> | 2019-07-18 14:28:53 +0200 |
commit | 12155cba0b8b8dc3853d78e948a917c92a84174e (patch) | |
tree | 7d9dd79ba47e620eab60c68ed77d6e99c81fded3 /erts/emulator/test | |
parent | 6c7132f25fb5d24e73a9f9c24227515a0d5fce39 (diff) | |
parent | 319465f1b4b7a518a27a9f5170de528b8566b3f9 (diff) | |
download | otp-12155cba0b8b8dc3853d78e948a917c92a84174e.tar.gz otp-12155cba0b8b8dc3853d78e948a917c92a84174e.tar.bz2 otp-12155cba0b8b8dc3853d78e948a917c92a84174e.zip |
Merge branch 'bmk/erts/esock/20190718/socket_option_dontroute/OTP-15904' into bmk/erts/esock/20190717/socket_options/OTP-15904
Diffstat (limited to 'erts/emulator/test')
-rw-r--r-- | erts/emulator/test/socket_SUITE.erl | 133 |
1 files changed, 132 insertions, 1 deletions
diff --git a/erts/emulator/test/socket_SUITE.erl b/erts/emulator/test/socket_SUITE.erl index efafbb7c8d..313408aa36 100644 --- a/erts/emulator/test/socket_SUITE.erl +++ b/erts/emulator/test/socket_SUITE.erl @@ -127,6 +127,7 @@ api_opt_sock_broadcast/1, api_opt_sock_debug/1, api_opt_sock_domain/1, + api_opt_sock_dontroute/1, api_opt_ip_add_drop_membership/1, %% *** API Operation Timeout *** @@ -791,7 +792,8 @@ api_options_socket_cases() -> api_opt_sock_bindtodevice, api_opt_sock_broadcast, api_opt_sock_debug, - api_opt_sock_domain + api_opt_sock_domain, + api_opt_sock_dontroute ]. api_options_ip_cases() -> @@ -9666,6 +9668,132 @@ api_opt_sock_domain() -> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Tests the socket option dontroute. +%% The man page has the following to say: +%% "Don't send via a gateway, send only to directly connected hosts. +%% The same effect can be achieved by setting the MSG_DONTROUTE +%% flag on a socket send(2) operation." +%% Since its "kind of" difficult to check if it actually takes an +%% effect (you would need a gateway for that), we only test if we +%% can set and get the value. Better then nothing. + +api_opt_sock_dontroute(suite) -> + []; +api_opt_sock_dontroute(doc) -> + []; +api_opt_sock_dontroute(_Config) when is_list(_Config) -> + ?TT(?SECS(10)), + tc_try(api_opt_sock_dontroute, + fun() -> has_support_sock_dontroute() end, + fun() -> api_opt_sock_dontroute() end). + + +api_opt_sock_dontroute() -> + Opt = dontroute, + Set = fun(S, Val) when is_boolean(Val) -> + socket:setopt(S, socket, Opt, Val) + end, + Get = fun(S) -> + socket:getopt(S, socket, Opt) + end, + + TesterSeq = + [ + #{desc => "which local address", + cmd => fun(#{domain := Domain} = State) -> + case ?LIB:which_local_host_info(Domain) of + {ok, #{name := Name, + addr := Addr, + broadaddr := BAddr}} -> + ?SEV_IPRINT("local host info: " + "~n Name: ~p" + "~n Addr: ~p" + "~n Broadcast Addr: ~p", + [Name, Addr, BAddr]), + LSA = #{family => Domain, + addr => Addr}, + BSA = #{family => Domain, + addr => BAddr}, + {ok, State#{lsa => LSA, + bsa => BSA}}; + {error, _} = ERROR -> + ERROR + end + end}, + + #{desc => "create UDP socket", + cmd => fun(#{domain := Domain} = State) -> + case socket:open(Domain, dgram, udp) of + {ok, Sock} -> + {ok, State#{sock => Sock}}; + {error, _} = ERROR -> + ERROR + end + end}, + #{desc => "Get current value", + cmd => fun(#{sock := Sock} = State) -> + case Get(Sock) of + {ok, Val} when is_boolean(Val) -> + ?SEV_IPRINT("Success: ~p", [Val]), + {ok, State#{dontroute => Val}}; + {error, Reason} = ERROR -> + ?SEV_EPRINT("Unexpected failure: ~p", + [Reason]), + ERROR + end + end}, + #{desc => "Try change value", + cmd => fun(#{sock := Sock, dontroute := Current} = State) -> + New = not Current, + ?SEV_IPRINT("Change from ~p to ~p", [Current, New]), + case Set(Sock, New) of + ok -> + ?SEV_IPRINT("Expected Success"), + {ok, State#{dontroute => New}}; + {error, Reason} = ERROR -> + ?SEV_EPRINT("Unexpected Failure: ~p", + [Reason]), + ERROR + end + end}, + #{desc => "Verify changed value", + cmd => fun(#{sock := Sock, dontroute := Val} = _State) -> + case Get(Sock) of + {ok, Val} -> + ?SEV_IPRINT("Expected Success"), + ok; + {error, Reason} = ERROR -> + ?SEV_EPRINT("Unexpected failure: ~p", + [Reason]), + ERROR + end + end}, + + %% *** Termination *** + #{desc => "close UDP socket", + cmd => fun(#{sock := Sock} = State0) -> + socket:close(Sock), + State1 = maps:remove(sock, State0), + {ok, State1} + end}, + + %% *** We are done *** + ?SEV_FINISH_NORMAL + ], + + Domain = inet, + + i("start tester evaluator"), + InitState = #{domain => Domain}, + Tester = ?SEV_START("tester", TesterSeq, InitState), + + i("await evaluator(s)"), + ok = ?SEV_AWAIT_FINISH([Tester]). + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %% Tests that the add_mambership and drop_membership ip options work. %% We create one server and two clients. The server only send messages, %% the clients only receives messages. @@ -28422,6 +28550,9 @@ has_support_sock_debug() -> has_support_sock_domain() -> has_support_socket_option_sock(domain). +has_support_sock_dontroute() -> + has_support_socket_option_sock(dontroute). + has_support_ip_add_membership() -> has_support_socket_option_ip(add_membership). |