%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2018. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%
%%
-module(scheduler_SUITE).
-export([suite/0, all/0]).
%% Test cases
-export([basic/1]).
all() -> [basic].
suite() -> [{ct_hooks,[ts_install_cth]}].
basic(_Config) ->
S1 = scheduler:sample(),
S2 = scheduler:sample_all(),
check(scheduler:utilization(1)),
check(scheduler:utilization(S1)),
check(scheduler:utilization(S2)),
check(scheduler:utilization(S1, scheduler:sample())),
check(scheduler:utilization(S2, scheduler:sample())),
S3 = scheduler:sample_all(),
U13 = scheduler:utilization(S1, S3),
U13 = scheduler:utilization(S1, remove_io(S3)),
check(U13),
U23all = scheduler:utilization(S2, S3),
check(U23all),
U23 = scheduler:utilization(S2, remove_io(S3)),
U23 = scheduler:utilization(remove_io(S2), S3),
U23 = remove_io(U23all),
check(U23),
ok.
check([{total, Tf, Ts} | List]=U) ->
io:format("\nU = ~p\n", [U]),
check_values(Tf, Ts, true),
SchdList = case hd(List) of
{weighted, Wf, Ws} ->
check_values(Wf, Ws, false),
tl(List);
_ ->
unknown = erlang:system_info(logical_processors_available),
List
end,
lists:foreach(fun({Type, Id, F, S}) when ((Type =:= normal) or (Type =:= cpu) or (Type =:= io)),
is_integer(Id) ->
check_values(F, S, true)
end,
SchdList),
ok.
check_values(F, S, Max100) ->
true = is_float(F),
true = F >= 0.0,
$% = lists:last(S),
Sf = list_to_float(lists:droplast(S)),
true = Sf >= 0.0,
true = case Max100 of
true ->
true = F =< 1.0,
true = Sf =< 100.0;
false ->
true
end,
MaxDiff = 0.055555555555555555, %% change to 0.05 when float_to_list/2 is fixed
true = abs(F*100 - Sf) =< MaxDiff,
ok.
remove_io({scheduler_wall_time_all,Lst}) ->
{scheduler_wall_time, remove_io(Lst)};
remove_io(Lst) ->
lists:filter(fun({io,_,_,_}) -> false;
(_) -> true end,
Lst).