%%-------------------------------------------------------------------- %% %CopyrightBegin% %% %% Copyright Ericsson AB 2012-2018. 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% %% %%---------------------------------------------------------------------- %% File: ct_snmp_SUITE.erl %% %% Description: %% This file contains the test cases for the ct_snmp API. %% %% Test of SNMP support in common_test %%---------------------------------------------------------------------- %%---------------------------------------------------------------------- -module(snmp_SUITE). -include_lib("common_test/include/ct.hrl"). -include_lib("snmp/include/STANDARD-MIB.hrl"). -include_lib("snmp/include/SNMP-USER-BASED-SM-MIB.hrl"). -include_lib("snmp/include/snmp_types.hrl"). -compile(export_all). %% Default timetrap timeout (set in init_per_testcase). -define(default_timeout, ?t:minutes(1)). -define(AGENT_UDP, 4000). suite() -> [ {require, snmp1, snmp1}, {require, snmp_app1, snmp_app1}, {require, snmp2, snmp2}, {require, snmp_app2, snmp_app2}, {require, snmp3, snmp3} ]. all() -> [start_stop, {group,get_set}, {group,register}, {group,override}, set_info]. groups() -> [{get_set,[get_values, get_next_values, set_values, load_mibs]}, {register,[register_users, register_users_fail, register_agents, register_agents_fail, register_usm_users, register_usm_users_fail]}, {override,[override_usm, override_standard, override_context, override_community, override_notify, override_target_addr, override_target_params, override_vacm]}]. init_per_suite(Config) -> Config. end_per_suite(Config) -> Config. init_per_group(get_set, Config) -> ok = ct_snmp:start(Config,snmp1,snmp_app1), Config; init_per_group(register, Config) -> ok = ct_snmp:start(Config,snmp2,snmp_app2), Config; init_per_group(_, Config) -> ok = ct_snmp:start(Config,snmp3,snmp_app2), Config. end_per_group(_Group, Config) -> catch ct_snmp:stop(Config), Config. init_per_testcase(_Case, Config) -> Dog = test_server:timetrap(?default_timeout), [{watchdog, Dog}|Config]. end_per_testcase(Case, Config) -> try apply(?MODULE,Case,[cleanup,Config]) catch error:undef -> ok end, Dog=?config(watchdog, Config), test_server:timetrap_cancel(Dog), ok. %%%----------------------------------------------------------------- %%% Test cases break(_Config) -> test_server:break(""), ok. start_stop(Config) -> ok = ct_snmp:start(Config,snmp1,snmp_app1), ct:sleep(1000), {snmp,_,_} = lists:keyfind(snmp,1,application:which_applications()), [_|_] = filelib:wildcard("*/*.conf",?config(priv_dir,Config)), ok = ct_snmp:stop(Config), ct:sleep(1000), false = lists:keyfind(snmp,1,application:which_applications()), [] = filelib:wildcard("*/*.conf",?config(priv_dir,Config)), ok. get_values(_Config) -> Oids1 = [?sysDescr_instance, ?sysName_instance], {noError,_,V1} = ct_snmp:get_values(agent_name,Oids1,snmp1), [#varbind{oid=?sysDescr_instance,value="Erlang SNMP agent"}, #varbind{oid=?sysName_instance,value="ct_test"}] = V1, ok. get_next_values(_Config) -> Oids2 = [?system], {noError,_,V2} = ct_snmp:get_next_values(agent_name,Oids2,snmp1), [#varbind{oid=?sysDescr_instance,value="Erlang SNMP agent"}] = V2, ok. set_values(Config) -> Oid3 = ?sysName_instance, NewName = "ct_test changed by " ++ atom_to_list(?MODULE), VarsAndVals = [{Oid3,s,NewName}], {noError,_,_} = ct_snmp:set_values(agent_name,VarsAndVals,snmp1,Config), Oids4 = [?sysName_instance], {noError,_,V4} = ct_snmp:get_values(agent_name,Oids4,snmp1), [#varbind{oid=?sysName_instance,value=NewName}] = V4, ok. load_mibs(_Config) -> [{'SNMPv2-MIB',_}=SnmpV2Mib] = snmpa:which_mibs(), Mib = filename:join([code:priv_dir(snmp),"mibs","SNMP-USER-BASED-SM-MIB"]), ok = ct_snmp:load_mibs([Mib]), TwoMibs = [_,_] = snmpa:which_mibs(), [{'SNMP-USER-BASED-SM-MIB',_}] = lists:delete(SnmpV2Mib,TwoMibs), ok = ct_snmp:unload_mibs([Mib]), [{'SNMPv2-MIB',_}] = snmpa:which_mibs(), ok. register_users(_Config) -> [] = snmpm:which_users(), ok = ct_snmp:register_users(snmp2,[{reg_user1,[snmpm_user_default,[]]}]), [_] = snmpm:which_users(), [_] = ct:get_config({snmp2,users}), ok = ct_snmp:register_users(snmp2,[{reg_user2,[snmpm_user_default,[]]}]), [_,_] = snmpm:which_users(), [_,_] = ct:get_config({snmp2,users}), ok = ct_snmp:register_users(snmp2,[{reg_user3,[snmpm_user_default,[]]}]), [_,_,_] = snmpm:which_users(), [_,_,_] = ct:get_config({snmp2,users}), ok = ct_snmp:unregister_users(snmp2,[reg_user3]), [_,_] = snmpm:which_users(), [_,_] = ct:get_config({snmp2,users}), ok = ct_snmp:unregister_users(snmp2), [] = snmpm:which_users(), [] = ct:get_config({snmp2,users}), ok. register_users(cleanup,_Config) -> ct_snmp:unregister_users(snmp2). register_users_fail(_Config) -> [] = snmpm:which_users(), {error,_} = ct_snmp:register_users(snmp2,[{reg_user3,[unknown_module,[]]}]), [] = snmpm:which_users(), ok. register_users_fail(cleanup,_Config) -> ct_snmp:unregister_users(snmp2). register_agents(_Config) -> {ok, HostName} = inet:gethostname(), {ok, Addr} = inet:getaddr(HostName, inet), [] = snmpm:which_agents(), ok = ct_snmp:register_users(snmp2,[{reg_user1,[snmpm_user_default,[]]}]), ok = ct_snmp:register_agents(snmp2,[{reg_agent1, [reg_user1,Addr,?AGENT_UDP,[]]}]), [_] = snmpm:which_agents(), [_] = ct:get_config({snmp2,managed_agents}), ok = ct_snmp:register_agents(snmp2,[{reg_agent2, [reg_user1,Addr,?AGENT_UDP,[]]}]), [_,_] = snmpm:which_agents(), [_,_] = ct:get_config({snmp2,managed_agents}), ok = ct_snmp:register_agents(snmp2,[{reg_agent3, [reg_user1,Addr,?AGENT_UDP,[]]}]), [_,_,_] = snmpm:which_agents(), [_,_,_] = ct:get_config({snmp2,managed_agents}), ok = ct_snmp:unregister_agents(snmp2,[reg_agent3]), [_,_] = snmpm:which_agents(), [_,_] = ct:get_config({snmp2,managed_agents}), ok = ct_snmp:unregister_agents(snmp2), ok = ct_snmp:unregister_users(snmp2), [] = snmpm:which_agents(), [] = ct:get_config({snmp2,managed_agents}), ok. register_agents(cleanup,_Config) -> ct_snmp:unregister_agents(snmp2), ct_snmp:unregister_users(snmp2). register_agents_fail(_Config) -> {ok, HostName} = inet:gethostname(), {ok, Addr} = inet:getaddr(HostName, inet), [] = snmpm:which_agents(), {error,_} = ct_snmp:register_agents(snmp2,[{reg_agent3, [unknown_user,Addr,?AGENT_UDP,[]]}]), [] = snmpm:which_agents(), ok. register_agents_fail(cleanup,_Config) -> ct_snmp:unregister_agents(snmp2). register_usm_users(_Config) -> [] = snmpm:which_usm_users(), ok = ct_snmp:register_usm_users(snmp2,[{"reg_usm_user1",[]}]), [_] = snmpm:which_usm_users(), [_] = ct:get_config({snmp2,usm_users}), ok = ct_snmp:register_usm_users(snmp2,[{"reg_usm_user2",[]}]), [_,_] = snmpm:which_usm_users(), [_,_] = ct:get_config({snmp2,usm_users}), ok = ct_snmp:register_usm_users(snmp2,[{"reg_usm_user3",[]}]), [_,_,_] = snmpm:which_usm_users(), [_,_,_] = ct:get_config({snmp2,usm_users}), ok = ct_snmp:unregister_usm_users(snmp2,["reg_usm_user3"]), [_,_] = snmpm:which_usm_users(), [_,_] = ct:get_config({snmp2,usm_users}), ok = ct_snmp:unregister_usm_users(snmp2), [] = snmpm:which_usm_users(), [] = ct:get_config({snmp2,usm_users}), ok. register_usm_users(cleanup,_Config) -> ct_snmp:unregister_usm_users(snmp2). register_usm_users_fail(_Config) -> [] = snmpm:which_usm_users(), {error,_} = ct_snmp:register_usm_users(snmp2,[{"reg_usm_user3", [{sec_name,invalid_data_type}]}]), [] = snmpm:which_usm_users(), ok. register_usm_users_fail(cleanup,_Config) -> ct_snmp:unregister_usm_users(snmp2). %% Test that functionality for overriding default configuration file %% works - i.e. that the files are written and that the configuration %% is actually used. %% %% Note that the config files used in this test case do not %% necessarily make up a reasonable configuration for the snmp %% application... override_usm(Config) -> DataDir = ?config(data_dir,Config), PrivDir = ?config(priv_dir,Config), ConfDir = filename:join(PrivDir,"conf"), Mib = filename:join([code:priv_dir(snmp),"mibs","SNMP-USER-BASED-SM-MIB"]), ok = ct_snmp:load_mibs([Mib]), %% Check that usm.conf is overwritten {ok,MyUsm} = snmpa_conf:read_usm_config(DataDir), {ok,UsedUsm} = snmpa_conf:read_usm_config(ConfDir), ct:pal( "MyUsm = ~p~nUsedUsm = ~p", [MyUsm, UsedUsm]), true = (MyUsm == UsedUsm), %% Check that the usm user is actually configured... [{Index,"secname"}] = snmp_user_based_sm_mib:usmUserTable(get_next,?usmUserEntry,[3]), true = lists:suffix("usm_user_name",Index), ok. override_standard(Config) -> DataDir = ?config(data_dir,Config), PrivDir = ?config(priv_dir,Config), ConfDir = filename:join(PrivDir,"conf"), %% Check that standard.conf is overwritten {ok,MyStandard} = snmpa_conf:read_standard_config(DataDir), {ok,UsedStandard} = snmpa_conf:read_standard_config(ConfDir), ct:pal( "MyStandard = ~p~nUsedStandard = ~p", [MyStandard, UsedStandard]), true = (MyStandard == UsedStandard), %% Check that the values from standard.conf is actually configured... {value,"name for override test"} = snmp_standard_mib:sysName(get), {value,"agent for ct_snmp override test"} = snmp_standard_mib:sysDescr(get), ok. override_context(Config) -> DataDir = ?config(data_dir,Config), PrivDir = ?config(priv_dir,Config), ConfDir = filename:join(PrivDir,"conf"), %% Check that context.conf is overwritten {ok,MyContext} = snmpa_conf:read_context_config(DataDir), {ok,UsedContext} = snmpa_conf:read_context_config(ConfDir), ct:pal( "MyContext = ~p~nUsedContext = ~p", [MyContext, UsedContext]), true = (MyContext == UsedContext), ok. override_community(Config) -> DataDir = ?config(data_dir,Config), PrivDir = ?config(priv_dir,Config), ConfDir = filename:join(PrivDir,"conf"), %% Check that community.conf is overwritten {ok,MyCommunity} = snmpa_conf:read_community_config(DataDir), {ok,UsedCommunity} = snmpa_conf:read_community_config(ConfDir), ct:pal( "MyCommunity = ~p~nUsedCommunity = ~p", [MyCommunity, UsedCommunity]), true = (MyCommunity == UsedCommunity), ok. override_notify(Config) -> DataDir = ?config(data_dir,Config), PrivDir = ?config(priv_dir,Config), ConfDir = filename:join(PrivDir,"conf"), %% Check that notify.conf is overwritten {ok,MyNotify} = snmpa_conf:read_notify_config(DataDir), {ok,UsedNotify} = snmpa_conf:read_notify_config(ConfDir), ct:pal( "MyNotify = ~p~nUsedNotify = ~p", [MyNotify, UsedNotify]), true = (MyNotify == UsedNotify), ok. override_target_addr(Config) -> DataDir = ?config(data_dir,Config), PrivDir = ?config(priv_dir,Config), ConfDir = filename:join(PrivDir,"conf"), %% Check that target_addr.conf is overwritten {ok,MyTargetAddr} = snmpa_conf:read_target_addr_config(DataDir), {ok,UsedTargetAddr} = snmpa_conf:read_target_addr_config(ConfDir), ct:pal( "MyTargetAddr = ~p~nUsedTargetAddr = ~p", [MyTargetAddr, UsedTargetAddr]), true = (MyTargetAddr == UsedTargetAddr), ok. override_target_params(Config) -> DataDir = ?config(data_dir,Config), PrivDir = ?config(priv_dir,Config), ConfDir = filename:join(PrivDir,"conf"), %% Check that target_params.conf is overwritten {ok,MyTargetParams} = snmpa_conf:read_target_params_config(DataDir), {ok,UsedTargetParams} = snmpa_conf:read_target_params_config(ConfDir), ct:pal( "MyTargetParams = ~p~nUsedTargetParams = ~p", [MyTargetParams, UsedTargetParams]), true = (MyTargetParams == UsedTargetParams), ok. override_vacm(Config) -> DataDir = ?config(data_dir,Config), PrivDir = ?config(priv_dir,Config), ConfDir = filename:join(PrivDir,"conf"), %% Check that vacm.conf is overwritten {ok,MyVacm} = snmpa_conf:read_vacm_config(DataDir), {ok,UsedVacm} = snmpa_conf:read_vacm_config(ConfDir), ct:pal( "MyVacm = ~p~nUsedVacm = ~p", [MyVacm, UsedVacm]), true = (MyVacm == UsedVacm), ok. %% NOTE!! This test must always be executed last in the suite, and %% should match all set requests performed in the suite. I.e. if you %% add a set request, you must add an entry in the return value of %% ct_snmp:set_info/1 below. set_info(Config) -> %% From test case set_values/1: Oid1 = ?sysName_instance, NewValue1 = "ct_test changed by " ++ atom_to_list(?MODULE), %% The test... [{_AgentName,_,[{Oid1,_,NewValue1}]}] = ct_snmp:set_info(Config), ok.