snmp_agent_ms_test.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 2,139 行 · 第 1/5 页

ERL
2,139
字号
%% ``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$%%-module(snmp_agent_test).%% TODO%% * Test fault-tolerance (kill master etc)%%-compile(export_all).-define(application, snmp).-include_lib("kernel/include/file.hrl").-include("test_server.hrl").-include("snmp_test_lib.hrl").-define(SNMP_USE_V3, true).-include_lib("snmp/include/snmp_types.hrl").%% -include_lib("snmp/include/SNMP-COMMUNITY-MIB.hrl").%% -include_lib("snmp/include/SNMP-VIEW-BASED-ACM-MIB.hrl").%% -include_lib("snmp/include/SNMP-USER-BASED-SM-MIB.hrl").-define(klas1, [1,3,6,1,2,1,7]).-define(klas2, [1,3,6,1,2,1,9]).-define(klas3, [1,3,6,1,2,1,8,1]).-define(klas4, [1,3,6,1,2,1,8,4]).-define(sa, [1,3,6,1,4,1,193,2]).-define(system, [1,3,6,1,2,1,1]).-define(snmp, [1,3,6,1,2,1,11]).-define(snmpTraps, [1,3,6,1,6,3,1,1,5]).-define(ericsson, [1,3,6,1,4,1,193]).-define(testTrap, [1,3,6,1,2,1,15,0]).-define(xDescr, [1,3,6,1,2,1,17,1]).-define(xDescr2, [1,3,6,1,2,1,17,2]).-define(active, 1).-define(notInService, 2).-define(notReady, 3).-define(createAndGo, 4).-define(createAndWait, 5).-define(destroy, 6).-define(TRAP_UDP, 5000).-define(tooBigStr, "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").-define(str(X), snmp_pdus:bits_to_str(X)).-define(break(), begin io:format(user, "break at line ~w: pid: ~p\n",				 [?LINE, self()]),		       receive cont -> ok end		 end).-import(snmp_test_mgr, [gn/1, g/1, s/1, gb/3]).-define(v1_2(V1,V2),	       case get(vsn) of		   v1 -> V1;		   _ -> V2	       end).		        -define(v1_2_3(V1,V2,V3),	       case get(vsn) of		   v1 -> V1;		   v2 -> V2;		   _ -> V3	       end).all(suite) -> {req,	       [mnesia, distribution,		{local_slave_nodes, 2}, {time, 360}],	       [{conf, init_all, cases(), finish_all}]}.init_per_testcase(_Case, Config) when list(Config) ->    Dog = ?t:timetrap(?t:minutes(6)),    [{watchdog, Dog}|Config].fin_per_testcase(_Case, Config) when list(Config) ->    Dog = ?config(watchdog, Config),    ?t:timetrap_cancel(Dog),    Config.cases() ->    case ?OSTYPE() of	vxworks ->	    %% No crypto app, so skip v3 testcases 	    [	     app_info, 	     test_v1, test_v2, test_v1_v2, 	     test_multi_threaded,  	     mib_storage, 	     tickets];	_Else ->  	    [	     app_info,  	     test_v1, test_v2, test_v1_v2, test_v3,    	     test_multi_threaded, 	     mib_storage, 	     tickets	    ]    end.%%%-----------------------------------------------------------------%%% The test case structure is as follows:%%%%%% init_all - starts mnesia, %%%      %%%    init_v1 - starts agent%%%       simple%%%       big  - e.g. starts/stops subagent, load/unloads mibs%%%       init_mul%%%          mul_get%%%          mul_set%%%          <etc>%%%       finish_mul%%%       <etc>%%%    finish_v1%%%%%%    init_v2 - starts agent%%%    finish_v2%%%      %%%    init_bilingual - starts agent%%%    finish_bilingual%%%      %%% finish_all%%%%%% There is still one problem with these testsuites.  If one test%%% fails, it may not be possible to run some other cases, as it%%% may have e.g. created some row or loaded some table, that it%%% didn't undo (since it failed).%%%-----------------------------------------------------------------init_all(Config0) when list(Config0) ->    ?LOG("init_all -> entry with"	 "~n   Config0: ~p",[Config0]),    %% --    %% Fix config:    %%     DataDir0     = ?config(data_dir, Config0),    DataDir1     = filename:split(filename:absname(DataDir0)),    [_|DataDir2] = lists:reverse(DataDir1),    DataDir3     = filename:join(lists:reverse(DataDir2) ++ [?snmp_test_data]),    Config1      = lists:keydelete(data_dir, 1, Config0),    Config       = [{data_dir, DataDir3 ++ "/"}|Config1],    %% --     %% Start nodes    %%     ?line {ok, SaNode}  = start_node(snmp_sa),    ?line {ok, MgrNode} = start_node(snmp_mgr),    %% --     %% Create necessary files    %%     Dir = ?config(priv_dir, Config),    ?DBG("init_all -> Dir ~p", [Dir]),    DataDir = ?config(data_dir, Config),    ?DBG("init_all -> DataDir ~p", [DataDir]),    file:make_dir(MgrDir = filename:join(Dir, "mgr_dir/")),    ?DBG("init_all -> MgrDir ~p", [MgrDir]),    file:make_dir(AgentDir = filename:join(Dir, "agent_dir/")),    ?DBG("init_all -> AgentDir ~p", [AgentDir]),    file:make_dir(SaDir = filename:join(Dir, "sa_dir/")),    ?DBG("init_all -> SaDir ~p", [SaDir]),    %% --     %% Start and initiate mnesia    %%     ?DBG("init_all -> load application mnesia", []),    ?line ok = application:load(mnesia),    ?DBG("init_all -> load application mnesia on node ~p", [SaNode]),    ?line ok = rpc:call(SaNode, application, load, [mnesia]),        ?DBG("init_all -> application mnesia: set_env dir",[]),    ?line application_controller:set_env(mnesia, dir, 					 filename:join(Dir, "Mnesia1")),    ?DBG("init_all -> application mnesia: set_env dir on node ~p",[SaNode]),    ?line rpc:call(SaNode, application_controller, set_env,		   [mnesia, dir,  filename:join(Dir, "Mnesia2")]),    ?DBG("init_all -> create mnesia schema",[]),    ?line ok = mnesia:create_schema([SaNode, node()]),        ?DBG("init_all -> start application mnesia",[]),    ?line ok = application:start(mnesia),    ?DBG("init_all -> start application mnesia on ~p",[SaNode]),    ?line ok = rpc:call(SaNode, application, start, [mnesia]),    Ip = ?LOCALHOST(),    [{snmp_sa,   SaNode},      {snmp_mgr,  MgrNode},      {agent_dir, AgentDir ++ "/"},     {mgr_dir,   MgrDir ++ "/"},     {sa_dir,    SaDir ++ "/"},      {mib_dir,   DataDir},      {ip,        Ip} |      Config].finish_all(Config) when list(Config) ->    SaNode = ?config(snmp_sa, Config),    MgrNode = ?config(snmp_mgr, Config),    stop_node(SaNode),    stop_node(MgrNode),    application:stop(mnesia).start_v1_agent(Config) when list(Config) ->    start_agent(Config, [v1]).start_v1_agent(Config,Opts) when list(Config), list(Opts)  ->    start_agent(Config, [v1], Opts).start_v2_agent(Config) when list(Config) ->    start_agent(Config, [v2]).start_v3_agent(Config) when list(Config) ->    start_agent(Config, [v3]).start_bilingual_agent(Config) when list(Config) ->    start_agent(Config, [v1,v2]).start_multi_threaded_agent(Config) when list(Config) ->    start_agent(Config, [v2], [{snmp_multi_threaded, true}]).stop_agent(Config) when list(Config) ->    ?LOG("stop_agent -> entry with"	 "~n   Config: ~p",[Config]),    {Sup, Par} = ?config(snmp_sup, Config),    ?DBG("stop_agent -> attempt to stop (sup) ~p"	"~n   Sup: ~p"	"~n   Par: ~p",	[Sup, 	(catch process_info(Sup)),	(catch process_info(Par))]),    stop_sup(Sup, Par),    {Sup2, Par2} = ?config(snmp_sub, Config),    ?DBG("stop_agent -> attempt to stop (sub) ~p"	"~n   Sup2: ~p"	"~n   Par2: ~p",	[Sup2,	(catch process_info(Sup2)),	(catch process_info(Par2))]),    stop_sup(Sup2, Par2),    ?DBG("stop_agent -> done - now cleanup config", []),    C1 = lists:keydelete(snmp_sup, 1, Config),    lists:keydelete(snmp_sub, 1, C1).stop_sup(Pid, _) when node(Pid) == node() ->    case (catch process_info(Pid)) of	PI when list(PI) ->	    ?LOG("stop_sup -> attempt to stop ~p", [Pid]),	    Ref = erlang:monitor(process, Pid),	    exit(Pid, kill),	    await_stopped(Pid, Ref);	{'EXIT', _Reason} ->	    ?LOG("stop_sup -> ~p not running", [Pid]),	    ok    end;stop_sup(Pid, _) ->    ?LOG("stop_sup -> attempt to stop ~p", [Pid]),    Ref = erlang:monitor(process, Pid),    ?LOG("stop_sup -> Ref: ~p", [Ref]),    %% Pid ! {'EXIT', Parent, shutdown}, % usch    exit(Pid, kill),     await_stopped(Pid, Ref).await_stopped(Pid, Ref) ->    receive        {'DOWN', Ref, process, Pid, _Reason} ->            ?DBG("received down message for ~p", [Pid]),            ok    after 10000 ->	    ?INF("await_stopped -> timeout for ~p",[Pid]),	    erlang:demonitor(Ref),	    ?FAIL({failed_stop,Pid})    end.start_agent(Config, Vsn) ->    start_agent(Config, Vsn, []).start_agent(Config, Vsn, Opts) ->     ?LOG("start_agent -> entry (~p) with"	"~n   Config: ~p"	"~n   Vsn:    ~p"	"~n   Opts:   ~p",[node(), Config, Vsn, Opts]),        ?line AgentDir = ?config(agent_dir, Config),    ?line SaNode   = ?config(snmp_sa,   Config),    snmp_app_env_init(vsn_init(Vsn) ++                       [{audit_trail_log, read_write_log},                       {audit_trail_log_dir, AgentDir},                       {audit_trail_log_size, {10240, 10}},                       {force_config_reload, false},                       {snmp_agent_type, master},                       {snmp_config_dir, AgentDir},                       {snmp_db_dir, AgentDir},                       {snmp_local_db_auto_repair, true},                       {snmp_master_agent_verbosity, trace},                       {snmp_supervisor_verbosity, trace},                       {snmp_mibserver_verbosity, trace},                       {snmp_symbolic_store_verbosity, trace},                       {snmp_note_store_verbosity, trace},                       {snmp_net_if_verbosity, trace}],                      Opts),    process_flag(trap_exit,true),    {ok, AppSup} = snmp_app_sup:start_link(),    unlink(AppSup),    ?DBG("start_agent -> snmp app supervisor: ~p",[AppSup]),    ?DBG("start_agent -> start master agent (old style)",[]),    Sup = case (catch snmpa_app:start(normal)) of              {ok, S} ->                  ?DBG("start_agent -> started, Sup: ~p",[S]),                  S;              Else ->		  ?DBG("start_agent -> unknown result: ~n~p",[Else]),		  %% Get info about the apps we depend on		  MnesiaInfo = mnesia_running(),		  ?FAIL({start_failed,Else,MnesiaInfo})          end,    ?DBG("start_agent -> unlink from supervisor",[]),    ?line unlink(Sup),    ?line SaDir = ?config(sa_dir, Config),    ?DBG("start_agent -> (rpc) start sub on ~p",[SaNode]),    ?line {ok, Sub} = rpc:call(SaNode, ?MODULE, start_sub, [SaDir]),    ?DBG("start_agent -> done",[]),    ?line [{snmp_sup, {Sup, self()}}, {snmp_sub, Sub} | Config].vsn_init(Vsn) ->    vsn_init([v1,v2,v3], Vsn, []).vsn_init([], _Vsn, Acc) ->    Acc;vsn_init([V|Vsns], Vsn, Acc) ->    case lists:member(V, Vsn) of        true ->            vsn_init(Vsns, Vsn, [{V, true}|Acc]);        false ->            vsn_init(Vsns, Vsn, [{V, false}|Acc])    end.snmp_app_env_init(Env0, Opts) ->    ?DBG("snmp_app_env_init -> unload snmp",[]),    ?line application:unload(snmp),    ?DBG("snmp_app_env_init -> load snmp",[]),    ?line application:load(snmp),    ?DBG("snmp_app_env_init -> initiate (snmp) application env",[]),    F1 = fun({Key,Val} = New, Acc0) ->                  ?DBG("snmp_app_env_init -> "                     "updating setting ~p to ~p", [Key, Val]),                 case lists:keyreplace(Key, 1, Acc0, New) of		     Acc0 ->			 [New|Acc0];		     Acc ->			 Acc		 end         end,     Env = lists:foldr(F1, Env0, Opts),    ?DBG("snmp_app_env_init -> Env: ~p",[Env]),    F2 = fun({Key,Val}) ->                 ?DBG("snmp_app_env_init -> setting ~p to ~p",[Key, Val]),                 application_controller:set_env(snmp, Key, Val)         end,    lists:foreach(F2, Env).%% Test if application is runningmnesia_running() -> ?IS_MNESIA_RUNNING().crypto_running() -> ?IS_CRYPTO_RUNNING().start_sub(Dir) ->    ?DBG("start_sub -> entry",[]),    Opts = [{db_dir, Dir},             {supervisor, [{verbosity, trace}]}],    %% BMK BMK %     {ok, P} = snmp_supervisor:start_sub(Dir),    {ok, P} = snmpa_supervisor:start_sub_sup(Opts),    unlink(P),    {ok, {P, self()}}.create_tables(SaNode) ->    ?line {atomic, ok} = mnesia:create_table([{name, friendsTable2},					      {ram_copies, [SaNode]},					      {snmp, [{key, integer}]},					      {attributes, [a1,a2,a3]}]),    ?line {atomic, ok} = mnesia:create_table([{name, kompissTable2},

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?