Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
2082-Add-smoke-test-for-the-erl_uds_dist-exampl...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 2082-Add-smoke-test-for-the-erl_uds_dist-example.patch of Package erlang
From 0a2fac71f3b982868f0cc3ac4369dbd632d0c7b2 Mon Sep 17 00:00:00 2001 From: Rickard Green <rickard@erlang.org> Date: Wed, 3 Jun 2020 18:17:05 +0200 Subject: [PATCH 2/4] Add smoke test for the erl_uds_dist example --- .gitignore | 1 + lib/kernel/test/Makefile | 4 + lib/kernel/test/erl_distribution_SUITE.erl | 181 ++++++++++++++++++++- 3 files changed, 184 insertions(+), 2 deletions(-) diff --git a/lib/kernel/test/Makefile b/lib/kernel/test/Makefile index 6a3696f92e..fdc7476ebc 100644 --- a/lib/kernel/test/Makefile +++ b/lib/kernel/test/Makefile @@ -65,6 +65,7 @@ MODULES= \ erl_distribution_SUITE \ erl_distribution_wb_SUITE \ erl_prim_loader_SUITE \ + erl_uds_dist \ error_handler_SUITE \ error_logger_SUITE \ error_logger_warn_SUITE \ @@ -165,6 +166,9 @@ SOCKET_TARGETS = $(SOCKET_MODULES:%=$(EBIN)/%.$(EMULATOR)) gen_tcp_dist.erl: ../examples/gen_tcp_dist/src/gen_tcp_dist.erl cp $< $@ +erl_uds_dist.erl: ../examples/erl_uds_dist/src/erl_uds_dist.erl + cp $< $@ + make_emakefile: $(ERL_FILES) $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) '*_SUITE_make' \ > $(EMAKEFILE) diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl index cf5b2d537d..da27992a77 100644 --- a/lib/kernel/test/erl_distribution_SUITE.erl +++ b/lib/kernel/test/erl_distribution_SUITE.erl @@ -46,6 +46,7 @@ monitor_nodes_down_up/1, dist_ctrl_proc_smoke/1, dist_ctrl_proc_reject/1, + erl_uds_dist_smoke_test/1, erl_1424/1, net_kernel_start/1]). @@ -63,6 +64,8 @@ -export([pinger/1]). +-export([start_uds_rpc_server/1]). + -define(DUMMY_NODE,dummy@test01). -define(ALT_EPMD_PORT, "12321"). -define(ALT_EPMD_CMD, "epmd -port "++?ALT_EPMD_PORT). @@ -85,6 +88,7 @@ all() -> hidden_node, setopts, table_waste, net_setuptime, inet_dist_options_options, {group, monitor_nodes}, + erl_uds_dist_smoke_test, erl_1424, net_kernel_start]. groups() -> @@ -1706,6 +1710,177 @@ smoke_communicate(Node, OLoopMod, OLoopFun) -> ok. +erl_uds_dist_smoke_test(Config) when is_list(Config) -> + Me = self(), + [Node1, Node2] = lists:map(fun (Name) -> + list_to_atom(atom_to_list(Name) ++ "@localhost") + end, + get_nodenames(2, erl_uds_dist_smoke_test)), + {LPort, Acceptor} = uds_listen(), + start_uds_node(Node1, LPort), + start_uds_node(Node2, LPort), + receive + {uds_nodeup, N1} -> + io:format("~p is up~n", [N1]) + end, + receive + {uds_nodeup, N2} -> + io:format("~p is up~n", [N2]) + end, + + io:format("Testing ping net_adm:ping(~p) on ~p~n", [Node2, Node1]), + Node1 ! {self(), {net_adm, ping, [Node2]}}, + receive + {Node1, PingRes} -> + io:format("~p~n", [PingRes]), + pong = PingRes + end, + + io:format("Testing nodes() on ~p~n", [Node1]), + Node1 ! {self(), {erlang, nodes, []}}, + receive + {Node1, N1List} -> + io:format("~p~n", [N1List]), + [Node2] = N1List + end, + + io:format("Testing nodes() on ~p~n", [Node2]), + Node2 ! {self(), {erlang, nodes, []}}, + receive + {Node2, N2List} -> + io:format("~p~n", [N2List]), + [Node1] = N2List + end, + + io:format("Shutting down~n", []), + + Node1 ! {self(), close}, + Node2 ! {self(), close}, + + receive {Node1, C1} -> ok = C1 end, + receive {Node2, C2} -> ok = C2 end, + + unlink(Acceptor), + exit(Acceptor, kill), + + io:format("ok~n", []), + + ok. + +%% Helpers for testing the erl_uds_dist example + +uds_listen() -> + Me = self(), + {ok, LSock} = gen_tcp:listen(0, [binary, {packet, 4}, {active, false}]), + {ok, LPort} = inet:port(LSock), + {LPort, spawn_link(fun () -> + uds_accept_loop(LSock, Me) + end)}. + +uds_accept_loop(LSock, TestProc) -> + {ok, Sock} = gen_tcp:accept(LSock), + _ = spawn_link(fun () -> + uds_rpc_client_init(Sock, TestProc) + end), + uds_accept_loop(LSock, TestProc). + +uds_rpc(Sock, MFA) -> + ok = gen_tcp:send(Sock, term_to_binary(MFA)), + case gen_tcp:recv(Sock, 0) of + {error, Reason} -> + error({recv_failed, Reason}); + {ok, Packet} -> + binary_to_term(Packet) + end. + +uds_rpc_client_init(Sock, TestProc) -> + case uds_rpc(Sock, {erlang, node, []}) of + nonode@nohost -> + %% Wait for distribution to come up... + receive after 100 -> ok end, + uds_rpc_client_init(Sock, TestProc); + Node when is_atom(Node) -> + register(Node, self()), + TestProc ! {uds_nodeup, Node}, + uds_rpc_client_loop(Sock, Node) + end. + +uds_rpc_client_loop(Sock, Node) -> + receive + {From, close} -> + ok = gen_tcp:send(Sock, term_to_binary(close)), + From ! {Node, gen_tcp:close(Sock)}, + exit(normal); + {From, ApplyData} -> + From ! {Node, uds_rpc(Sock, ApplyData)}, + uds_rpc_client_loop(Sock, Node) + end. + +uds_rpc_server_loop(Sock) -> + case gen_tcp:recv(Sock, 0) of + {error, Reason} -> + error({recv_failed, Reason}); + {ok, Packet} -> + case binary_to_term(Packet) of + {M, F, A} when is_atom(M), is_atom(F), is_list(A) -> + ok = gen_tcp:send(Sock, term_to_binary(apply(M, F, A))); + {F, A} when is_function(F), is_list(A) -> + ok = gen_tcp:send(Sock, term_to_binary(apply(F, A))); + close -> + ok = gen_tcp:close(Sock), + exit(normal); + Other -> + error({unexpected_data, Other}) + end + end, + uds_rpc_server_loop(Sock). + +start_uds_rpc_server([PortString]) -> + Port = list_to_integer(PortString), + {Pid, Mon} = spawn_monitor(fun () -> + {ok, Sock} = gen_tcp:connect({127,0,0,1}, Port, + [binary, {packet, 4}, + {active, false}]), + uds_rpc_server_loop(Sock) + end), + receive + {'DOWN', Mon, process, Pid, Reason} -> + if Reason == normal -> + halt(); + true -> + EStr = lists:flatten(io_lib:format("uds rpc server crashed: ~p", [Reason])), + (catch file:write_file("uds_rpc_server_crash."++os:getpid(), EStr)), + halt(EStr) + end + end. + +start_uds_node(NodeName, LPort) -> + Static = "-detached -noinput -proto_dist erl_uds", + Pa = filename:dirname(code:which(?MODULE)), + Prog = case catch init:get_argument(progname) of + {ok,[[P]]} -> P; + _ -> error(no_progname_argument_found) + end, + {ok, Pwd} = file:get_cwd(), + NameStr = atom_to_list(NodeName), + CmdLine = Prog ++ " " + ++ Static + ++ " -sname " ++ NameStr + ++ " -pa " ++ Pa + ++ " -env ERL_CRASH_DUMP " ++ Pwd ++ "/erl_crash_dump." ++ NameStr + ++ " -setcookie " ++ atom_to_list(erlang:get_cookie()) + ++ " -run " ++ atom_to_list(?MODULE) ++ " start_uds_rpc_server " + ++ integer_to_list(LPort), + io:format("Starting: ~p~n", [CmdLine]), + case open_port({spawn, CmdLine}, []) of + Port when is_port(Port) -> + unlink(Port), + erlang:port_close(Port); + Error -> + error({open_port_failed, Error}) + end, + ok. + erl_1424(Config) when is_list(Config) -> {error, Reason} = erl_epmd:names("."), {comment, lists:flatten(io_lib:format("Reason: ~p", [Reason]))}. -- 2.26.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor