diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/rebar_dialyzer_SUITE.erl | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/test/rebar_dialyzer_SUITE.erl b/test/rebar_dialyzer_SUITE.erl new file mode 100644 index 0000000..724d8f0 --- /dev/null +++ b/test/rebar_dialyzer_SUITE.erl @@ -0,0 +1,158 @@ +-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. |