Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

333 lignes
11 KiB

il y a 8 ans
il y a 8 ans
il y a 8 ans
il y a 8 ans
il y a 8 ans
il y a 8 ans
il y a 9 ans
il y a 9 ans
il y a 9 ans
il y a 9 ans
  1. -module(rebar_dialyzer_SUITE).
  2. -export([suite/0,
  3. init_per_suite/1,
  4. end_per_suite/1,
  5. init_per_group/2,
  6. end_per_group/2,
  7. init_per_testcase/2,
  8. all/0,
  9. groups/0,
  10. empty_base_plt/1,
  11. empty_app_plt/1,
  12. empty_app_succ_typings/1,
  13. update_base_plt/1,
  14. update_app_plt/1,
  15. build_release_plt/1,
  16. plt_apps_option/1]).
  17. -include_lib("common_test/include/ct.hrl").
  18. -include_lib("eunit/include/eunit.hrl").
  19. -include_lib("kernel/include/file.hrl").
  20. suite() ->
  21. [].
  22. init_per_suite(Config) ->
  23. Config.
  24. end_per_suite(_Config) ->
  25. ok.
  26. init_per_group(empty, Config) ->
  27. [{base_plt_apps, []} | Config];
  28. init_per_group(_Group, Config) ->
  29. [{base_plt_apps, [erts]} | Config].
  30. end_per_group(_Group, _Config) ->
  31. ok.
  32. init_per_testcase(Testcase, Config) ->
  33. PrivDir = ?config(priv_dir, Config),
  34. Prefix = ec_cnv:to_list(Testcase),
  35. BasePrefix = Prefix ++ "_base",
  36. Opts = [{plt_prefix, Prefix},
  37. {plt_location, PrivDir},
  38. {base_plt_prefix, BasePrefix},
  39. {base_plt_location, PrivDir},
  40. {base_plt_apps, ?config(base_plt_apps, Config)}],
  41. Suffix = "_" ++ rebar_utils:otp_release() ++ "_plt",
  42. [{plt, filename:join(PrivDir, Prefix ++ Suffix)},
  43. {base_plt, filename:join(PrivDir, BasePrefix ++ Suffix)},
  44. {rebar_config, [{dialyzer, Opts}]} |
  45. rebar_test_utils:init_rebar_state(Config)].
  46. all() ->
  47. [{group, empty}, {group, build_and_check}, {group, update}].
  48. groups() ->
  49. [{empty, [empty_base_plt, empty_app_plt, empty_app_succ_typings]},
  50. {build_and_check, [build_release_plt, plt_apps_option]},
  51. {update, [update_base_plt, update_app_plt]}].
  52. empty_base_plt(Config) ->
  53. AppDir = ?config(apps, Config),
  54. RebarConfig = ?config(rebar_config, Config),
  55. BasePlt = ?config(base_plt, Config),
  56. Plt = ?config(plt, Config),
  57. Name = rebar_test_utils:create_random_name("app1_"),
  58. Vsn = rebar_test_utils:create_random_vsn(),
  59. rebar_test_utils:create_app(AppDir, Name, Vsn, [erts]),
  60. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  61. {ok, [{app, Name}]}),
  62. {ok, BasePltFiles} = plt_files(BasePlt),
  63. ?assertEqual([], BasePltFiles),
  64. ErtsFiles = erts_files(),
  65. {ok, PltFiles} = plt_files(Plt),
  66. ?assertEqual(ErtsFiles, PltFiles),
  67. ok.
  68. empty_app_plt(Config) ->
  69. AppDir = ?config(apps, Config),
  70. RebarConfig = ?config(rebar_config, Config),
  71. BasePlt = ?config(base_plt, Config),
  72. Plt = ?config(plt, Config),
  73. Name = rebar_test_utils:create_random_name("app1_"),
  74. Vsn = rebar_test_utils:create_random_vsn(),
  75. rebar_test_utils:create_app(AppDir, Name, Vsn, []),
  76. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  77. {ok, [{app, Name}]}),
  78. {ok, BasePltFiles} = plt_files(BasePlt),
  79. ?assertEqual([], BasePltFiles),
  80. {ok, PltFiles} = plt_files(Plt),
  81. ?assertEqual([], PltFiles),
  82. ok.
  83. empty_app_succ_typings(Config) ->
  84. AppDir = ?config(apps, Config),
  85. RebarConfig = ?config(rebar_config, Config),
  86. Name = rebar_test_utils:create_random_name("app1_"),
  87. Vsn = rebar_test_utils:create_random_vsn(),
  88. rebar_test_utils:create_empty_app(AppDir, Name, Vsn, []),
  89. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  90. {ok, [{app, Name}]}),
  91. ok.
  92. update_base_plt(Config) ->
  93. AppDir = ?config(apps, Config),
  94. RebarConfig = ?config(rebar_config, Config),
  95. BasePlt = ?config(base_plt, Config),
  96. Plt = ?config(plt, Config),
  97. Name = rebar_test_utils:create_random_name("app1_"),
  98. Vsn = rebar_test_utils:create_random_vsn(),
  99. rebar_test_utils:create_app(AppDir, Name, Vsn, [erts]),
  100. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  101. {ok, [{app, Name}]}),
  102. ErtsFiles = erts_files(),
  103. {ok, BasePltFiles} = plt_files(BasePlt),
  104. ?assertEqual(ErtsFiles, BasePltFiles),
  105. alter_plt(BasePlt),
  106. ok = file:delete(Plt),
  107. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  108. {ok, [{app, Name}]}),
  109. {ok, BasePltFiles2} = plt_files(BasePlt),
  110. ?assertEqual(ErtsFiles, BasePltFiles2),
  111. {ok, PltFiles} = plt_files(Plt),
  112. ?assertEqual(ErtsFiles, PltFiles),
  113. add_missing_file(BasePlt),
  114. ok = file:delete(Plt),
  115. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  116. {ok, [{app, Name}]}),
  117. {ok, BasePltFiles3} = plt_files(BasePlt),
  118. ?assertEqual(ErtsFiles, BasePltFiles3).
  119. update_app_plt(Config) ->
  120. AppDir = ?config(apps, Config),
  121. RebarConfig = ?config(rebar_config, Config),
  122. Plt = ?config(plt, Config),
  123. Name = rebar_test_utils:create_random_name("app1_"),
  124. Vsn = rebar_test_utils:create_random_vsn(),
  125. rebar_test_utils:create_app(AppDir, Name, Vsn, [erts]),
  126. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  127. {ok, [{app, Name}]}),
  128. ErtsFiles = erts_files(),
  129. {ok, PltFiles} = plt_files(Plt),
  130. ?assertEqual(ErtsFiles, PltFiles),
  131. alter_plt(Plt),
  132. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  133. {ok, [{app, Name}]}),
  134. {ok, PltFiles2} = plt_files(Plt),
  135. ?assertEqual(ErtsFiles, PltFiles2),
  136. ok = file:delete(Plt),
  137. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  138. {ok, [{app, Name}]}),
  139. {ok, PltFiles3} = plt_files(Plt),
  140. ?assertEqual(ErtsFiles, PltFiles3),
  141. add_missing_file(Plt),
  142. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  143. {ok, [{app, Name}]}),
  144. {ok, PltFiles4} = plt_files(Plt),
  145. ?assertEqual(ErtsFiles, PltFiles4).
  146. build_release_plt(Config) ->
  147. AppDir = ?config(apps, Config),
  148. RebarConfig = ?config(rebar_config, Config),
  149. BasePlt = ?config(base_plt, Config),
  150. Plt = ?config(plt, Config),
  151. Name1 = rebar_test_utils:create_random_name("relapp1_"),
  152. Vsn1 = rebar_test_utils:create_random_vsn(),
  153. rebar_test_utils:create_app(filename:join([AppDir,"apps",Name1]), Name1, Vsn1,
  154. [erts]),
  155. Name2 = rebar_test_utils:create_random_name("relapp2_"),
  156. Vsn2 = rebar_test_utils:create_random_vsn(),
  157. rebar_test_utils:create_app(filename:join([AppDir,"apps",Name2]), Name2, Vsn2,
  158. [erts, ec_cnv:to_atom(Name1)]),
  159. rebar_test_utils:run_and_check(Config, RebarConfig, ["dialyzer"],
  160. {ok, [{app, Name1}, {app, Name2}]}),
  161. ErtsFiles = erts_files(),
  162. {ok, BasePltFiles} = plt_files(BasePlt),
  163. ?assertEqual(ErtsFiles, BasePltFiles),
  164. {ok, PltFiles} = plt_files(Plt),
  165. ?assertEqual(ErtsFiles, PltFiles).
  166. plt_apps_option(Config) ->
  167. AppDir = ?config(apps, Config),
  168. RebarConfig = ?config(rebar_config, Config),
  169. Plt = ?config(plt, Config),
  170. State = ?config(state, Config),
  171. %% Create applications
  172. Name1 = rebar_test_utils:create_random_name("app1_"),
  173. Vsn1 = rebar_test_utils:create_random_vsn(),
  174. rebar_test_utils:create_app(filename:join([AppDir,"deps",Name1]), Name1, Vsn1,
  175. []),
  176. App1 = ec_cnv:to_atom(Name1),
  177. Name2 = rebar_test_utils:create_random_name("app2_"),
  178. Vsn2 = rebar_test_utils:create_random_vsn(),
  179. rebar_test_utils:create_app(filename:join([AppDir,"deps",Name2]), Name2, Vsn2,
  180. [App1]), % App2 depends on App1
  181. App2 = ec_cnv:to_atom(Name2),
  182. Name3 = rebar_test_utils:create_random_name("app3_"), % the project application
  183. Vsn3 = rebar_test_utils:create_random_vsn(),
  184. rebar_test_utils:create_app(AppDir, Name3, Vsn3,
  185. [App2]), % App3 depends on App2
  186. %% Dependencies settings
  187. State1 = rebar_state:add_resource(State, {localfs, rebar_localfs_resource}),
  188. Config1 = [{state, State1} | Config],
  189. RebarConfig1 = merge_config(
  190. [{deps,
  191. [
  192. {App1, {localfs, filename:join([AppDir,"deps",Name1])}},
  193. {App2, {localfs, filename:join([AppDir,"deps",Name2])}}
  194. ]}],
  195. RebarConfig),
  196. %% Dialyzer: plt_apps = top_level_deps (default)
  197. rebar_test_utils:run_and_check(Config1, RebarConfig1, ["dialyzer"],
  198. {ok, [{app, Name3}]}),
  199. %% NOTE: `erts` is included in `base_plt_apps`
  200. {ok, PltFiles1} = plt_files(Plt),
  201. ?assertEqual([App2, erts], get_apps_from_beam_files(PltFiles1)),
  202. %% Dialyzer: plt_apps = all_deps
  203. RebarConfig2 = merge_config([{dialyzer, [{plt_apps, all_deps}]}],
  204. RebarConfig1),
  205. rebar_test_utils:run_and_check(Config1, RebarConfig2, ["dialyzer"],
  206. {ok, [{app, Name3}]}),
  207. {ok, PltFiles2} = plt_files(Plt),
  208. ?assertEqual([App1, App2, erts], get_apps_from_beam_files(PltFiles2)).
  209. %% Helpers
  210. erts_files() ->
  211. ErtsDir = code:lib_dir(erts, ebin),
  212. ErtsBeams = filelib:wildcard("*.beam", ErtsDir),
  213. ErtsFiles = lists:map(fun(Beam) -> filename:join(ErtsDir, Beam) end,
  214. ErtsBeams),
  215. lists:sort(ErtsFiles).
  216. plt_files(Plt) ->
  217. case dialyzer:plt_info(Plt) of
  218. {ok, Info} ->
  219. Files = proplists:get_value(files, Info),
  220. {ok, lists:sort(Files)};
  221. Other ->
  222. Other
  223. end.
  224. alter_plt(Plt) ->
  225. {ok, Files} = plt_files(Plt),
  226. _ = dialyzer:run([{analysis_type, plt_remove},
  227. {init_plt, Plt},
  228. {files, [hd(Files)]}]),
  229. _ = dialyzer:run([{analysis_type, plt_add},
  230. {init_plt, Plt},
  231. {files, [code:which(dialyzer)]}]),
  232. ok.
  233. add_missing_file(Plt) ->
  234. Source = code:which(dialyzer),
  235. Dest = filename:join(filename:dirname(Plt), "dialyzer.beam"),
  236. {ok, _} = file:copy(Source, Dest),
  237. _ = try
  238. dialyzer:run([{analysis_type, plt_add},
  239. {init_plt, Plt},
  240. {files, [Dest]}])
  241. after
  242. ok = file:delete(Dest)
  243. end,
  244. ok.
  245. -spec merge_config(Config, Config) -> Config when
  246. Config :: [{term(), term()}].
  247. merge_config(NewConfig, OldConfig) ->
  248. dict:to_list(
  249. rebar_opts:merge_opts(dict:from_list(NewConfig),
  250. dict:from_list(OldConfig))).
  251. -spec get_apps_from_beam_files(string()) -> [atom()].
  252. get_apps_from_beam_files(BeamFiles) ->
  253. lists:usort(
  254. [begin
  255. AppNameVsn = filename:basename(filename:dirname(filename:dirname(File))),
  256. [AppName | _] = string:tokens(AppNameVsn ++ "-", "-"),
  257. ec_cnv:to_atom(AppName)
  258. end || File <- BeamFiles]).