summaryrefslogtreecommitdiff
path: root/lib/erl_interface/test/erl_call_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/erl_interface/test/erl_call_SUITE.erl')
-rw-r--r--lib/erl_interface/test/erl_call_SUITE.erl117
1 files changed, 114 insertions, 3 deletions
diff --git a/lib/erl_interface/test/erl_call_SUITE.erl b/lib/erl_interface/test/erl_call_SUITE.erl
index 9cfc2ac25c..8f1d0c9f90 100644
--- a/lib/erl_interface/test/erl_call_SUITE.erl
+++ b/lib/erl_interface/test/erl_call_SUITE.erl
@@ -27,14 +27,16 @@
random_cnode_name/1,
test_connect_to_host_port/1,
unresolvable_hostname/1,
- timeout/1]).
+ timeout/1,
+ test_fetch_stdout/1]).
all() ->
[smoke,
random_cnode_name,
test_connect_to_host_port,
unresolvable_hostname,
- timeout].
+ timeout,
+ test_fetch_stdout].
smoke(Config) when is_list(Config) ->
Name = atom_to_list(?MODULE)
@@ -129,6 +131,113 @@ test_connect_to_host_port_do(Name) ->
end,
ok.
+test_fetch_stdout(Config) when is_list(Config) ->
+ Name = atom_to_list(?MODULE)
+ ++ "-"
+ ++ "fetch_stdout"
+ ++ "-"
+ ++ integer_to_list(erlang:system_time(microsecond)),
+ try
+ test_fetch_stdout_do(Name)
+ after
+ halt_node(Name)
+ end,
+ ok.
+
+
+test_fetch_stdout_do(Name) ->
+ Port = start_node_and_get_port(Name),
+ %% Test that the -fetch_stdout option works
+ "hejok" = get_erl_call_result(["-address",
+ erlang:integer_to_list(Port),
+ "-a",
+ "io format [[104,101,106]]",
+ "-fetch_stdout"]),
+ %% Test that the -fetch_stdout option works together with
+ %% -no_result_term
+ "hej" = get_erl_call_result(["-address",
+ erlang:integer_to_list(Port),
+ "-a",
+ "io format [[104,101,106]]",
+ "-fetch_stdout",
+ "-no_result_term"]),
+ %% Test that we can print several times
+ MultiPrintCodeStr =
+ "io:format(\"hej\"),io:format(\"hej\"),io:format(\"hej\").\n",
+ "hejhejhej" = get_erl_call_result(["-address",
+ erlang:integer_to_list(Port),
+ "-a",
+ erlang_eval_call_string(MultiPrintCodeStr),
+ "-fetch_stdout",
+ "-no_result_term"]),
+ %% Test that we can print from a sub-process
+ SubProcPrintStr =
+ "begin\n"
+ " P = self(),\n"
+ " Printer = fun() ->\n"
+ " io:format(\"subhej\"),\n"
+ " receive\n"
+ " hej -> P ! hej\n"
+ " end\n"
+ " end,\n"
+ " PrinterPid = spawn(Printer),\n"
+ " PrinterPid ! hej,\n"
+ " receive\n"
+ " hej -> ok\n"
+ " end\n"
+ "end.\n",
+ "subhej" = get_erl_call_result(["-address",
+ erlang:integer_to_list(Port),
+ "-a",
+ erlang_eval_call_string(SubProcPrintStr),
+ "-fetch_stdout",
+ "-no_result_term"]),
+ %% Test that the remote group leader supports the multi-requests
+ %% request
+ TriggerMultiRequestsRequestStr =
+ "begin\n"
+ " %% Create multi request\n"
+ " MultiReqCollectGL =\n"
+ " spawn(\n"
+ " fun() ->\n"
+ " (fun GL(ReqList) ->\n"
+ " receive\n"
+ " {io_request, From, ReplyAs, Req} ->\n"
+ " From ! {io_reply, ReplyAs, ok},\n"
+ " GL([Req | ReqList]);\n"
+ " {get_reqs, Pid} ->\n"
+ " Pid ! {multi_req,\n"
+ " {requests, lists:reverse(ReqList)}}\n"
+ " end\n"
+ " end)([])\n"
+ " end),\n"
+ " OldGL = erlang:group_leader(),\n"
+ " erlang:group_leader(MultiReqCollectGL, self()),\n"
+ " io:format(\"test1\"),\n"
+ " io:format(\"test2\"),\n"
+ " io:format(\"test3\"),\n"
+ " MultiReqCollectGL ! {get_reqs, self()},\n"
+ " MultiReqsRequest =\n"
+ " receive\n"
+ " {multi_req, R} -> R\n"
+ " end,\n"
+ " erlang:group_leader(OldGL, self()),\n"
+ " %% Send multi request\n"
+ " erlang:group_leader() ! {io_request,self(), self(), MultiReqsRequest},\n"
+ " Me = self(),\n"
+ " receive {io_reply, Me, ok} -> ok end,\n"
+ " %% Send normal request\n"
+ " io:format(\"test4\")\n"
+ "end.\n",
+ "test1test2test3test4" =
+ get_erl_call_result(["-address",
+ erlang:integer_to_list(Port),
+ "-a",
+ erlang_eval_call_string(TriggerMultiRequestsRequestStr),
+ "-fetch_stdout",
+ "-no_result_term"]),
+ ok.
+
%% OTP-16604: Tests that erl_call works even when the local hostname cannot be
%% resolved.
unresolvable_hostname(_Config) ->
@@ -261,4 +370,6 @@ get_port_res(Port, Acc) when is_port(Port) ->
{Port, eof} ->
lists:flatten(Acc)
end.
-
+
+erlang_eval_call_string(CodeStr) ->
+ lists:flatten(io_lib:format("erl_eval eval_str [~w]",[CodeStr])).