%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2004-2013. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%
%%----------------------------------------------------------------------
%% Purpose: Various (snmp manager) user related tests
%%----------------------------------------------------------------------
-module(snmp_manager_user_test).
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
-include_lib("common_test/include/ct.hrl").
-include("snmp_test_lib.hrl").
%%----------------------------------------------------------------------
%% External exports
%%----------------------------------------------------------------------
%% -compile(export_all).
-export([
all/0,groups/0,init_per_group/2,end_per_group/2,
init_per_testcase/2, end_per_testcase/2,
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,
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].
end_per_testcase(Case, Config) when is_list(Config) ->
p("end_per_testcase -> Case: ~p", [Case]),
% MgrTopDir = ?config(manager_dir, Config),
% ?DEL_DIR(MgrTopDir),
Config.
%%======================================================================
%% Test case definitions
%%======================================================================
all() ->
[{group, register_user}, {group, tickets}].
groups() ->
[{register_user, [],
[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, [], [otp7902]}].
init_per_group(_GroupName, Config) ->
Config.
end_per_group(_GroupName, Config) ->
Config.
%%======================================================================
%% 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) ->
process_flag(trap_exit, true),
put(tname,rlac3),
%% <CONDITIONAL-SKIP>
%% The point of this is to catch machines running
%% SLES9 (2.6.5)
LinuxVersionVerify =
fun() ->
case os:cmd("uname -m") of
"i686" ++ _ ->
%% io:format("found an i686 machine, "
%% "now check version~n", []),
case os:version() of
{2, 6, Rev} when Rev >= 16 ->
true;
{2, Min, _} when Min > 6 ->
true;
{Maj, _, _} when Maj > 2 ->
true;
_ ->
false
end;
_ ->
true
end
end,
Skippable = [{unix, [{linux, LinuxVersionVerify}]}],
Condition = fun() -> ?OS_BASED_SKIP(Skippable) end,
?NON_PC_TC_MAYBE_SKIP(Conf, Condition),
%% </CONDITIONAL-SKIP>
p("start"),
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]).