aboutsummaryrefslogblamecommitdiffstats
path: root/lib/sasl/test/overload_SUITE.erl
blob: 02d105669830c8d012a93d418be4eb88b01dcbed (plain) (tree)
1
2
3
4
5
6
7
8
9




                                                   


                                                                   
  






                                                                           




                        
                                           





                                                                      











                                                                    
                






                                        

                                                                    
                           




                                               


                                                                    
                        







                                                              






                                                                    


                                                                    




                                         

                                                                     




                                         


                                                              




                                                 




                                                                     




                                             


                                                                    
                   


                                     
                                              
                                                



                                                                    


                                                


                                                                   


                                    





































                                                                               
%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2011. 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(overload_SUITE).
-include_lib("common_test/include/ct.hrl").

-compile(export_all).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

all() -> [info, set_config_data, set_env_vars, request, timeout].

init_per_testcase(_Case,Config) ->
    restart_sasl(),
    Config.

end_per_testcase(Case,Config) ->
    try apply(?MODULE,Case,[cleanup,Config])
    catch error:undef -> ok
    end,
    ok.

%%%-----------------------------------------------------------------
info(_Config) ->
    Info = overload:get_overload_info(),
    [{total_intensity,0.0},
     {accept_intensity,0.0},
     {max_intensity,0.8},
     {weight,0.1},
     {total_requests,0},
     {accepted_requests,0}] = Info.

%%%-----------------------------------------------------------------
set_config_data(_Config) ->
    InfoDefault = overload:get_overload_info(),
    ok = check_info(0.8,0.1,InfoDefault),
    ok = overload:set_config_data(0.5,0.4),
    Info1 = overload:get_overload_info(),
    ok = check_info(0.5,0.4,Info1),
    ok.

%%%-----------------------------------------------------------------
set_env_vars(_Config) ->
    InfoDefault = overload:get_overload_info(),
    ok = check_info(0.8,0.1,InfoDefault),
    ok = application:set_env(sasl,overload_max_intensity,0.5),
    ok = application:set_env(sasl,overload_weight,0.4),
    ok = application:stop(sasl),
    ok = application:start(sasl),
    Info1 = overload:get_overload_info(),
    ok = check_info(0.5,0.4,Info1),
    ok.
set_env_vars(cleanup,_Config) ->
    application:unset_env(sasl,overload_max_intensity),
    application:unset_env(sasl,overload_weight),
    ok.

%%%-----------------------------------------------------------------
request(_Config) ->
    %% Find number of request that can be done with default settings
    %% and no delay
    overload:set_config_data(0.8, 0.1),
    NDefault = do_many_requests(0),
    restart_sasl(),
    ?t:format("NDefault: ~p",[NDefault]),

    %% Check that the number of requests increases when max_intensity
    %% increases
    overload:set_config_data(2, 0.1),
    NLargeMI = do_many_requests(0),
    restart_sasl(),
    ?t:format("NLargeMI: ~p",[NLargeMI]),
    true = NLargeMI > NDefault,

    %% Check that the number of requests decreases when weight
    %% increases
    overload:set_config_data(0.8, 1),
    NLargeWeight = do_many_requests(0),
    restart_sasl(),
    ?t:format("NLargeWeight: ~p",[NLargeWeight]),
    true = NLargeWeight < NDefault,

    %% Check that number of requests increases when delay between
    %% requests increases.
    %% (Keeping same config and comparing to large weight in order to
    %% minimize the time needed for this case.)
    overload:set_config_data(0.8, 1),
    NLargeTime = do_many_requests(500),
    restart_sasl(),
    ?t:format("NLargeTime: ~p",[NLargeTime]),
    true = NLargeTime > NLargeWeight,
    ok.

%%%-----------------------------------------------------------------
timeout(_Config) ->
    overload:set_config_data(0.8, 1),
    _N = do_many_requests(0),

    %% Check that the overload alarm is raised
    [{overload,_}] = alarm_handler:get_alarms(),

    %% Fake a clear timeout in overload.erl and check that, since it
    %% came very soon after the overload situation, the alarm is not
    %% cleared
    overload ! timeout,
    timer:sleep(1000),
    [{overload,_}] = alarm_handler:get_alarms(),

    %% A bit later, try again and check that this time the alarm is
    %% cleared
    overload ! timeout,
    timer:sleep(1000),
    [] = alarm_handler:get_alarms(),

    ok.


%%%-----------------------------------------------------------------
%%% INTERNAL FUNCTIONS

%%%-----------------------------------------------------------------
%%% Call overload:request/0 up to 30 times with the given time delay
%%% between. Stop when 'reject' is returned.
do_many_requests(T) ->
    30 - do_requests(30,T).

do_requests(0,_) ->
    ?t:fail(never_rejected);
do_requests(N,T) ->
    case overload:request() of
	accept ->
	    timer:sleep(T),
	    do_requests(N-1,T);
	reject ->
	    N
    end.

%%%-----------------------------------------------------------------
%%% Restart the sasl application
restart_sasl() ->
    application:stop(sasl),
    application:start(sasl),
    ok.

%%%-----------------------------------------------------------------
%%% Check that max_intensity and weight is set as expected
check_info(MI,W,Info) -> 
    case {lists:keyfind(max_intensity,1,Info), lists:keyfind(weight,1,Info)} of
	{{_,MI},{_,W}} -> ok;
	_ -> ?t:fail({unexpected_info,MI,W,Info})
    end.