You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.8 KiB

  1. -module(rebar_dialyzer_SUITE).
  2. -export([suite/0,
  3. init_per_suite/1,
  4. end_per_suite/1,
  5. init_per_testcase/2,
  6. all/0,
  7. update_base_plt/1,
  8. update_app_plt/1,
  9. build_release_plt/1]).
  10. -include_lib("common_test/include/ct.hrl").
  11. -include_lib("eunit/include/eunit.hrl").
  12. -include_lib("kernel/include/file.hrl").
  13. suite() ->
  14. [].
  15. init_per_suite(Config) ->
  16. Config.
  17. end_per_suite(_Config) ->
  18. ok.
  19. init_per_testcase(Testcase, Config) ->
  20. PrivDir = ?config(priv_dir, Config),
  21. Prefix = ec_cnv:to_list(Testcase),
  22. Plt = filename:join(PrivDir, Prefix ++ ".project.plt"),
  23. BasePlt = Prefix ++ "base.plt",
  24. RebarConfig = [{dialyzer_plt, Plt},
  25. {dialyzer_base_plt, BasePlt},
  26. {dialyzer_base_plt_dir, PrivDir},
  27. {dialyzer_base_plt_apps, [erts]}],
  28. [{plt, Plt},
  29. {base_plt, filename:join(PrivDir, BasePlt)},
  30. {rebar_config, RebarConfig} |
  31. rebar_test_utils:init_rebar_state(Config)].
  32. all() ->
  33. [update_base_plt, update_app_plt, build_release_plt].
  34. update_base_plt(Config) ->
  35. AppDir = ?config(apps, Config),
  36. RebarConfig = ?config(rebar_config, Config),
  37. BasePlt = ?config(base_plt, Config),
  38. Plt = ?config(plt, Config),
  39. Name = rebar_test_utils:create_random_name("app1_"),
  40. Vsn = rebar_test_utils:create_random_vsn(),
  41. rebar_test_utils:create_app(AppDir, Name, Vsn, [erts]),
  42. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  43. {ok, [{app, Name}]}),
  44. ErtsFiles = erts_files(),
  45. {ok, BasePltFiles} = plt_files(BasePlt),
  46. ?assertEqual(ErtsFiles, BasePltFiles),
  47. alter_plt(BasePlt),
  48. ok = file:delete(Plt),
  49. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  50. {ok, [{app, Name}]}),
  51. {ok, BasePltFiles2} = plt_files(BasePlt),
  52. ?assertEqual(ErtsFiles, BasePltFiles2),
  53. {ok, PltFiles} = plt_files(Plt),
  54. ?assertEqual(ErtsFiles, PltFiles).
  55. update_app_plt(Config) ->
  56. AppDir = ?config(apps, Config),
  57. RebarConfig = ?config(rebar_config, Config),
  58. Plt = ?config(plt, Config),
  59. Name = rebar_test_utils:create_random_name("app1_"),
  60. Vsn = rebar_test_utils:create_random_vsn(),
  61. rebar_test_utils:create_app(AppDir, Name, Vsn, [erts]),
  62. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  63. {ok, [{app, Name}]}),
  64. ErtsFiles = erts_files(),
  65. {ok, PltFiles} = plt_files(Plt),
  66. ?assertEqual(ErtsFiles, PltFiles),
  67. alter_plt(Plt),
  68. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  69. {ok, [{app, Name}]}),
  70. {ok, PltFiles2} = plt_files(Plt),
  71. ?assertEqual(ErtsFiles, PltFiles2),
  72. ok = file:delete(Plt),
  73. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  74. {ok, [{app, Name}]}),
  75. {ok, PltFiles3} = plt_files(Plt),
  76. ?assertEqual(ErtsFiles, PltFiles3).
  77. build_release_plt(Config) ->
  78. AppDir = ?config(apps, Config),
  79. RebarConfig = ?config(rebar_config, Config),
  80. BasePlt = ?config(base_plt, Config),
  81. Plt = ?config(plt, Config),
  82. Name1 = rebar_test_utils:create_random_name("relapp1_"),
  83. Vsn1 = rebar_test_utils:create_random_vsn(),
  84. rebar_test_utils:create_app(filename:join([AppDir,Name1]), Name1, Vsn1,
  85. [erts]),
  86. Name2 = rebar_test_utils:create_random_name("relapp2_"),
  87. Vsn2 = rebar_test_utils:create_random_vsn(),
  88. rebar_test_utils:create_app(filename:join([AppDir,Name2]), Name2, Vsn2,
  89. [erts, ec_cnv:to_atom(Name1)]),
  90. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  91. {ok, [{app, Name1}, {app, Name2}]}),
  92. ErtsFiles = erts_files(),
  93. {ok, BasePltFiles} = plt_files(BasePlt),
  94. ?assertEqual(ErtsFiles, BasePltFiles),
  95. {ok, PltFiles} = plt_files(Plt),
  96. ?assertEqual(ErtsFiles, PltFiles).
  97. %% Helpers
  98. erts_files() ->
  99. ErtsDir = code:lib_dir(erts, ebin),
  100. ErtsBeams = filelib:wildcard("*.beam", ErtsDir),
  101. ErtsFiles = lists:map(fun(Beam) -> filename:join(ErtsDir, Beam) end,
  102. ErtsBeams),
  103. lists:sort(ErtsFiles).
  104. plt_files(Plt) ->
  105. case dialyzer:plt_info(Plt) of
  106. {ok, Info} ->
  107. Files = proplists:get_value(files, Info),
  108. {ok, lists:sort(Files)};
  109. Other ->
  110. Other
  111. end.
  112. alter_plt(Plt) ->
  113. {ok, Files} = plt_files(Plt),
  114. _ = dialyzer:run([{analysis_type, plt_remove},
  115. {init_plt, Plt},
  116. {files, [hd(Files)]}]),
  117. _ = dialyzer:run([{analysis_type, plt_add},
  118. {init_plt, Plt},
  119. {files, [code:which(dialyzer)]}]),
  120. ok.