%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2003-2016. 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%
%%
-module(snmp_agent_conf_test).
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
%-include_lib("test_server/include/test_server.hrl").
%-include("snmp_test_lib.hrl").
-include_lib("common_test/include/ct.hrl").
-export([
all/0,
groups/0,
init_per_suite/1,
end_per_suite/1,
check_agent/1,
check_usm/1,
check_vacm/1
]).
all() -> [
check_agent,
check_usm,
check_vacm
].
groups() ->
[].
init_per_suite(Config) ->
PrivDir = ?config(priv_dir, Config),
PrivSubdir = filename:join(PrivDir, "snmp_agent_conf_test"),
ok = filelib:ensure_dir(filename:join(PrivSubdir, "dummy")),
[{priv_subdir, PrivSubdir} | Config].
end_per_suite(_Config) ->
ok.
%%======================================================================
%% Test data
%%======================================================================
engine_ids() -> [
"plain eid",
"here\"eid",
"comes\neid",
"trouble\0eid",
binary_to_list(<<"中国引擎标识符"/utf8>>)
].
snmp_admin_strings() -> [
"plain string",
"heres\"eid",
"trouble\neid",
binary_to_list(<<"中国引擎标识符"/utf8>>)
].
%%======================================================================
%% Test functions
%%======================================================================
check_agent(Config) ->
Dir = ?config(priv_subdir, Config),
lists:foreach(
fun(EngineId) -> check_agent_by_engineid(Dir, EngineId) end,
engine_ids()
),
ok.
check_agent_by_engineid(Dir, EngineId) ->
WEntries = [
snmpa_conf:agent_entry(intAgentIpAddress, {0,0,0,0}),
snmpa_conf:agent_entry(intAgentUDPPort, 161),
snmpa_conf:agent_entry(snmpEngineMaxMessageSize, 484),
snmpa_conf:agent_entry(snmpEngineID, EngineId)
],
ok = snmpa_conf:write_agent_config(Dir, WEntries),
{ok, REntries} = snmpa_conf:read_agent_config(Dir),
true = is_subset(WEntries, REntries),
ok.
%%======================================================================
check_usm(Config) ->
Dir = ?config(priv_subdir, Config),
EngineId = hd(engine_ids()),
UserName = hd(snmp_admin_strings()),
SecName = hd(snmp_admin_strings()),
%% vary engine id
lists:foreach(
fun(EngineId_) -> check_usm_by_params(Dir, EngineId_, UserName, SecName) end,
engine_ids()
),
%% vary user name
lists:foreach(
fun(UserName_) -> check_usm_by_params(Dir, EngineId, UserName_, SecName) end,
snmp_admin_strings()
),
%% vary sec name
lists:foreach(
fun(SecName_) -> check_usm_by_params(Dir, EngineId, UserName, SecName_) end,
snmp_admin_strings()
),
ok.
check_usm_by_params(Dir, EngineId, UserName, SecName) ->
WEntries = [
snmpa_conf:usm_entry(
EngineId,
UserName,
SecName,
zeroDotZero,
usmNoAuthProtocol, % authproto
"", "",
usmNoPrivProtocol, % privproto
"", "", "",
[], %AuthKey
[]) %PrivKey
],
ok = snmpa_conf:write_usm_config(Dir, WEntries),
{ok, REntries} = snmpa_conf:read_usm_config(Dir),
true = is_subset(WEntries, REntries),
ok.
%%======================================================================
check_vacm(Config) ->
Dir = ?config(priv_subdir, Config),
%% vary sec name
lists:foreach(
fun(SecName_) -> check_vacm_by_params(Dir, SecName_) end,
snmp_admin_strings()
),
ok.
check_vacm_by_params(Dir, SecName) ->
WEntries = [
%% SecModel, SecName, GroupName
snmpa_conf:vacm_s2g_entry(usm, SecName, SecName),
%% GroupName,Prefix,SecModel,SecLevel,Match,ReadView,WriteView,NotifyView
snmpa_conf:vacm_acc_entry(SecName, "", any, noAuthNoPriv, exact, "all", "all", "all")
],
ok = snmpa_conf:write_vacm_config(Dir, WEntries),
{ok, REntries} = snmpa_conf:read_vacm_config(Dir),
true = is_subset(WEntries, REntries),
ok.
%%======================================================================
%% additional tests needed:
% check_context()
% check_community()
% check_standard()
% check_target_addr()
% check_target_params()
% check_notify()
%%======================================================================
%% Local utility functions
%%======================================================================
is_subset(List1, List2) ->
io:format("Check ~p is subset of ~p\n", [List1, List2]),
sets:is_subset(
sets:from_list(List1),
sets:from_list(List2)
).