%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2006-2011. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%
-module(os_sup_SUITE).
-include_lib("test_server/include/test_server.hrl").
%% Test server specific exports
-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
-export([init_per_suite/1, end_per_suite/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
%% Test cases
-export([message/1]).
-export([config/1, port/1]).
%% Default timetrap timeout (set in init_per_testcase)
-define(default_timeout, ?t:minutes(1)).
-define(TAG, test_tag).
-define(MFA, {?MODULE, test_mfa, [?TAG]}).
-export([test_mfa/2]).
init_per_suite(Config) when is_list(Config) ->
spawn(fun() -> message_receptor() end),
?line application:load(os_mon),
?line ok = application:set_env(os_mon, start_os_sup, true),
?line ok = application:set_env(os_mon, os_sup_mfa, ?MFA),
?line ok = application:set_env(os_mon, os_sup_enable, false),
?line ok = application:start(os_mon),
Config.
end_per_suite(Config) when is_list(Config) ->
?line application:stop(os_mon),
?line ok = application:set_env(os_mon, start_os_sup, false),
MFA = {os_sup, error_report, [std_error]},
?line ok = application:set_env(os_mon, os_sup_mfa, MFA),
?line ok = application:set_env(os_mon, os_sup_enable, true),
?line exit(whereis(message_receptor), done),
Config.
init_per_testcase(_Case, Config) ->
Dog = ?t:timetrap(?default_timeout),
[{watchdog,Dog} | Config].
end_per_testcase(_Case, Config) ->
Dog = ?config(watchdog, Config),
?t:timetrap_cancel(Dog),
ok.
suite() -> [{ct_hooks,[ts_install_cth]}].
all() ->
case test_server:os_type() of
{unix, sunos} -> [message, config, port];
{win32, _OSname} -> [message];
OS ->
Str = io_lib:format("os_sup not available for ~p",
[OS]),
{skip, lists:flatten(Str)}
end.
groups() ->
[].
init_per_group(_GroupName, Config) ->
Config.
end_per_group(_GroupName, Config) ->
Config.
message(suite) ->
[];
message(doc) ->
["Test OS message handling"];
message(Config) when is_list(Config) ->
%% Fake an OS message
Data = "10H11386278426HSystem4HTest5HError5HTesto",
?line os_sup_server ! {faked_port, {data, Data}},
%% Check with message_receptor that it has been received
?t:sleep(?t:seconds(1)),
Msg =
case ?t:os_type() of
{unix, sunos} ->
{?TAG, Data};
{win32, _} ->
{?TAG,{{1138,627842,0},"System","Test","Error","Testo"}}
end,
?line message_receptor ! {check, self(), Msg},
receive
{result, true} ->
ok;
{result, Rec} ->
?t:fail({no_message, Rec})
end,
ok.
config(suite) ->
[];
config(doc) ->
["Test configuration"];
config(Config) when is_list(Config) ->
%% os_sup_enable==true and os_sup_own/os_sup_syslogconf cannot
%% be tested as test_server is not running is root
%% os_sup_mfa is already tested, sort of (in init_per_suite)
%% os_sup_errortag should be tested, however
ok.
port(suite) ->
[];
port(doc) ->
["Test that os_sup handles a terminating port program"];
port(Config) when is_list(Config) ->
?line Str = os:cmd("ps -e | grep '[f]errule'"),
case io_lib:fread("~s", Str) of
{ok, [Pid], _Rest} ->
%% Monitor os_sup_server
?line MonRef = erlang:monitor(process, os_sup_server),
%% Kill the port program
case os:cmd("kill -9 " ++ Pid) of
[] ->
%% os_sup_server should now terminate
receive
{'DOWN', MonRef, _, _, {port_died, _Reason}} ->
ok;
{'DOWN', MonRef, _, _, Reason} ->
?line ?t:fail({unexpected_exit_reason, Reason})
after
3000 ->
?line ?t:fail(still_alive)
end,
%% Give os_mon_sup time to restart os_sup
?t:sleep(?t:seconds(3)),
?line true = is_pid(whereis(os_sup_server)),
ok;
Line ->
erlang:demonitor(MonRef),
{skip, {not_killed, Line}}
end;
_ ->
{skip, {os_pid_not_found}}
end.
%%----------------------------------------------------------------------
%% Auxiliary
%%----------------------------------------------------------------------
test_mfa(Message, Tag) ->
message_receptor ! {Tag, Message}.
message_receptor() ->
register(message_receptor, self()),
message_receptor([]).
message_receptor(Received) ->
receive
%% Check if a certain message has been received
{check, From, Msg} ->
case lists:member(Msg, Received) of
true ->
From ! {result, true},
message_receptor(lists:delete(Msg, Received));
false ->
From ! {result, Received},
message_receptor(Received)
end;
%% Save all other messages
Msg ->
message_receptor([Msg|Received])
end.