%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2009-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.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
-module(reltool_wx_SUITE).
-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
init_per_suite/1, end_per_suite/1,
init_per_testcase/2, end_per_testcase/2]).
-export([start_all_windows/1, check_no_win_crash/0, wait_terminate/1]).
-include("reltool_test_lib.hrl").
%% Initialization functions.
init_per_suite(Config) ->
reltool_test_lib:wx_init_per_suite(Config).
end_per_suite(Config) ->
reltool_test_lib:wx_end_per_suite(Config).
init_per_testcase(Func,Config) ->
reltool_test_lib:init_per_testcase(Func,Config).
end_per_testcase(Func,Config) ->
reltool_test_lib:end_per_testcase(Func,Config).
%% SUITE specification
suite() -> [{ct_hooks,[ts_install_cth]}].
all() ->
[start_all_windows].
groups() ->
[].
init_per_group(_GroupName, Config) ->
Config.
end_per_group(_GroupName, Config) ->
Config.
%% The test cases
%% Display all windows and see if something crashes
start_all_windows(TestInfo) when is_atom(TestInfo) ->
reltool_test_lib:tc_info(TestInfo);
start_all_windows(_Config) ->
{ok, SysPid} = ?msym({ok, _}, reltool:start([{trap_exit, false}])),
erlang:monitor(process,SysPid),
{ok, AppPid} = ?msym({ok, _}, reltool_sys_win:open_app(SysPid, stdlib)),
erlang:monitor(process,AppPid),
{ok, ModPid} = ?msym({ok, _}, reltool_app_win:open_mod(AppPid, escript)),
erlang:monitor(process,ModPid),
%% Let all windows get started
timer:sleep(timer:seconds(10)),
%% Test that server pid can be fetched, and that server is alive
{ok, Server} = ?msym({ok,_}, reltool:get_server(SysPid)),
?m(true, erlang:is_process_alive(Server)),
?m({ok,{sys,[]}}, reltool:get_config(Server)),
%% Terminate
check_no_win_crash(),
?m(ok, reltool:stop(SysPid)),
wait_terminate([{sys,SysPid},{app,AppPid},{mod,ModPid}]),
ok.
%%%-----------------------------------------------------------------
%%% Internal functions
check_no_win_crash() ->
receive {'DOWN',_,_,_,_} = Down ->
ct:log("Unexpected termination of window:~n~p",[Down]),
ct:fail("window crashed")
after 0 ->
ok
end.
wait_terminate([]) ->
ok;
wait_terminate([{Win,P}|Rest]) ->
receive
{'DOWN',_,process,P,shutdown} ->
wait_terminate(Rest);
{'DOWN',_,process,P,Reason} ->
ct:log("~p window terminated with unexpected reason:~n~p",
[Win,Reason]),
ct:fail("unexpected exit reason from window")
end.