%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2014-2015. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%
-module(msacc_SUITE).
-include_lib("common_test/include/ct.hrl").
%% Test server callbacks
-export([suite/0, all/0]).
%% Test cases
-export([
%% API-test
api_file/1,
api_start_stop/1,
api_timer/1,
api_print/1
]).
%%--------------------------------------------------------------------
%% COMMON TEST CALLBACK FUNCTIONS
%%--------------------------------------------------------------------
all() ->
[
api_start_stop,
api_file,
api_timer,
api_print
].
suite() -> [
{timetrap,{minutes,1}},
{ct_hooks,[ts_install_cth]}
].
%%--------------------------------------------------------------------
%% TEST CASES
%%--------------------------------------------------------------------
api_timer(_Config) ->
%% Run msacc for about 100ms
msacc:start(100),
%% Verify that scheduler 1 executed+slept for about 100ms
[Sched1] = [S || S = #{ type := scheduler, id := 1 } <- msacc:stats()],
#{ counters := Cnt } = Sched1,
%% Time should be in us
Time = maps:fold(fun(_,V,Acc) -> V + Acc end, 0, Cnt),
if Time < 120000 andalso Time > 80000 -> ok;
true -> ct:fail({inaccurate_time, Time, msacc:stats()})
end.
%% We just do a basic check that none of the apis crash
api_start_stop(_Config) ->
msacc:start(),
timer:sleep(100),
msacc:stop(),
Runtime = msacc:stats(system_runtime, msacc:stats()),
Realtime = msacc:stats(system_realtime, msacc:stats()),
true = Runtime < Realtime,
RuntimeCnt = msacc:stats(runtime, msacc:stats()),
RealtimeCnt = msacc:stats(realtime, msacc:stats()),
TypeCnt = msacc:stats(type, msacc:stats()),
%% These should be very similar
RuntimeTypeCnt = msacc:stats(type, RuntimeCnt),
TypeRuntimeCnt = msacc:stats(runtime, TypeCnt),
lists:map(fun({#{ system := T1 },#{ system := T2}}) ->
if T1-0.5 < T2 orelse T1+0.5 > T2 -> ok;
true -> ct:fail({inaccurate_stats, RuntimeTypeCnt,
TypeRuntimeCnt})
end
end, lists:zip(RuntimeTypeCnt, TypeRuntimeCnt)),
%% These should be very similar
RealtimeTypeCnt = msacc:stats(type, RealtimeCnt),
TypeRealtimeCnt = msacc:stats(realtime, TypeCnt),
lists:map(fun({#{ system := T1 },#{ system := T2}}) ->
if T1-0.5 < T2 orelse T1+0.5 > T2 -> ok;
true -> ct:fail({inaccurate_stats, RealtimeTypeCnt,
TypeRealtimeCnt})
end
end,lists:zip(RealtimeTypeCnt, TypeRealtimeCnt)),
msacc:reset().
api_file(Config) ->
PrivDir = proplists:get_value(priv_dir, Config),
File = filename:join(PrivDir, "msacc.stats"),
Stats = msacc:stats(),
ok = msacc:to_file(File),
Stats = msacc:from_file(File),
PrintFile = filename:join(PrivDir, "msacc.txt"),
msacc:print(PrintFile, Stats, #{}).
%% We just check that it is possible to print in a couple of different ways
api_print(_Config) ->
msacc:start(100),
io:format("msacc:print(msacc:stats()).~n"),
msacc:print(msacc:stats()),
io:format("msacc:print(msacc:stats(),#{ system => true }).~n"),
msacc:print(msacc:stats(), #{ system => true }),
io:format("msacc:print(msacc:stats(runtime,msacc:stats())).~n"),
msacc:print(msacc:stats(runtime, msacc:stats())),
io:format("msacc:print(msacc:stats(type,msacc:stats())).~n"),
msacc:print(msacc:stats(type, msacc:stats())),
io:format("msacc:print(msacc:stats(realtime,msacc:stats())).~n"),
msacc:print(msacc:stats(realtime, msacc:stats())),
io:format("msacc:stats(type,msacc:stats(runtime,msacc:stats())).~n"),
msacc:print(msacc:stats(type, msacc:stats(runtime, msacc:stats()))).