-module(rebar_dialyzer_SUITE).
|
|
|
|
-export([suite/0,
|
|
init_per_suite/1,
|
|
end_per_suite/1,
|
|
init_per_testcase/2,
|
|
all/0,
|
|
update_base_plt/1,
|
|
update_app_plt/1,
|
|
build_release_plt/1]).
|
|
|
|
-include_lib("common_test/include/ct.hrl").
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
-include_lib("kernel/include/file.hrl").
|
|
|
|
suite() ->
|
|
[].
|
|
|
|
init_per_suite(Config) ->
|
|
Config.
|
|
|
|
end_per_suite(_Config) ->
|
|
ok.
|
|
|
|
init_per_testcase(Testcase, Config) ->
|
|
PrivDir = ?config(priv_dir, Config),
|
|
Prefix = ec_cnv:to_list(Testcase),
|
|
Plt = filename:join(PrivDir, Prefix ++ ".project.plt"),
|
|
BasePlt = Prefix ++ "base.plt",
|
|
RebarConfig = [{dialyzer_plt, Plt},
|
|
{dialyzer_base_plt, BasePlt},
|
|
{dialyzer_base_plt_dir, PrivDir},
|
|
{dialyzer_base_plt_apps, [erts]}],
|
|
[{plt, Plt},
|
|
{base_plt, filename:join(PrivDir, BasePlt)},
|
|
{rebar_config, RebarConfig} |
|
|
rebar_test_utils:init_rebar_state(Config)].
|
|
|
|
all() ->
|
|
[update_base_plt, update_app_plt, build_release_plt].
|
|
|
|
update_base_plt(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
RebarConfig = ?config(rebar_config, Config),
|
|
BasePlt = ?config(base_plt, Config),
|
|
Plt = ?config(plt, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [erts]),
|
|
|
|
rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
|
|
{ok, [{app, Name}]}),
|
|
|
|
ErtsFiles = erts_files(),
|
|
|
|
{ok, BasePltFiles} = plt_files(BasePlt),
|
|
?assertEqual(ErtsFiles, BasePltFiles),
|
|
|
|
alter_plt(BasePlt),
|
|
ok = file:delete(Plt),
|
|
|
|
rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
|
|
{ok, [{app, Name}]}),
|
|
|
|
{ok, BasePltFiles2} = plt_files(BasePlt),
|
|
?assertEqual(ErtsFiles, BasePltFiles2),
|
|
|
|
{ok, PltFiles} = plt_files(Plt),
|
|
?assertEqual(ErtsFiles, PltFiles).
|
|
|
|
|
|
update_app_plt(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
RebarConfig = ?config(rebar_config, Config),
|
|
Plt = ?config(plt, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [erts]),
|
|
|
|
rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
|
|
{ok, [{app, Name}]}),
|
|
|
|
ErtsFiles = erts_files(),
|
|
|
|
{ok, PltFiles} = plt_files(Plt),
|
|
?assertEqual(ErtsFiles, PltFiles),
|
|
|
|
alter_plt(Plt),
|
|
|
|
rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
|
|
{ok, [{app, Name}]}),
|
|
|
|
{ok, PltFiles2} = plt_files(Plt),
|
|
?assertEqual(ErtsFiles, PltFiles2),
|
|
|
|
ok = file:delete(Plt),
|
|
|
|
rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
|
|
{ok, [{app, Name}]}),
|
|
|
|
{ok, PltFiles3} = plt_files(Plt),
|
|
?assertEqual(ErtsFiles, PltFiles3).
|
|
|
|
build_release_plt(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
RebarConfig = ?config(rebar_config, Config),
|
|
BasePlt = ?config(base_plt, Config),
|
|
Plt = ?config(plt, Config),
|
|
|
|
Name1 = rebar_test_utils:create_random_name("relapp1_"),
|
|
Vsn1 = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(filename:join([AppDir,Name1]), Name1, Vsn1,
|
|
[erts]),
|
|
Name2 = rebar_test_utils:create_random_name("relapp2_"),
|
|
Vsn2 = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(filename:join([AppDir,Name2]), Name2, Vsn2,
|
|
[erts, ec_cnv:to_atom(Name1)]),
|
|
|
|
rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
|
|
{ok, [{app, Name1}, {app, Name2}]}),
|
|
|
|
ErtsFiles = erts_files(),
|
|
|
|
{ok, BasePltFiles} = plt_files(BasePlt),
|
|
?assertEqual(ErtsFiles, BasePltFiles),
|
|
|
|
{ok, PltFiles} = plt_files(Plt),
|
|
?assertEqual(ErtsFiles, PltFiles).
|
|
|
|
%% Helpers
|
|
|
|
erts_files() ->
|
|
ErtsDir = code:lib_dir(erts, ebin),
|
|
ErtsBeams = filelib:wildcard("*.beam", ErtsDir),
|
|
ErtsFiles = lists:map(fun(Beam) -> filename:join(ErtsDir, Beam) end,
|
|
ErtsBeams),
|
|
lists:sort(ErtsFiles).
|
|
|
|
plt_files(Plt) ->
|
|
case dialyzer:plt_info(Plt) of
|
|
{ok, Info} ->
|
|
Files = proplists:get_value(files, Info),
|
|
{ok, lists:sort(Files)};
|
|
Other ->
|
|
Other
|
|
end.
|
|
|
|
alter_plt(Plt) ->
|
|
{ok, Files} = plt_files(Plt),
|
|
_ = dialyzer:run([{analysis_type, plt_remove},
|
|
{init_plt, Plt},
|
|
{files, [hd(Files)]}]),
|
|
_ = dialyzer:run([{analysis_type, plt_add},
|
|
{init_plt, Plt},
|
|
{files, [code:which(dialyzer)]}]),
|
|
ok.
|