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.

159 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. BasePrefix = Prefix ++ "_base",
  23. Opts = [{plt_prefix, Prefix},
  24. {plt_location, PrivDir},
  25. {base_plt_prefix, BasePrefix},
  26. {base_plt_location, PrivDir},
  27. {base_plt_apps, [erts]}],
  28. Suffix = "_" ++ rebar_utils:otp_release() ++ "_plt",
  29. [{plt, filename:join(PrivDir, Prefix ++ Suffix)},
  30. {base_plt, filename:join(PrivDir, BasePrefix ++ Suffix)},
  31. {rebar_config, [{dialyzer, Opts}]} |
  32. rebar_test_utils:init_rebar_state(Config)].
  33. all() ->
  34. [update_base_plt, update_app_plt, build_release_plt].
  35. update_base_plt(Config) ->
  36. AppDir = ?config(apps, Config),
  37. RebarConfig = ?config(rebar_config, Config),
  38. BasePlt = ?config(base_plt, Config),
  39. Plt = ?config(plt, Config),
  40. Name = rebar_test_utils:create_random_name("app1_"),
  41. Vsn = rebar_test_utils:create_random_vsn(),
  42. rebar_test_utils:create_app(AppDir, Name, Vsn, [erts]),
  43. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  44. {ok, [{app, Name}]}),
  45. ErtsFiles = erts_files(),
  46. {ok, BasePltFiles} = plt_files(BasePlt),
  47. ?assertEqual(ErtsFiles, BasePltFiles),
  48. alter_plt(BasePlt),
  49. ok = file:delete(Plt),
  50. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  51. {ok, [{app, Name}]}),
  52. {ok, BasePltFiles2} = plt_files(BasePlt),
  53. ?assertEqual(ErtsFiles, BasePltFiles2),
  54. {ok, PltFiles} = plt_files(Plt),
  55. ?assertEqual(ErtsFiles, PltFiles).
  56. update_app_plt(Config) ->
  57. AppDir = ?config(apps, Config),
  58. RebarConfig = ?config(rebar_config, Config),
  59. Plt = ?config(plt, Config),
  60. Name = rebar_test_utils:create_random_name("app1_"),
  61. Vsn = rebar_test_utils:create_random_vsn(),
  62. rebar_test_utils:create_app(AppDir, Name, Vsn, [erts]),
  63. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  64. {ok, [{app, Name}]}),
  65. ErtsFiles = erts_files(),
  66. {ok, PltFiles} = plt_files(Plt),
  67. ?assertEqual(ErtsFiles, PltFiles),
  68. alter_plt(Plt),
  69. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  70. {ok, [{app, Name}]}),
  71. {ok, PltFiles2} = plt_files(Plt),
  72. ?assertEqual(ErtsFiles, PltFiles2),
  73. ok = file:delete(Plt),
  74. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  75. {ok, [{app, Name}]}),
  76. {ok, PltFiles3} = plt_files(Plt),
  77. ?assertEqual(ErtsFiles, PltFiles3).
  78. build_release_plt(Config) ->
  79. AppDir = ?config(apps, Config),
  80. RebarConfig = ?config(rebar_config, Config),
  81. BasePlt = ?config(base_plt, Config),
  82. Plt = ?config(plt, Config),
  83. Name1 = rebar_test_utils:create_random_name("relapp1_"),
  84. Vsn1 = rebar_test_utils:create_random_vsn(),
  85. rebar_test_utils:create_app(filename:join([AppDir,"apps",Name1]), Name1, Vsn1,
  86. [erts]),
  87. Name2 = rebar_test_utils:create_random_name("relapp2_"),
  88. Vsn2 = rebar_test_utils:create_random_vsn(),
  89. rebar_test_utils:create_app(filename:join([AppDir,"apps",Name2]), Name2, Vsn2,
  90. [erts, ec_cnv:to_atom(Name1)]),
  91. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  92. {ok, [{app, Name1}, {app, Name2}]}),
  93. ErtsFiles = erts_files(),
  94. {ok, BasePltFiles} = plt_files(BasePlt),
  95. ?assertEqual(ErtsFiles, BasePltFiles),
  96. {ok, PltFiles} = plt_files(Plt),
  97. ?assertEqual(ErtsFiles, PltFiles).
  98. %% Helpers
  99. erts_files() ->
  100. ErtsDir = code:lib_dir(erts, ebin),
  101. ErtsBeams = filelib:wildcard("*.beam", ErtsDir),
  102. ErtsFiles = lists:map(fun(Beam) -> filename:join(ErtsDir, Beam) end,
  103. ErtsBeams),
  104. lists:sort(ErtsFiles).
  105. plt_files(Plt) ->
  106. case dialyzer:plt_info(Plt) of
  107. {ok, Info} ->
  108. Files = proplists:get_value(files, Info),
  109. {ok, lists:sort(Files)};
  110. Other ->
  111. Other
  112. end.
  113. alter_plt(Plt) ->
  114. {ok, Files} = plt_files(Plt),
  115. _ = dialyzer:run([{analysis_type, plt_remove},
  116. {init_plt, Plt},
  117. {files, [hd(Files)]}]),
  118. _ = dialyzer:run([{analysis_type, plt_add},
  119. {init_plt, Plt},
  120. {files, [code:which(dialyzer)]}]),
  121. ok.