@ -46,9 +46,11 @@ init_per_testcase(Case, Config) ->
Name = rebar_test_utils : create_random_name ( " xrefapp_ " ) ,
Vsn = rebar_test_utils : create_random_vsn ( ) ,
rebar_test_utils : create_empty_app ( AppDir , Name , Vsn , [ kernel , stdlib ] ) ,
AppModules = [ behaviour1 , behaviour2 , mymod , othermod ] ,
AppModules = [ behaviour1 , behaviour2 , mymod , othermod , ignoremod , ignoremod2 ],
[ write_src_file ( AppDir , Name , Module , ignore_xref ( Case ) ) | | Module < - AppModules ] ,
IgnoreMod = list_to_atom ( Name ++ " _ " ++ " ignoremod " ) ,
RebarConfig = [ { erl_opts , [ debug_info ] } ,
{ xref_ignores , [ IgnoreMod ] } ,
{ xref_checks , [ deprecated_function_calls , deprecated_functions ,
undefined_function_calls , undefined_functions ,
exports_not_used , locals_not_used ] } ] ,
@ -95,7 +97,6 @@ xref_undef_behaviour(Config) ->
Result = rebar3 : run ( rebar_state : new ( State , RebarConfig , AppDir ) , [ " xref " ] ) ,
verify_results ( xref_undef_behaviour , Name , Result ) .
% % == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == =
% % Helper functions
% % == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == == =
@ -162,8 +163,9 @@ verify_test_results(xref_undef_behaviour, AppName, XrefResults, _QueryResults) -
? assertNot ( lists : member ( { MyMod , bh2_b , 1 } , ExportsNotUsed ) ) ,
ok ;
verify_test_results ( xref_ignore_test , AppName , XrefResults , _ QueryResults ) - >
AppModules = [ " behaviour1 " , " behaviour2 " , " mymod " , " othermod " , " somemod " ] ,
[ _ Behaviour1Mod , _ Behaviour2Mod , _ MyMod , _ OtherMod , SomeMod ] =
AppModules = [ " behaviour1 " , " behaviour2 " , " mymod " , " othermod " , " somemod " ,
" ignoremod " , " ignoremod2 " ] ,
[ _ Behaviour1Mod , _ Behaviour2Mod , _ MyMod , _ OtherMod , SomeMod , IgnoreMod , IgnoreMod2 ] =
[ list_to_atom ( AppName ++ " _ " ++ Mod ) | | Mod < - AppModules ] ,
UndefFuns = proplists : get_value ( undefined_functions , XrefResults ) ,
? assertNot ( lists : keymember ( undefined_function_calls , 1 , XrefResults ) ) ,
@ -171,6 +173,8 @@ verify_test_results(xref_ignore_test, AppName, XrefResults, _QueryResults) ->
? assertNot ( lists : keymember ( exports_not_used , 1 , XrefResults ) ) ,
? assertNot ( lists : keymember ( deprecated_functions , 1 , XrefResults ) ) ,
? assertNot ( lists : keymember ( deprecated_function_calls , 1 , XrefResults ) ) ,
? assertNot ( lists : member ( { IgnoreMod , notavailable , 1 } , UndefFuns ) ) ,
? assertNot ( lists : member ( { IgnoreMod2 , notavailable , 1 } , UndefFuns ) ) ,
? assert ( lists : member ( { SomeMod , notavailable , 1 } , UndefFuns ) ) ,
ok .
@ -189,13 +193,15 @@ module_name(AppName, Module) ->
get_module_body ( behaviour1 , AppName , IgnoreXref ) - >
[ " -module( " , AppName , " _behaviour1). \n " ,
" -export([behaviour_info/1]). \n " ,
[ " -ignore_xref({behaviour_info,1}). \n " | | X < - [ IgnoreXref ] , X =:= true ] ,
[ " -ignore_xref([ignoremod,{behaviour_info,1}]). \n "
| | X < - [ IgnoreXref ] , X =:= true ] ,
" behaviour_info(callbacks) -> [{bh1_a,1},{bh1_b,1}]; \n " ,
" behaviour_info(_Other) -> undefined. \n " ] ;
get_module_body ( behaviour2 , AppName , IgnoreXref ) - >
[ " -module( " , AppName , " _behaviour2). \n " ,
" -export([behaviour_info/1]). \n " ,
[ " -ignore_xref({behaviour_info,1}). \n " | | X < - [ IgnoreXref ] , X =:= true ] ,
[ " -ignore_xref({behaviour_info,1}). \n "
| | X < - [ IgnoreXref ] , X =:= true ] ,
" behaviour_info(callbacks) -> [{bh2_a,1},{bh2_b,1}]; \n " ,
" behaviour_info(_Other) -> undefined. \n " ] ;
get_module_body ( mymod , AppName , IgnoreXref ) - >
@ -217,6 +223,26 @@ get_module_body(mymod, AppName, IgnoreXref) ->
" localfunc2() -> ok. \n " , % unused local
" fdeprecated() -> ok. \n " % deprecated function
] ;
get_module_body ( ignoremod , AppName , IgnoreXref ) - >
[ " -module( " , AppName , " _ignoremod). \n " ,
" -export([]). \n " ,
[ [ " -ignore_xref( " , AppName , " _ignoremod). \n " ]
| | X < - [ IgnoreXref ] , X =:= true ] ,
" localfunc1(A, B) -> {A, B}. \n " , % used local
" localfunc2() -> ok. \n " , % unused local
" fdeprecated() -> ok. \n " % deprecated function
] ;
get_module_body ( ignoremod2 , AppName , IgnoreXref ) - >
[ " -module( " , AppName , " _ignoremod2). \n " ,
" -export([]). \n " ,
[ [ " -ignore_xref( " , AppName , " _ignoremod2). \n " ]
| | X < - [ IgnoreXref ] , X =:= true ] ,
" localfunc1(A, B) -> {A, B}. \n " , % used local
" localfunc2() -> ok. \n " , % unused local
" fdeprecated() -> ok. \n " % deprecated function
] ;
get_module_body ( othermod , AppName , IgnoreXref ) - >
[ " -module( " , AppName , " _othermod). \n " ,
" -export([somefunc/0]). \n " ,
@ -226,4 +252,5 @@ get_module_body(othermod, AppName, IgnoreXref) ->
" somefunc() -> \n " ,
" " , AppName , " _mymod:other1(arg), \n " ,
" " , AppName , " _somemod:notavailable(arg), \n " ,
" " , AppName , " _mymod:fdeprecated(). \n " ] .
" " , AppName , " _mymod:fdeprecated(), \n " ,
" " , AppName , " _ignoremod:notavailable(). \n " ] .