-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.