inviso_tool_suite.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 968 行 · 第 1/3 页
ERL
968 行
% ``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 via the world wide web 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.
%%
%% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
%% AB. All Rights Reserved.''
%%
%% $Id$
%%
%% Description:
%% Test suite for the inviso_tool. It is here assumed that inviso works
%% properly.
%%
%% Authors:
%% Lennart 謍man, lennart.ohman@st.se
%% -----------------------------------------------------------------------------
-module(inviso_tool_SUITE).
-compile(export_all).
-include("test_server.hrl").
-include_lib("kernel/include/file.hrl").
-define(l,?line).
all(suite) ->
[
dist_basic_1,
dist_reconnect,
dist_adopt,
dist_history
].
%% -----------------------------------------------------------------------------
init_per_suite(Config) ->
Config.
%% -----------------------------------------------------------------------------
end_per_suite(_Config) ->
ok.
%% -----------------------------------------------------------------------------
%% For each distributed testcase, we need two other distributed nodes to run the
%% runtime components on. Since they are freshly started every time there is no
%% need to clean them up first.
init_per_testcase(_Case,Config) ->
?l TH=test_server:timetrap(100000),
?l {ok,Node1}=test_server:start_node(inviso1,peer,[]),
?l {ok,Node2}=test_server:start_node(inviso2,peer,[]),
?l SuiteDir=filename:dirname(code:which(?MODULE)),
%% Otherwise peer nodes will not find this module!
?l true=rpc:call(Node1,code,add_patha,[SuiteDir]),
?l true=rpc:call(Node2,code,add_patha,[SuiteDir]),
%% SPECIAL FOR MY PRIVATE TEST ENVIROMENT
% ?l rpc:call(Node1,code,add_patha,["/clearcase/otp/tools/runtime_tools/ebin"]),
% ?l rpc:call(Node1,code,add_patha,["/clearcase/otp/tools/inviso/ebin"]),
% ?l rpc:call(Node2,code,add_patha,["/clearcase/otp/tools/runtime_tools/ebin"]),
% ?l rpc:call(Node2,code,add_patha,["/clearcase/otp/tools/inviso/ebin"]),
% %% SPECIAL FOR MY PRIVATE TEST ENVIROMENT, windows.
% ?l rpc:call(Node1,code,add_patha,["C:/DATA/PROJECTS/inviso_project/runtime_tools/ebin"]),
% ?l rpc:call(Node1,code,add_patha,["C:/DATA/PROJECTS/inviso_project/inviso/ebin"]),
% ?l rpc:call(Node2,code,add_patha,["C:/DATA/PROJECTS/inviso_project/runtime_tools/ebin"]),
% ?l rpc:call(Node2,code,add_patha,["C:/DATA/PROJECTS/inviso_project/inviso/ebin"]),
?l ok=rpc:call(Node1,application,start,[runtime_tools]),
?l ok=rpc:call(Node2,application,start,[runtime_tools]),
?l timer:sleep(100), % Problem with autostarted runtime.
%% The following is a test that the inviso_rt processes which are autostarted
%% are now gone.
?l ok=poll(rpc,call,[Node1,erlang,whereis,[inviso_rt]],undefined,20),
?l ok=poll(rpc,call,[Node2,erlang,whereis,[inviso_rt]],undefined,20),
NewConfig1=insert_remotenode_config(inviso1,Node1,Config),
NewConfig2=insert_remotenode_config(inviso2,Node2,NewConfig1),
insert_timetraphandle_config(TH,NewConfig2).
%% -----------------------------------------------------------------------------
fin_per_testcase(_Case,Config) ->
?l test_server:stop_node(get_remotenode_config(inviso1,Config)),
?l test_server:stop_node(get_remotenode_config(inviso2,Config)),
?l test_server:timetrap_cancel(get_timetraphandle_config(Config)),
?l case whereis(inviso_tool) of % In case inviso_tool did not stop.
Pid when pid(Pid) ->
?l io:format("Had to kill inviso_tool!~n",[]),
?l exit(Pid,kill);
_ ->
true
end,
?l case whereis(inviso_rt) of % In case we ran a runtime here.
Pid2 when pid(Pid2) ->
?l io:format("Had to kill inviso_rt!~n",[]),
?l exit(Pid2,kill);
_ ->
true
end,
?l case whereis(inviso_c) of % In case we ran the controll component here.
Pid3 when pid(Pid3) ->
?l io:format("Had to kill inviso_c!~n",[]),
?l exit(Pid3,kill);
_ ->
true
end,
NewConfig1=remove_remotenode_config(inviso1,Config),
NewConfig2=remove_remotenode_config(inviso2,NewConfig1),
remove_timetraphandle_config(NewConfig2).
%% -----------------------------------------------------------------------------
%% ==============================================================================
%% Testcases.
%% ==============================================================================
%% -----------------------------------------------------------------------------
%% Functional tests:
%% API:
%% start/0 dist_basic_1
%% stop/0 dist_basic_1
%% reconnect_nodes/1 dist_reconnect
%% start_session/0 dist_basic_1
%% reinitiate_session/1 dist_reconnect
%% stop_session/0 dist_basic_1
%% atc/3 dist_basic_1
%% sync_atc/3 dist_basic_1
%% dtc/2 dist_basic_1
%% sync_dtc/2 dist_basic_1
%% inviso/2 dist_basic_1
%% reactivate/1 dist_basic_1
%% get_autostart_data/2 dist_basic_1
%% get_activities/0 dist_basic_1
%% save_history/1 dist_history
%% restore_session/1 dist_history
%% get_node_status/1 dist_basic_1
%% -----------------------------------------------------------------------------
%% Non functional tests:
%% Run the control component on both the dist_history
%% same node as the tool and on a
%% different node.
%% Let a trace case crash in its execution dist_basic_1
%% and check that it does not become
%% part of the history.
%% Check that tracer data becomes what the NOT IMPLEMENTED
%% tdg function generates.
%% Check that all inviso runtime stop_inviso_tool/2
%% components terminate if the tool is
%% killed.
%% Check that activation/deactivation dist_basic_1
%% cancels each other out in the history.
%% Check that regexp expansion is done on dist_reconnect
%% another node if regexp_node is down.
%% Test that tool-commands activating dist_basic_1
%% something done during a reactivation
%% are actually done a bit later at the
%% reactivated node (this since the the
%% command being reactivated at the momen
%% at the reactivating node may not
%% be finished at the time the new tool
%% command is issued).
%% Check that deactivating tracecases are dist_basic_1
%% not redone at a reactivating node.
%% (to prevent it from being redone and
%% then just deactivated).
%% Check that on-going reactivators and NOT IMPLEMENTED
%% tracecases are killed when stop_session.
%% -----------------------------------------------------------------------------
-define(TC_DEF_FILE,filename:join(DataDir,"tracecase_def.txt")).
%% TEST CASE: Basic, distributed, start of inviso_tool with simple tracing.
dist_basic_1(doc) -> ["Simple test"];
dist_basic_1(suite) -> [];
dist_basic_1(Config) when list(Config) ->
RemoteNodes=get_remotenodes_config(Config),
[RegExpNode|_]=RemoteNodes,
CNode=node(),
Nodes=RemoteNodes,
DataDir=?config(data_dir,Config),
PrivDir=?config(priv_dir,Config),
Opts=[{regexp_node,RegExpNode},
{tdg,{?MODULE,tdg,[PrivDir]}},
{tc_def_file,?TC_DEF_FILE},
{initial_tcs,[{tracecase_init,[]}]},
{dir,DataDir}], % This is where we find tracecases.
?l start_inviso_tool(Nodes,CNode,Opts),
%% Now we know that all inviso runtimes are running and are not tracing.
?l {error,no_session}=inviso_tool:inviso(tpl,[lists,module_info,0,[]]),
?l start_inviso_tool_session(CNode,[],1,Nodes),
%% Check that the initial tracecase has been executed at all tracing nodes.
?l lists:foreach(fun(N)->
ok=poll(rpc,
call,
[N,
erlang,
trace_info,
[{lists,module_info,1},traced]],
{traced,local},
20)
end,
Nodes),
%% Start a test process at every node with a runtime component.
?l lists:foreach(fun(N)->spawn(N,?MODULE,test_proc_init,[]) end,Nodes),
%% Find the pids of the test processes.
?l TestProcs=lists:map(fun(N)->rpc:call(N,erlang,whereis,[inviso_tool_test_proc]) end,
Nodes),
?l true=(1=<length(TestProcs)),
%% Activate a trace case.
?l {error,unknown_tracecase}=inviso_tool:atc(nonexistant,id,[]),
?l {error,{missing_variable,'ProcessName'}}=
inviso_tool:atc(tracecase1,id1,[]),
?l ok=inviso_tool:atc(tracecase1,id1,[{'ProcessName',inviso_tool_test_proc}]),
?l {error,activating}=inviso_tool:atc(tracecase1,id1,[{'ProcessName',inviso_tool_test_proc}]),
?l {ok,[{tracecases,[{{tracecase1,id1},activating}]}]}=inviso_tool:get_activities(),
?l timer:sleep(600), % There is a 500 ms delay in the tracecase.
?l {error,already_started}=
inviso_tool:atc(tracecase1,id1,[{'ProcessName',inviso_tool_test_proc}]),
%% Now check that the trace case was executed at Nodes.
?l lists:foreach(fun(P)->
?l ok=poll(rpc,
call,
[node(P),erlang,trace_info,[P,flags]],
{flags,[call]},
10),
?l ok=poll(rpc,
call,
[node(P),erlang,trace_info,[{math,module_info,1},traced]],
{traced,local},
10)
end,
TestProcs),
?l lists:foreach(fun(P) ->
?l ok=poll(rpc,
call,
[node(P),erlang,trace_info,[{math,module_info,0},traced]],
{traced,false},
1)
end,
TestProcs),
%% Test inviso_tool:inviso/2.
?l {ok,NodeResults1}=inviso_tool:inviso(tpl,[math,module_info,0,[]]),
?l true=check_noderesults(Nodes,{ok,[1]},NodeResults1),
?l lists:foreach(fun(P) ->
?l ok=poll(rpc,
call,
[node(P),erlang,trace_info,[{math,module_info,0},traced]],
{traced,local},
10)
end,
TestProcs),
%% Test inviso_tool:sync_atc/3.
?l a_return_value=inviso_tool:sync_atc(tracecase2,id2,[]), % This will take 3000 ms.
?l lists:foreach(fun(P) ->
?l ok=poll(rpc,
call,
[node(P),erlang,trace_info,[{math,pi,0},traced]],
{traced,local},
10)
end,
TestProcs),
%% Test the reactivation mechanism.
?l [ANode|OtherNodes]=Nodes, % Get a node to suspend.
?l {ok,{tracing,running}}=inviso_tool:get_node_status(ANode),
?l {ok,[{ANode,ok}]}=rpc:call(CNode,inviso,suspend,[[ANode],test]),
?l [APid|_]=TestProcs, % The first process is at ANode.
%% Now check that trace flags were removed at ANode. This is actually testing inviso.
?l ok=poll(rpc,call,[node(APid),erlang,trace_info,[APid,flags]],{flags,[]},10),
?l {ok,{tracing,suspended}}=inviso_tool:get_node_status(ANode),
%% Now reactivate it and expect the history to be redone. But it will take
%% 3000 ms since there is a delay in tracecase2. Use that delay to issue a new
%% tool command.
?l ok=inviso_tool:reactivate(ANode),
?l {ok,reactivating}=inviso_tool:get_node_status(ANode),
?l {ok,NodeResults2}=inviso_tool:inviso(tpl,[math,sin,1,[]]),
?l true=check_noderesults(OtherNodes,{ok,[1]},NodeResults2),
%% Verify that the inviso command was not done (yet) at ANode.
?l {traced,false}=rpc:call(ANode,erlang,trace_info,[{math,sin,1},traced]),
?l {ok,[{reactivating_nodes,[ANode]}]}=inviso_tool:get_activities(),
?l timer:sleep(3600),
%% Now the history shall have been redone including the new inviso command.
?l ok=poll(rpc,call,[ANode,erlang,trace_info,[{math,sin,1},traced]],{traced,local},10),
?l {flags,[call]}=rpc:call(ANode,erlang,trace_info,[APid,flags]),
?l {ok,[]}=inviso_tool:get_activities(),
%% Check the get_autostart function. We know that we use the standard options
%% generator and the tracecases activated above.
?l {ok,{AutostartData1,NodeResults3}}=
inviso_tool:get_autostart_data(Nodes,{dependency,infinity}),
?l true=check_noderesults(Nodes,
fun({_N,{ok,{[{dependency,infinity}],TDlist}}}) when list(TDlist)->
case lists:keysearch(trace,1,TDlist) of
{value,_} ->
case lists:keysearch(ti,1,TDlist) of
{value,_} ->
true;
_ ->
false
end;
_ ->
false
end;
(_) ->
false
end,
NodeResults3),
%% Check the tracecase that shall be activated and their order.
?l TraceCaseFileNameInit=filename:join(DataDir,"./tracecase_init.trc"),
?l TraceCaseFileName1=filename:join(DataDir,"./tracecase1_on.trc"),
?l TraceCaseFileName2=filename:join(DataDir,"./tracecase2_on.trc"),
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?