From c72e305bbd4d0e85730587fed82ead4f3b362713 Mon Sep 17 00:00:00 2001 From: Raimo Niskanen Date: Thu, 9 Jun 2016 16:08:13 +0200 Subject: Add AF_LOCAL test cases --- lib/kernel/test/gen_udp_SUITE.erl | 160 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 155 insertions(+), 5 deletions(-) (limited to 'lib/kernel/test/gen_udp_SUITE.erl') diff --git a/lib/kernel/test/gen_udp_SUITE.erl b/lib/kernel/test/gen_udp_SUITE.erl index 85dc6312ea..6d82e124e9 100644 --- a/lib/kernel/test/gen_udp_SUITE.erl +++ b/lib/kernel/test/gen_udp_SUITE.erl @@ -35,7 +35,9 @@ -export([send_to_closed/1, active_n/1, buffer_size/1, binary_passive_recv/1, bad_address/1, - read_packets/1, open_fd/1, connect/1, implicit_inet6/1]). + read_packets/1, open_fd/1, connect/1, implicit_inet6/1, + local_basic/1, local_unbound/1, + local_fdopen/1, local_fdopen_unbound/1, local_abstract/1]). suite() -> [{ct_hooks,[ts_install_cth]}, @@ -44,10 +46,13 @@ suite() -> all() -> [send_to_closed, buffer_size, binary_passive_recv, bad_address, read_packets, open_fd, connect, - implicit_inet6, active_n]. + implicit_inet6, active_n, + {group, local}]. groups() -> - []. + [{local, [], + [local_basic, local_unbound, + local_fdopen, local_fdopen_unbound, local_abstract]}]. init_per_suite(Config) -> Config. @@ -55,9 +60,20 @@ init_per_suite(Config) -> end_per_suite(_Config) -> ok. +init_per_group(local, Config) -> + try gen_udp:open(0, [local]) of + {ok,S} -> + ok = gen_udp:close(S), + Config + catch + Class:badarg when Class =:= error; Class =:= exit -> + {skip, "AF_LOCAL not supported"} + end; init_per_group(_GroupName, Config) -> Config. +end_per_group(local, _Config) -> + delete_local_filenames(); end_per_group(_GroupName, Config) -> Config. @@ -65,7 +81,7 @@ end_per_group(_GroupName, Config) -> init_per_testcase(_Case, Config) -> Config. -end_per_testcase(_Case, Config) -> +end_per_testcase(_Case, _Config) -> ok. %%------------------------------------------------------------- @@ -550,6 +566,118 @@ active_n(Config) when is_list(Config) -> ok = gen_udp:close(S1), ok. + +local_basic(_Config) -> + SFile = local_filename(server), + SAddr = {local,bin_filename(SFile)}, + CFile = local_filename(client), + CAddr = {local,bin_filename(CFile)}, + _ = file:delete(SFile), + _ = file:delete(CFile), + %% + S = ok(gen_udp:open(0, [{ifaddr,{local,SFile}},{active,false}])), + C = ok(gen_udp:open(0, [{ifaddr,{local,CFile}},{active,false}])), + SAddr = ok(inet:sockname(S)), + CAddr = ok(inet:sockname(C)), + local_handshake(S, SAddr, C, CAddr), + ok = gen_udp:close(S), + ok = gen_udp:close(C), + %% + ok = file:delete(SFile), + ok = file:delete(CFile), + ok. + +local_unbound(_Config) -> + SFile = local_filename(server), + SAddr = {local,bin_filename(SFile)}, + _ = file:delete(SFile), + %% + S = ok(gen_udp:open(0, [{ifaddr,SAddr},{active,false}])), + C = ok(gen_udp:open(0, [local,{active,false}])), + SAddr = ok(inet:sockname(S)), + {local,<<>>} = ok(inet:sockname(C)), + local_handshake(S, SAddr, C, {unspec,<<>>}), + ok = gen_udp:close(S), + ok = gen_udp:close(C), + %% + ok = file:delete(SFile), + ok. + +local_fdopen(_Config) -> + SFile = local_filename(server), + SAddr = {local,bin_filename(SFile)}, + CFile = local_filename(client), + CAddr = {local,bin_filename(CFile)}, + _ = file:delete(SFile), + _ = file:delete(CFile), + %% + S0 = ok(gen_udp:open(0, [{ifaddr,SAddr},{active,false}])), + C = ok(gen_udp:open(0, [{ifaddr,{local,CFile}},{active,false}])), + SAddr = ok(inet:sockname(S0)), + CAddr = ok(inet:sockname(C)), + Fd = ok(prim_inet:getfd(S0)), + S = ok(gen_udp:open(0, [{fd,Fd},local,{active,false}])), + SAddr = ok(inet:sockname(S)), + local_handshake(S, SAddr, C, CAddr), + ok = gen_udp:close(S), + ok = gen_udp:close(S0), + ok = gen_udp:close(C), + %% + ok = file:delete(SFile), + ok = file:delete(CFile), + ok. + +local_fdopen_unbound(_Config) -> + SFile = local_filename(server), + SAddr = {local,bin_filename(SFile)}, + _ = file:delete(SFile), + %% + S = ok(gen_udp:open(0, [{ifaddr,SAddr},{active,false}])), + C0 = ok(gen_udp:open(0, [local,{active,false}])), + SAddr = ok(inet:sockname(S)), + {local,<<>>} = ok(inet:sockname(C0)), + Fd = ok(prim_inet:getfd(C0)), + C = ok(gen_udp:open(0, [{fd,Fd},local,{active,false}])), + {local,<<>>} = ok(inet:sockname(C)), + local_handshake(S, SAddr, C, {unspec,<<>>}), + ok = gen_udp:close(S), + ok = gen_udp:close(C), + ok = gen_udp:close(C0), + %% + ok = file:delete(SFile), + ok. + +local_abstract(_Config) -> + case os:type() of + {unix,linux} -> + S = ok(gen_udp:open(0, [{ifaddr,{local,<<>>}},{active,false}])), + C = ok(gen_udp:open(0, [{ifaddr,{local,<<>>}},{active,false}])), + {local,_} = SAddr = ok(inet:sockname(S)), + {local,_} = CAddr = ok(inet:sockname(C)), + local_handshake(S, SAddr, C, CAddr), + ok = gen_udp:close(S), + ok = gen_udp:close(C), + ok; + _ -> + {skip,"AF_LOCAL Abstract Addresses only supported on Linux"} + end. + + +local_handshake(S, SAddr, C, CAddr) -> + SData = "9876543210", + CData = "0123456789", + ok = gen_udp:send(C, SAddr, 0, CData), + {CAddr, 0, CData} = ok(gen_tcp:recv(S, 112)), + case CAddr of + {unspec,_} -> + ok; + _ -> + ok = gen_udp:send(S, CAddr, 0, SData), + {SAddr, 0, SData} = ok(gen_tcp:recv(C, 112)), + ok + end. + + %% %% Utils %% @@ -630,4 +758,26 @@ implicit_inet6(S1, Active, Addr) -> {Addr,P2,"pong"} = ok(gen_udp:recv(S1, 1024)), ok = gen_udp:close(S2). -ok({ok,V}) -> V. +ok({ok,V}) -> V; +ok(NotOk) -> + try throw(not_ok) + catch + Thrown -> + erlang:raise( + error, {Thrown, NotOk}, tl(erlang:get_stacktrace())) + end. + + +local_filename(Tag) -> + "/tmp/" ?MODULE_STRING "_" ++ os:getpid() ++ "_" ++ atom_to_list(Tag). + +bin_filename(String) -> + unicode:characters_to_binary(String, file:native_name_encoding()). + +delete_local_filenames() -> + _ = + [file:delete(F) || + F <- + filelib:wildcard( + "/tmp/" ?MODULE_STRING "_" ++ os:getpid() ++ "_*")], + ok. -- cgit v1.2.3 From e0881861bb8d4bf796134f072e67608c6f32b4c6 Mon Sep 17 00:00:00 2001 From: Raimo Niskanen Date: Thu, 16 Jun 2016 13:13:49 +0200 Subject: Return eafnosupport when not supported --- lib/kernel/test/gen_udp_SUITE.erl | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'lib/kernel/test/gen_udp_SUITE.erl') diff --git a/lib/kernel/test/gen_udp_SUITE.erl b/lib/kernel/test/gen_udp_SUITE.erl index 6d82e124e9..9554920d07 100644 --- a/lib/kernel/test/gen_udp_SUITE.erl +++ b/lib/kernel/test/gen_udp_SUITE.erl @@ -61,12 +61,11 @@ end_per_suite(_Config) -> ok. init_per_group(local, Config) -> - try gen_udp:open(0, [local]) of + case gen_udp:open(0, [local]) of {ok,S} -> ok = gen_udp:close(S), - Config - catch - Class:badarg when Class =:= error; Class =:= exit -> + Config; + {error,eafnosupport} -> {skip, "AF_LOCAL not supported"} end; init_per_group(_GroupName, Config) -> -- cgit v1.2.3 From a3626105809abf8be1869f6b0725b6cfa912dedd Mon Sep 17 00:00:00 2001 From: Raimo Niskanen Date: Thu, 16 Jun 2016 14:03:58 +0200 Subject: Update test cases after daily builds --- lib/kernel/test/gen_udp_SUITE.erl | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'lib/kernel/test/gen_udp_SUITE.erl') diff --git a/lib/kernel/test/gen_udp_SUITE.erl b/lib/kernel/test/gen_udp_SUITE.erl index 9554920d07..ca629f7344 100644 --- a/lib/kernel/test/gen_udp_SUITE.erl +++ b/lib/kernel/test/gen_udp_SUITE.erl @@ -594,8 +594,7 @@ local_unbound(_Config) -> S = ok(gen_udp:open(0, [{ifaddr,SAddr},{active,false}])), C = ok(gen_udp:open(0, [local,{active,false}])), SAddr = ok(inet:sockname(S)), - {local,<<>>} = ok(inet:sockname(C)), - local_handshake(S, SAddr, C, {unspec,<<>>}), + local_handshake(S, SAddr, C, undefined), ok = gen_udp:close(S), ok = gen_udp:close(C), %% @@ -634,11 +633,9 @@ local_fdopen_unbound(_Config) -> S = ok(gen_udp:open(0, [{ifaddr,SAddr},{active,false}])), C0 = ok(gen_udp:open(0, [local,{active,false}])), SAddr = ok(inet:sockname(S)), - {local,<<>>} = ok(inet:sockname(C0)), Fd = ok(prim_inet:getfd(C0)), C = ok(gen_udp:open(0, [{fd,Fd},local,{active,false}])), - {local,<<>>} = ok(inet:sockname(C)), - local_handshake(S, SAddr, C, {unspec,<<>>}), + local_handshake(S, SAddr, C, undefined), ok = gen_udp:close(S), ok = gen_udp:close(C), ok = gen_udp:close(C0), @@ -666,16 +663,17 @@ local_handshake(S, SAddr, C, CAddr) -> SData = "9876543210", CData = "0123456789", ok = gen_udp:send(C, SAddr, 0, CData), - {CAddr, 0, CData} = ok(gen_tcp:recv(S, 112)), - case CAddr of - {unspec,_} -> + case ok(gen_tcp:recv(S, 112)) of + {{unspec,<<>>}, 0, CData} when CAddr =:= undefined -> ok; - _ -> + {{local,<<>>}, 0, CData} when CAddr =:= undefined -> + ok; + {CAddr, 0, CData} when CAddr =/= undefined -> ok = gen_udp:send(S, CAddr, 0, SData), {SAddr, 0, SData} = ok(gen_tcp:recv(C, 112)), ok - end. + end. %% %% Utils -- cgit v1.2.3