aboutsummaryrefslogtreecommitdiffstats
path: root/lib/kernel/test/error_logger_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kernel/test/error_logger_SUITE.erl')
-rw-r--r--lib/kernel/test/error_logger_SUITE.erl233
1 files changed, 141 insertions, 92 deletions
diff --git a/lib/kernel/test/error_logger_SUITE.erl b/lib/kernel/test/error_logger_SUITE.erl
index f1988b68d9..eab72e58a7 100644
--- a/lib/kernel/test/error_logger_SUITE.erl
+++ b/lib/kernel/test/error_logger_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2011. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2018. 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.
@@ -19,7 +19,7 @@
%%
-module(error_logger_SUITE).
--include_lib("test_server/include/test_server.hrl").
+-include_lib("common_test/include/ct.hrl").
%%-----------------------------------------------------------------
%% We don't have to test the normal behaviour here, i.e. the tty
@@ -30,8 +30,10 @@
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2,
+ off_heap/1,
error_report/1, info_report/1, error/1, info/1,
- emulator/1, tty/1, logfile/1, add/1, delete/1]).
+ emulator/1, via_logger_process/1, other_node/1,
+ tty/1, logfile/1, add/1, delete/1, format_depth/1]).
-export([generate_error/2]).
@@ -40,19 +42,25 @@
terminate/2]).
-suite() -> [{ct_hooks,[ts_install_cth]}].
+suite() ->
+ [{ct_hooks,[ts_install_cth]},
+ {timetrap,{minutes,1}}].
all() ->
- [error_report, info_report, error, info, emulator, tty,
- logfile, add, delete].
+ [off_heap, error_report, info_report, error, info, emulator,
+ via_logger_process, other_node, tty, logfile, add, delete,
+ format_depth].
groups() ->
[].
init_per_suite(Config) ->
+ logger:add_handler(error_logger,error_logger,
+ #{level=>info,filter_default=>log}),
Config.
end_per_suite(_Config) ->
+ logger:remove_handler(error_logger),
ok.
init_per_group(_GroupName, Config) ->
@@ -64,215 +72,256 @@ end_per_group(_GroupName, Config) ->
%%-----------------------------------------------------------------
-error_report(suite) -> [];
-error_report(doc) -> [];
+off_heap(_Config) ->
+ %% The error_logger process may receive a huge amount of
+ %% messages. Make sure that they are stored off heap to
+ %% avoid exessive GCs.
+ MQD = message_queue_data,
+ {MQD,off_heap} = process_info(whereis(error_logger), MQD),
+ ok.
+
+%%-----------------------------------------------------------------
+
error_report(Config) when is_list(Config) ->
- ?line error_logger:add_report_handler(?MODULE, self()),
+ error_logger:add_report_handler(?MODULE, self()),
Rep1 = [{tag1,"data1"},{tag2,data2},{tag3,3}],
Rep2 = [testing,"testing",{tag1,"tag1"}],
Rep3 = "This is a string !",
Rep4 = {this,is,a,tuple},
- ?line ok = error_logger:error_report(Rep1),
+ ok = error_logger:error_report(Rep1),
reported(error_report, std_error, Rep1),
- ?line ok = error_logger:error_report(Rep2),
+ ok = error_logger:error_report(Rep2),
reported(error_report, std_error, Rep2),
- ?line ok = error_logger:error_report(Rep3),
+ ok = error_logger:error_report(Rep3),
reported(error_report, std_error, Rep3),
- ?line ok = error_logger:error_report(Rep4),
+ ok = error_logger:error_report(Rep4),
reported(error_report, std_error, Rep4),
- ?line ok = error_logger:error_report(test_type, Rep1),
+ ok = error_logger:error_report(test_type, Rep1),
reported(error_report, test_type, Rep1),
- ?line ok = error_logger:error_report(test_type, Rep2),
+ ok = error_logger:error_report(test_type, Rep2),
reported(error_report, test_type, Rep2),
- ?line ok = error_logger:error_report(test_type, Rep3),
+ ok = error_logger:error_report(test_type, Rep3),
reported(error_report, test_type, Rep3),
- ?line ok = error_logger:error_report(test_type, Rep4),
+ ok = error_logger:error_report(test_type, Rep4),
reported(error_report, test_type, Rep4),
- ?line ok = error_logger:error_report("test_type", Rep1),
+ ok = error_logger:error_report("test_type", Rep1),
reported(error_report, "test_type", Rep1),
- ?line ok = error_logger:error_report({test,type}, Rep2),
+ ok = error_logger:error_report({test,type}, Rep2),
reported(error_report, {test,type}, Rep2),
- ?line ok = error_logger:error_report([test,type], Rep3),
+ ok = error_logger:error_report([test,type], Rep3),
reported(error_report, [test,type], Rep3),
- ?line ok = error_logger:error_report(1, Rep4),
+ ok = error_logger:error_report(1, Rep4),
reported(error_report, 1, Rep4),
- ?line my_yes = error_logger:delete_report_handler(?MODULE),
+ my_yes = error_logger:delete_report_handler(?MODULE),
ok.
%%-----------------------------------------------------------------
-info_report(suite) -> [];
-info_report(doc) -> [];
info_report(Config) when is_list(Config) ->
- ?line error_logger:add_report_handler(?MODULE, self()),
+ error_logger:add_report_handler(?MODULE, self()),
Rep1 = [{tag1,"data1"},{tag2,data2},{tag3,3}],
Rep2 = [testing,"testing",{tag1,"tag1"}],
Rep3 = "This is a string !",
Rep4 = {this,is,a,tuple},
- ?line ok = error_logger:info_report(Rep1),
+ ok = error_logger:info_report(Rep1),
reported(info_report, std_info, Rep1),
- ?line ok = error_logger:info_report(Rep2),
+ ok = error_logger:info_report(Rep2),
reported(info_report, std_info, Rep2),
- ?line ok = error_logger:info_report(Rep3),
+ ok = error_logger:info_report(Rep3),
reported(info_report, std_info, Rep3),
- ?line ok = error_logger:info_report(Rep4),
+ ok = error_logger:info_report(Rep4),
reported(info_report, std_info, Rep4),
- ?line ok = error_logger:info_report(test_type, Rep1),
+ ok = error_logger:info_report(test_type, Rep1),
reported(info_report, test_type, Rep1),
- ?line ok = error_logger:info_report(test_type, Rep2),
+ ok = error_logger:info_report(test_type, Rep2),
reported(info_report, test_type, Rep2),
- ?line ok = error_logger:info_report(test_type, Rep3),
+ ok = error_logger:info_report(test_type, Rep3),
reported(info_report, test_type, Rep3),
- ?line ok = error_logger:info_report(test_type, Rep4),
+ ok = error_logger:info_report(test_type, Rep4),
reported(info_report, test_type, Rep4),
- ?line ok = error_logger:info_report("test_type", Rep1),
+ ok = error_logger:info_report("test_type", Rep1),
reported(info_report, "test_type", Rep1),
- ?line ok = error_logger:info_report({test,type}, Rep2),
+ ok = error_logger:info_report({test,type}, Rep2),
reported(info_report, {test,type}, Rep2),
- ?line ok = error_logger:info_report([test,type], Rep3),
+ ok = error_logger:info_report([test,type], Rep3),
reported(info_report, [test,type], Rep3),
- ?line ok = error_logger:info_report(1, Rep4),
+ ok = error_logger:info_report(1, Rep4),
reported(info_report, 1, Rep4),
- ?line my_yes = error_logger:delete_report_handler(?MODULE),
+ my_yes = error_logger:delete_report_handler(?MODULE),
ok.
%%-----------------------------------------------------------------
-error(suite) -> [];
-error(doc) -> [];
error(Config) when is_list(Config) ->
- ?line error_logger:add_report_handler(?MODULE, self()),
+ error_logger:add_report_handler(?MODULE, self()),
Msg1 = "This is a plain text string~n",
Msg2 = "This is a text with arguments ~p~n",
Arg2 = "This is the argument",
Msg3 = {erroneous,msg},
- ?line ok = error_logger:error_msg(Msg1),
+ ok = error_logger:error_msg(Msg1),
reported(error, Msg1, []),
- ?line ok = error_logger:error_msg(Msg2, Arg2),
+ ok = error_logger:error_msg(Msg2, Arg2),
reported(error, Msg2, Arg2),
- ?line ok = error_logger:error_msg(Msg3),
+ ok = error_logger:error_msg(Msg3),
reported(error, Msg3, []),
- ?line ok = error_logger:error_msg(Msg1, []),
+ ok = error_logger:error_msg(Msg1, []),
reported(error, Msg1, []),
- ?line ok = error_logger:error_msg(Msg2, Arg2),
+ ok = error_logger:error_msg(Msg2, Arg2),
reported(error, Msg2, Arg2),
- ?line ok = error_logger:error_msg(Msg3, []),
+ ok = error_logger:error_msg(Msg3, []),
reported(error, Msg3, []),
- ?line ok = error_logger:format(Msg1, []),
+ ok = error_logger:format(Msg1, []),
reported(error, Msg1, []),
- ?line ok = error_logger:format(Msg2, Arg2),
+ ok = error_logger:format(Msg2, Arg2),
reported(error, Msg2, Arg2),
- ?line ok = error_logger:format(Msg3, []),
+ ok = error_logger:format(Msg3, []),
reported(error, Msg3, []),
- ?line my_yes = error_logger:delete_report_handler(?MODULE),
+ my_yes = error_logger:delete_report_handler(?MODULE),
ok.
%%-----------------------------------------------------------------
-info(suite) -> [];
-info(doc) -> [];
info(Config) when is_list(Config) ->
- ?line error_logger:add_report_handler(?MODULE, self()),
+ error_logger:add_report_handler(?MODULE, self()),
Msg1 = "This is a plain text string~n",
Msg2 = "This is a text with arguments ~p~n",
Arg2 = "This is the argument",
Msg3 = {erroneous,msg},
- ?line ok = error_logger:info_msg(Msg1),
+ ok = error_logger:info_msg(Msg1),
reported(info_msg, Msg1, []),
- ?line ok = error_logger:info_msg(Msg2, Arg2),
+ ok = error_logger:info_msg(Msg2, Arg2),
reported(info_msg, Msg2, Arg2),
- ?line ok = error_logger:info_msg(Msg3),
+ ok = error_logger:info_msg(Msg3),
reported(info_msg, Msg3, []),
- ?line ok = error_logger:info_msg(Msg1, []),
+ ok = error_logger:info_msg(Msg1, []),
reported(info_msg, Msg1, []),
- ?line ok = error_logger:info_msg(Msg2, Arg2),
+ ok = error_logger:info_msg(Msg2, Arg2),
reported(info_msg, Msg2, Arg2),
- ?line ok = error_logger:info_msg(Msg3, []),
+ ok = error_logger:info_msg(Msg3, []),
reported(info_msg, Msg3, []),
- ?line my_yes = error_logger:delete_report_handler(?MODULE),
+ my_yes = error_logger:delete_report_handler(?MODULE),
ok.
%%-----------------------------------------------------------------
-emulator(suite) -> [];
-emulator(doc) -> [];
emulator(Config) when is_list(Config) ->
- ?line error_logger:add_report_handler(?MODULE, self()),
+ error_logger:add_report_handler(?MODULE, self()),
Msg = "Error in process ~p on node ~p with exit value:~n~p~n",
Error = {badmatch,4},
Stack = [{module, function, 2, []}],
Pid = spawn(?MODULE, generate_error, [Error, Stack]),
reported(error, Msg, [Pid, node(), {Error, Stack}]),
- ?line my_yes = error_logger:delete_report_handler(?MODULE),
+ my_yes = error_logger:delete_report_handler(?MODULE),
ok.
generate_error(Error, Stack) ->
erlang:raise(error, Error, Stack).
%%-----------------------------------------------------------------
+
+via_logger_process(Config) ->
+ case os:type() of
+ {win32,_} ->
+ {skip,"Skip on windows - cant change file mode"};
+ _ ->
+ error_logger:add_report_handler(?MODULE, self()),
+ Dir = filename:join(?config(priv_dir,Config),"dummydir"),
+ Msg = "File operation error: eacces. Target: " ++
+ Dir ++ ". Function: list_dir. ",
+ ok = file:make_dir(Dir),
+ ok = file:change_mode(Dir,8#0222),
+ error = erl_prim_loader:list_dir(Dir),
+ ok = file:change_mode(Dir,8#0664),
+ _ = file:del_dir(Dir),
+ reported(error_report, std_error, Msg),
+ my_yes = error_logger:delete_report_handler(?MODULE),
+ ok
+ end.
+
+%%-----------------------------------------------------------------
+
+other_node(_Config) ->
+ error_logger:add_report_handler(?MODULE, self()),
+ {ok,Node} = test_server:start_node(?FUNCTION_NAME,slave,[]),
+ ok = rpc:call(Node,logger,add_handler,[error_logger,error_logger,
+ #{level=>info,filter_default=>log}]),
+ rpc:call(Node,error_logger,error_report,[hi_from_remote]),
+ reported(error_report,std_error,hi_from_remote),
+ test_server:stop_node(Node),
+ ok.
+
+
+%%-----------------------------------------------------------------
%% We don't enables or disables tty error logging here. We do not
%% want to interact with the test run.
%%-----------------------------------------------------------------
-tty(suite) -> [];
-tty(doc) -> [];
tty(Config) when is_list(Config) ->
- ?line {'EXIT', _Reason} = (catch error_logger:tty(dummy)),
+ {'EXIT', _Reason} = (catch error_logger:tty(dummy)),
ok.
%%-----------------------------------------------------------------
%% If where already exists a logfile we skip this test case !!
%%-----------------------------------------------------------------
-logfile(suite) -> [];
-logfile(doc) -> [];
logfile(Config) when is_list(Config) ->
- ?line case error_logger:logfile(filename) of
- {error, no_log_file} -> % Ok, we continues.
- do_logfile();
- _ ->
- ok
- end.
+ case error_logger:logfile(filename) of
+ {error, no_log_file} -> % Ok, we continues.
+ do_logfile();
+ _ ->
+ ok
+ end.
do_logfile() ->
- ?line {error, _} = error_logger:logfile(close),
- ?line {error, _} = error_logger:logfile({open,{error}}),
- ?line ok = error_logger:logfile({open, "dummy_logfile.log"}),
- ?line "dummy_logfile.log" = error_logger:logfile(filename),
- ?line ok = error_logger:logfile(close),
- ?line {'EXIT',_} = (catch error_logger:logfile(dummy)),
+ {error, _} = error_logger:logfile(close),
+ {error, _} = error_logger:logfile({open,{error}}),
+ ok = error_logger:logfile({open, "dummy_logfile.log"}),
+ "dummy_logfile.log" = error_logger:logfile(filename),
+ ok = error_logger:logfile(close),
+ {'EXIT',_} = (catch error_logger:logfile(dummy)),
ok.
%%-----------------------------------------------------------------
-add(suite) -> [];
-add(doc) -> [];
add(Config) when is_list(Config) ->
- ?line {'EXIT',_} = (catch error_logger:add_report_handler("dummy")),
- ?line {'EXIT',_} = error_logger:add_report_handler(non_existing),
- ?line my_error = error_logger:add_report_handler(?MODULE, [error]),
+ {'EXIT',_} = (catch error_logger:add_report_handler("dummy")),
+ {'EXIT',_} = error_logger:add_report_handler(non_existing),
+ my_error = error_logger:add_report_handler(?MODULE, [error]),
ok.
%%-----------------------------------------------------------------
-delete(suite) -> [];
-delete(doc) -> [];
delete(Config) when is_list(Config) ->
- ?line {'EXIT',_} = (catch error_logger:delete_report_handler("dummy")),
- ?line {error,_} = error_logger:delete_report_handler(non_existing),
+ {'EXIT',_} = (catch error_logger:delete_report_handler("dummy")),
+ {error,_} = error_logger:delete_report_handler(non_existing),
+ ok.
+
+%%-----------------------------------------------------------------
+
+format_depth(_Config) ->
+ ok = application:set_env(kernel,error_logger_format_depth,30),
+ 30 = error_logger:get_format_depth(),
+ ok = application:set_env(kernel,error_logger_format_depth,3),
+ 10 = error_logger:get_format_depth(),
+ ok = application:set_env(kernel,error_logger_format_depth,11),
+ 11 = error_logger:get_format_depth(),
+ ok = application:set_env(kernel,error_logger_format_depth,unlimited),
+ unlimited = error_logger:get_format_depth(),
+ ok = application:unset_env(kernel,error_logger_format_depth),
+ unlimited = error_logger:get_format_depth(),
ok.
%%-----------------------------------------------------------------
@@ -284,7 +333,7 @@ reported(Tag, Type, Report) ->
test_server:messages_get(),
ok
after 1000 ->
- test_server:fail(no_report_received)
+ ct:fail({no_report_received,test_server:messages_get()})
end.
%%-----------------------------------------------------------------