aboutsummaryrefslogblamecommitdiffstats
path: root/lib/orber/test/orber_SUITE.erl
blob: 75da31bc5f7fa42fe671c1807b2d0c741feb1ac1 (plain) (tree)
1
2
3
4
5


                   
                                                        
   










                                                                           




                     
                                           
 
                                                  


                              

                                                                    
                                                   


                                                                 




                                                        



        
                                         
 
         
                                                       

                           



            





                         
                                     
           

                                    
           
 

                                   
                                               

                             
                                  
                                              





                                     
                    
                                   

       




















                                                                        
                                             





















                                                            























                                                            
























































                                                                           
                 
 
                          
 


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

-define(default_timeout, test_server:minutes(15)).
-define(application, orber).

% Test server specific exports
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, 
	 init_per_group/2,end_per_group/2]).
-export([init_per_testcase/2, end_per_testcase/2]).

% Test cases must be exported.
-export([app_test/1, undefined_functions/1, install_load_order/1,
	 install_local_content/1, 
         otp_9887/1]).

%% Exporting error handler callbacks for use in otp_9887
-export([init/1, handle_event/2]).

%%
%% all/1
%%
suite() -> [{ct_hooks,[ts_install_cth]}].

all() -> 
    [app_test, undefined_functions, install_load_order,
     install_local_content,
     otp_9887].

groups() -> 
    [].

init_per_suite(Config) ->
    Config.

end_per_suite(_Config) ->
    ok.

init_per_group(_GroupName, Config) ->
    Config.

end_per_group(_GroupName, Config) ->
    Config.


init_per_testcase(_Case, Config) ->
    Dog=test_server:timetrap(?default_timeout),
    [{watchdog, Dog}|Config].

end_per_testcase(_Case, Config) ->
    Dog=proplists:get_value(watchdog, Config),
    test_server:timetrap_cancel(Dog),
    ok.

%
% Test cases starts here.
%
app_test(_Config) ->
    ok=test_server:app_test(orber),
    ok.

otp_9887(_Config) ->
    orber:jump_stop(),
    application:set_env(orber, orber_debug_level, 10),
    orber:jump_start([]),
    
    mnesia:create_table(orber_light_ifr, []),

    error_logger:add_report_handler(?MODULE,[self()]),
    catch orber_ifr:get_module(foo, bar),
    
    receive
	{stolen,Reason} ->
            {error,_Pid1, {_Pid2, _ErrorString, ArgumentList}} = Reason,
            5 = length(ArgumentList)
    after 500 ->
            test_server:fail("OTP_9887 TIMED OUT")
    end,

    orber:jump_stop(),
    ok.

%% Install Orber using the load_order option.
install_load_order(_Config) ->
    orber:jump_stop(),
    case catch install_load_order2() of
	ok ->
	    orber:jump_stop();
	What ->
	    orber:jump_stop(),
	    exit(What)
    end.

install_load_order2() ->
    application:load(orber),
    mnesia:start(),
    corba:orb_init([{iiop_port, 0}]),
    orber:install([node()], [{ifr_storage_type, ram_copies},
			     {load_order, 10}]),
    orber:start(),
    [H|_] = orber:get_tables(),
    10 = mnesia:table_info(H, load_order),
    ok.

%% Install Orber using the local_content option.
install_local_content(_Config) ->
    orber:jump_stop(),
    case catch install_local_content2() of
	ok ->
	    orber:jump_stop();
	What ->
	    orber:jump_stop(),
	    exit(What)
    end.

install_local_content2() ->
    application:load(orber),
    mnesia:start(),
    corba:orb_init([{iiop_port, 0}]),
    orber:install([node()], [{ifr_storage_type, ram_copies},
			     {local_content, true}]),
    orber:start(),
    [H|_] = orber:get_tables(),
    true = mnesia:table_info(H, local_content),
    ok.



%% Check for undefined functions
undefined_functions(_Config) ->
    App            = orber,
    Root           = code:root_dir(),
    LibDir         = code:lib_dir(App),
    EbinDir        = filename:join([LibDir,"ebin"]),
    AppFilePath    = filename:join([LibDir,"ebin", "orber.app"]),
    {ok, [{application,orber,AppFile}]} = file:consult(AppFilePath),
    io:format("Using ~p~n~p~n", [AppFilePath, AppFile]),
    Mods           = key1search(modules, AppFile),
    XRefTestName   = undef_funcs_make_name(App, xref_test_name),
    {ok, XRef}     = xref:start(XRefTestName),
    ok             = xref:set_default(XRef,
                                      [{verbose,false},{warnings,false}]),
    XRefName       = undef_funcs_make_name(App, xref_name),
    {ok, XRefName} = xref:add_release(XRef, Root, {name,XRefName}),
    {ok, App}      = xref:replace_application(XRef, App, EbinDir),
    {ok, Undefs}   = xref:analyze(XRef, undefined_function_calls),
    xref:stop(XRef),
    analyze_undefined_function_calls(Undefs, Mods, []).
 
analyze_undefined_function_calls([], _, []) ->
    ok;
analyze_undefined_function_calls([], _, AppUndefs) ->
    exit({suite_failed, {undefined_function_calls, AppUndefs}});
analyze_undefined_function_calls([{{Mod, _F, _A}, _C} = AppUndef|Undefs],
                                 AppModules, AppUndefs) ->
    %% Check that this module is our's
    case lists:member(Mod,AppModules) of
        true ->
            {Calling,Called} = AppUndef,
            {Mod1,Func1,Ar1} = Calling,
            {Mod2,Func2,Ar2} = Called,
            io:format("undefined function call: "
                      "~n   ~w:~w/~w calls ~w:~w/~w~n",
                      [Mod1,Func1,Ar1,Mod2,Func2,Ar2]),
            analyze_undefined_function_calls(Undefs, AppModules,
                                             [AppUndef|AppUndefs]);
        false ->
            io:format("dropping ~p~n", [Mod]),
            analyze_undefined_function_calls(Undefs, AppModules, AppUndefs)
    end.
 
%% This function is used simply to avoid cut-and-paste errors later...
undef_funcs_make_name(App, PostFix) ->
    list_to_atom(atom_to_list(App) ++ "_" ++ atom_to_list(PostFix)).

key1search(Key, L) ->
    case lists:keysearch(Key, 1, L) of
        false ->
            fail({not_found, Key, L});
        {value, {Key, Value}} ->
            Value
    end.

fail(Reason) ->
    exit({suite_failed, Reason}).

%% Error handler 

init([Proc]) -> {ok,Proc}.

handle_event(Event, Proc) -> 
    Proc ! {stolen,Event},
    {ok,Proc}.