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 + -
显示快捷键?