aboutsummaryrefslogtreecommitdiffstats
path: root/lib/snmp/test/snmp_manager_user_test.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/snmp/test/snmp_manager_user_test.erl')
-rw-r--r--lib/snmp/test/snmp_manager_user_test.erl1244
1 files changed, 1244 insertions, 0 deletions
diff --git a/lib/snmp/test/snmp_manager_user_test.erl b/lib/snmp/test/snmp_manager_user_test.erl
new file mode 100644
index 0000000000..24ed3b0b73
--- /dev/null
+++ b/lib/snmp/test/snmp_manager_user_test.erl
@@ -0,0 +1,1244 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%%
+%% 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 online 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.
+%%
+%% %CopyrightEnd%
+%%
+
+%%----------------------------------------------------------------------
+%% Purpose: Various (snmp manager) user related tests
+%%----------------------------------------------------------------------
+-module(snmp_manager_user_test).
+
+
+%%----------------------------------------------------------------------
+%% Include files
+%%----------------------------------------------------------------------
+-include("test_server.hrl").
+-include("snmp_test_lib.hrl").
+
+
+%%----------------------------------------------------------------------
+%% External exports
+%%----------------------------------------------------------------------
+%% -compile(export_all).
+
+-export([
+ all/1,
+ init_per_testcase/2, fin_per_testcase/2,
+
+ register_user/1,
+ simple_register_and_unregister1/1,
+ simple_register_and_unregister2/1,
+ simple_register_and_unregister3/1,
+ register_and_crash1/1,
+ register_and_crash2/1,
+ register_and_crash3/1,
+ register_request_and_crash1/1,
+ register_request_and_crash2/1,
+ register_request_and_crash3/1,
+ simple_register_monitor_and_unregister1/1,
+ simple_register_monitor_and_unregister2/1,
+ simple_register_monitor_and_unregister3/1,
+ register_monitor_and_crash1/1,
+ register_monitor_and_crash2/1,
+ register_monitor_and_crash3/1,
+ register_monitor_and_crash4/1,
+ register_monitor_and_crash5/1,
+ register_monitor_request_and_crash1/1,
+ register_monitor_request_and_crash2/1,
+ register_monitor_request_and_crash3/1,
+ register_monitor_request_and_crash4/1,
+
+ tickets/1,
+ otp7902/1
+
+ ]).
+
+%%----------------------------------------------------------------------
+%% Internal exports
+%%----------------------------------------------------------------------
+-export([
+ ]).
+
+
+%%----------------------------------------------------------------------
+%% Macros
+%%----------------------------------------------------------------------
+
+
+%%----------------------------------------------------------------------
+%% Records
+%%----------------------------------------------------------------------
+
+
+%%======================================================================
+%% External functions
+%%======================================================================
+
+init_per_testcase(Case, Config) when is_list(Config) ->
+ p("init_per_testcase -> Case: ~p", [Case]),
+ SnmpPrivDir = ?config(priv_dir, Config),
+ p("init_per_testcase -> SnmpPrivDir: ~p", [SnmpPrivDir]),
+ SuiteDir = atom_to_list(?MODULE),
+ SuiteTopDir = filename:join(SnmpPrivDir, SuiteDir),
+ case file:make_dir(SuiteTopDir) of
+ ok ->
+ ok;
+ {error, eexist} ->
+ ok;
+ {error, Reason} ->
+ ?FAIL({failed_creating, SuiteTopDir, Reason})
+ end,
+ p("init_per_testcase -> SuiteTopDir: ~p", [SuiteTopDir]),
+ CaseDir = atom_to_list(Case),
+ ?line ok =
+ file:make_dir(CaseTopDir = filename:join(SuiteTopDir, CaseDir)),
+ p("init_per_testcase -> CaseTopDir: ~p", [CaseTopDir]),
+ ?line ok =
+ file:make_dir(MgrTopDir = filename:join(CaseTopDir, "manager/")),
+ ?line ok =
+ file:make_dir(MgrConfDir = filename:join(MgrTopDir, "conf/")),
+ ?line ok =
+ file:make_dir(MgrDbDir = filename:join(MgrTopDir, "db/")),
+ ?line ok =
+ file:make_dir(MgrLogDir = filename:join(MgrTopDir, "log/")),
+ [{suite_top_dir, SuiteTopDir},
+ {case_top_dir, CaseTopDir},
+ {manager_dir, MgrTopDir},
+ {manager_conf_dir, MgrConfDir},
+ {manager_db_dir, MgrDbDir},
+ {manager_log_dir, MgrLogDir} | Config].
+
+
+fin_per_testcase(Case, Config) when is_list(Config) ->
+ p("fin_per_testcase -> Case: ~p", [Case]),
+% MgrTopDir = ?config(manager_dir, Config),
+% ?DEL_DIR(MgrTopDir),
+ Config.
+
+
+%%======================================================================
+%% Test case definitions
+%%======================================================================
+
+all(suite) ->
+ [
+ register_user,
+ tickets
+ ].
+
+register_user(suite) ->
+ [
+ simple_register_and_unregister1,
+ simple_register_and_unregister2,
+ simple_register_and_unregister3,
+ register_and_crash1,
+ register_and_crash2,
+ register_and_crash3,
+ register_request_and_crash1,
+ register_request_and_crash2,
+ register_request_and_crash3,
+ simple_register_monitor_and_unregister1,
+ simple_register_monitor_and_unregister2,
+ simple_register_monitor_and_unregister3,
+ register_monitor_and_crash1,
+ register_monitor_and_crash2,
+ register_monitor_and_crash3,
+ register_monitor_and_crash4,
+ register_monitor_and_crash5,
+ register_monitor_request_and_crash1,
+ register_monitor_request_and_crash2,
+ register_monitor_request_and_crash3,
+ register_monitor_request_and_crash4
+ ].
+
+
+tickets(suite) ->
+ [
+ otp7902
+ ].
+
+
+%%======================================================================
+%% Test functions
+%%======================================================================
+
+simple_register_and_unregister1(suite) -> [];
+simple_register_and_unregister1(doc) ->
+ "Start a user, register and unregister the user.";
+simple_register_and_unregister1(Conf) when is_list(Conf) ->
+ put(tname,srar1),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("try starting manager"),
+ ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id = make_ref(),
+
+ ?line Pid = start_user(),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = register_user(Pid, Id),
+
+ ?line [Id] = Users2 = which_users(),
+ p("Users2: ~p", [Users2]),
+
+ ?line ok = unregister_user(Pid),
+
+ ?line [] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ ?line stop_user(Pid),
+
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+simple_register_and_unregister2(suite) -> [];
+simple_register_and_unregister2(doc) ->
+ "Start a single user process, "
+ "register 2 users (per that process) and unregister the 2 users.";
+simple_register_and_unregister2(Conf) when is_list(Conf) ->
+ put(tname,srar2),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("try starting manager"),
+ ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id1 = make_ref(),
+ Id2 = make_ref(),
+
+ ?line Pid = start_user(),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = register_user(Pid, Id1),
+ ?line ok = register_user(Pid, Id2),
+
+ ?line Users2 = case which_users() of
+ [Id1, Id2] = U1 ->
+ U1;
+ [Id2, Id1] = U2 ->
+ U2;
+ Else ->
+ ?FAIL({invalid_users, Else})
+ end,
+ p("Users2: ~p", [Users2]),
+
+
+ ?line ok = unregister_user(Pid, Id1),
+ ?line ok = unregister_user(Pid, Id2),
+
+ ?line [] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ ?line stop_user(Pid),
+
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+simple_register_and_unregister3(suite) -> [];
+simple_register_and_unregister3(doc) ->
+ "Start 2 user processes, "
+ "register one users per process and unregister the 2 users.";
+simple_register_and_unregister3(Conf) when is_list(Conf) ->
+ put(tname,srar2),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("try starting manager"),
+ ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id1 = make_ref(),
+ Id2 = make_ref(),
+
+ ?line Pid1 = start_user(),
+ ?line Pid2 = start_user(),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = register_user(Pid1, Id1),
+ ?line ok = register_user(Pid2, Id2),
+
+ ?line Users2 = case which_users() of
+ [Id1, Id2] = U1 ->
+ U1;
+ [Id2, Id1] = U2 ->
+ U2;
+ Else ->
+ ?FAIL({invalid_users, Else})
+ end,
+ p("Users2: ~p", [Users2]),
+
+
+ ?line ok = unregister_user(Pid1, Id1),
+ ?line ok = unregister_user(Pid2, Id2),
+
+ ?line [] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ ?line stop_user(Pid1),
+ ?line stop_user(Pid2),
+
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+register_and_crash1(suite) -> [];
+register_and_crash1(doc) ->
+ "Start a user, register and crash user.";
+register_and_crash1(Conf) when is_list(Conf) ->
+ put(tname,racau1),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("try starting manager"),
+ ?line ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id = make_ref(),
+
+ ?line Pid = start_user(),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = register_user(Pid, Id),
+
+ ?line [Id] = Users2 = which_users(),
+ p("Users2: ~p", [Users2]),
+
+ ?line ok = simulate_crash(Pid),
+
+ ?line [Id] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ p("stop manager"),
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+register_and_crash2(suite) -> [];
+register_and_crash2(doc) ->
+ "Start a single user process, "
+ "register 2 users (per that process) and crash the process.";
+register_and_crash2(Conf) when is_list(Conf) ->
+ put(tname,racau2),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("try starting manager"),
+ ?line ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id1 = make_ref(),
+ Id2 = make_ref(),
+
+ ?line Pid = start_user(),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = register_user(Pid, Id1),
+ ?line ok = register_user(Pid, Id2),
+
+ ?line Users2 = case which_users() of
+ [Id1, Id2] = U1 ->
+ U1;
+ [Id2, Id1] = U2 ->
+ U2;
+ Else1 ->
+ ?FAIL({invalid_users, Else1})
+ end,
+ p("Users2: ~p", [Users2]),
+
+ ?line ok = simulate_crash(Pid),
+
+ ?line Users3 = case which_users() of
+ [Id1, Id2] = U3 ->
+ U3;
+ [Id2, Id1] = U4 ->
+ U4;
+ Else2 ->
+ ?FAIL({invalid_users, Else2})
+ end,
+ p("Users3: ~p", [Users3]),
+
+ p("stop manager"),
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+register_and_crash3(suite) -> [];
+register_and_crash3(doc) ->
+ "Start 2 user processes, "
+ "register one user per process and "
+ "crash the first user process.";
+register_and_crash3(Conf) when is_list(Conf) ->
+ %% put(tname,rac3),
+ %% p("start"),
+ %% process_flag(trap_exit, true),
+ ?SKIP(not_yet_implemented).
+
+
+%% ------------------------------------------------------------------
+
+register_request_and_crash1(suite) -> [];
+register_request_and_crash1(doc) ->
+ "Start a single user process, "
+ "register user, send request and crash user.";
+register_request_and_crash1(Conf) when is_list(Conf) ->
+ %% put(tname,rrac1),
+ %% p("start"),
+ %% process_flag(trap_exit, true),
+ ?SKIP(not_yet_implemented).
+
+
+%% ------------------------------------------------------------------
+
+register_request_and_crash2(suite) -> [];
+register_request_and_crash2(doc) ->
+ "Start a single user process, "
+ "register 2 users (per that single user process), "
+ "send a request for each user and crash the single user process.";
+register_request_and_crash2(Conf) when is_list(Conf) ->
+ %% put(tname,rrac2),
+ %% p("start"),
+ %% process_flag(trap_exit, true),
+ ?SKIP(not_yet_implemented).
+
+
+%% ------------------------------------------------------------------
+
+register_request_and_crash3(suite) -> [];
+register_request_and_crash3(doc) ->
+ "Start 2 user processes, "
+ "register one user per process, "
+ "send a request for each user and crash the first user process.";
+register_request_and_crash3(Conf) when is_list(Conf) ->
+ %% put(tname,rrac3),
+ %% p("start"),
+ %% process_flag(trap_exit, true),
+ ?SKIP(not_yet_implemented).
+
+
+%% ------------------------------------------------------------------
+
+simple_register_monitor_and_unregister1(suite) -> [];
+simple_register_monitor_and_unregister1(doc) ->
+ "Start a user, register-link and unregister the user.";
+simple_register_monitor_and_unregister1(Conf) when is_list(Conf) ->
+ put(tname,srlau1),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("try starting manager"),
+ ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id = make_ref(),
+
+ p("start user"),
+ ?line Pid = start_user(),
+
+ p("get users (=0)"),
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ p("register monitored user"),
+ ?line ok = register_user_monitor(Pid, Id),
+
+ p("get users (=1)"),
+ ?line [Id] = Users2 = which_users(),
+ p("Users2: ~p", [Users2]),
+
+ p("unregister monitored user"),
+ ?line unregister_user(Pid),
+
+ p("get users (=0)"),
+ ?line [] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ p("start user"),
+ ?line stop_user(Pid),
+
+ p("stop manager"),
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+simple_register_monitor_and_unregister2(suite) -> [];
+simple_register_monitor_and_unregister2(doc) ->
+ "Start a single user process, "
+ "register-link 2 users (per that process) and "
+ "unregister the 2 users.";
+simple_register_monitor_and_unregister2(Conf) when is_list(Conf) ->
+ put(tname,srlau2),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("try starting manager"),
+ ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id1 = make_ref(),
+ Id2 = make_ref(),
+
+ ?line Pid = start_user(),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = register_user_monitor(Pid, Id1),
+ ?line ok = register_user_monitor(Pid, Id2),
+
+ ?line Users2 = case which_users() of
+ [Id1, Id2] = U1 ->
+ U1;
+ [Id2, Id1] = U2 ->
+ U2;
+ Else ->
+ ?FAIL({invalid_users, Else})
+ end,
+ p("Users2: ~p", [Users2]),
+
+ ?line ok = unregister_user(Pid, Id1),
+ ?line ok = unregister_user(Pid, Id2),
+
+ ?line [] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ ?line stop_user(Pid),
+
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+simple_register_monitor_and_unregister3(suite) -> [];
+simple_register_monitor_and_unregister3(doc) ->
+ "Start a single user process, "
+ "register one user and register-monitor one user "
+ "(per that process) and "
+ "unregister the 2 users.";
+simple_register_monitor_and_unregister3(Conf) when is_list(Conf) ->
+ put(tname,srlau3),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("try starting manager"),
+ ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id1 = make_ref(),
+ Id2 = make_ref(),
+
+ ?line Pid = start_user(),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = register_user(Pid, Id1),
+ ?line ok = register_user_monitor(Pid, Id2),
+
+ ?line Users2 = case which_users() of
+ [Id1, Id2] = U1 ->
+ U1;
+ [Id2, Id1] = U2 ->
+ U2;
+ Else ->
+ ?FAIL({invalid_users, Else})
+ end,
+ p("Users2: ~p", [Users2]),
+
+ ?line unregister_user(Pid),
+
+ ?line [] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ ?line stop_user(Pid),
+
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+register_monitor_and_crash1(suite) -> [];
+register_monitor_and_crash1(doc) ->
+ "Start a user, register-monitor and crash the user.";
+register_monitor_and_crash1(Conf) when is_list(Conf) ->
+ put(tname,rlac1),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("try starting manager"),
+ ?line ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id = make_ref(),
+
+ ?line Pid = start_user(),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = register_user_monitor(Pid, Id),
+
+ ?line [Id] = Users2 = which_users(),
+ p("Users2: ~p", [Users2]),
+
+ ?line ok = simulate_crash(Pid),
+
+ ?SLEEP(1000),
+
+ ?line [] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ p("stop manager"),
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+register_monitor_and_crash2(suite) -> [];
+register_monitor_and_crash2(doc) ->
+ "Start a single user process, "
+ "register-monitor 2 users (per that process) "
+ "and crash the single user process.";
+register_monitor_and_crash2(Conf) when is_list(Conf) ->
+ put(tname,rlac2),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("try starting manager"),
+ ?line ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id1 = make_ref(),
+ Id2 = make_ref(),
+
+ ?line Pid = start_user(),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = register_user_monitor(Pid, Id1),
+ ?line ok = register_user_monitor(Pid, Id2),
+
+ ?line Users2 = case which_users() of
+ [Id1, Id2] = U1 ->
+ U1;
+ [Id2, Id1] = U2 ->
+ U2;
+ Else ->
+ ?FAIL({invalid_users, Else})
+ end,
+ p("Users2: ~p", [Users2]),
+
+ ?line ok = simulate_crash(Pid),
+
+ ?SLEEP(1000),
+
+ ?line [] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ p("stop manager"),
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+register_monitor_and_crash3(suite) -> [];
+register_monitor_and_crash3(doc) ->
+ "Start a single user process, "
+ "register-monitor one user and register one user, "
+ "crash the single user process.";
+register_monitor_and_crash3(Conf) when is_list(Conf) ->
+ put(tname,rlac3),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("try starting manager"),
+ ?line ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id1 = make_ref(),
+ Id2 = make_ref(),
+
+ ?line Pid = start_user(),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = register_user(Pid, Id1),
+ ?line ok = register_user_monitor(Pid, Id2),
+
+ ?line Users2 = case which_users() of
+ [Id1, Id2] = U1 ->
+ U1;
+ [Id2, Id1] = U2 ->
+ U2;
+ Else ->
+ ?FAIL({invalid_users, Else})
+ end,
+ p("Users2: ~p", [Users2]),
+
+ ?line ok = simulate_crash(Pid),
+
+ ?SLEEP(1000),
+
+ ?line [Id1] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ p("stop manager"),
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+register_monitor_and_crash4(suite) -> [];
+register_monitor_and_crash4(doc) ->
+ "Start 2 user processes, "
+ "register-monitor one user per process "
+ "and crash the first user process.";
+register_monitor_and_crash4(Conf) when is_list(Conf) ->
+ put(tname,rlac4),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("start manager"),
+ ?line ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id1 = make_ref(),
+ Id2 = make_ref(),
+
+ p("start user processes"),
+ ?line Pid1 = start_user(),
+ ?line Pid2 = start_user(),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = register_user_monitor(Pid1, Id1),
+ ?line ok = register_user_monitor(Pid2, Id2),
+
+ ?line Users2 = case which_users() of
+ [Id1, Id2] = U1 ->
+ U1;
+ [Id2, Id1] = U2 ->
+ U2;
+ Else ->
+ ?FAIL({invalid_users, Else})
+ end,
+ p("Users2: ~p", [Users2]),
+
+ ?line ok = simulate_crash(Pid1),
+
+ ?SLEEP(1000),
+
+ ?line [Id2] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ ?line stop_user(Pid2),
+
+ p("stop manager"),
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+register_monitor_and_crash5(suite) -> [];
+register_monitor_and_crash5(doc) ->
+ "OTP-7961: "
+ "Start 2 user processes, "
+ "register-monitor a user for per process, "
+ "let each user register an agent "
+ "and crash the first user process.";
+register_monitor_and_crash5(Conf) when is_list(Conf) ->
+ put(tname,rlac4),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("start manager"),
+ ?line ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ Id1 = gurka, %% make_ref(),
+ Id2 = tomat, %% make_ref(),
+
+ p("start user processes"),
+ ?line Pid1 = start_user(),
+ ?line Pid2 = start_user(),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = register_user_monitor(Pid1, Id1),
+ ?line ok = register_user_monitor(Pid2, Id2),
+
+ LocalHost = snmp_test_lib:localhost(),
+
+ TargetName1 = "kalle1",
+ Address1 = LocalHost,
+ Port1 = 5001,
+ EngineId1 = "agentEngineId-1",
+
+ TargetName2 = "kalle2",
+ Address2 = LocalHost,
+ Port2 = 5002,
+ EngineId2 = "agentEngineId-2",
+
+ ?line ok = register_agent(Pid1,
+ Id1, TargetName1, [{address, Address1},
+ {port, Port1},
+ {engine_id, EngineId1}]),
+ ?line ok = register_agent(Pid2,
+ Id2, TargetName2, [{address, Address2},
+ {port, Port2},
+ {engine_id, EngineId2}]),
+
+ ?line Users2 = case which_users() of
+ [Id1, Id2] = U1 ->
+ U1;
+ [Id2, Id1] = U2 ->
+ U2;
+ U3 ->
+ ?FAIL({invalid_users, U3})
+ end,
+ p("Users2: ~p", [Users2]),
+
+ p("verify all agent(s): expect 2"),
+ ?line Agents1 = case which_agents() of
+ [TargetName1, TargetName2] = A1 ->
+ A1;
+ [TargetName2, TargetName1] = A2 ->
+ A2;
+ A3 ->
+ ?FAIL({invalid_agents, A3})
+ end,
+ p("Agents1: ~p", [Agents1]),
+
+ ?line ok = simulate_crash(Pid1),
+
+ p("wait some time"),
+ ?SLEEP(1000),
+
+ ?line [Id2] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ ?line [TargetName2] = Agents2 = which_agents(),
+ p("Agents2: ~p", [Agents2]),
+
+ ?line stop_user(Pid2),
+
+ p("stop manager"),
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+register_monitor_request_and_crash1(suite) -> [];
+register_monitor_request_and_crash1(doc) ->
+ "Start a single user process, "
+ "register-monitor one user, "
+ "send request and crash the user.";
+register_monitor_request_and_crash1(Conf) when is_list(Conf) ->
+ %% put(tname,rlrac1),
+ %% p("start"),
+ %% process_flag(trap_exit, true),
+ ?SKIP(not_yet_implemented).
+
+
+%% ------------------------------------------------------------------
+
+register_monitor_request_and_crash2(suite) -> [];
+register_monitor_request_and_crash2(doc) ->
+ "Start a single user process, "
+ "register-monitor 2 user (per that one process), "
+ "send a request for each user and crash the single user process.";
+register_monitor_request_and_crash2(Conf) when is_list(Conf) ->
+ %% put(tname,rlrac2),
+ %% p("start"),
+ %% process_flag(trap_exit, true),
+ ?SKIP(not_yet_implemented).
+
+
+%% ------------------------------------------------------------------
+
+register_monitor_request_and_crash3(suite) -> [];
+register_monitor_request_and_crash3(doc) ->
+ "Start a single user process, "
+ "register-monitor one user and register one user, "
+ "send a request for each user and crash the single user process.";
+register_monitor_request_and_crash3(Conf) when is_list(Conf) ->
+ %% put(tname,rlrac3),
+ %% p("start"),
+ %% process_flag(trap_exit, true),
+ ?SKIP(not_yet_implemented).
+
+
+%% ------------------------------------------------------------------
+
+register_monitor_request_and_crash4(suite) -> [];
+register_monitor_request_and_crash4(doc) ->
+ "Start 2 user processes, "
+ "register-monitor one user and register one user on the "
+ "first user process and do the same for the other user process, "
+ "then for each user, send a request and "
+ "crash the first user process.";
+register_monitor_request_and_crash4(Conf) when is_list(Conf) ->
+ %% put(tname,rlrac4),
+ %% p("start"),
+ %% process_flag(trap_exit, true),
+ ?SKIP(not_yet_implemented).
+
+
+
+%% ------------------------------------------------------------------
+
+otp7902(suite) -> [];
+otp7902(doc) ->
+ "OTP-7902 - Start old user and make sure it wors.";
+otp7902(Conf) when is_list(Conf) ->
+ put(tname, otp7902),
+ p("start"),
+ process_flag(trap_exit, true),
+
+ ConfDir = ?config(manager_conf_dir, Conf),
+ DbDir = ?config(manager_db_dir, Conf),
+
+ write_manager_conf(ConfDir),
+
+ Opts = [{server, [{verbosity, trace}]},
+ {net_if, [{verbosity, trace}]},
+ {note_store, [{verbosity, trace}]},
+ {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
+
+ p("try starting manager"),
+ ok = snmpm:start_link(Opts),
+
+ ?SLEEP(1000),
+
+ ?line [] = Users1 = which_users(),
+ p("Users1: ~p", [Users1]),
+
+ ?line ok = snmp_manager_user_old:start(),
+
+ ?line [_] = Users2 = which_users(),
+ p("Users2: ~p", [Users2]),
+
+ ?line ok = snmp_manager_user_old:stop(),
+
+ ?line [] = Users3 = which_users(),
+ p("Users3: ~p", [Users3]),
+
+ ?line ok = snmpm:stop(),
+
+ p("end"),
+ ok.
+
+
+%% ------------------------------------------------------------------
+
+start_user() ->
+ {ok, Pid} = snmp_manager_user_test_lib:start_link(),
+ Pid.
+
+stop_user(Pid) ->
+ snmp_manager_user_test_lib:stop(Pid).
+
+simulate_crash(Pid) ->
+ snmp_manager_user_test_lib:simulate_crash(Pid, simulate_crash),
+ receive
+ {'EXIT', Pid, simulate_crash} ->
+ ok;
+ {'EXIT', Pid, Whatever} ->
+ {ok, Whatever}
+ after 5000 ->
+ {error, timeout}
+ end.
+
+register_user(Pid, Id) ->
+ snmp_manager_user_test_lib:register(Pid, Id).
+
+register_user_monitor(Pid, Id) ->
+ snmp_manager_user_test_lib:register_monitor(Pid, Id).
+
+unregister_user(Pid) ->
+ case snmp_manager_user_test_lib:unregister(Pid) of
+ {ok, Res} ->
+ case [R || R <- Res, R =/= ok] of
+ [] ->
+ ok;
+ Errs ->
+ {error, Errs}
+ end;
+ Error ->
+ Error
+ end.
+
+unregister_user(Pid, Id) ->
+ snmp_manager_user_test_lib:unregister(Pid, Id).
+
+
+register_agent(Pid, Id, TargetName, Config) ->
+ snmp_manager_user_test_lib:register_agent(Pid, Id, TargetName, Config).
+
+
+%% ------
+
+which_users() ->
+ snmpm:which_users().
+
+which_agents() ->
+ snmpm:which_agents().
+
+
+%% ------
+
+
+write_manager_conf(Dir) ->
+ Port = "5000",
+ MMS = "484",
+ EngineID = "\"mgrEngine\"",
+ Str = lists:flatten(
+ io_lib:format("%% Minimum manager config file\n"
+ "{port, ~s}.\n"
+ "{max_message_size, ~s}.\n"
+ "{engine_id, ~s}.\n",
+ [Port, MMS, EngineID])),
+ write_manager_conf(Dir, Str).
+
+write_manager_conf(Dir, Str) ->
+ write_conf_file(Dir, "manager.conf", Str).
+
+
+write_conf_file(Dir, File, Str) ->
+ ?line {ok, Fd} = file:open(filename:join(Dir, File), write),
+ ?line ok = io:format(Fd, "~s", [Str]),
+ file:close(Fd).
+
+
+%% ------
+
+p(F) ->
+ p(F, []).
+
+p(F, A) ->
+ p(get(tname), F, A).
+
+p(TName, F, A) ->
+ io:format("~w -> " ++ F ++ "~n", [TName|A]).
+