1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 2004-2020. All Rights Reserved.
5%%
6%% Licensed under the Apache License, Version 2.0 (the "License");
7%% you may not use this file except in compliance with the License.
8%% You may obtain a copy of the License at
9%%
10%%     http://www.apache.org/licenses/LICENSE-2.0
11%%
12%% Unless required by applicable law or agreed to in writing, software
13%% distributed under the License is distributed on an "AS IS" BASIS,
14%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15%% See the License for the specific language governing permissions and
16%% limitations under the License.
17%%
18%% %CopyrightEnd%
19%%
20
21%%----------------------------------------------------------------------
22%% Purpose:
23%%
24%% Test:
25%% ts:run().
26%% ts:run(snmp, [batch]).
27%% ts:run(snmp, snmp_manager_config_SUITE, [batch]).
28%%
29%%----------------------------------------------------------------------
30-module(snmp_manager_config_SUITE).
31
32
33%%----------------------------------------------------------------------
34%% Include files
35%%----------------------------------------------------------------------
36-include_lib("common_test/include/ct.hrl").
37-include("snmp_test_lib.hrl").
38-include_lib("snmp/src/manager/snmpm_usm.hrl").
39-include_lib("snmp/src/app/snmp_internal.hrl").
40
41
42%%----------------------------------------------------------------------
43%% External exports
44%%----------------------------------------------------------------------
45%% -compile(export_all).
46
47-export([
48         suite/0, all/0, groups/0,
49	 init_per_suite/1,    end_per_suite/1,
50	 init_per_group/2,    end_per_group/2,
51	 init_per_testcase/2, end_per_testcase/2,
52
53
54	 simple_start_and_stop/1,
55	 start_without_mandatory_opts1/1,
56	 start_without_mandatory_opts2/1,
57	 start_with_all_valid_opts/1,
58	 start_with_unknown_opts/1,
59	 start_with_incorrect_opts/1,
60	 start_with_invalid_manager_conf_file1/1,
61	 start_with_invalid_users_conf_file1/1,
62	 start_with_invalid_agents_conf_file1/1,
63	 start_with_invalid_usm_conf_file1/1,
64         start_with_create_db_and_dir_opt/1,
65
66
67	 simple_system_op/1,
68
69
70	 register_user_using_file/1,
71	 register_user_using_function/1,
72	 register_user_failed_using_function1/1,
73
74
75	 register_agent_using_file/1,
76	 register_agent_using_function/1,
77	 register_agent_failed_using_function1/1,
78
79
80	 register_usm_user_using_file/1,
81	 register_usm_user_using_function/1,
82	 register_usm_user_failed_using_function1/1,
83	 update_usm_user_info/1,
84
85
86	 create_and_increment/1,
87
88
89	 stats_create_and_increment/1,
90
91
92	 otp_7219/1,
93
94	 otp_8395_1/1,
95	 otp_8395_2/1,
96	 otp_8395_3/1,
97	 otp_8395_4/1
98
99	]).
100
101
102%%----------------------------------------------------------------------
103%% Internal exports
104%%----------------------------------------------------------------------
105-export([
106        ]).
107
108
109%%----------------------------------------------------------------------
110%% Macros
111%%----------------------------------------------------------------------
112
113
114%%----------------------------------------------------------------------
115%% Records
116%%----------------------------------------------------------------------
117
118
119%%======================================================================
120%% Common Test interface functions
121%%======================================================================
122
123suite() ->
124    [{ct_hooks, [ts_install_cth]}].
125
126
127all() ->
128    [
129     {group, start_and_stop},
130     {group, normal_op},
131     {group, tickets}
132    ].
133
134groups() ->
135    [
136     {start_and_stop, [], start_and_stop_cases()},
137     {normal_op,      [], normal_op_cases()},
138     {system,         [], system_cases()},
139     {users,          [], users_cases()},
140     {agents,         [], agents_cases()},
141     {usm_users,      [], usm_users_cases()},
142     {counter,        [], counter_cases()},
143     {stats_counter,  [], stats_counter_cases()},
144     {tickets,        [], tickets_cases()},
145     {otp_8395,       [], otp_8395_cases()}
146    ].
147
148start_and_stop_cases() ->
149    [
150     simple_start_and_stop,
151     start_without_mandatory_opts1,
152     start_without_mandatory_opts2,
153     start_with_all_valid_opts,
154     start_with_unknown_opts,
155     start_with_incorrect_opts,
156     start_with_create_db_and_dir_opt,
157     start_with_invalid_manager_conf_file1,
158     start_with_invalid_users_conf_file1,
159     start_with_invalid_agents_conf_file1,
160     start_with_invalid_usm_conf_file1
161    ].
162
163normal_op_cases() ->
164    [
165     {group, system},
166     {group, agents},
167     {group, users},
168     {group, usm_users},
169     {group, counter},
170     {group, stats_counter}
171    ].
172
173system_cases() ->
174    [
175     simple_system_op
176    ].
177
178users_cases() ->
179    [
180     register_user_using_file,
181     register_user_using_function,
182     register_user_failed_using_function1
183    ].
184
185agents_cases() ->
186    [
187     register_agent_using_file,
188     register_agent_using_function,
189     register_agent_failed_using_function1
190    ].
191
192usm_users_cases() ->
193    [
194     register_usm_user_using_file,
195     register_usm_user_using_function,
196     register_usm_user_failed_using_function1,
197     update_usm_user_info
198    ].
199
200counter_cases() ->
201    [
202     create_and_increment
203    ].
204
205stats_counter_cases() ->
206    [
207     stats_create_and_increment
208    ].
209
210tickets_cases() ->
211    [
212     otp_7219,
213     {group, otp_8395}
214    ].
215
216otp_8395_cases() ->
217    [
218     otp_8395_1,
219     otp_8395_2,
220     otp_8395_3,
221     otp_8395_4
222    ].
223
224
225init_per_suite(Config0) when is_list(Config0) ->
226
227    ?IPRINT("init_per_suite -> entry with"
228            "~n      Config0: ~p", [Config0]),
229
230    case ?LIB:init_per_suite(Config0) of
231        {skip, _} = SKIP ->
232            SKIP;
233
234        Config1 ->
235
236            Config2 = snmp_test_lib:init_suite_top_dir(?MODULE, Config1),
237
238            %% We need one on this node also
239            snmp_test_sys_monitor:start(),
240
241            ?IPRINT("init_per_suite -> end when"
242                    "~n   Config: ~p", [Config2]),
243
244            Config2
245    end.
246
247end_per_suite(Config0) when is_list(Config0) ->
248
249    ?IPRINT("end_per_suite -> entry with"
250            "~n   Config0: ~p", [Config0]),
251
252    snmp_test_sys_monitor:stop(),
253    Config1 = ?LIB:end_per_suite(Config0),
254
255    ?IPRINT("end_per_suite -> end"),
256
257    Config1.
258
259
260init_per_group(_GroupName, Config) ->
261    Config.
262
263end_per_group(_GroupName, Config) ->
264    Config.
265
266
267init_per_testcase(Case, Config) when is_list(Config) ->
268    ?IPRINT("init_per_testcase -> entry with"
269            "~n   Config: ~p", [Config]),
270
271    snmp_test_global_sys_monitor:reset_events(),
272
273    SuiteTopDir = ?config(snmp_suite_top_dir, Config),
274    CaseTopDir  = filename:join(SuiteTopDir, atom_to_list(Case)),
275    ?line ok    = file:make_dir(CaseTopDir),
276
277    ?IPRINT("init_per_testcase -> CaseTopDir: ~p", [CaseTopDir]),
278    MgrTopDir   = filename:join(CaseTopDir, "manager/"),
279    ?line ok    = file:make_dir(MgrTopDir),
280    MgrConfDir  = filename:join(MgrTopDir, "conf/"),
281    ?line ok    = file:make_dir(MgrConfDir),
282    MgrDbDir    = filename:join(MgrTopDir, "db/"),
283    case Case of
284	start_with_create_db_and_dir_opt ->
285	    ok;
286	_ ->
287	    ?line ok = file:make_dir(MgrDbDir)
288    end,
289    MgrLogDir   = filename:join(MgrTopDir,   "log/"),
290    ?line ok    = file:make_dir(MgrLogDir),
291    Config1 = [{case_top_dir,     CaseTopDir},
292               {manager_dir,      MgrTopDir},
293               {manager_conf_dir, MgrConfDir},
294               {manager_db_dir,   MgrDbDir},
295               {manager_log_dir,  MgrLogDir} | Config],
296
297    ?IPRINT("init_per_testcase -> done when"
298            "~n   Config1:  ~p", [Config1]),
299
300    Config1.
301
302
303end_per_testcase(_Case, Config) when is_list(Config) ->
304
305    ?IPRINT("end_per_testcase -> entry with"
306            "~n   Config: ~p", [Config]),
307
308    ?IPRINT("system events during test: "
309            "~n   ~p", [snmp_test_global_sys_monitor:events()]),
310
311    %% The cleanup is removed due to some really discusting NFS behaviour...
312    %% Also, it can always be useful to retain "all the stuff" after
313    %% the test case in case of debugging...
314    Config.
315
316
317%%======================================================================
318%% Test functions
319%%======================================================================
320
321%%
322%% ---
323%%
324
325simple_start_and_stop(suite) -> [];
326simple_start_and_stop(doc) ->
327    "Start the snmp manager config process with the \n"
328	"minimum setof options (config dir).";
329simple_start_and_stop(Conf) when is_list(Conf) ->
330    put(tname, "SIME-START_AND_STOP"),
331    ?IPRINT("start"),
332    process_flag(trap_exit, true),
333    ConfDir = ?config(manager_conf_dir, Conf),
334    DbDir = ?config(manager_db_dir, Conf),
335
336    write_manager_conf(ConfDir),
337
338    Opts = [{versions, [v1]},
339	    {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
340
341    ?line {ok, _Pid} = snmpm_config:start_link(Opts),
342    ?line ok = snmpm_config:stop(),
343
344    ok.
345
346
347%%
348%% ---
349%%
350
351start_without_mandatory_opts1(suite) -> [];
352start_without_mandatory_opts1(doc) ->
353    "Start the snmp manager config process with some of the \n"
354	"mandatory options missing.";
355start_without_mandatory_opts1(Conf) when is_list(Conf) ->
356    put(tname, "START-WO-MAND-OPTS-1"),
357    put(verbosity, trace),
358    ?IPRINT("start"),
359    process_flag(trap_exit, true),
360    ConfDir = ?config(manager_conf_dir, Conf),
361    DbDir = ?config(manager_db_dir, Conf),
362
363    write_manager_conf(ConfDir),
364
365
366    %% config, but no dir:
367    ?IPRINT("config option, but no dir"),
368    Opts = [{priority, normal},
369	    {config, [{verbosity, trace}, {db_dir, DbDir}]}, {mibs, []}],
370    ?line {error, {missing_mandatory,dir}} = config_start(Opts),
371
372    ?IPRINT("done"),
373    ok.
374
375
376%%
377%% ---
378%%
379
380start_without_mandatory_opts2(suite) -> [];
381start_without_mandatory_opts2(doc) ->
382    "Start the snmp manager config process with some of the \n"
383	"mandatory options missing.";
384start_without_mandatory_opts2(Conf) when is_list(Conf) ->
385    put(tname, "START-WO-MAND-OPTS-2"),
386    put(verbosity,trace),
387    ?IPRINT("start"),
388    process_flag(trap_exit, true),
389    ConfDir = ?config(manager_conf_dir, Conf),
390
391    write_manager_conf(ConfDir),
392
393
394    %% Second set of options (no config):
395    ?IPRINT("no config option"),
396    Opts = [{priority, normal},
397	    {mibs, []}],
398    ?line {error, {missing_mandatory,config,[dir, db_dir]}} =
399	config_start(Opts),
400
401    ?IPRINT("done"),
402    ok.
403
404
405%%
406%% ---
407%%
408
409start_with_all_valid_opts(suite) -> [];
410start_with_all_valid_opts(doc) ->
411    "Start the snmp manager config process with the \n"
412	"complete set of all the valid options.";
413start_with_all_valid_opts(Conf) when is_list(Conf) ->
414    put(tname, "START-W-ALL-VALID-OPTS"),
415    put(tname,swavo),
416    ?IPRINT("start"),
417    process_flag(trap_exit, true),
418    ConfDir = ?config(manager_conf_dir, Conf),
419    DbDir = ?config(manager_db_dir, Conf),
420    LogDir  = ?config(manager_log_dir, Conf),
421    StdMibDir = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
422
423    write_manager_conf(ConfDir),
424
425
426    %% Third set of options (no versions):
427    ?IPRINT("all options"),
428    NetIfOpts  = [{module,    snmpm_net_if},
429		  {verbosity, trace},
430		  {options,   [{recbuf,   30000},
431			       {bind_to,  false},
432			       {no_reuse, false}]}],
433    ServerOpts = [{timeout,   ?SECS(10)},
434                  {verbosity, trace},
435                  {cbproxy,   permanent},
436                  {netif_sup, {?SECS(60), ?SECS(5)}}],
437    NoteStoreOpts = [{timeout,   ?SECS(20)},
438                     {verbosity, trace}],
439    ConfigOpts = [{dir,           ConfDir},
440                  {verbosity,     trace},
441                  {db_dir,        DbDir},
442                  {db_init_error, create}],
443    Mibs = [join(StdMibDir, "SNMP-NOTIFICATION-MIB"),
444	    join(StdMibDir, "SNMP-USER-BASED-SM-MIB")],
445    Prio = normal,
446    ATL  = [{type,   read_write},
447	    {dir,    LogDir},
448	    {size,   {10,10240}},
449	    {repair, true}],
450    Vsns = [v1,v2,v3],
451    Opts = [{config,          ConfigOpts},
452	    {net_if,          NetIfOpts},
453	    {server,          ServerOpts},
454	    {note_store,      NoteStoreOpts},
455	    {audit_trail_log, ATL},
456	    {priority,        Prio},
457	    {mibs,            Mibs},
458	    {versions,        Vsns}],
459    ?line {ok, _Pid} = config_start(Opts),
460    ?line ok = config_stop(),
461
462    ?IPRINT("done"),
463    ok.
464
465
466%%
467%% ---
468%%
469
470start_with_unknown_opts(suite) -> [];
471start_with_unknown_opts(doc) ->
472    "Start the snmp manager config process when some of\n"
473	"the options are unknown.";
474start_with_unknown_opts(Conf) when is_list(Conf) ->
475    put(tname, "START-W-UNKNOWN-OPTS"),
476    ?IPRINT("start"),
477    process_flag(trap_exit, true),
478    ConfDir = ?config(manager_conf_dir, Conf),
479    DbDir = ?config(manager_db_dir, Conf),
480    LogDir  = ?config(manager_log_dir, Conf),
481    StdMibDir = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
482
483    write_manager_conf(ConfDir),
484
485
486    %% Third set of options (no versions):
487    ?IPRINT("all options"),
488    NetIfOpts  = [{module,    snmpm_net_if},
489		  {verbosity, trace},
490		  {options,   [{recbuf,   30000},
491			       {bind_to,  false},
492			       {no_reuse, false}]}],
493    ServerOpts = [{timeout, 10000}, {verbosity, trace}],
494    NoteStoreOpts = [{timeout, 20000}, {verbosity, trace}],
495    ConfigOpts = [{dir, ConfDir}, {verbosity, trace}, {db_dir, DbDir}],
496    Mibs = [join(StdMibDir, "SNMP-NOTIFICATION-MIB"),
497	    join(StdMibDir, "SNMP-USER-BASED-SM-MIB")],
498    Prio = normal,
499    ATL  = [{type,   read_write},
500	    {dir,    LogDir},
501	    {size,   {10,10240}},
502	    {repair, true}],
503    Vsns = [v1,v2,v3],
504    Opts = [{config,          ConfigOpts},
505	    {net_if,          NetIfOpts},
506	    {server,          ServerOpts},
507	    {note_store,      NoteStoreOpts},
508	    {audit_trail_log, ATL},
509	    {unknown_option,  "dummy value"},
510	    {priority,        Prio},
511	    {mibs,            Mibs},
512	    {versions,        Vsns}],
513    ?line {ok, _Pid} = config_start(Opts),
514
515    ?IPRINT("(config) started - now stop"),
516    ?line ok = config_stop(),
517
518    ?IPRINT("done"),
519    ok.
520
521
522%%
523%% ---
524%%
525
526start_with_incorrect_opts(suite) -> [];
527start_with_incorrect_opts(doc) ->
528    "Start the snmp manager config process when some of\n"
529	"the options has incorrect values.";
530start_with_incorrect_opts(Conf) when is_list(Conf) ->
531    put(tname, "START-W-INCORRECT-OPTS"),
532    ?IPRINT("start"),
533    process_flag(trap_exit, true),
534    ConfDir = ?config(manager_conf_dir, Conf),
535    DbDir = ?config(manager_db_dir, Conf),
536    LogDir  = ?config(manager_log_dir, Conf),
537    StdMibDir = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
538
539    write_manager_conf(ConfDir),
540
541    ConfigOpts = [{verbosity,trace}, {dir, ConfDir}, {db_dir, DbDir}],
542
543    ?IPRINT("net-if - incorrect module"),
544    NetIfOpts1 = [{module, snmpm_user}],  %% Behaviour check will fail
545    Opts01     = [{config, ConfigOpts}, {versions, [v1]},
546		   {net_if, NetIfOpts1}],
547    ?line {error, Reason01} = config_start(Opts01),
548    ?IPRINT("net-if (module) res: ~p", [Reason01]),
549
550    ?IPRINT("net-if - incorrect verbosity"),
551    NetIfOpts2  = [{verbosity, invalid_verbosity}],
552    Opts02      = [{config, ConfigOpts}, {versions, [v1]},
553		   {net_if, NetIfOpts2}],
554    ?line {error, Reason02} = config_start(Opts02),
555    ?IPRINT("net-if (verbosity) res: ~p", [Reason02]),
556
557    ?IPRINT("net-if - incorrect options"),
558    NetIfOpts3 = [{options, invalid_options}],
559    Opts03     = [{config, ConfigOpts}, {versions, [v1]},
560		  {net_if, NetIfOpts3}],
561    ?line {error, Reason03} = config_start(Opts03),
562    ?IPRINT("net-if (options) res: ~p", [Reason03]),
563
564    ?IPRINT("server - incorrect timeout (1)"),
565    ServerOpts1 = [{timeout, invalid_timeout}],
566    Opts08      = [{config, ConfigOpts}, {versions, [v1]},
567		   {server, ServerOpts1}],
568    ?line {error, Reason08} = config_start(Opts08),
569    ?IPRINT("server (timeout) res: ~p", [Reason08]),
570
571    ?IPRINT("server - incorrect timeout (2)"),
572    ServerOpts2 = [{timeout, 0}],
573    Opts09      = [{config, ConfigOpts}, {versions, [v1]},
574		   {server, ServerOpts2}],
575    ?line {error, Reason09} = config_start(Opts09),
576    ?IPRINT("server (timeout) res: ~p", [Reason09]),
577
578    ?IPRINT("server - incorrect timeout (3)"),
579    ServerOpts3 = [{timeout, -1000}],
580    Opts10      = [{config, ConfigOpts},
581		   {versions, [v1]},
582		   {server, ServerOpts3}],
583    ?line {error, Reason10} = config_start(Opts10),
584    ?IPRINT("server (timeout) res: ~p", [Reason10]),
585
586    ?IPRINT("server - incorrect verbosity"),
587    ServerOpts4 = [{verbosity, invalid_verbosity}],
588    Opts11      = [{config, ConfigOpts},
589		   {versions, [v1]},
590		   {server, ServerOpts4}],
591    ?line {error, Reason11} = config_start(Opts11),
592    ?IPRINT("server (verbosity) res: ~p", [Reason11]),
593
594    ?IPRINT("note-store - incorrect timeout (1)"),
595    NoteStoreOpts1 = [{timeout, invalid_timeout}],
596    Opts12         = [{config, ConfigOpts},
597		      {versions, [v1]},
598		      {note_store, NoteStoreOpts1}],
599    ?line {error, Reason12} = config_start(Opts12),
600    ?IPRINT("note-store (timeout) res: ~p", [Reason12]),
601
602    ?IPRINT("note-store - incorrect timeout (2)"),
603    NoteStoreOpts2 = [{timeout, 0}],
604    Opts13         = [{config, ConfigOpts},
605		      {versions, [v1]},
606		      {note_store, NoteStoreOpts2}],
607    ?line {error, Reason13} = config_start(Opts13),
608    ?IPRINT("note-store (timeout) res: ~p", [Reason13]),
609
610    ?IPRINT("note-store - incorrect timeout (3)"),
611    NoteStoreOpts3 = [{timeout, -2000}],
612    Opts14         = [{config, ConfigOpts},
613		      {versions, [v1]},
614		      {note_store, NoteStoreOpts3}],
615    ?line {error, Reason14} = config_start(Opts14),
616    ?IPRINT("note-store (timeout) res: ~p", [Reason14]),
617
618    ?IPRINT("note-store - incorrect verbosity"),
619    NoteStoreOpts4 = [{timeout, 20000}, {verbosity, invalid_verbosity}],
620    Opts15         = [{config, ConfigOpts},
621		      {versions, [v1]},
622		      {note_store, NoteStoreOpts4}],
623    ?line {error, Reason15} = config_start(Opts15),
624    ?IPRINT("note-store (verbosity) res: ~p", [Reason15]),
625
626    ?IPRINT("config - incorrect dir (1)"),
627    ConfigOpts1 = [{dir, invalid_dir}],
628    Opts16      = [{config, ConfigOpts1},
629		   {versions, [v1]}],
630    ?line {error, Reason16} = config_start(Opts16),
631    ?IPRINT("config (dir) res: ~p", [Reason16]),
632
633    ?IPRINT("config - incorrect dir (2)"),
634    ConfigOpts2 = [{dir, "/invalid/dir"}],
635    Opts17      = [{config, ConfigOpts2},
636		   {versions, [v1]}],
637    ?line {error, Reason17} = config_start(Opts17),
638    ?IPRINT("config (dir) res: ~p", [Reason17]),
639
640    ?IPRINT("config - incorrect verbosity"),
641    ConfigOpts3 = [{dir, ConfDir}, {verbosity, invalid_verbosity}],
642    Opts18      = [{config, ConfigOpts3},
643		   {versions, [v1]}],
644    ?line {error, Reason18} = config_start(Opts18),
645    ?IPRINT("config (verbosity) res: ~p", [Reason18]),
646
647    ?IPRINT("mibs - incorrect mibs (1)"),
648    Mibs1  = invalid_mibs,
649    Opts19 = [{config, ConfigOpts},
650	      {versions, [v1]},
651	      {mibs, Mibs1}],
652    ?line {error, Reason19} = config_start(Opts19),
653    ?IPRINT("mibs (mibs) res: ~p", [Reason19]),
654
655    ?IPRINT("mibs - incorrect mibs (2)"),
656    Mibs2  = [join(StdMibDir, "INVALID-MIB")],
657    Opts20 = [{config, ConfigOpts},
658	      {versions, [v1]},
659	      {mibs, Mibs2}],
660    ?line {error, Reason20} = config_start(Opts20),
661    ?IPRINT("mibs (mibs) res: ~p", [Reason20]),
662
663    ?IPRINT("prio - incorrect prio"),
664    Prio1 = invalid_prio,
665    Opts21 = [{config, ConfigOpts},
666	      {versions, [v1]},
667	      {priority, Prio1}],
668    ?line {error, Reason21} = config_start(Opts21),
669    ?IPRINT("prio (prio) res: ~p", [Reason21]),
670
671    ?IPRINT("atl - incorrect type"),
672    ATL1  = [{type,   invalid_type},
673	     {dir,    LogDir},
674	     {size,   {10,10240}},
675	     {repair, true}],
676    Opts22 = [{config, ConfigOpts},
677	      {versions, [v1]},
678	      {audit_trail_log, ATL1}],
679    ?line {error, Reason22} = config_start(Opts22),
680    ?IPRINT("atl (type) res: ~p", [Reason22]),
681
682    ?IPRINT("atl - incorrect dir (1)"),
683    ATL2  = [{type,   read_write},
684	     {dir,    invalid_dir},
685	     {size,   {10,10240}},
686	     {repair, true}],
687    Opts23 = [{config, ConfigOpts},
688	      {versions, [v1]},
689	      {audit_trail_log, ATL2}],
690    ?line {error, Reason23} = config_start(Opts23),
691    ?IPRINT("atl (dir) res: ~p", [Reason23]),
692
693    ?IPRINT("atl - incorrect dir (2)"),
694    ATL3  = [{type,   read_write},
695	     {dir,    "/invalid/dir"},
696	     {size,   {10,10240}},
697	     {repair, true}],
698    Opts24 = [{config, ConfigOpts},
699	      {versions, [v1]},
700	      {audit_trail_log, ATL3}],
701    ?line {error, Reason24} = config_start(Opts24),
702    ?IPRINT("atl (dir) res: ~p", [Reason24]),
703
704    ?IPRINT("atl - incorrect size (1)"),
705    ATL4  = [{type,   read_write},
706	     {dir,    LogDir},
707	     {size,   invalid_size},
708	     {repair, true}],
709    Opts25 = [{config, ConfigOpts},
710	      {versions, [v1]},
711	      {audit_trail_log, ATL4}],
712    ?line {error, Reason25} = config_start(Opts25),
713    ?IPRINT("atl (size) res: ~p", [Reason25]),
714
715    ?IPRINT("atl - incorrect size (2)"),
716    ATL5  = [{type,   read_write},
717	     {dir,    LogDir},
718	     {size,   {10,invalid_file_size}},
719	     {repair, true}],
720    Opts26 = [{config, ConfigOpts},
721	      {versions, [v1]},
722	      {audit_trail_log, ATL5}],
723    ?line {error, Reason26} = config_start(Opts26),
724    ?IPRINT("atl (size) res: ~p", [Reason26]),
725
726    ?IPRINT("atl - incorrect size (3)"),
727    ATL6  = [{type,   read_write},
728	     {dir,    LogDir},
729	     {size,   {invalid_file_num,10240}},
730	     {repair, true}],
731    Opts27 = [{config, ConfigOpts},
732	      {versions, [v1]},
733	      {audit_trail_log, ATL6}],
734    ?line {error, Reason27} = config_start(Opts27),
735    ?IPRINT("atl (size) res: ~p", [Reason27]),
736
737    ?IPRINT("atl - incorrect repair"),
738    ATL7  = [{type,   read_write},
739	     {dir,    LogDir},
740	     {size,   {10,10240}},
741	     {repair, invalid_repair}],
742    Opts28 = [{config, ConfigOpts},
743	      {versions, [v1]},
744	      {audit_trail_log, ATL7}],
745    ?line {error, Reason28} = config_start(Opts28),
746    ?IPRINT("atl (repair) res: ~p", [Reason28]),
747
748    ?IPRINT("version - incorrect versions (1)"),
749    Vsns1  = invalid_vsns,
750    Opts29 = [{config, ConfigOpts},
751	      {versions, Vsns1}],
752    ?line {error, Reason29} = config_start(Opts29),
753    ?IPRINT("versions (versions) res: ~p", [Reason29]),
754
755    ?IPRINT("version - incorrect versions (2)"),
756    Vsns2  = [v1,v2,v3,v9],
757    Opts30 = [{config, ConfigOpts},
758	      {versions, Vsns2}],
759    ?line {error, Reason30} = config_start(Opts30),
760    ?IPRINT("versions (versions) res: ~p", [Reason30]),
761
762    ?IPRINT("done"),
763    ok.
764
765
766%%
767%% ---
768%%
769
770start_with_invalid_manager_conf_file1(suite) -> [];
771start_with_invalid_manager_conf_file1(doc) ->
772    "Start with invalid manager config file (1).";
773start_with_invalid_manager_conf_file1(Conf) when is_list(Conf) ->
774    put(tname, "START-W-INV-MGR-CONF-FILE-1"),
775    ?IPRINT("start"),
776    process_flag(trap_exit, true),
777    ConfDir = ?config(manager_conf_dir, Conf),
778    DbDir = ?config(manager_db_dir, Conf),
779
780    Opts = [{versions, [v1]},
781	    {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
782
783    %% --
784    ?IPRINT("write manager config file with invalid IP address (1)"),
785    write_manager_conf(ConfDir,
786		       "arne-anka", "4001", "500", "\"bmkEngine\""),
787    ?line {error, Reason11} = config_start(Opts),
788    ?IPRINT("start failed (as expected): ~p", [Reason11]),
789    ?line {failed_reading, _, _, 1, {parse_error, _}} = Reason11,
790    config_ensure_not_running(),
791
792    %% --
793    ?IPRINT("write manager config file with invalid IP address (2)"),
794    write_manager_conf(ConfDir,
795		       "arne_anka", "4001", "500", "\"bmkEngine\""),
796    ?line {error, Reason12} = config_start(Opts),
797    ?IPRINT("start failed (as expected): ~p", [Reason12]),
798    ?line {failed_check, _, _, 2, {bad_address, _}} = Reason12,
799    config_ensure_not_running(),
800
801    %% --
802    ?IPRINT("write manager config file with invalid IP address (3)"),
803    write_manager_conf(ConfDir,
804		       "9999", "4001", "500", "\"bmkEngine\""),
805    ?line {error, Reason13} = config_start(Opts),
806    ?IPRINT("start failed (as expected): ~p", [Reason13]),
807    ?line {failed_check, _, _, 2, {bad_address, _}} = Reason13,
808    config_ensure_not_running(),
809
810    %% --
811    ?IPRINT("write manager config file with invalid port (2)"),
812    write_manager_conf(ConfDir,
813		       "[134,138,177,189]", "kalle-anka", "500", "\"bmkEngine\""),
814    ?line {error, Reason21} = config_start(Opts),
815    ?IPRINT("start failed (as expected): ~p", [Reason21]),
816    ?line {failed_reading, _, _, 2, {parse_error, _}} = Reason21,
817    config_ensure_not_running(),
818
819    %% --
820    ?IPRINT("write manager config file with invalid port (1)"),
821    write_manager_conf(ConfDir,
822		       "[134,138,177,189]", "-1", "500", "\"bmkEngine\""),
823    ?line {error, Reason22} = config_start(Opts),
824    ?IPRINT("start failed (as expected): ~p", [Reason22]),
825    io:format("Reason22: ~p~n", [Reason22]),
826   ?line {failed_check, _, _, 3, {bad_port, _}} = Reason22,
827    config_ensure_not_running(),
828
829    %% --
830    ?IPRINT("write manager config file with invalid port (3)"),
831    write_manager_conf(ConfDir,
832		       "[134,138,177,189]", "\"kalle-anka\"", "500", "\"bmkEngine\""),
833    ?line {error, Reason23} = config_start(Opts),
834    ?IPRINT("start failed (as expected): ~p", [Reason23]),
835    ?line {failed_check, _, _, 3, {bad_port, _}} = Reason23,
836    config_ensure_not_running(),
837
838    %% --
839    ?IPRINT("write manager config file with invalid EngineID (1)"),
840    write_manager_conf(ConfDir,
841		       "[134,138,177,189]", "4001", "500", "bmkEngine"),
842    ?line {error, Reason31} = config_start(Opts),
843    ?IPRINT("start failed (as expected): ~p", [Reason31]),
844    ?line {failed_check, _, _, 5, {invalid_string, _}} = Reason31,
845    config_ensure_not_running(),
846
847    %% --
848    ?IPRINT("write manager config file with invalid EngineID (2)"),
849    write_manager_conf(ConfDir,
850		       "[134,138,177,189]", "4001", "500", "{1,2,3}"),
851    ?line {error, Reason32} = config_start(Opts),
852    ?IPRINT("start failed (as expected): ~p", [Reason32]),
853    ?line {failed_check, _, _, 5, {invalid_string, _}} = Reason32,
854    config_ensure_not_running(),
855
856    %% --
857    ?IPRINT("write manager config file with invalid EngineID (3)"),
858    write_manager_conf(ConfDir,
859		       "[134,138,177,189]", "4001", "500", "10101"),
860    ?line {error, Reason33} = config_start(Opts),
861    ?IPRINT("start failed (as expected): ~p", [Reason33]),
862    ?line {failed_check, _, _, 5, {invalid_string, _}} = Reason33,
863    config_ensure_not_running(),
864
865    %% --
866    ?IPRINT("write manager config file with invalid MMS (1)"),
867    write_manager_conf(ConfDir,
868		       "[134,138,177,189]", "4001", "483", "\"bmkEngine\""),
869    ?line {error, Reason41} = config_start(Opts),
870    ?IPRINT("start failed (as expected): ~p", [Reason41]),
871    ?line {failed_check, _, _, 4, {invalid_integer, _}} = Reason41,
872    config_ensure_not_running(),
873
874    %% --
875    ?IPRINT("write manager config file with invalid MMS (2)"),
876    write_manager_conf(ConfDir,
877		       "[134,138,177,189]", "4001", "-1", "\"bmkEngine\""),
878    ?line {error, Reason42} = config_start(Opts),
879    ?IPRINT("start failed (as expected): ~p", [Reason42]),
880    ?line {failed_check, _, _, 4, {invalid_integer, _}} = Reason42,
881    config_ensure_not_running(),
882
883    %% --
884    ?IPRINT("write manager config file with invalid MMS (3)"),
885    write_manager_conf(ConfDir,
886		       "[134,138,177,189]", "4001", "\"kalle-anka\"", "\"bmkEngine\""),
887    ?line {error, Reason43} = config_start(Opts),
888    ?IPRINT("start failed (as expected): ~p", [Reason43]),
889    ?line {failed_check, _, _, 4, {invalid_integer, _}} = Reason43,
890    config_ensure_not_running(),
891
892    %% --
893    ?IPRINT("write manager config file with invalid MMS (4)"),
894    write_manager_conf(ConfDir,
895		       "[134,138,177,189]", "4001", "kalle_anka", "\"bmkEngine\""),
896    ?line {error, Reason44} = config_start(Opts),
897    ?IPRINT("start failed (as expected): ~p", [Reason44]),
898    ?line {failed_check, _, _, 4, {invalid_integer, _}} = Reason44,
899    config_ensure_not_running(),
900
901    %% --
902    ?IPRINT("write manager config file with unknown option"),
903    write_manager_conf(ConfDir,
904		       "{kalle, anka}."),
905    ?line {error, Reason51} = config_start(Opts),
906    ?IPRINT("start failed (as expected): ~p", [Reason51]),
907    ?line {failed_check, _, _, 1, {unknown_config, _}} = Reason51,
908    config_ensure_not_running(),
909
910    %% --
911    ?IPRINT("write manager config file with unknown option"),
912    write_manager_conf(ConfDir,
913		       "kalle_anka."),
914    ?line {error, Reason52} = config_start(Opts),
915    ?IPRINT("start failed (as expected): ~p", [Reason52]),
916    ?line {failed_check, _, _, 1, {unknown_config, _}} = Reason52,
917    config_ensure_not_running(),
918
919    ?IPRINT("done"),
920    ok.
921
922
923%%
924%% ---
925%%
926
927start_with_invalid_users_conf_file1(suite) -> [];
928start_with_invalid_users_conf_file1(doc) ->
929    "Start with invalid users config file.";
930start_with_invalid_users_conf_file1(Conf) when is_list(Conf) ->
931    put(tname, "START-W-INV-USER-CONF-FILE-1"),
932    ?IPRINT("start"),
933    process_flag(trap_exit, true),
934    ConfDir = ?config(manager_conf_dir, Conf),
935    DbDir   = ?config(manager_db_dir, Conf),
936
937    verify_dir_existing(conf, ConfDir),
938    verify_dir_existing(db,   DbDir),
939
940    Opts = [{versions, [v1]},
941	    {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
942
943    write_manager_conf(ConfDir),
944
945    %% --
946    ?IPRINT("write users config file with invalid module (1)"),
947    write_users_conf(ConfDir, [{"kalle", "kalle", "dummy"}]),
948    ?line {error, Reason11} = config_start(Opts),
949    ?IPRINT("start failed (as expected): ~p", [Reason11]),
950    ?line {failed_check, _, _, _, {bad_module, kalle}} = Reason11,
951    config_ensure_not_running(),
952
953    %% --
954    ?IPRINT("write users config file with invalid module (1)"),
955    write_users_conf(ConfDir, [{"kalle", "snmpm", "dummy"}]),
956    ?line {error, Reason12} = config_start(Opts),
957    ?IPRINT("start failed (as expected): ~p", [Reason12]),
958    ?line {failed_check, _, _, _, {bad_module, _}} = Reason12,
959    config_ensure_not_running(),
960
961    %% --
962    ?IPRINT("write users config file with invalid module (2)"),
963    write_users_conf(ConfDir, [{"kalle1", "10101", "dummy"}]),
964    ?line {error, Reason13} = config_start(Opts),
965    ?IPRINT("start failed (as expected): ~p", [Reason13]),
966    ?line {failed_check, _, _, _, {bad_module, _}} = Reason13,
967    config_ensure_not_running(),
968
969    %% --
970    ?IPRINT("write users config file with invalid user tuple (1)"),
971    write_users_conf2(ConfDir, "{kalle, snmpm_user_default}."),
972    ?line {error, Reason21} = config_start(Opts),
973    ?IPRINT("start failed (as expected): ~p", [Reason21]),
974    ?line {failed_check, _, _, _, {bad_user_config, _}} = Reason21,
975    config_ensure_not_running(),
976
977    %% --
978    ?IPRINT("write users config file with invalid user tuple (2)"),
979    write_users_conf2(ConfDir, "{kalle, snmpm_user_default, kalle, [], olle}."),
980    ?line {error, Reason22} = config_start(Opts),
981    ?IPRINT("start failed (as expected): ~p", [Reason22]),
982    ?line {failed_check, _, _, _, {bad_user_config, _}} = Reason22,
983    config_ensure_not_running(),
984
985    %% --
986    ?IPRINT("write users config file with invalid user tuple (3)"),
987    write_users_conf2(ConfDir, "snmpm_user_default."),
988    ?line {error, Reason23} = config_start(Opts),
989    ?IPRINT("start failed (as expected): ~p", [Reason23]),
990    ?line {failed_check, _, _, _, {bad_user_config, _}} = Reason23,
991    config_ensure_not_running(),
992
993    %% --
994    ?IPRINT("write users config file with invalid user tuple (4)"),
995    write_users_conf2(ConfDir, "[kalle, snmpm_user_default, kalle]."),
996    ?line {error, Reason24} = config_start(Opts),
997    ?IPRINT("start failed (as expected): ~p", [Reason24]),
998    ?line {failed_check, _, _, _, {bad_user_config, _}} = Reason24,
999    config_ensure_not_running(),
1000
1001    %% --
1002    ?IPRINT("write users config file with invalid user agent default config (1)"),
1003    write_users_conf2(ConfDir, "{kalle, snmpm_user_default, kalle, olle}."),
1004    ?line {error, Reason31} = config_start(Opts),
1005    ?IPRINT("start failed (as expected): ~p", [Reason31]),
1006    ?line {failed_check, _, _, _, {bad_default_agent_config, _}} = Reason31,
1007    config_ensure_not_running(),
1008
1009    %% --
1010    ?IPRINT("write users config file with invalid user agent default config (2)"),
1011    write_users_conf2(ConfDir, "{kalle, snmpm_user_default, kalle, [olle]}."),
1012    ?line {error, Reason32} = config_start(Opts),
1013    ?IPRINT("start failed (as expected): ~p", [Reason32]),
1014    %% ?line {failed_check, _, _, _, {bad_default_agent_config, _}} = Reason32,
1015    case Reason32 of
1016	{failed_check, _, _, _, {bad_default_agent_config, _}} ->
1017	    ok;
1018	{A, B, C, D} ->
1019	    exit({bad_error, A, B, C, D})
1020    end,
1021    config_ensure_not_running(),
1022
1023    ?IPRINT("done"),
1024    ok.
1025
1026
1027%%
1028%% ---
1029%%
1030
1031start_with_invalid_agents_conf_file1(suite) -> [];
1032start_with_invalid_agents_conf_file1(doc) ->
1033    "Start with invalid agents config file.";
1034start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
1035    put(tname, "START-W-INV-AGS-CONF-FILE-1"),
1036    ?IPRINT("start"),
1037    process_flag(trap_exit, true),
1038    ConfDir = ?config(manager_conf_dir, Conf),
1039    DbDir   = ?config(manager_db_dir, Conf),
1040
1041    verify_dir_existing(conf, ConfDir),
1042    verify_dir_existing(db,   DbDir),
1043
1044    Opts = [{versions, [v1]},
1045	    {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
1046
1047    write_manager_conf(ConfDir),
1048
1049    write_users_conf(ConfDir, [{"swiacf", "snmpm_user_default", "dummy"}]),
1050
1051    Agent0 = {"swiacf", "\"targ-hobbes\"", "\"comm1\"",
1052	      "[192,168,0,100]", "162", "\"bmkEngine\"", "1500", "484", "v1",
1053	      "any", "\"initial\"", "noAuthNoPriv"},
1054
1055    %% --
1056    ?IPRINT("[test 11] write agents config file with invalid user (1)"),
1057    Agent11 = setelement(1, Agent0, "kalle-anka"),
1058    write_agents_conf(ConfDir, [Agent11]),
1059    case config_start(Opts) of
1060	{error, Reason11} ->
1061	    ?IPRINT("start failed (as expected): ~p", [Reason11]),
1062	    ?line {failed_reading, _, _, _, {parse_error, _}} = Reason11,
1063	    config_ensure_not_running();
1064	OK_11 ->
1065	    config_ensure_not_running(),
1066	    exit({error, {unexpected_success, "11", OK_11}})
1067    end,
1068
1069    %% --
1070    ?IPRINT("[test 21] write agents config file with invalid target name (1)"),
1071    Agent21 = setelement(2, Agent0, "targ-hobbes"),
1072    write_agents_conf(ConfDir, [Agent21]),
1073    case config_start(Opts) of
1074	{error, Reason21} ->
1075	    ?IPRINT("start failed (as expected): ~p", [Reason21]),
1076	    ?line {failed_reading, _, _, _, {parse_error, _}} = Reason21,
1077	    config_ensure_not_running();
1078	OK_21 ->
1079	    config_ensure_not_running(),
1080	    exit({error, {unexpected_success, "21", OK_21}})
1081    end,
1082
1083    %% --
1084    ?IPRINT("[test 22] write agents config file with invalid target name (2)"),
1085    Agent22 = setelement(2, Agent0, "targ_hobbes"),
1086    write_agents_conf(ConfDir, [Agent22]),
1087    case config_start(Opts) of
1088	{error, Reason22} ->
1089	    ?IPRINT("start failed (as expected): ~p", [Reason22]),
1090	    ?line {failed_check, _, _, _, {invalid_string, _}} = Reason22,
1091	    config_ensure_not_running();
1092	OK_22 ->
1093	    config_ensure_not_running(),
1094	    exit({error, {unexpected_success, "22", OK_22}})
1095    end,
1096
1097    %% --
1098    ?IPRINT("[test 23] write agents config file with invalid target name (3)"),
1099    Agent23 = setelement(2, Agent0, "10101"),
1100    write_agents_conf(ConfDir, [Agent23]),
1101    case config_start(Opts) of
1102	{error, Reason23} ->
1103	    ?IPRINT("start failed (as expected): ~p", [Reason23]),
1104	    ?line {failed_check, _, _, _, {invalid_string, _}} = Reason23,
1105	    config_ensure_not_running();
1106	OK_23 ->
1107	    config_ensure_not_running(),
1108	    exit({error, {unexpected_success, "23", OK_23}})
1109    end,
1110
1111    %% --
1112    ?IPRINT("[test 31] write agents config file with invalid community (1)"),
1113    Agent31 = setelement(3, Agent0, "targ-hobbes"),
1114    write_agents_conf(ConfDir, [Agent31]),
1115    case config_start(Opts) of
1116	{error, Reason31} ->
1117	    ?IPRINT("start failed (as expected): ~p", [Reason31]),
1118	    ?line {failed_reading, _, _, _, {parse_error, _}} = Reason31,
1119	    config_ensure_not_running();
1120	OK_31 ->
1121	    config_ensure_not_running(),
1122	    exit({error, {unexpected_success, "31", OK_31}})
1123    end,
1124
1125    %% --
1126    ?IPRINT("[test 32] write agents config file with invalid community (2)"),
1127    Agent32 = setelement(3, Agent0, "targ_hobbes"),
1128    write_agents_conf(ConfDir, [Agent32]),
1129    case config_start(Opts) of
1130	{error, Reason32} ->
1131	    ?IPRINT("start failed (as expected): ~p", [Reason32]),
1132	    ?line {failed_check, _, _, _, {invalid_string, _}} = Reason32,
1133	    config_ensure_not_running();
1134	OK_32 ->
1135	    config_ensure_not_running(),
1136	    exit({error, {unexpected_success, "32", OK_32}})
1137    end,
1138
1139    %% --
1140    ?IPRINT("[test 33] write agents config file with invalid community (3)"),
1141    Agent33 = setelement(3, Agent0, "10101"),
1142    write_agents_conf(ConfDir, [Agent33]),
1143    case config_start(Opts) of
1144	{error, Reason33} ->
1145	    ?IPRINT("start failed (as expected): ~p", [Reason33]),
1146	    ?line {failed_check, _, _, _, {invalid_string, _}} = Reason33,
1147	    config_ensure_not_running();
1148	OK_33 ->
1149	    config_ensure_not_running(),
1150	    exit({error, {unexpected_success, "33", OK_33}})
1151    end,
1152
1153    %% --
1154    ?IPRINT("[test 51] write agents config file with invalid ip (1)"),
1155    Agent51 = setelement(4, Agent0, "kalle_anka"),
1156    write_agents_conf(ConfDir, [Agent51]),
1157    case config_start(Opts) of
1158	{error, Reason51} ->
1159	    ?IPRINT("start failed (as expected): ~p", [Reason51]),
1160	    ?line {failed_check, _, _, _, {bad_domain, _}} = Reason51,
1161	    config_ensure_not_running();
1162	OK_51 ->
1163	    config_ensure_not_running(),
1164	    exit({error, {unexpected_success, "51", OK_51}})
1165    end,
1166
1167    %% --
1168    ?IPRINT("[test 52] write agents config file with invalid ip (2)"),
1169    Agent52 = setelement(4, Agent0, "10101"),
1170    write_agents_conf(ConfDir, [Agent52]),
1171    case config_start(Opts) of
1172	{error, Reason52} ->
1173	    ?IPRINT("start failed (as expected): ~p", [Reason52]),
1174	    ?line {failed_check, _, _, _, {bad_address, _}} = Reason52,
1175	    config_ensure_not_running();
1176	OK_52 ->
1177	    config_ensure_not_running(),
1178	    exit({error, {unexpected_success, "52", OK_52}})
1179    end,
1180
1181    %% --
1182    ?IPRINT("[test 53] write agents config file with invalid ip (3)"),
1183    Agent53 = setelement(4, Agent0, "[192,168,0]"),
1184    write_agents_conf(ConfDir, [Agent53]),
1185    case config_start(Opts) of
1186	{error, Reason53} ->
1187	    ?IPRINT("start failed (as expected): ~p", [Reason53]),
1188	    ?line {failed_check, _, _, _, {bad_address, _}} = Reason53,
1189	    config_ensure_not_running();
1190	OK_53 ->
1191	    config_ensure_not_running(),
1192	    exit({error, {unexpected_success, "53", OK_53}})
1193    end,
1194
1195    %% --
1196    ?IPRINT("[test 54] write agents config file with invalid ip (4)"),
1197    Agent54 = setelement(4, Agent0, "[192,168,0,100,99]"),
1198    write_agents_conf(ConfDir, [Agent54]),
1199    case config_start(Opts) of
1200	{error, Reason54} ->
1201	    ?IPRINT("start failed (as expected): ~p", [Reason54]),
1202	    ?line {failed_check, _, _, _, {bad_address, _}} = Reason54,
1203	    config_ensure_not_running();
1204	OK_54 ->
1205	    config_ensure_not_running(),
1206	    exit({error, {unexpected_success, "54", OK_54}})
1207    end,
1208
1209    %% --
1210    ?IPRINT("[test 55] write agents config file with invalid ip (5)"),
1211    Agent55 = setelement(4, Agent0, "[192,168,0,arne]"),
1212    write_agents_conf(ConfDir, [Agent55]),
1213    ?line {error, Reason55} = config_start(Opts),
1214    ?IPRINT("start failed (as expected): ~p", [Reason55]),
1215    ?line {failed_check, _, _, _, {bad_address, _}} = Reason55,
1216    config_ensure_not_running(),
1217
1218    %% --
1219    ?IPRINT("[test 61] write agents config file with invalid port (1)"),
1220    Agent61 = setelement(5, Agent0, "kalle_anka"),
1221    write_agents_conf(ConfDir, [Agent61]),
1222    ?line {error, Reason61} = config_start(Opts),
1223    ?IPRINT("start failed (as expected): ~p", [Reason61]),
1224    ?line {failed_check, _, _, _, {bad_address, _}} = Reason61,
1225    config_ensure_not_running(),
1226
1227    %% --
1228    ?IPRINT("[test 62] write agents config file with invalid port (2)"),
1229    Agent62 = setelement(5, Agent0, "-1"),
1230    write_agents_conf(ConfDir, [Agent62]),
1231    ?line {error, Reason62} = config_start(Opts),
1232    ?IPRINT("start failed (as expected): ~p", [Reason62]),
1233    ?line {failed_check, _, _, _, {bad_address, _}} = Reason62,
1234    config_ensure_not_running(),
1235
1236    %% --
1237    ?IPRINT("[test 63] write agents config file with invalid port (3)"),
1238    Agent63 = setelement(5, Agent0, "\"100\""),
1239    write_agents_conf(ConfDir, [Agent63]),
1240    ?line {error, Reason63} = config_start(Opts),
1241    ?IPRINT("start failed (as expected): ~p", [Reason63]),
1242    ?line {failed_check, _, _, _, {bad_address, _}} = Reason63,
1243    config_ensure_not_running(),
1244
1245    %% --
1246    ?IPRINT("[test 71] write agents config file with invalid engine-id (1)"),
1247    Agent71 = setelement(6, Agent0, "kalle_anka"),
1248    write_agents_conf(ConfDir, [Agent71]),
1249    ?line {error, Reason71} = config_start(Opts),
1250    ?IPRINT("start failed (as expected): ~p", [Reason71]),
1251    ?line {failed_check, _, _, _, {invalid_string, _}} = Reason71,
1252    config_ensure_not_running(),
1253
1254    %% --
1255    ?IPRINT("[test 72] write agents config file with invalid engine-id (2)"),
1256    Agent72 = setelement(6, Agent0, "10101"),
1257    write_agents_conf(ConfDir, [Agent72]),
1258    ?line {error, Reason72} = config_start(Opts),
1259    ?IPRINT("start failed (as expected): ~p", [Reason72]),
1260    ?line {failed_check, _, _, _, {invalid_string, _}} = Reason72,
1261    config_ensure_not_running(),
1262
1263    %% --
1264    ?IPRINT("[test 81] write agents config file with invalid timeout (1)"),
1265    Agent81 = setelement(7, Agent0, "kalle_anka"),
1266    write_agents_conf(ConfDir, [Agent81]),
1267    ?line {error, Reason81} = config_start(Opts),
1268    ?IPRINT("start failed (as expected): ~p", [Reason81]),
1269    ?line {failed_check, _, _, _, {invalid_timer, _}} = Reason81,
1270    config_ensure_not_running(),
1271
1272    %% --
1273    ?IPRINT("[test 82] write agents config file with invalid timeout (2)"),
1274    Agent82 = setelement(7, Agent0, "-1"),
1275    write_agents_conf(ConfDir, [Agent82]),
1276    ?line {error, Reason82} = config_start(Opts),
1277    ?IPRINT("start failed (as expected): ~p", [Reason82]),
1278    ?line {failed_check, _, _, _, {invalid_timer, _}} = Reason82,
1279    config_ensure_not_running(),
1280
1281    %% --
1282    ?IPRINT("[test 83] write agents config file with invalid timeout (3)"),
1283    Agent83 = setelement(7, Agent0, "{1000, 1, 10, kalle}"),
1284    write_agents_conf(ConfDir, [Agent83]),
1285    ?line {error, Reason83} = config_start(Opts),
1286    ?IPRINT("start failed (as expected): ~p", [Reason83]),
1287    ?line {failed_check, _, _, _, {invalid_timer, _}} = Reason83,
1288    config_ensure_not_running(),
1289
1290    %% --
1291    ?IPRINT("[test 84] write agents config file with invalid timeout (4)"),
1292    Agent84 = setelement(7, Agent0, "{1000, -1, 10, 10}"),
1293    write_agents_conf(ConfDir, [Agent84]),
1294    ?line {error, Reason84} = config_start(Opts),
1295    ?IPRINT("start failed (as expected): ~p", [Reason84]),
1296    ?line {failed_check, _, _, _, {invalid_timer, _}} = Reason84,
1297    config_ensure_not_running(),
1298
1299    %% --
1300    ?IPRINT("[test 85] write agents config file with invalid timeout (5)"),
1301    Agent85 = setelement(7, Agent0, "{1000, 1, -100, 10}"),
1302    write_agents_conf(ConfDir, [Agent85]),
1303    ?line {error, Reason85} = config_start(Opts),
1304    ?IPRINT("start failed (as expected): ~p", [Reason85]),
1305    ?line {failed_check, _, _, _, {invalid_timer, _}} = Reason85,
1306    config_ensure_not_running(),
1307
1308    %% --
1309    ?IPRINT("[test 86] write agents config file with invalid timeout (6)"),
1310    Agent86 = setelement(7, Agent0, "{1000, 1, 100, -1}"),
1311    write_agents_conf(ConfDir, [Agent86]),
1312    ?line {error, Reason86} = config_start(Opts),
1313    ?IPRINT("start failed (as expected): ~p", [Reason86]),
1314    ?line {failed_check, _, _, _, {invalid_timer, _}} = Reason86,
1315    config_ensure_not_running(),
1316
1317    %% --
1318    ?IPRINT("[test 91] write agents config file with invalid max-message-size (1)"),
1319    Agent91 = setelement(8, Agent0, "483"),
1320    write_agents_conf(ConfDir, [Agent91]),
1321    ?line {error, Reason91} = config_start(Opts),
1322    ?IPRINT("start failed (as expected): ~p", [Reason91]),
1323    ?line {failed_check, _, _, _, {invalid_packet_size, _}} = Reason91,
1324    config_ensure_not_running(),
1325
1326    %% --
1327    ?IPRINT("[test 92] write agents config file with invalid max-message-size (2)"),
1328    Agent92 = setelement(8, Agent0, "kalle_anka"),
1329    write_agents_conf(ConfDir, [Agent92]),
1330    ?line {error, Reason92} = config_start(Opts),
1331    ?IPRINT("start failed (as expected): ~p", [Reason92]),
1332    ?line {failed_check, _, _, _, {invalid_packet_size, _}} = Reason92,
1333    config_ensure_not_running(),
1334
1335    %% --
1336    ?IPRINT("[test A1] write agents config file with invalid version (1)"),
1337    AgentA1 = setelement(9, Agent0, "1"),
1338    write_agents_conf(ConfDir, [AgentA1]),
1339    ?line {error, ReasonA1} = config_start(Opts),
1340    ?IPRINT("start failed (as expected): ~p", [ReasonA1]),
1341    ?line {failed_check, _, _, _, {bad_version, _}} = ReasonA1,
1342    config_ensure_not_running(),
1343
1344    %% --
1345    ?IPRINT("[test A2] write agents config file with invalid version (2)"),
1346    AgentA2 = setelement(9, Agent0, "v30"),
1347    write_agents_conf(ConfDir, [AgentA2]),
1348    ?line {error, ReasonA2} = config_start(Opts),
1349    ?IPRINT("start failed (as expected): ~p", [ReasonA2]),
1350    ?line {failed_check, _, _, _, {bad_version, _}} = ReasonA2,
1351    config_ensure_not_running(),
1352
1353    %% --
1354    ?IPRINT("[test B1] write agents config file with invalid sec-model (1)"),
1355    AgentB1 = setelement(10, Agent0, "\"any\""),
1356    write_agents_conf(ConfDir, [AgentB1]),
1357    ?line {error, ReasonB1} = config_start(Opts),
1358    ?IPRINT("start failed (as expected): ~p", [ReasonB1]),
1359    ?line {failed_check, _, _, _, {invalid_sec_model, _}} = ReasonB1,
1360    config_ensure_not_running(),
1361
1362    %% --
1363    ?IPRINT("[test B2] write agents config file with invalid sec-model (2)"),
1364    AgentB2 = setelement(10, Agent0, "v3"),
1365    write_agents_conf(ConfDir, [AgentB2]),
1366    ?line {error, ReasonB2} = config_start(Opts),
1367    ?IPRINT("start failed (as expected): ~p", [ReasonB2]),
1368    ?line {failed_check, _, _, _, {invalid_sec_model, _}} = ReasonB2,
1369    config_ensure_not_running(),
1370
1371    %% --
1372    ?IPRINT("[test C1] write agents config file with invalid sec-name (1)"),
1373    AgentC1 = setelement(11, Agent0, "initial"),
1374    write_agents_conf(ConfDir, [AgentC1]),
1375    case config_start(Opts) of
1376	{error, ReasonC1} ->
1377	    ?IPRINT("start failed (as expected): ~p", [ReasonC1]),
1378	    ?line {failed_check, _, _, _, {bad_sec_name, _}} = ReasonC1,
1379	    config_ensure_not_running();
1380	OK_C1 ->
1381	    config_ensure_not_running(),
1382	    exit({error, {unexpected_success, "C1", OK_C1}})
1383    end,
1384
1385    %% --
1386    ?IPRINT("[test C2] write agents config file with invalid sec-name (2)"),
1387    AgentC2 = setelement(11, Agent0, "10101"),
1388    write_agents_conf(ConfDir, [AgentC2]),
1389    case config_start(Opts) of
1390	{error, ReasonC2} ->
1391	    ?IPRINT("start failed (as expected): ~p", [ReasonC2]),
1392	    ?line {failed_check, _, _, _, {bad_sec_name, _}} = ReasonC2,
1393	    config_ensure_not_running();
1394	OK_C2 ->
1395	    config_ensure_not_running(),
1396	    exit({error, {unexpected_success, "C2", OK_C2}})
1397    end,
1398
1399    %% --
1400    ?IPRINT("[test D1] write agents config file with invalid sec-level (1)"),
1401    AgentD1 = setelement(12, Agent0, "\"noAuthNoPriv\""),
1402    write_agents_conf(ConfDir, [AgentD1]),
1403    case config_start(Opts) of
1404	{error, ReasonD1} ->
1405	    ?IPRINT("start failed (as expected): ~p", [ReasonD1]),
1406	    ?line {failed_check, _, _, _, {invalid_sec_level, _}} = ReasonD1,
1407	    config_ensure_not_running();
1408	OK_D1 ->
1409	    config_ensure_not_running(),
1410	    exit({error, {unexpected_success, "D1", OK_D1}})
1411    end,
1412
1413    %% --
1414    ?IPRINT("[test D2] write agents config file with invalid sec-level (2)"),
1415    AgentD2 = setelement(12, Agent0, "99"),
1416    write_agents_conf(ConfDir, [AgentD2]),
1417    case config_start(Opts) of
1418	{error, ReasonD2} ->
1419	    ?IPRINT("start failed (as expected): ~p", [ReasonD2]),
1420	    ?line {failed_check, _, _, _, {invalid_sec_level, _}} = ReasonD2,
1421	    config_ensure_not_running();
1422	OK_D2 ->
1423	    config_ensure_not_running(),
1424	    exit({error, {unexpected_success, "D2", OK_D2}})
1425    end,
1426
1427    %% --
1428    ?IPRINT("[test E1] write agents config file with invalid agent (1)"),
1429    write_agents_conf2(ConfDir, "{swiacf, \"targ-hobbes\"}."),
1430    case config_start(Opts) of
1431	{error, ReasonE1} ->
1432	    ?IPRINT("start failed (as expected): ~p", [ReasonE1]),
1433	    ?line {failed_check, _, _, _, {bad_agent_config, _}} = ReasonE1,
1434	    config_ensure_not_running();
1435	OK_E1 ->
1436	    config_ensure_not_running(),
1437	    exit({error, {unexpected_success, "E1", OK_E1}})
1438    end,
1439
1440    ?IPRINT("done"),
1441    ok.
1442
1443
1444%%
1445%% ---
1446%%
1447
1448start_with_invalid_usm_conf_file1(suite) -> [];
1449start_with_invalid_usm_conf_file1(doc) ->
1450    "Start with invalid usm config file.";
1451start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
1452    put(tname, "START-W-INV-USM-CONF-FILE-1"),
1453    ?IPRINT("start"),
1454    process_flag(trap_exit, true),
1455
1456    case ?CRYPTO_START() of
1457        ok ->
1458            case ?CRYPTO_SUPPORT() of
1459                {no, Reason} ->
1460                    ?SKIP({unsupported_encryption, Reason});
1461                yes ->
1462                    ok
1463            end;
1464        {error, Reason} ->
1465            ?SKIP({failed_starting_crypto, Reason})
1466    end,
1467
1468    ConfDir = ?config(manager_conf_dir, Conf),
1469    DbDir = ?config(manager_db_dir, Conf),
1470
1471    Opts = [{versions, [v1,v2,v3]},
1472	    {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
1473
1474    write_manager_conf(ConfDir),
1475
1476    write_users_conf(ConfDir, [{"swiacf", "snmpm_user_default", "dummy"}]),
1477
1478    Usm0 = {"\"bmkEngine\"", "\"swiusmcf\"",
1479	    "usmNoAuthProtocol", "[]",
1480	    "usmNoPrivProtocol", "[]"},
1481
1482    Usm1 = {"\"bmkEngine\"", "\"swiusmcf\"", "\"kalle\"",
1483	    "usmNoAuthProtocol", "[]",
1484	    "usmNoPrivProtocol", "[]"},
1485
1486    %% --
1487    ?IPRINT("[test 11] write usm config file with invalid engine-id (1)"),
1488    Usm11 = setelement(1, Usm0, "kalle-anka"),
1489    write_usm_conf(ConfDir, [Usm11]),
1490    ?line {error, Reason11} = config_start(Opts),
1491    ?IPRINT("start failed (as expected): ~p", [Reason11]),
1492    ?line {failed_reading, _, _, _, {parse_error, _}} = Reason11,
1493    config_ensure_not_running(),
1494
1495    %% --
1496    ?IPRINT("[test 12] write usm config file with invalid engine-id (2)"),
1497    Usm12 = setelement(1, Usm0, "kalle_anka"),
1498    write_usm_conf(ConfDir, [Usm12]),
1499    ?line {error, Reason12} = config_start(Opts),
1500    ?IPRINT("start failed (as expected): ~p", [Reason12]),
1501    ?line {failed_check, _, _, _, {bad_usm_engine_id, _}} = Reason12,
1502    config_ensure_not_running(),
1503
1504    %% --
1505    ?IPRINT("[test 13] write usm config file with invalid engine-id (3)"),
1506    Usm13 = setelement(1, Usm1, "10101"),
1507    write_usm_conf(ConfDir, [Usm13]),
1508    ?line {error, Reason13} = config_start(Opts),
1509    ?IPRINT("start failed (as expected): ~p", [Reason13]),
1510    ?line {failed_check, _, _, _, {bad_usm_engine_id, _}} = Reason13,
1511    config_ensure_not_running(),
1512
1513    %% --
1514    ?IPRINT("[test 21] write usm config file with invalid user-name (1)"),
1515    Usm21 = setelement(2, Usm0, "kalle_anka"),
1516    write_usm_conf(ConfDir, [Usm21]),
1517    ?line {error, Reason21} = config_start(Opts),
1518    ?IPRINT("start failed (as expected): ~p", [Reason21]),
1519    ?line {failed_check, _, _, _, {bad_usm_user_name, _}} = Reason21,
1520    config_ensure_not_running(),
1521
1522    %% --
1523    ?IPRINT("[test 22] write usm config file with invalid user-name (1)"),
1524    Usm22 = setelement(2, Usm1, "10101"),
1525    write_usm_conf(ConfDir, [Usm22]),
1526    ?line {error, Reason22} = config_start(Opts),
1527    ?IPRINT("start failed (as expected): ~p", [Reason22]),
1528    ?line {failed_check, _, _, _, {bad_usm_user_name, _}} = Reason22,
1529    config_ensure_not_running(),
1530
1531    %% --
1532    ?IPRINT("[test 31] write usm config file with invalid sec-name (1)"),
1533    Usm31 = setelement(3, Usm1, "kalle_anka"),
1534    write_usm_conf(ConfDir, [Usm31]),
1535    ?line {error, Reason31} = config_start(Opts),
1536    ?IPRINT("start failed (as expected): ~p", [Reason31]),
1537    ?line {failed_check, _, _, _, {bad_usm_sec_name, _}} = Reason31,
1538    config_ensure_not_running(),
1539
1540    %% --
1541    ?IPRINT("[test 32] write usm config file with invalid sec-name (2)"),
1542    Usm32 = setelement(3, Usm1, "10101"),
1543    write_usm_conf(ConfDir, [Usm32]),
1544    ?line {error, Reason32} = config_start(Opts),
1545    ?IPRINT("start failed (as expected): ~p", [Reason32]),
1546    ?line {failed_check, _, _, _, {bad_usm_sec_name, _}} = Reason32,
1547    config_ensure_not_running(),
1548
1549    %% --
1550    ?IPRINT("[test 41] write usm config file with invalid auth-protocol (1)"),
1551    Usm41 = setelement(3, Usm0, "\"usmNoAuthProtocol\""),
1552    write_usm_conf(ConfDir, [Usm41]),
1553    ?line {error, Reason41} = config_start(Opts),
1554    ?IPRINT("start failed (as expected): ~p", [Reason41]),
1555    ?line {failed_check, _, _, _, {invalid_auth_protocol, _}} = Reason41,
1556    config_ensure_not_running(),
1557
1558    %% --
1559    ?IPRINT("[test 42] write usm config file with invalid auth-protocol (2)"),
1560    Usm42 = setelement(3, Usm0, "kalle"),
1561    write_usm_conf(ConfDir, [Usm42]),
1562    ?line {error, Reason42} = config_start(Opts),
1563    ?IPRINT("start failed (as expected): ~p", [Reason42]),
1564    ?line {failed_check, _, _, _, {invalid_auth_protocol, _}} = Reason42,
1565    config_ensure_not_running(),
1566
1567    %% --
1568    ?IPRINT("[test 43] write usm config file with invalid auth-protocol (3)"),
1569    Usm43 = setelement(3, Usm0, "10101"),
1570    write_usm_conf(ConfDir, [Usm43]),
1571    ?line {error, Reason43} = config_start(Opts),
1572    ?IPRINT("start failed (as expected): ~p", [Reason43]),
1573    ?line {failed_check, _, _, _, {invalid_auth_protocol, _}} = Reason43,
1574    config_ensure_not_running(),
1575
1576    %% --
1577    ?IPRINT("[test 51] write usm config file with invalid auth-key (1)"),
1578    Usm51 = setelement(3, Usm0, "usmHMACMD5AuthProtocol"),
1579    write_usm_conf(ConfDir, [Usm51]),
1580    ?line {error, Reason51} = config_start(Opts),
1581    ?IPRINT("start failed (as expected): ~p", [Reason51]),
1582    ?line {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason51,
1583    config_ensure_not_running(),
1584
1585    %% --
1586    ?IPRINT("[test 52] write usm config file with invalid auth-key (2)"),
1587    Usm52 = setelement(4, Usm51, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5]"),
1588    write_usm_conf(ConfDir, [Usm52]),
1589    ?line {error, Reason52} = config_start(Opts),
1590    ?IPRINT("start failed (as expected): ~p", [Reason52]),
1591    ?line {failed_check, _, _, _, {invalid_auth_key, _, 15}} = Reason52,
1592    config_ensure_not_running(),
1593
1594    %% --
1595    ?IPRINT("[test 53] write usm config file with invalid auth-key (3)"),
1596    Usm53 = setelement(4, Usm51, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7]"),
1597    write_usm_conf(ConfDir, [Usm53]),
1598    ?line {error, Reason53} = config_start(Opts),
1599    ?IPRINT("start failed (as expected): ~p", [Reason53]),
1600    ?line {failed_check, _, _, _, {invalid_auth_key, _, 17}} = Reason53,
1601    config_ensure_not_running(),
1602
1603    %% --
1604    ?IPRINT("[test 54] write usm config file with invalid auth-key (4)"),
1605    Usm54 = setelement(4, Usm51, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,kalle]"),
1606    write_usm_conf(ConfDir, [Usm54]),
1607    ?line maybe_start_crypto(),  %% Make sure it's started...
1608    ?line {error, Reason54} = config_start(Opts),
1609    ?line ok = maybe_stop_crypto(),
1610    ?IPRINT("start failed (as expected): ~p", [Reason54]),
1611    ?line {failed_check, _, _, _, {invalid_auth_key, _}} = Reason54,
1612    config_ensure_not_running(),
1613
1614    %% --
1615    ?IPRINT("[test 55] write usm config file with invalid auth-key (5)"),
1616    Usm55 = setelement(4, Usm51, "arne_anka"),
1617    write_usm_conf(ConfDir, [Usm55]),
1618    ?line {error, Reason55} = config_start(Opts),
1619    ?IPRINT("start failed (as expected): ~p", [Reason55]),
1620    ?line {failed_check, _, _, _, {invalid_auth_key, _}} = Reason55,
1621    config_ensure_not_running(),
1622
1623    %% --
1624    ?IPRINT("[test 56] write usm config file with invalid auth-key (6)"),
1625    Usm56 = setelement(4, Usm51, "10101"),
1626    write_usm_conf(ConfDir, [Usm56]),
1627    ?line {error, Reason56} = config_start(Opts),
1628    ?IPRINT("start failed (as expected): ~p", [Reason56]),
1629    ?line {failed_check, _, _, _, {invalid_auth_key, _}} = Reason56,
1630    config_ensure_not_running(),
1631
1632    %% --
1633    ?IPRINT("[test 57] write usm config file with invalid auth-key (7)"),
1634    Usm57 = setelement(3, Usm0, "usmHMACSHAAuthProtocol"),
1635    write_usm_conf(ConfDir, [Usm57]),
1636    ?line {error, Reason57} = config_start(Opts),
1637    ?IPRINT("start failed (as expected): ~p", [Reason57]),
1638    ?line {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason57,
1639    config_ensure_not_running(),
1640
1641    %% --
1642    ?IPRINT("[test 58] write usm config file with invalid auth-key (8)"),
1643    Usm58 = setelement(4, Usm57, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]"),
1644    write_usm_conf(ConfDir, [Usm58]),
1645    ?line {error, Reason58} = config_start(Opts),
1646    ?IPRINT("start failed (as expected): ~p", [Reason58]),
1647    ?line {failed_check, _, _, _, {invalid_auth_key, _, 16}} = Reason58,
1648    config_ensure_not_running(),
1649
1650    %% --
1651    ?IPRINT("[test 59] write usm config file with invalid auth-key (9)"),
1652    Usm59 = setelement(4, Usm57, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,ka]"),
1653    write_usm_conf(ConfDir, [Usm59]),
1654    ?line ok = maybe_start_crypto(),
1655    ?line {error, Reason59} = config_start(Opts),
1656    ?line ok = maybe_stop_crypto(),
1657    ?IPRINT("start failed (as expected): ~p", [Reason59]),
1658    ?line {failed_check, _, _, _, {invalid_auth_key, _}} = Reason59,
1659    config_ensure_not_running(),
1660
1661    %% --
1662    %% <CRYPTO-MODIFICATIONS>
1663    %% The crypto application do no longer need to be started
1664    %% explicitly (all of it is as of R14 implemented with NIFs).
1665    case (catch crypto:version()) of
1666	{'EXIT', {undef, _}} ->
1667	    ?IPRINT("[test 5A] write usm config file with valid auth-key "
1668	      "when crypto not started (10)"),
1669	    Usm5A = setelement(4,
1670			       Usm57,
1671			       "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0]"),
1672	    write_usm_conf(ConfDir, [Usm5A]),
1673	    ?line {error, Reason5A} = config_start(Opts),
1674	    ?IPRINT("start failed (as expected): ~p", [Reason5A]),
1675	    ?line {failed_check, _, _, _, {unsupported_crypto, _}} = Reason5A,
1676	    config_ensure_not_running();
1677	_ ->
1678	    %% This function is only present in version 2.0 or greater.
1679	    %% The crypto app no longer needs to be explicitly started
1680	    ok
1681    end,
1682    %% </CRYPTO-MODIFICATIONS>
1683
1684    %% --
1685    ?IPRINT("[test 61] write usm config file with invalid priv-protocol (1)"),
1686    Usm61 = setelement(5, Usm0, "\"usmNoPrivProtocol\""),
1687    write_usm_conf(ConfDir, [Usm61]),
1688    ?line {error, Reason61} = config_start(Opts),
1689    ?IPRINT("start failed (as expected): ~p", [Reason61]),
1690    ?line {failed_check, _, _, _, {invalid_priv_protocol, _}} = Reason61,
1691    config_ensure_not_running(),
1692
1693    %% --
1694    ?IPRINT("[test 62] write usm config file with invalid priv-protocol (2)"),
1695    Usm62 = setelement(5, Usm0, "kalle"),
1696    write_usm_conf(ConfDir, [Usm62]),
1697    ?line {error, Reason62} = config_start(Opts),
1698    ?IPRINT("start failed (as expected): ~p", [Reason62]),
1699    ?line {failed_check, _, _, _, {invalid_priv_protocol, _}} = Reason62,
1700    config_ensure_not_running(),
1701
1702    %% --
1703    ?IPRINT("[test 63] write usm config file with invalid priv-protocol (3)"),
1704    Usm63 = setelement(5, Usm0, "10101"),
1705    write_usm_conf(ConfDir, [Usm63]),
1706    ?line {error, Reason63} = config_start(Opts),
1707    ?IPRINT("start failed (as expected): ~p", [Reason63]),
1708    ?line {failed_check, _, _, _, {invalid_priv_protocol, _}} = Reason63,
1709    config_ensure_not_running(),
1710
1711    %% --
1712    ?IPRINT("[test 71] write usm config file with invalid priv-key (1)"),
1713    Usm71 = setelement(5, Usm0, "usmDESPrivProtocol"),
1714    write_usm_conf(ConfDir, [Usm71]),
1715    ?line {error, Reason71} = config_start(Opts),
1716    ?IPRINT("start failed (as expected): ~p", [Reason71]),
1717    ?line {failed_check, _, _, _, {invalid_priv_key, _, _}} = Reason71,
1718    config_ensure_not_running(),
1719
1720    %% --
1721    ?IPRINT("[test 72] write usm config file with invalid priv-key (2)"),
1722    Usm72 = setelement(6, Usm71, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5]"),
1723    write_usm_conf(ConfDir, [Usm72]),
1724    ?line {error, Reason72} = config_start(Opts),
1725    ?IPRINT("start failed (as expected): ~p", [Reason72]),
1726    ?line {failed_check, _, _, _, {invalid_priv_key, _, 15}} = Reason72,
1727    config_ensure_not_running(),
1728
1729    %% --
1730    ?IPRINT("[test 73] write usm config file with invalid priv-key (3)"),
1731    Usm73 = setelement(6, Usm71, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7]"),
1732    write_usm_conf(ConfDir, [Usm73]),
1733    ?line {error, Reason73} = config_start(Opts),
1734    ?IPRINT("start failed (as expected): ~p", [Reason73]),
1735    ?line {failed_check, _, _, _, {invalid_priv_key, _, 17}} = Reason73,
1736    config_ensure_not_running(),
1737
1738    %% --
1739    ?IPRINT("[test 74] write usm config file with invalid priv-key (4)"),
1740    Usm74 = setelement(6, Usm71, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,kalle]"),
1741    write_usm_conf(ConfDir, [Usm74]),
1742    ?line ok = maybe_start_crypto(),
1743    ?line {error, Reason74} = config_start(Opts),
1744    ?line ok = maybe_stop_crypto(),
1745    ?IPRINT("start failed (as expected): ~p", [Reason74]),
1746    ?line {failed_check, _, _, _, {invalid_priv_key, _}} = Reason74,
1747    config_ensure_not_running(),
1748
1749    %% --
1750    ?IPRINT("[test 75] write usm config file with invalid priv-key (5)"),
1751    Usm75 = setelement(6, Usm71, "arne_anka"),
1752    write_usm_conf(ConfDir, [Usm75]),
1753    ?line {error, Reason75} = config_start(Opts),
1754    ?IPRINT("start failed (as expected): ~p", [Reason75]),
1755    ?line {failed_check, _, _, _, {invalid_priv_key, _}} = Reason75,
1756    config_ensure_not_running(),
1757
1758    %% --
1759    ?IPRINT("[test 76] write usm config file with invalid priv-key (6)"),
1760    Usm76 = setelement(6, Usm71, "10101"),
1761    write_usm_conf(ConfDir, [Usm76]),
1762    ?line {error, Reason76} = config_start(Opts),
1763    ?IPRINT("start failed (as expected): ~p", [Reason76]),
1764    ?line {failed_check, _, _, _, {invalid_priv_key, _}} = Reason76,
1765    config_ensure_not_running(),
1766
1767    %% --
1768    %% <CRYPTO-MODIFICATIONS>
1769    %% The crypto application do no longer need to be started
1770    %% explicitly (all of it is as of R14 implemented with NIFs).
1771    case (catch crypto:version()) of
1772	{'EXIT', {undef, _}} ->
1773	    ?IPRINT("[test 77] write usm config file with valid priv-key "
1774	      "when crypto not started (7)"),
1775	    Usm77 = setelement(6, Usm71, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]"),
1776	    write_usm_conf(ConfDir, [Usm77]),
1777	    ?line {error, Reason77} = config_start(Opts),
1778	    ?IPRINT("start failed (as expected): ~p", [Reason77]),
1779	    ?line {failed_check, _, _, _, {unsupported_crypto, _}} = Reason77,
1780	    config_ensure_not_running();
1781	_ ->
1782	    %% This function is only present in version 2.0 or greater.
1783	    %% The crypto app no longer needs to be explicitly started
1784	    ok
1785    end,
1786    %% </CRYPTO-MODIFICATIONS>
1787
1788    %% --
1789    ?IPRINT("[test 78] write usm config file with invalid usm (1)"),
1790    write_usm_conf2(ConfDir, "{\"bmkEngine\", \"swiusmcf\"}."),
1791    ?line {error, Reason81} = config_start(Opts),
1792    ?IPRINT("start failed (as expected): ~p", [Reason81]),
1793    ?line {failed_check, _, _, _, {bad_usm_config, _}} = Reason81,
1794    config_ensure_not_running(),
1795
1796    ?IPRINT("done"),
1797    ok.
1798
1799
1800%%
1801%% ---
1802%%
1803
1804start_with_create_db_and_dir_opt(suite) -> [];
1805start_with_create_db_and_dir_opt(doc) ->
1806    "Start the snmp manager config process with the\n"
1807        "create_db_and_dir option.";
1808start_with_create_db_and_dir_opt(Conf) when is_list(Conf) ->
1809    put(tname, "START-W-CRE-DB-AND-DIR-OPT"),
1810    ?IPRINT("start"),
1811    process_flag(trap_exit, true),
1812    ConfDir = ?config(manager_conf_dir, Conf),
1813    DbDir = ?config(manager_db_dir, Conf),
1814    true = not filelib:is_dir(DbDir) and not filelib:is_file(DbDir),
1815    write_manager_conf(ConfDir),
1816
1817    ?IPRINT("verify nonexistent db_dir"),
1818    ConfigOpts01 = [{verbosity,trace}, {dir, ConfDir}, {db_dir, DbDir}],
1819    {error, Reason01} = config_start([{config, ConfigOpts01}]),
1820    ?IPRINT("nonexistent db_dir res: ~p", [Reason01]),
1821    {invalid_conf_db_dir, _, not_found} = Reason01,
1822
1823    ?IPRINT("verify nonexistent db_dir gets created"),
1824    ConfigOpts02 = [{db_init_error, create_db_and_dir} | ConfigOpts01],
1825    {ok, _Pid} = config_start([{config, ConfigOpts02}]),
1826    true = filelib:is_dir(DbDir),
1827    ?IPRINT("verified: nonexistent db_dir was correctly created"),
1828    ok = config_stop(),
1829
1830    ?IPRINT("done"),
1831    ok.
1832
1833%%
1834%% ---
1835%%
1836
1837
1838simple_system_op(suite) -> [];
1839simple_system_op(doc) ->
1840    "Access some of the known system info and some \n"
1841	"system info that does not exist.";
1842simple_system_op(Conf) when is_list(Conf) ->
1843    put(tname, "SIMPLE-SYS-OP"),
1844    ?IPRINT("start"),
1845    ConfDir = ?config(manager_conf_dir, Conf),
1846    DbDir = ?config(manager_db_dir, Conf),
1847
1848    write_manager_conf(ConfDir),
1849
1850    Opts = [{versions, [v1]},
1851	    {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
1852
1853    ?IPRINT("start config"),
1854    ?line {ok, _Pid}         = config_start(Opts),
1855
1856    ?IPRINT("retreive various configs"),
1857    ?line {ok, _Time}        = snmpm_config:system_start_time(),
1858    ?line {ok, _EngineId}    = snmpm_config:get_engine_id(),
1859    ?line {ok, _MMS}         = snmpm_config:get_engine_max_message_size(),
1860
1861    ?IPRINT("attempt to retreive nonexisting"),
1862    ?line {error, not_found} = snmpm_config:system_info(kalle),
1863
1864    ?line ok = config_stop(),
1865    config_ensure_not_running(),
1866
1867    ?IPRINT("done"),
1868    ok.
1869
1870
1871%%
1872%% ---
1873%%
1874
1875
1876
1877%%
1878%% ---
1879%%
1880
1881register_user_using_file(suite) -> [];
1882register_user_using_file(doc) ->
1883    "Register user using the 'users.conf' file.";
1884register_user_using_file(Conf) when is_list(Conf) ->
1885    put(tname, "REG-USER-USING-FILE"),
1886    ?IPRINT("start"),
1887    process_flag(trap_exit, true),
1888    _ConfDir = ?config(manager_conf_dir, Conf),
1889    _DbDir = ?config(manager_db_dir, Conf),
1890    ?SKIP(not_yet_implemented).
1891
1892
1893%%
1894%% ---
1895%%
1896
1897register_user_using_function(suite) -> [];
1898register_user_using_function(doc) ->
1899    "Register user using the API (function).";
1900register_user_using_function(Conf) when is_list(Conf) ->
1901    put(tname, "REG-USER-USING-FUNC"),
1902    ?IPRINT("start"),
1903    process_flag(trap_exit, true),
1904    _ConfDir = ?config(manager_conf_dir, Conf),
1905    _DbDir = ?config(manager_db_dir, Conf),
1906    ?SKIP(not_yet_implemented).
1907
1908
1909%%
1910%% ---
1911%%
1912
1913register_user_failed_using_function1(suite) -> [];
1914register_user_failed_using_function1(doc) ->
1915    "Register user failed using incorrect arguments to API (function).";
1916register_user_failed_using_function1(Conf) when is_list(Conf) ->
1917    put(tname, "REG-USER-FAIL-USING-FUNC-1"),
1918    ?IPRINT("start"),
1919    process_flag(trap_exit, true),
1920    _ConfDir = ?config(manager_conf_dir, Conf),
1921    _DbDir = ?config(manager_db_dir, Conf),
1922    ?SKIP(not_yet_implemented).
1923
1924
1925%%
1926%% ---
1927%%
1928
1929
1930
1931%%
1932%% ---
1933%%
1934
1935%% This test case tests that we can "register" agents using a config file.
1936%% So, starting the config process is part of the actual test, but even
1937%% if the test fails, we want to make sure the config process is actually
1938%% stop'ed. So, we put config stop in the post.
1939
1940register_agent_using_file(suite) -> [];
1941register_agent_using_file(doc) ->
1942    "Register agents using the 'agents'conf' file.";
1943register_agent_using_file(Conf) when is_list(Conf) ->
1944    put(tname, "REG-AG-USING-FILE"),
1945    process_flag(trap_exit, true),
1946    Pre  = fun()  -> ok end,
1947    Case = fun(_) -> do_register_agent_using_file(Conf) end,
1948    Post = fun(_) ->
1949                   ?IPRINT("stop config process"),
1950                   ?line ok = snmpm_config:stop(),
1951                   config_ensure_not_running(),
1952                   ok
1953           end,
1954    ?TC_TRY(register_agent_using_file, Pre, Case, Post).
1955
1956do_register_agent_using_file(Conf) ->
1957    ?IPRINT("start"),
1958    ConfDir = ?config(manager_conf_dir, Conf),
1959    DbDir = ?config(manager_db_dir, Conf),
1960
1961    Opts = [{versions, [v1]},
1962	    {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
1963
1964
1965    %% --
1966    ?IPRINT("write manager config file"),
1967    write_manager_conf(ConfDir),
1968
1969    %% --
1970    ?IPRINT("write users config file"),
1971    UserId1 = raufi1,
1972    UserId1Str = str(UserId1),
1973    UserId2 = raufi2,
1974    UserId2Str = str(UserId2),
1975    User1 = {UserId1Str, "snmpm_user_default", "dummy1"},
1976    User2 = {UserId2Str, "snmpm_user_default", "dummy2", "[{version, v1}]"},
1977    write_users_conf(ConfDir, [User1, User2]),
1978
1979    %% --
1980    ?IPRINT("write agents config file"),
1981    AgentAddr1 = [192,168,0,101],
1982    AgentAddr1Str = str(AgentAddr1),
1983    AgentPort1 = 162,
1984    AgentPort1Str = str(AgentPort1),
1985    EngineID1 = "bmkEngine1",
1986    EngineID1Str = str(EngineID1),
1987    MMS1 = 1024,
1988    MMS1Str = str(MMS1),
1989    AgentAddr2 = [192,168,0,102],
1990    AgentAddr2Str = str(AgentAddr2),
1991    AgentPort2 = 162,
1992    AgentPort2Str = str(AgentPort2),
1993    EngineID2 = "bmkEngine2",
1994    EngineID2Str = str(EngineID2),
1995    MMS2 = 512,
1996    MMS2Str = str(MMS2),
1997    Agent1Str = {UserId1Str, "\"targ-hobbes1\"", "\"comm\"",
1998		 AgentAddr1Str, AgentPort1Str, EngineID1Str,
1999		 "1000", MMS1Str, "v1",
2000		 "any", "\"initial\"", "noAuthNoPriv"},
2001    Agent2Str = {UserId2Str, "\"targ-hobbes2\"", "\"comm\"",
2002		 AgentAddr2Str, AgentPort2Str, EngineID2Str,
2003		 "1500", MMS2Str, "v1",
2004		 "any", "\"initial\"", "noAuthNoPriv"},
2005    write_agents_conf(ConfDir, [Agent1Str, Agent2Str]),
2006
2007    %% --
2008    ?IPRINT("start the config process"),
2009    ?line {ok, _Pid} = config_start(Opts),
2010
2011    %% --
2012    ?IPRINT("which agents"),
2013    ?line [_, _] = All = snmpm_config:which_agents(),
2014    ?IPRINT("all agents: ~n   ~p", [All]),
2015    ?line [A1]         = snmpm_config:which_agents(UserId1),
2016    ?IPRINT("agents belonging to ~w: ~n   ~p", [UserId1, A1]),
2017    ?line [A2]         = snmpm_config:which_agents(UserId2),
2018    ?IPRINT("agents belonging to ~w: ~n   ~p", [UserId2, A2]),
2019
2020    %% --
2021    ?IPRINT("All info for agent <~w,~w>", [AgentAddr1, AgentPort1]),
2022    ?line {ok, AllInfo1} =
2023	snmpm_config:agent_info(AgentAddr1, AgentPort1, all),
2024    ?IPRINT("all agent info for agent: ~n   ~p", [AllInfo1]),
2025
2026    %% --
2027    ?IPRINT("EngineID (~p) for agent <~w,~w>", [EngineID1, AgentAddr1, AgentPort1]),
2028    ?line {ok, EngineID1} =
2029	snmpm_config:agent_info(AgentAddr1, AgentPort1, engine_id),
2030
2031
2032    %% --
2033    ?IPRINT("All info for agent <~w,~w>", [AgentAddr2, AgentPort2]),
2034    ?line {ok, AllInfo2} =
2035	snmpm_config:agent_info(AgentAddr2, AgentPort2, all),
2036    ?IPRINT("all agent info for agent: ~n   ~p", [AllInfo2]),
2037
2038    %% --
2039    ?IPRINT("EngineID (~p) for agent <~w,~w>", [EngineID2, AgentAddr2, AgentPort2]),
2040    ?line {ok, EngineID2} =
2041	snmpm_config:agent_info(AgentAddr2, AgentPort2, engine_id),
2042
2043    %% --
2044    ?line {ok, MMS2} =
2045	snmpm_config:agent_info(AgentAddr2, AgentPort2, max_message_size),
2046    NewMMS21 = 2048,
2047    ?IPRINT("try update agent info max-message-size to ~w for agent <~w,~w>",
2048      [NewMMS21, AgentAddr2, AgentPort2]),
2049    ?line ok = snmpm_config:update_agent_info(UserId2, AgentAddr2, AgentPort2,
2050					      max_message_size, NewMMS21),
2051    ?line {ok, NewMMS21} =
2052	snmpm_config:agent_info(AgentAddr2, AgentPort2, max_message_size),
2053
2054    %% --
2055    ?IPRINT("try (and fail) to update agent info max-message-size to ~w "
2056      "for agent <~w,~w> "
2057      "with user ~w (not owner)",
2058      [NewMMS21, AgentAddr2, AgentPort2, UserId1]),
2059    ?line {error, Reason01} =
2060	snmpm_config:update_agent_info(UserId1, AgentAddr2, AgentPort2,
2061				       max_message_size, NewMMS21),
2062    ?IPRINT("expected failure. Reason01: ~p", [Reason01]),
2063    ?line {ok, NewMMS21} =
2064	snmpm_config:agent_info(AgentAddr2, AgentPort2, max_message_size),
2065
2066    %% --
2067    NewMMS22 = 400,
2068    ?IPRINT("try (and fail) to update agent info max-message-size to ~w "
2069      "for agent <~w,~w>",
2070      [NewMMS22, AgentAddr2, AgentPort2]),
2071    ?line {error, Reason02} =
2072	snmpm_config:update_agent_info(UserId1, AgentAddr2, AgentPort2,
2073				       max_message_size, NewMMS22),
2074    ?IPRINT("expected failure. Reason02: ~p", [Reason02]),
2075
2076    %% --
2077    ?IPRINT("done"),
2078    ok.
2079
2080
2081%%
2082%% ---
2083%%
2084
2085register_agent_using_function(suite) -> [];
2086register_agent_using_function(doc) ->
2087    "Register agents using the API (function).";
2088register_agent_using_function(Conf) when is_list(Conf) ->
2089    put(tname, "REG-AG-USING-FUNC"),
2090    ?IPRINT("start"),
2091    process_flag(trap_exit, true),
2092    _ConfDir = ?config(manager_conf_dir, Conf),
2093    _DbDir = ?config(manager_db_dir, Conf),
2094    ?SKIP(not_yet_implemented).
2095
2096
2097%%
2098%% ---
2099%%
2100
2101register_agent_failed_using_function1(suite) -> [];
2102register_agent_failed_using_function1(doc) ->
2103    "Register agents failng using the API (function) with incorrect "
2104	"config (1).";
2105register_agent_failed_using_function1(Conf) when is_list(Conf) ->
2106    put(tname, "REG-AG-FAIL-USING-FUNC-1"),
2107    ?IPRINT("start"),
2108    process_flag(trap_exit, true),
2109    _ConfDir = ?config(manager_conf_dir, Conf),
2110    _DbDir = ?config(manager_db_dir, Conf),
2111    ?SKIP(not_yet_implemented).
2112
2113
2114%%
2115%% ---
2116%%
2117
2118
2119
2120%%
2121%% ---
2122%%
2123
2124register_usm_user_using_file(suite) -> [];
2125register_usm_user_using_file(doc) ->
2126    "Register usm user using the 'usm.conf' file.";
2127register_usm_user_using_file(Conf) when is_list(Conf) ->
2128    put(tname, "REG-USM-USER-USING-FILE"),
2129    ?IPRINT("start"),
2130    process_flag(trap_exit, true),
2131
2132    case ?CRYPTO_START() of
2133        ok ->
2134            case ?CRYPTO_SUPPORT() of
2135                {no, Reason} ->
2136                    ?SKIP({unsupported_encryption, Reason});
2137                yes ->
2138                    ok
2139            end;
2140        {error, Reason} ->
2141            ?SKIP({failed_starting_crypto, Reason})
2142    end,
2143
2144    ConfDir = ?config(manager_conf_dir, Conf),
2145    DbDir   = ?config(manager_db_dir, Conf),
2146
2147    Opts = [{versions, [v3]},
2148	    {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
2149
2150    %% --
2151    ?IPRINT("write manager config file"),
2152    write_manager_conf(ConfDir),
2153
2154    %% --
2155    ?IPRINT("write usm user config file"),
2156    SecEngineID = "loctzp's engine",
2157    SecName1    = "samu_auth1",
2158    UserName1   = SecName1,
2159    UsmUser1 = {"\"" ++ SecEngineID ++ "\"",
2160		"\"" ++ UserName1 ++ "\"",
2161		"\"" ++ SecName1 ++ "\"",
2162		"usmHMACMD5AuthProtocol", "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]",
2163		"usmNoPrivProtocol", "[]"},
2164
2165    SecName2    = "samu_auth2",
2166    UserName2   = "samu",
2167    UsmUser2 = {"\"" ++ SecEngineID ++ "\"",
2168		"\"" ++ UserName2 ++ "\"",
2169		"\"" ++ SecName2 ++ "\"",
2170		"usmHMACMD5AuthProtocol", "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]",
2171		"usmNoPrivProtocol", "[]"},
2172    write_usm_conf(ConfDir, [UsmUser1, UsmUser2]),
2173
2174    %% --
2175    ?IPRINT("start the config process"),
2176    ?line {ok, _Pid} = config_start(Opts),
2177
2178    %% --
2179    ?IPRINT("lookup 1 (ok)"),
2180    ?line {ok, #usm_user{name = UserName1} = User1} =
2181	snmpm_config:get_usm_user_from_sec_name(SecEngineID, SecName1),
2182    ?IPRINT("User: ~p", [User1]),
2183
2184    ?IPRINT("lookup 2 (ok)"),
2185    ?line {ok, #usm_user{name = UserName2} = User2} =
2186	snmpm_config:get_usm_user_from_sec_name(SecEngineID, SecName2),
2187    ?IPRINT("User: ~p", [User2]),
2188
2189    ?IPRINT("lookup 3 (error)"),
2190    ?line {error, not_found} =
2191	snmpm_config:get_usm_user_from_sec_name(SecEngineID, SecName2 ++ "_1"),
2192
2193    %% --
2194    ?IPRINT("stop config process"),
2195    ?line ok = snmpm_config:stop(),
2196    config_ensure_not_running(),
2197
2198    %% --
2199    ?IPRINT("done"),
2200    ok.
2201
2202
2203%%
2204%% ---
2205%%
2206
2207register_usm_user_using_function(suite) -> [];
2208register_usm_user_using_function(doc) ->
2209    "Register usm user using the API (function).";
2210register_usm_user_using_function(Conf) when is_list(Conf) ->
2211    put(tname, "REG-USM-USER-USING-FUNC"),
2212    ?IPRINT("start"),
2213    process_flag(trap_exit, true),
2214
2215    case ?CRYPTO_START() of
2216        ok ->
2217            case ?CRYPTO_SUPPORT() of
2218                {no, Reason} ->
2219                    ?SKIP({unsupported_encryption, Reason});
2220                yes ->
2221                    ok
2222            end;
2223        {error, Reason} ->
2224            ?SKIP({failed_starting_crypto, Reason})
2225    end,
2226
2227    ConfDir = ?config(manager_conf_dir, Conf),
2228    DbDir = ?config(manager_db_dir, Conf),
2229
2230    Opts = [{versions, [v3]},
2231	    {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
2232
2233    %% --
2234    ?IPRINT("write manager config file"),
2235    write_manager_conf(ConfDir),
2236
2237    %% --
2238    ?IPRINT("start the config process"),
2239    ?line {ok, _Pid} = config_start(Opts),
2240
2241    %% --
2242    ?IPRINT("register usm user's"),
2243    EngineID   = "loctzp's engine",
2244
2245    ?IPRINT("register user 1 (ok)"),
2246    UserName1  = "samu_auth1",
2247    SecName1   = UserName1,
2248    UsmConfig1 = [{sec_name, SecName1},
2249		  {auth,     usmHMACMD5AuthProtocol},
2250		  {auth_key, [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]},
2251		  {priv,     usmNoPrivProtocol}],
2252    ?line ok = snmpm_config:register_usm_user(EngineID, UserName1, UsmConfig1),
2253    ?IPRINT("try register user 1 again (error)"),
2254    ?line {error, {already_registered, EngineID, UserName1}} =
2255	snmpm_config:register_usm_user(EngineID, UserName1, UsmConfig1),
2256
2257    ?IPRINT("register user 2 (ok)"),
2258    UserName2  = "samu_auth2",
2259    SecName2   = UserName2,
2260    UsmConfig2 = [{auth,     usmHMACMD5AuthProtocol},
2261		  {auth_key, [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]},
2262		  {priv,     usmNoPrivProtocol}],
2263    ?line ok = snmpm_config:register_usm_user(EngineID, UserName2, UsmConfig2),
2264
2265    ?IPRINT("register user 3 (ok)"),
2266    UserName3  = "samu3",
2267    SecName3   = "samu_auth3",
2268    UsmConfig3 = [{sec_name, SecName3},
2269		  {auth,     usmHMACMD5AuthProtocol},
2270		  {auth_key, [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]},
2271		  {priv,     usmNoPrivProtocol}],
2272    ?line ok = snmpm_config:register_usm_user(EngineID, UserName3, UsmConfig3),
2273
2274    ?IPRINT("lookup 1 (ok)"),
2275    ?line {ok, #usm_user{name = UserName1} = User1} =
2276	snmpm_config:get_usm_user_from_sec_name(EngineID, SecName1),
2277    ?IPRINT("User: ~p", [User1]),
2278
2279    ?IPRINT("lookup 2 (ok)"),
2280    ?line {ok, #usm_user{name = UserName2} = User2} =
2281	snmpm_config:get_usm_user_from_sec_name(EngineID, SecName2),
2282    ?IPRINT("User: ~p", [User2]),
2283
2284    ?IPRINT("lookup 3 (ok)"),
2285    ?line {ok, #usm_user{name = UserName3} = User3} =
2286	snmpm_config:get_usm_user_from_sec_name(EngineID, SecName3),
2287    ?IPRINT("User: ~p", [User3]),
2288
2289    ?IPRINT("lookup 4 (error)"),
2290    ?line {error, not_found} =
2291	snmpm_config:get_usm_user_from_sec_name(EngineID, SecName3 ++ "_1"),
2292
2293    %% --
2294    ?IPRINT("stop config process"),
2295    ?line ok = snmpm_config:stop(),
2296    config_ensure_not_running(),
2297
2298    %% --
2299    ?IPRINT("done"),
2300    ok.
2301
2302
2303%%
2304%% ---
2305%%
2306
2307register_usm_user_failed_using_function1(suite) -> [];
2308register_usm_user_failed_using_function1(doc) ->
2309    "Register usm user failed using incorrect arguments to API (function).";
2310register_usm_user_failed_using_function1(Conf) when is_list(Conf) ->
2311    put(tname, "REG-USM-USER-FAIL-USING-FUNC"),
2312    ?IPRINT("start"),
2313    process_flag(trap_exit, true),
2314
2315    case ?CRYPTO_START() of
2316        ok ->
2317            case ?CRYPTO_SUPPORT() of
2318                {no, Reason} ->
2319                    ?SKIP({unsupported_encryption, Reason});
2320                yes ->
2321                    ok
2322            end;
2323        {error, Reason} ->
2324            ?SKIP({failed_starting_crypto, Reason})
2325    end,
2326
2327    _ConfDir = ?config(manager_conf_dir, Conf),
2328    _DbDir = ?config(manager_db_dir, Conf),
2329    ?SKIP(not_yet_implemented).
2330
2331
2332%%
2333%% ---
2334%%
2335
2336update_usm_user_info(suite) -> [];
2337update_usm_user_info(doc) ->
2338    "Update usm user info.";
2339update_usm_user_info(Conf) when is_list(Conf) ->
2340    put(tname, "UPD-USM-USER-INFO"),
2341    ?IPRINT("start"),
2342    process_flag(trap_exit, true),
2343
2344    case ?CRYPTO_START() of
2345        ok ->
2346            case ?CRYPTO_SUPPORT() of
2347                {no, Reason} ->
2348                    ?SKIP({unsupported_encryption, Reason});
2349                yes ->
2350                    ok
2351            end;
2352        {error, Reason} ->
2353            ?SKIP({failed_starting_crypto, Reason})
2354    end,
2355
2356    _ConfDir = ?config(manager_conf_dir, Conf),
2357    _DbDir = ?config(manager_db_dir, Conf),
2358    ?SKIP(not_yet_implemented).
2359
2360
2361%%
2362%% ---
2363%%
2364
2365
2366
2367%%
2368%% ---
2369%%
2370
2371create_and_increment(suite) -> [];
2372create_and_increment(doc) ->
2373    "Craete and increment counters.";
2374create_and_increment(Conf) when is_list(Conf) ->
2375    put(tname, "CRE-AND-INC"),
2376    ?IPRINT("start"),
2377    process_flag(trap_exit, true),
2378
2379    ConfDir = ?config(manager_conf_dir, Conf),
2380    DbDir = ?config(manager_db_dir, Conf),
2381
2382    write_manager_conf(ConfDir),
2383
2384    Opts = [{versions, [v1]},
2385	    {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
2386
2387    ?line {ok, _Pid} = snmpm_config:start_link(Opts),
2388
2389    %% Random init
2390    ?SNMP_RAND_SEED(),
2391
2392    StartVal = rand:uniform(2147483647),
2393    IncVal   = 42,
2394    EndVal   = StartVal + IncVal,
2395
2396    ?line StartVal = snmpm_config:cre_counter(test_id, StartVal),
2397    ?line EndVal   = snmpm_config:incr_counter(test_id, IncVal),
2398
2399    ?line ok = snmpm_config:stop(),
2400    config_ensure_not_running(),
2401    ok.
2402
2403
2404%%
2405%% ---
2406%%
2407
2408
2409
2410%%
2411%% ---
2412%%
2413
2414stats_create_and_increment(suite) -> [];
2415stats_create_and_increment(doc) ->
2416    "Create and increment statistics counters.";
2417stats_create_and_increment(Conf) when is_list(Conf) ->
2418    put(tname, "STATS-CRE-AND-INC"),
2419    ?IPRINT("start"),
2420    process_flag(trap_exit, true),
2421
2422    ConfDir = ?config(manager_conf_dir, Conf),
2423    DbDir = ?config(manager_db_dir, Conf),
2424
2425    write_manager_conf(ConfDir),
2426
2427    Opts = [{versions, [v1]},
2428	    {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
2429
2430    ?line {ok, _Pid} = snmpm_config:start_link(Opts),
2431
2432    ?IPRINT("stats table (1): ~p", [ets:tab2list(snmpm_stats_table)]),
2433    ?line 0  = snmpm_config:maybe_cre_stats_counter(stats1, 0),
2434    ?IPRINT("stats table (2): ~p", [ets:tab2list(snmpm_stats_table)]),
2435    ?line ok = snmpm_config:maybe_cre_stats_counter(stats1, 0),
2436    ?IPRINT("stats table (3): ~p", [ets:tab2list(snmpm_stats_table)]),
2437    ?line 1  = snmpm_config:maybe_cre_stats_counter(stats2, 1),
2438    ?IPRINT("stats table (4): ~p", [ets:tab2list(snmpm_stats_table)]),
2439    ?line 10 = snmpm_config:cre_stats_counter(stats3, 10),
2440    ?IPRINT("stats table (5): ~p", [ets:tab2list(snmpm_stats_table)]),
2441
2442    Stats1Inc = fun() -> snmpm_config:incr_stats_counter(stats1, 1) end,
2443    ?line 10 = loop(10, -1, Stats1Inc),
2444    ?IPRINT("stats table (6): ~p", [ets:tab2list(snmpm_stats_table)]),
2445
2446    ?line ok = snmpm_config:reset_stats_counter(stats1),
2447
2448    ?line 10 = loop(10, -1, Stats1Inc),
2449
2450    ?line ok = snmpm_config:stop(),
2451    config_ensure_not_running(),
2452    ok.
2453
2454
2455loop(0, Acc, _) ->
2456    Acc;
2457loop(N, _, F) when (N > 0) andalso is_function(F) ->
2458    Acc = F(),
2459    loop(N-1, Acc, F).
2460
2461
2462%%======================================================================
2463%% Ticket test-cases
2464%%======================================================================
2465
2466
2467
2468otp_7219(suite) ->
2469    [];
2470otp_7219(doc) ->
2471    "Test-case for ticket OTP-7219";
2472otp_7219(Config) when is_list(Config) ->
2473    put(tname, "OTP-7219"),
2474    ?IPRINT("start"),
2475    process_flag(trap_exit, true),
2476
2477    ConfDir = ?config(manager_conf_dir, Config),
2478    DbDir   = ?config(manager_db_dir, Config),
2479
2480    ?IPRINT("write manager configuration"),
2481    write_manager_conf(ConfDir),
2482
2483    Opts1 = [{versions, [v1]},
2484	     {inform_request_behaviour, user},
2485	     {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
2486
2487    ?IPRINT("start manager config"),
2488    ?line {ok, _Pid1} = snmpm_config:start_link(Opts1),
2489
2490    ?IPRINT("get some manager config"),
2491    {ok, {user, _}} = snmpm_config:system_info(net_if_irb),
2492
2493    ?IPRINT("stop manager config"),
2494    ?line ok = snmpm_config:stop(),
2495    config_ensure_not_running(),
2496
2497    IRB_TO = 15322,
2498    Opts2 = [{versions, [v1]},
2499	     {inform_request_behaviour, {user, IRB_TO}},
2500	     {config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
2501
2502    ?IPRINT("start manager config"),
2503    ?line {ok, _Pid2} = snmpm_config:start_link(Opts2),
2504
2505    ?IPRINT("get some manager config"),
2506    {ok, {user, IRB_TO}} = snmpm_config:system_info(net_if_irb),
2507
2508    ?IPRINT("stop manager config"),
2509    ?line ok = snmpm_config:stop(),
2510    config_ensure_not_running(),
2511
2512    ?IPRINT("done"),
2513    ok.
2514
2515
2516
2517
2518otp_8395_1(suite) -> [];
2519otp_8395_1(doc) ->
2520    "OTP-8395(1)";
2521otp_8395_1(Conf) when is_list(Conf) ->
2522    put(tname, "OTP-8395-1"),
2523    ?IPRINT("start"),
2524    process_flag(trap_exit, true),
2525    otp8395(Conf, false, ok),
2526    ok.
2527
2528otp_8395_2(suite) -> [];
2529otp_8395_2(doc) ->
2530    "OTP-8395(2)";
2531otp_8395_2(Conf) when is_list(Conf) ->
2532    put(tname, "OTP-8395-2"),
2533    ?IPRINT("start"),
2534    process_flag(trap_exit, true),
2535    otp8395(Conf, true, ok),
2536    ok.
2537
2538otp_8395_3(suite) -> [];
2539otp_8395_3(doc) ->
2540    "OTP-8395(3)";
2541otp_8395_3(Conf) when is_list(Conf) ->
2542    put(tname, "OTP-8395-3"),
2543    ?IPRINT("start"),
2544    process_flag(trap_exit, true),
2545    otp8395(Conf, gurka, error),
2546    ok.
2547
2548otp8395(Conf, SeqNoVal, Expect) ->
2549    ConfDir   = ?config(manager_conf_dir, Conf),
2550    DbDir     = ?config(manager_db_dir, Conf),
2551    LogDir    = ?config(manager_log_dir, Conf),
2552    StdMibDir = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
2553
2554    write_manager_conf(ConfDir),
2555
2556    %% Third set of options (no versions):
2557    ?IPRINT("all options"),
2558    NetIfOpts  = [{module,    snmpm_net_if},
2559		  {verbosity, trace},
2560		  {options,   [{recbuf,   30000},
2561			       {bind_to,  false},
2562			       {no_reuse, false}]}],
2563    ServerOpts = [{timeout, 10000}, {verbosity, trace}],
2564    NoteStoreOpts = [{timeout, 20000}, {verbosity, trace}],
2565    ConfigOpts = [{dir, ConfDir}, {verbosity, trace}, {db_dir, DbDir}],
2566    Mibs = [join(StdMibDir, "SNMP-NOTIFICATION-MIB"),
2567	    join(StdMibDir, "SNMP-USER-BASED-SM-MIB")],
2568    Prio = normal,
2569    ATL  = [{type,   read_write},
2570	    {dir,    LogDir},
2571	    {size,   {10,10240}},
2572	    {repair, true},
2573	    {seqno,  SeqNoVal}],
2574    Vsns = [v1,v2,v3],
2575    Opts = [{config,          ConfigOpts},
2576	    {net_if,          NetIfOpts},
2577	    {server,          ServerOpts},
2578	    {note_store,      NoteStoreOpts},
2579	    {audit_trail_log, ATL},
2580	    {priority,        Prio},
2581	    {mibs,            Mibs},
2582	    {versions,        Vsns}],
2583
2584    case config_start(Opts) of
2585	{ok, _Pid} when (Expect =:= ok) ->
2586	    ?line ok = config_stop(),
2587	    ok;
2588	{ok, _Pid} when (Expect =/= ok) ->
2589	    config_stop(),
2590	    exit({unexpected_started_config, SeqNoVal});
2591	_Error when (Expect =/= ok) ->
2592	    ok;
2593	Error when (Expect =:= ok) ->
2594	    exit({unexpected_failed_starting_config, SeqNoVal, Error})
2595    end,
2596    ?IPRINT("done"),
2597    ok.
2598
2599
2600otp_8395_4(suite) -> [];
2601otp_8395_4(doc) ->
2602    "OTP-8395(4)";
2603otp_8395_4(Conf) when is_list(Conf) ->
2604    put(tname, "OTP-8395-4"),
2605    ?IPRINT("start"),
2606    process_flag(trap_exit, true),
2607
2608    snmp:print_version_info(),
2609
2610    ConfDir   = ?config(manager_conf_dir, Conf),
2611    DbDir     = ?config(manager_db_dir, Conf),
2612    LogDir    = ?config(manager_log_dir, Conf),
2613    StdMibDir = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
2614
2615    write_manager_conf(ConfDir),
2616
2617    %% Third set of options (no versions):
2618    ?IPRINT("all options"),
2619    NetIfOpts  = [{module,    snmpm_net_if},
2620		  {verbosity, trace},
2621		  {options,   [{recbuf,   30000},
2622			       {bind_to,  false},
2623			       {no_reuse, false}]}],
2624    ServerOpts = [{timeout, 10000}, {verbosity, trace}],
2625    NoteStoreOpts = [{timeout, 20000}, {verbosity, trace}],
2626    ConfigOpts = [{dir, ConfDir}, {verbosity, trace}, {db_dir, DbDir}],
2627    Mibs = [join(StdMibDir, "SNMP-NOTIFICATION-MIB"),
2628	    join(StdMibDir, "SNMP-USER-BASED-SM-MIB")],
2629    Prio = normal,
2630    ATL  = [{type,   read_write},
2631	    {dir,    LogDir},
2632	    {size,   {10,10240}},
2633	    {repair, true},
2634	    {seqno,  true}],
2635    Vsns = [v1,v2,v3],
2636    Opts = [{config,          ConfigOpts},
2637	    {net_if,          NetIfOpts},
2638	    {server,          ServerOpts},
2639	    {note_store,      NoteStoreOpts},
2640	    {audit_trail_log, ATL},
2641	    {priority,        Prio},
2642	    {mibs,            Mibs},
2643	    {versions,        Vsns}],
2644
2645    ?line {ok, _Pid} = config_start(Opts),
2646
2647    Counter   = otp_8395_4,
2648    Initial   = 10,
2649    Increment = 2,
2650    Max       = 20,
2651
2652    %% At this call the counter does *not* exist. The call creates
2653    %% it with the initial value!
2654
2655    Val1 = Initial,
2656    Val1 = otp8395_incr_counter(Counter, Initial, Increment, Max),
2657
2658    %% Now it exist, make sure another call does the expected increment
2659
2660    Val2 = Initial + Increment,
2661    Val2 = otp8395_incr_counter(Counter, Initial, Increment, Max),
2662
2663    ?line ok = config_stop(),
2664
2665    ?IPRINT("done"),
2666    ok.
2667
2668
2669otp8395_incr_counter(Counter, Initial, Increment, Max) ->
2670    snmpm_config:increment_counter(Counter, Initial, Increment, Max).
2671
2672
2673%%======================================================================
2674%% Internal functions
2675%%======================================================================
2676
2677config_start(Opts) ->
2678    (catch snmpm_config:start_link(Opts)).
2679
2680config_stop() ->
2681    (catch snmpm_config:stop()).
2682
2683config_ensure_not_running() ->
2684    ?ENSURE_NOT_RUNNING(snmpm_config,
2685                        fun() -> snmpm_config:stop() end,
2686                        1000).
2687
2688
2689%% ------
2690
2691join(Dir, File) ->
2692    filename:join(Dir, File).
2693
2694
2695%% ------
2696
2697write_manager_conf(Dir) ->
2698    Port = "5000",
2699    MMS  = "484",
2700    EngineID = "\"mgrEngine\"",
2701    Str = lists:flatten(
2702	    io_lib:format("%% Minimum manager config file\n"
2703			  "{port,             ~s}.\n"
2704			  "{max_message_size, ~s}.\n"
2705			  "{engine_id,        ~s}.\n",
2706			  [Port, MMS, EngineID])),
2707    write_manager_conf(Dir, Str).
2708
2709write_manager_conf(Dir, IP, Port, MMS, EngineID) ->
2710    Str = lists:flatten(
2711	    io_lib:format("{address,          ~s}.\n"
2712			  "{port,             ~s}.\n"
2713			  "{max_message_size, ~s}.\n"
2714			  "{engine_id,        ~s}.\n",
2715			  [IP, Port, MMS, EngineID])),
2716    write_manager_conf(Dir, Str).
2717
2718write_manager_conf(Dir, Str) ->
2719    write_conf_file(Dir, "manager.conf", Str).
2720
2721
2722write_users_conf(Dir, Users) ->
2723    F = fun({UserId, UserMod, UserData}) -> %% Old format
2724		lists:flatten(
2725		  io_lib:format("{~s, ~s, ~s, ~s}.~n",
2726				[UserId, UserMod, UserData, "[]"]));
2727	   ({UserId, UserMod, UserData, DefaultAgentConfig}) -> %% New format
2728		lists:flatten(
2729		  io_lib:format("{~s, ~s, ~s, ~s}.~n",
2730				[UserId, UserMod, UserData, DefaultAgentConfig]))
2731	end,
2732    Str = lists:flatten([F(User) || User <- Users]),
2733    write_conf_file(Dir, "users.conf", Str).
2734
2735write_users_conf2(Dir, Str) ->
2736    write_conf_file(Dir, "users.conf", Str).
2737
2738
2739write_agents_conf(Dir, Agents) ->
2740    F = fun({UserId,
2741	     TargetName, Comm,
2742	     Ip, Port, EngineID,
2743	     Timeout, MMS,
2744	     Version, SecModel, SecName, SecLevel}) ->
2745		lists:flatten(
2746		  io_lib:format("{~s, ~n"
2747				" ~s, ~s, ~n"
2748				" ~s, ~s, ~s, ~n"
2749				" ~s, ~s, ~n"
2750				" ~s, ~s, ~s, ~s}.~n",
2751				[UserId,
2752				 TargetName, Comm,
2753				 Ip, Port, EngineID,
2754				 Timeout, MMS,
2755				 Version, SecModel, SecName, SecLevel]))
2756	end,
2757    Str = lists:flatten([F(Agent) || Agent <- Agents]),
2758    write_conf_file(Dir, "agents.conf", Str).
2759
2760write_agents_conf2(Dir, Str) ->
2761    write_conf_file(Dir, "agents.conf", Str).
2762
2763
2764write_usm_conf(Dir, Usms) ->
2765    F = fun({EngineID, UserName, SecName, AuthP, AuthKey, PrivP, PrivKey}) ->
2766		lists:flatten(
2767		  io_lib:format("{~s, ~s, ~s, ~n"
2768				" ~s, ~s, ~n"
2769				" ~s, ~s}.~n",
2770				[EngineID, UserName, SecName,
2771				 AuthP, AuthKey,
2772				 PrivP, PrivKey]));
2773	   ({EngineID, UserName, AuthP, AuthKey, PrivP, PrivKey}) ->
2774		lists:flatten(
2775		  io_lib:format("{~s, ~s, ~n"
2776				" ~s, ~s, ~n"
2777				" ~s, ~s}.~n",
2778				[EngineID, UserName,
2779				 AuthP, AuthKey,
2780				 PrivP, PrivKey]));
2781	   (Usm) ->
2782		exit({invalid_usm, Usm})
2783	end,
2784    Str = lists:flatten([F(Usm) || Usm <- Usms]),
2785    write_conf_file(Dir, "usm.conf", Str).
2786
2787write_usm_conf2(Dir, Str) ->
2788    write_conf_file(Dir, "usm.conf", Str).
2789
2790
2791write_conf_file(Dir, File, Str) ->
2792    case file:open(filename:join(Dir, File), write) of
2793	{ok, Fd} ->
2794	    ?line ok = io:format(Fd, "~s", [Str]),
2795	    file:close(Fd);
2796	{error, Reason} ->
2797	    Info =
2798		[{dir, Dir, case (catch file:read_file_info(Dir)) of
2799				{ok, FI} ->
2800				    FI;
2801				_ ->
2802				    undefined
2803			    end},
2804		 {file, File}],
2805	    exit({failed_writing_conf_file, Info, Reason})
2806    end.
2807
2808
2809maybe_start_crypto() ->
2810    case (catch crypto:version()) of
2811	{'EXIT', {undef, _}} ->
2812	    %% This is the version of crypto before the NIFs...
2813	    ?CRYPTO_START();
2814	_ ->
2815	    %% No need to start this version of crypto..
2816	    ok
2817    end.
2818
2819maybe_stop_crypto() ->
2820    case (catch crypto:version()) of
2821	{'EXIT', {undef, _}} ->
2822	    %% This is the version of crypto before the NIFs...
2823	    crypto:stop();
2824	_ ->
2825	    %% There is nothing to stop in this version of crypto..
2826	    ok
2827    end.
2828
2829
2830%% ------
2831
2832verify_dir_existing(DirName, Dir) ->
2833    case file:read_file_info(Dir) of
2834	{ok, _} ->
2835	    ok;
2836	{error, Reason} ->
2837	    exit({non_existing_dir, DirName, Dir, Reason})
2838    end.
2839
2840
2841%% ------
2842
2843str(X) ->
2844    ?F("~w", [X]).
2845
2846