%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2004-2010. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%
%%----------------------------------------------------------------------
%% Purpose:
%%----------------------------------------------------------------------
-module(snmp_note_store_test).
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
-include_lib("common_test/include/ct.hrl").
-include("snmp_test_lib.hrl").
%%----------------------------------------------------------------------
%% External exports
%%----------------------------------------------------------------------
-export([
init_per_testcase/2, end_per_testcase/2,
all/0,groups/0,init_per_group/2,end_per_group/2,
start_and_stop/1,
notes/1,
info/1,
garbage_in/1
]).
%%----------------------------------------------------------------------
%% Internal exports
%%----------------------------------------------------------------------
-export([
system_start_time/0
]).
%%----------------------------------------------------------------------
%% Macros
%%----------------------------------------------------------------------
%%----------------------------------------------------------------------
%% Records
%%----------------------------------------------------------------------
%%======================================================================
%% External functions
%%======================================================================
init_per_testcase(_Case, Config) when is_list(Config) ->
Config.
end_per_testcase(_Case, Config) when is_list(Config) ->
Config.
%%======================================================================
%% Test case definitions
%%======================================================================
all() ->
[start_and_stop, notes, info, garbage_in].
groups() ->
[].
init_per_group(_GroupName, Config) ->
Config.
end_per_group(_GroupName, Config) ->
Config.
%%======================================================================
%% Test functions
%%======================================================================
%%======================================================================
start_and_stop(suite) ->
[];
start_and_stop(doc) ->
["Simple start and stop."];
start_and_stop(Config) when is_list(Config) ->
Prio = normal,
Mod = ?MODULE,
Opts = [{verbosity, trace}],
{ok, Pid} = snmp_note_store:start_link(Prio, Mod, Opts),
snmp_note_store:stop(Pid),
ok.
%%======================================================================
notes(suite) ->
[];
notes(doc) ->
["Testing that it does what it is actually supposed to do, "
"namilly to handle notes. "];
notes(Config) when is_list(Config) ->
{ok, Handler, Pid} = note_store_handler_start(),
io:format("sleep some before we begin the tests~n", []),
?SLEEP(timer:seconds(1)),
%% Default lifetime is infinity. A note with lifetime
%% infinity is permanent
io:format("create permanent note sune~n", []),
true = snmp_note_store:set_note(Pid, sune, 10),
10 = snmp_note_store:get_note(Pid, sune),
10 = snmp_note_store:get_note(Pid, sune),
%% Lifetime is in 1/100 sec ticks, so 500 equals 5 seconds
io:format("create 5 sec note kalle~n", []),
true = snmp_note_store:set_note(Pid, 500, kalle, hobbe),
io:format("wait 1 sec~n", []),
?SLEEP(timer:seconds(1)),
io:format("get note kalle~n", []),
hobbe = snmp_note_store:get_note(Pid, kalle),
io:format("wait 5 sec~n", []),
?SLEEP(timer:seconds(5)),
io:format("get note kalle again (now it should not exist)~n", []),
undefined = snmp_note_store:get_note(Pid, kalle),
io:format("create 5 sec note kalle~n", []),
true = snmp_note_store:set_note(Pid, 500, kalle, hobbe),
io:format("wait 6 sec (to allow timer to clean up note)~n", []),
?SLEEP(timer:seconds(6)),
io:format("get note kalle - should not exist~n", []),
undefined = snmp_note_store:get_note(Pid, kalle),
io:format("read the permanent note sune again~n", []),
10 = snmp_note_store:get_note(Pid, sune),
note_store_handler_stop(Handler),
ok.
%%======================================================================
info(suite) ->
[];
info(doc) ->
["Testing that we can retreive process info."];
info(Config) when is_list(Config) ->
Prio = normal,
Mod = ?MODULE,
Opts = [{verbosity, trace}],
{ok, Pid} = snmp_note_store:start_link(Prio, Mod, Opts),
%% Get the info:
Info = snmp_note_store:info(Pid),
io:format("Info: ~p~n", [Info]),
%% Verify content
io:format("get process memory~n", []),
{value, {process_memory, ProcMem}} =
lists:keysearch(process_memory, 1, Info),
io:format("get notes process memory~n", []),
{value, {notes, NotesProcMem}} =
lists:keysearch(notes, 1, ProcMem),
io:format("verify notes process memory~n", []),
if
is_integer(NotesProcMem) andalso (NotesProcMem > 0) ->
ok;
true ->
throw({error, {bad_notes_proc_memery, NotesProcMem}})
end,
io:format("get timer process memory~n", []),
{value, {timer, TmrProcMem}} =
lists:keysearch(timer, 1, ProcMem),
io:format("verify timer process memory~n", []),
if
is_integer(TmrProcMem) andalso (TmrProcMem > 0) ->
ok;
true ->
throw({error, {bad_timer_proc_memery, TmrProcMem}})
end,
io:format("get db memory~n", []),
{value, {db_memory, DbMem}} =
lists:keysearch(db_memory, 1, Info),
io:format("get notes db memory~n", []),
{value, {notes, NotesDbMem}} =
lists:keysearch(notes, 1, DbMem),
io:format("verify notes db memory~n", []),
if
is_integer(NotesDbMem) andalso (NotesDbMem > 0) ->
ok;
true ->
throw({error, {bad_notes_db_memery, NotesDbMem}})
end,
snmp_note_store:stop(Pid),
ok.
%%======================================================================
garbage_in(suite) ->
[];
garbage_in(doc) ->
["Test that the process handles garbage sent to it."];
garbage_in(Config) when is_list(Config) ->
io:format("start note_store server~n", []),
Prio = normal,
Mod = ?MODULE,
Opts = [{verbosity, trace}],
{ok, Pid} = snmp_note_store:start_link(Prio, Mod, Opts),
io:format("issue bad request~n", []),
{error, _} = gen_server:call(Pid, bad_request),
io:format("cast bad message~n", []),
gen_server:cast(Pid, bad_message),
io:format("bang bad info~n", []),
Pid ! bad_info,
io:format("verify note_Store server still alive and kicking~n", []),
Info = snmp_note_store:info(Pid),
if
is_list(Info) andalso (length(Info) > 0) ->
ok;
true ->
throw({error, {bad_info, Info}})
end,
io:format("stop note_store server~n", []),
snmp_note_store:stop(Pid),
io:format("done~n", []),
ok.
%%======================================================================
%% Internal functions
%%======================================================================
system_start_time() ->
note_store_handler ! {system_start_time, self()},
receive
{system_start_time, SysStartTime} ->
SysStartTime
end.
note_store_handler_start() ->
Self = self(),
Fun = fun() -> note_store_handler(Self) end,
HandlerPid = spawn_link(Fun),
receive
{started, HandlerPid, NSPid} ->
{ok, HandlerPid, NSPid}
after 5000 ->
exit(HandlerPid, kill),
{error, timeout}
end.
note_store_handler_stop(Pid) ->
Pid ! {stop, self()},
receive
{stopped, Pid} ->
ok
after 5000 ->
exit(Pid, kill),
{error, timeout}
end.
note_store_handler(Parent) ->
erlang:register(note_store_handler, self()),
put(system_start_time, snmp_misc:now(cs)),
Prio = normal,
Mod = ?MODULE,
Opts = [{verbosity, trace}],
{ok, Pid} = snmp_note_store:start_link(Prio, Mod, Opts),
Parent ! {started, self(), Pid},
note_store_handler_loop(Parent, Pid).
note_store_handler_loop(Parent, NSPid) ->
receive
{stop, Parent} ->
snmp_note_store:stop(NSPid),
Parent ! {stopped, self()},
exit(normal);
{system_start_time, Pid} ->
StartTime = get(system_start_time),
Pid ! {system_start_time, StartTime},
note_store_handler_loop(Parent, NSPid)
end.