snmp_manager_user_test_lib.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 291 行

ERL
291
字号
%% ``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$%%%%----------------------------------------------------------------------%% Purpose: Utility functions for the (snmp manager) user test(s).%%-----------------------------------------------------------------------module(snmp_manager_user_test_lib).-behaviour(snmpm_user).%%----------------------------------------------------------------------%% Include files%%-----------------------------------------------------------------------include("test_server.hrl").-include("snmp_test_lib.hrl").%%----------------------------------------------------------------------%% External exports%%-----------------------------------------------------------------------export([         start_link/0, stop/1,	 simulate_crash/2,	 register/2, register_monitor/2, unregister/1, unregister/2        ]).%%----------------------------------------------------------------------%% Internal exports%%-----------------------------------------------------------------------export([         user/1        ]).-export([handle_error/3,         handle_agent/4,         handle_pdu/5,         handle_trap/4,         handle_inform/4,         handle_report/4]).-record(state, {parent, ids = []}).%%----------------------------------------------------------------------%% The user simulation API%%----------------------------------------------------------------------start_link() ->    S = #state{parent = self()},    proc_lib:start_link(?MODULE, user, [S]).stop(Pid) ->    cast(Pid, stop).simulate_crash(Pid, Reason) ->    call(Pid, {simulate_crash, Reason}).register(Pid, Id) ->    call(Pid, {register, Id}).register_monitor(Pid, Id) ->    call(Pid, {register_monitor, Id}).unregister(Pid) ->    call(Pid, unregister).unregister(Pid, Id) ->    call(Pid, {unregister, Id}).user(#state{parent = Pid} = S) ->    proc_lib:init_ack(Pid, {ok, self()}),    user_loop(S).user_loop(#state{parent = Parent} = S) ->    receive	{stop, Parent} ->	    exit(normal);	{{simulate_crash, Reason}, Parent, Ref} ->	    reply(Parent, ok, Ref),	    exit(Reason);		{{register, Id}, Parent, Ref} ->	    IDs = S#state.ids,	    case lists:member(Id, IDs) of		false ->		    Res = snmpm:register_user(Id, ?MODULE, self()),		    reply(Parent, Res, Ref),		    user_loop(S#state{ids = [Id|IDs]});		true ->		    reply(Parent, {error, already_registered}, Ref),		    user_loop(S)	    end;		{{register_monitor, Id}, Parent, Ref} ->	    IDs = S#state.ids,	    case lists:member(Id, IDs) of		false ->		    Res = snmpm:register_user_monitor(Id, ?MODULE, self()),		    reply(Parent, Res, Ref),		    user_loop(S#state{ids = [Id|IDs]});		true ->		    reply(Parent, {error, already_registered}, Ref),		    user_loop(S)	    end;		{unregister, Parent, Ref} ->	    Res = [snmpm:unregister_user(Id) || Id <- S#state.ids],	    reply(Parent, {ok, Res}, Ref),	    user_loop(S);		{{unregister, Id}, Parent, Ref} ->	    IDs = S#state.ids,	    IDs2 = 		case lists:member(Id, IDs) of		    true ->			Res = snmpm:unregister_user(Id),			reply(Parent, Res, Ref),			lists:delete(Id, IDs);		    false ->			reply(Parent, {error, not_registered}, Ref),			IDs		end,	    user_loop(S#state{ids = IDs2});		%% SNMP manager callback messages (from our callback API):	{handle_error, Pid, ReqId, Reason} ->	    do_handle_error(Pid, ReqId, Reason),	    user_loop(S);	{handle_agent, Pid, Addr, Port, SnmpInfo} ->	    do_handle_agent(Pid, Addr, Port, SnmpInfo),	    user_loop(S);	{handle_pdu, Pid, Addr, Port, ReqId, SnmpResponse} ->	    do_handle_pdu(Pid, Addr, Port, ReqId, SnmpResponse),	    user_loop(S);	{handle_trap, Pid, Addr, Port, SnmpTrap} ->	    do_handle_trap(Pid, Addr, Port, SnmpTrap),	    user_loop(S);	{handle_inform, Pid, Addr, Port, SnmpInform} ->	    do_handle_inform(Pid, Addr, Port, SnmpInform),	    user_loop(S);	{handle_report, Pid, Addr, Port, SnmpReport} ->	    do_handle_report(Pid, Addr, Port, SnmpReport),	    user_loop(S);	Unknown ->	    info("received unknown message: ~n~p", [Unknown]),	    user_loop(S)    end.	    %% -------------do_handle_error(Pid, ReqId, Reason) ->    info("received error callback:"         "~n   ReqId:    ~p"         "~n   Reason:   ~p", [ReqId, Reason]),    Pid ! {ignore, self()},    ok.do_handle_agent(Pid, Addr, Port, SnmpInfo) ->    info("received agent callback:"         "~n   Addr:     ~p"         "~n   Port:     ~p"         "~n   SnmpInfo: ~p", [Addr, Port, SnmpInfo]),    Pid ! {ignore, self()},    ok.do_handle_pdu(Pid, Addr, Port, ReqId, SnmpResponse) ->    info("received pdu callback:"         "~n   Addr:         ~p"         "~n   Port:         ~p"         "~n   ReqId:        ~p"         "~n   SnmpResponse: ~p", [Addr, Port, ReqId, SnmpResponse]),    Pid ! {ignore, self()},    ok.do_handle_trap(Pid, Addr, Port, SnmpTrap) ->    info("received trap callback:"         "~n   Addr:     ~p"         "~n   Port:     ~p"         "~n   SnmpTrap: ~p", [Addr, Port, SnmpTrap]),    Pid ! {ignore, self()},    ok.do_handle_inform(Pid, Addr, Port, SnmpInform) ->    info("received inform callback:"         "~n   Addr:       ~p"         "~n   Port:       ~p"         "~n   SnmpInform: ~p", [Addr, Port, SnmpInform]),    Pid ! {ignore, self()},    ok.do_handle_report(Pid, Addr, Port, SnmpReport) ->    info("received report callback:"         "~n   Addr:       ~p"         "~n   Port:       ~p"         "~n   SnmpReport: ~p", [Addr, Port, SnmpReport]),    Pid ! {ignore, self()},    ok.info(F, A) ->    error_logger:info_msg("USER SIMULATOR " ++ F ++ "~n", A).%% -------------call(UserPid, Req) ->    call(UserPid, Req, 5000).call(UserPid, Req, To) ->    Ref = make_ref(),    UserPid ! {Req, self(), Ref},    receive	{Reply, UserPid, Ref} ->	    Reply    after To ->	    {error, timeout}    end.reply(Pid, Reply, Ref) ->        Pid ! {Reply, self(), Ref}.cast(UserPid, Msg) ->    UserPid ! {Msg, self()},    ok.%%----------------------------------------------------------------------%% User callback functions:%%----------------------------------------------------------------------handle_error(ReqId, Reason, UserPid) ->    UserPid ! {handle_error, self(), ReqId, Reason},    ignore.  handle_agent(Addr, Port, SnmpInfo, UserPid) ->    UserPid ! {handle_agent, self(), Addr, Port, SnmpInfo},    ignore.  handle_pdu(Addr, Port, ReqId, SnmpResponse, UserPid) ->    UserPid ! {handle_pdu, self(), Addr, Port, ReqId, SnmpResponse},    ignore.  handle_trap(Addr, Port, SnmpTrap, UserPid) ->    UserPid ! {handle_trap, self(), Addr, Port, SnmpTrap},    ok.  handle_inform(Addr, Port, SnmpInform, UserPid) ->    UserPid ! {handle_inform, self(), Addr, Port, SnmpInform},    ok.handle_report(Addr, Port, SnmpReport, UserPid) ->    UserPid ! {handle_report, self(), Addr, Port, SnmpReport},    ok.

⌨️ 快捷键说明

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