選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

272 行
12 KiB

  1. -module(rebar_release_SUITE).
  2. -compile(export_all).
  3. -include_lib("common_test/include/ct.hrl").
  4. -include_lib("eunit/include/eunit.hrl").
  5. all() -> [release,
  6. dev_mode_release,
  7. profile_dev_mode_override_release,
  8. tar,
  9. profile_ordering_sys_config_extend,
  10. profile_ordering_sys_config_extend_3_tuple_merge,
  11. extend_release,
  12. user_output_dir, profile_overlays,
  13. overlay_vars].
  14. init_per_testcase(Case, Config0) ->
  15. Config = rebar_test_utils:init_rebar_state(Config0),
  16. Name = rebar_test_utils:create_random_name(atom_to_list(Case)),
  17. AppDir = ?config(apps, Config),
  18. application:load(rebar),
  19. ok = ec_file:mkdir_p(AppDir),
  20. State = rebar_state:new([{base_dir, filename:join([AppDir, "_build"])}]),
  21. rebar_test_utils:create_app(AppDir, Name, "1.0.0", [kernel, stdlib]),
  22. [{name, Name}, {apps, AppDir}, {state, State} | Config].
  23. end_per_testcase(_, Config) ->
  24. meck:unload(),
  25. Config.
  26. release(Config) ->
  27. AppDir = ?config(apps, Config),
  28. Name = ?config(name, Config),
  29. Vsn = "1.0.0",
  30. {ok, RebarConfig} =
  31. file:consult(rebar_test_utils:create_config(AppDir,
  32. [{relx, [{release, {list_to_atom(Name), Vsn},
  33. [list_to_atom(Name)]},
  34. {lib_dirs, [AppDir]}]}])),
  35. rebar_test_utils:run_and_check(
  36. Config, RebarConfig,
  37. ["release"],
  38. {ok, [{release, list_to_atom(Name), Vsn, false}]}
  39. ).
  40. dev_mode_release(Config) ->
  41. AppDir = ?config(apps, Config),
  42. Name = ?config(name, Config),
  43. Vsn = "1.0.0",
  44. {ok, RebarConfig} =
  45. file:consult(rebar_test_utils:create_config(AppDir,
  46. [{relx, [{release, {list_to_atom(Name), Vsn},
  47. [list_to_atom(Name)]},
  48. {lib_dirs, [AppDir]},
  49. {dev_mode, true}]}])),
  50. rebar_test_utils:run_and_check(
  51. Config, RebarConfig,
  52. ["release"],
  53. {ok, [{release, list_to_atom(Name), Vsn, true}]}
  54. ).
  55. profile_dev_mode_override_release(Config) ->
  56. AppDir = ?config(apps, Config),
  57. Name = ?config(name, Config),
  58. Vsn = "1.0.0",
  59. {ok, RebarConfig} =
  60. file:consult(rebar_test_utils:create_config(AppDir,
  61. [{relx, [{release, {list_to_atom(Name), Vsn},
  62. [list_to_atom(Name)]},
  63. {lib_dirs, [AppDir]},
  64. {dev_mode, true}]},
  65. {profiles,
  66. [{ct,
  67. [{relx, [{dev_mode, false}]}]}]}])),
  68. rebar_test_utils:run_and_check(
  69. Config, RebarConfig,
  70. ["as", "ct", "release"],
  71. {ok, [{release, list_to_atom(Name), Vsn, false}]}
  72. ).
  73. tar(Config) ->
  74. AppDir = ?config(apps, Config),
  75. Name = ?config(name, Config),
  76. Vsn = "1.0.0",
  77. {ok, RebarConfig} =
  78. file:consult(rebar_test_utils:create_config(AppDir,
  79. [{relx, [{release, {list_to_atom(Name), Vsn},
  80. [list_to_atom(Name)]},
  81. {lib_dirs, [AppDir]}]}])),
  82. rebar_test_utils:run_and_check(
  83. Config, RebarConfig,
  84. ["tar"],
  85. {ok, [{release, list_to_atom(Name), Vsn, false}, {tar, Name, Vsn}]}
  86. ).
  87. %% Test that the order of release config args is not lost. If it is extend would fail.
  88. extend_release(Config) ->
  89. AppDir = ?config(apps, Config),
  90. Name = ?config(name, Config),
  91. Vsn = "1.0.0",
  92. {ok, RebarConfig} =
  93. file:consult(rebar_test_utils:create_config(AppDir,
  94. [{relx, [{release, {list_to_atom(Name), Vsn},
  95. [list_to_atom(Name)]},
  96. {release, {extended, Vsn, {extend, list_to_atom(Name)}},
  97. []},
  98. {lib_dirs, [AppDir]}]}])),
  99. rebar_test_utils:run_and_check(
  100. Config, RebarConfig,
  101. ["release", "-n", "extended"],
  102. {ok, [{release, extended, Vsn, false}]}
  103. ).
  104. %% Ensure proper ordering of sys_config and extended releases in profiles
  105. profile_ordering_sys_config_extend(Config) ->
  106. AppDir = ?config(apps, Config),
  107. Name = ?config(name, Config),
  108. Vsn = "1.0.0",
  109. TestSysConfig = filename:join(AppDir, "test.config"),
  110. OtherSysConfig = filename:join(AppDir, "other.config"),
  111. ok = file:write_file(TestSysConfig, "[]."),
  112. ok = file:write_file(OtherSysConfig, "[{some, content}]."),
  113. {ok, RebarConfig} =
  114. file:consult(rebar_test_utils:create_config(AppDir,
  115. [{relx, [{release, {list_to_atom(Name), Vsn},
  116. [list_to_atom(Name)]},
  117. {sys_config, OtherSysConfig},
  118. {lib_dirs, [AppDir]}]},
  119. {profiles, [{extended,
  120. [{relx, [
  121. {sys_config, TestSysConfig}]}]}]}])),
  122. rebar_test_utils:run_and_check(
  123. Config, RebarConfig,
  124. ["as", "extended", "release"],
  125. {ok, [{release, list_to_atom(Name), Vsn, false}]}
  126. ),
  127. ReleaseDir = filename:join([AppDir, "./_build/extended/rel/", Name, "releases", Vsn]),
  128. {ok, [[]]} = file:consult(filename:join(ReleaseDir, "sys.config")).
  129. %% test that tup_umerge works with tuples of different sizes
  130. profile_ordering_sys_config_extend_3_tuple_merge(Config) ->
  131. AppDir = ?config(apps, Config),
  132. Name = ?config(name, Config),
  133. Vsn = "1.0.0",
  134. TestSysConfig = filename:join(AppDir, "test.config"),
  135. OtherSysConfig = filename:join(AppDir, "other.config"),
  136. ok = file:write_file(TestSysConfig, "[]."),
  137. ok = file:write_file(OtherSysConfig, "[{some, content}]."),
  138. {ok, RebarConfig} =
  139. file:consult(rebar_test_utils:create_config(AppDir,
  140. [{relx, [{release, {list_to_atom(Name), Vsn},
  141. [list_to_atom(Name)]},
  142. {sys_config, OtherSysConfig},
  143. {lib_dirs, [AppDir]}]},
  144. {profiles, [{extended,
  145. [{relx, [
  146. {release, {extended, Vsn, {extend, list_to_atom(Name)}},
  147. []},
  148. {sys_config, TestSysConfig}]}]}]}])),
  149. rebar_test_utils:run_and_check(
  150. Config, RebarConfig,
  151. ["as", "extended", "release", "-n", Name],
  152. {ok, [{release, list_to_atom(Name), Vsn, false}]}
  153. ),
  154. ReleaseDir = filename:join([AppDir, "./_build/extended/rel/", Name, "releases", Vsn]),
  155. {ok, [[]]} = file:consult(filename:join(ReleaseDir, "sys.config")).
  156. user_output_dir(Config) ->
  157. AppDir = ?config(apps, Config),
  158. Name = ?config(name, Config),
  159. ReleaseDir = filename:join(AppDir, "./_rel"),
  160. Vsn = "1.0.0",
  161. {ok, RebarConfig} =
  162. file:consult(rebar_test_utils:create_config(AppDir,
  163. [{relx, [{release, {list_to_atom(Name), Vsn},
  164. [list_to_atom(Name)]},
  165. {lib_dirs, [AppDir]},
  166. {dev_mode, true}]}])),
  167. rebar_test_utils:run_and_check(
  168. Config, RebarConfig,
  169. ["release", "-o", ReleaseDir],
  170. {ok, []}
  171. ),
  172. RelxState = rlx_state:new("", [], []),
  173. RelxState1 = rlx_state:base_output_dir(RelxState, ReleaseDir),
  174. {ok, RelxState2} = rlx_prv_app_discover:do(RelxState1),
  175. {ok, RelxState3} = rlx_prv_rel_discover:do(RelxState2),
  176. rlx_state:get_realized_release(RelxState3, list_to_atom(Name), Vsn).
  177. profile_overlays(Config) ->
  178. AppDir = ?config(apps, Config),
  179. Name = ?config(name, Config),
  180. Vsn = "1.0.0",
  181. {ok, RebarConfig} =
  182. file:consult(rebar_test_utils:create_config(AppDir,
  183. [{relx, [{release, {list_to_atom(Name), Vsn},
  184. [list_to_atom(Name)]},
  185. {overlay, [{mkdir, "randomdir"}]},
  186. {lib_dirs, [AppDir]}]},
  187. {profiles, [{prod, [{relx, [{overlay, [{mkdir, "otherrandomdir"}]}]}]}]}])),
  188. ReleaseDir = filename:join([AppDir, "./_build/prod/rel/", Name]),
  189. rebar_test_utils:run_and_check(
  190. Config, RebarConfig,
  191. ["as", "prod", "release"],
  192. {ok, [{release, list_to_atom(Name), Vsn, false},
  193. {dir, filename:join(ReleaseDir, "otherrandomdir")},
  194. {dir, filename:join(ReleaseDir, "randomdir")}]}
  195. ).
  196. overlay_vars(Config) ->
  197. AppDir = ?config(apps, Config),
  198. Name = ?config(name, Config),
  199. Vsn = "1.0.0",
  200. {ok, RebarConfig} =
  201. file:consult(rebar_test_utils:create_config(AppDir,
  202. [{relx, [{release, {list_to_atom(Name), Vsn},
  203. [list_to_atom(Name)]},
  204. {overlay, [
  205. {template, filename:join([AppDir, "config/app.config"]),
  206. "releases/{{release_version}}/sys.config"}
  207. ]},
  208. {overlay_vars, filename:join([AppDir, "config/vars.config"])},
  209. {lib_dirs, [AppDir]}]}
  210. ])),
  211. ok = filelib:ensure_dir(filename:join([AppDir, "config", "dummy"])),
  212. OverlayVars = [{var_int, 1},
  213. {var_string, "\"test\""},
  214. {var_bin_string, "<<\"test\">>"},
  215. {var_tuple, "{t, ['atom']}"},
  216. {var_list, "[a, b, c, 'd']"},
  217. {var_bin, "<<23, 24, 25>>"}],
  218. rebar_test_utils:create_config(AppDir,
  219. filename:join([AppDir, "config", "vars.config"]),
  220. OverlayVars),
  221. AppConfig = [[{var_int, {{var_int}}},
  222. {var_string, {{{var_string}}}},
  223. {var_bin_string, {{{var_bin_string}}}},
  224. {var_tuple, {{{var_tuple}}}},
  225. {var_list, {{{var_list}}}},
  226. {var_bin, {{{var_bin}}}}]],
  227. rebar_test_utils:create_config(AppDir,
  228. filename:join([AppDir, "config", "app.config"]),
  229. AppConfig),
  230. rebar_test_utils:run_and_check(
  231. Config, RebarConfig,
  232. ["release"],
  233. {ok, [{release, list_to_atom(Name), Vsn, false}]}),
  234. %% now consult the sys.config file to make sure that is has the expected
  235. %% format
  236. ExpectedSysconfig = [{var_int, 1},
  237. {var_string, "test"},
  238. {var_bin_string, <<"test">>},
  239. {var_tuple, {t, ['atom']}},
  240. {var_list, [a, b, c, 'd']},
  241. {var_bin, <<23, 24, 25>>}],
  242. {ok, [ExpectedSysconfig]} = file:consult(filename:join([AppDir, "_build/default/rel",
  243. Name, "releases", Vsn, "sys.config"])).