Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

351 rinda
16 KiB

pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
  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. config_file,
  7. dev_mode_release,
  8. profile_dev_mode_override_release,
  9. tar,
  10. profile_ordering_sys_config_extend,
  11. profile_ordering_sys_config_extend_3_tuple_merge,
  12. extend_release,
  13. user_output_dir, profile_overlays,
  14. profile_overlay_merge,
  15. overlay_vars].
  16. init_per_testcase(Case, Config0) ->
  17. Config = rebar_test_utils:init_rebar_state(Config0),
  18. Name = rebar_test_utils:create_random_name(atom_to_list(Case)),
  19. AppDir = ?config(apps, Config),
  20. application:load(rebar),
  21. ok = ec_file:mkdir_p(AppDir),
  22. State = rebar_state:new([{base_dir, filename:join([AppDir, "_build"])}]),
  23. rebar_test_utils:create_app(AppDir, Name, "1.0.0", [kernel, stdlib]),
  24. [{name, Name}, {apps, AppDir}, {state, State} | Config].
  25. end_per_testcase(_, Config) ->
  26. meck:unload(),
  27. Config.
  28. release(Config) ->
  29. AppDir = ?config(apps, Config),
  30. Name = ?config(name, Config),
  31. Vsn = "1.0.0",
  32. {ok, RebarConfig} =
  33. file:consult(rebar_test_utils:create_config(AppDir,
  34. [{relx, [{release, {list_to_atom(Name), Vsn},
  35. [list_to_atom(Name)]},
  36. {lib_dirs, [AppDir]}]}])),
  37. rebar_test_utils:run_and_check(
  38. Config, RebarConfig,
  39. ["release"],
  40. {ok, [{release, list_to_atom(Name), Vsn, false}]}
  41. ).
  42. config_file(Config) ->
  43. AppDir = ?config(apps, Config),
  44. Name = list_to_atom(?config(name, Config)),
  45. %% Relase build fails if no relx config exists
  46. ?assertError({error, {relx, no_releases_in_system}},
  47. rebar_test_utils:run_and_check(Config, [], ["release"], result)),
  48. %% Write relx.config
  49. RelxConfig = fun(Vsn) -> [{release, {Name, Vsn}, [Name]}, {lib_dirs, [AppDir]}] end,
  50. rebar_test_utils:create_config(AppDir, "relx.config", RelxConfig("1.0.0")),
  51. %% Release is built with relx.config (default)
  52. rebar_test_utils:run_and_check(Config, [], ["release"],
  53. {ok, [{release, Name, "1.0.0", false}]}),
  54. %% Release is built with custom.config (--config)
  55. rebar_test_utils:create_config(AppDir, "custom.config", RelxConfig("2.0.0")),
  56. rebar_test_utils:run_and_check(Config, [], ["release", "--config", "custom.config"],
  57. {ok, [{release, Name, "2.0.0", false}]}),
  58. %% Fail due to non-existing file
  59. ?assertError({error, {rebar_relx, {config_file, "no_exist.config", enoent}}},
  60. rebar_test_utils:run_and_check(Config, [],
  61. ["release", "--config", "no_exist.config"], result)),
  62. %% Fail due to non-existing file, even with relx config in rebar.config
  63. ?assertError({error, {rebar_relx, {config_file, "no_exist.config", enoent}}},
  64. rebar_test_utils:run_and_check(Config, [{relx, RelxConfig("3.0.0")}],
  65. ["release", "--config", "no_exist.config"], result)),
  66. %% rebar.config overrides relx.config if both exist
  67. rebar_test_utils:run_and_check(Config, [{relx, RelxConfig("4.0.0")}], ["release"],
  68. {ok, [{release, Name, "4.0.0", false}]}).
  69. dev_mode_release(Config) ->
  70. AppDir = ?config(apps, Config),
  71. Name = ?config(name, Config),
  72. Vsn = "1.0.0",
  73. {ok, RebarConfig} =
  74. file:consult(rebar_test_utils:create_config(AppDir,
  75. [{relx, [{release, {list_to_atom(Name), Vsn},
  76. [list_to_atom(Name)]},
  77. {lib_dirs, [AppDir]},
  78. {dev_mode, true}]}])),
  79. rebar_test_utils:run_and_check(
  80. Config, RebarConfig,
  81. ["release"],
  82. {ok, [{release, list_to_atom(Name), Vsn, true}]}
  83. ).
  84. profile_dev_mode_override_release(Config) ->
  85. AppDir = ?config(apps, Config),
  86. Name = ?config(name, Config),
  87. Vsn = "1.0.0",
  88. {ok, RebarConfig} =
  89. file:consult(rebar_test_utils:create_config(AppDir,
  90. [{relx, [{release, {list_to_atom(Name), Vsn},
  91. [list_to_atom(Name)]},
  92. {lib_dirs, [AppDir]},
  93. {dev_mode, true}]},
  94. {profiles,
  95. [{ct,
  96. [{relx, [{dev_mode, false}]}]}]}])),
  97. rebar_test_utils:run_and_check(
  98. Config, RebarConfig,
  99. ["as", "ct", "release"],
  100. {ok, [{release, list_to_atom(Name), Vsn, false}]}
  101. ).
  102. tar(Config) ->
  103. AppDir = ?config(apps, Config),
  104. Name = ?config(name, Config),
  105. Vsn = "1.0.0",
  106. {ok, RebarConfig} =
  107. file:consult(rebar_test_utils:create_config(AppDir,
  108. [{relx, [{release, {list_to_atom(Name), Vsn},
  109. [list_to_atom(Name)]},
  110. {lib_dirs, [AppDir]}]}])),
  111. rebar_test_utils:run_and_check(
  112. Config, RebarConfig,
  113. ["tar"],
  114. {ok, [{release, list_to_atom(Name), Vsn, false}, {tar, Name, Vsn}]}
  115. ).
  116. %% Test that the order of release config args is not lost. If it is extend would fail.
  117. extend_release(Config) ->
  118. AppDir = ?config(apps, Config),
  119. Name = ?config(name, Config),
  120. Vsn = "1.0.0",
  121. {ok, RebarConfig} =
  122. file:consult(rebar_test_utils:create_config(AppDir,
  123. [{relx, [{release, {list_to_atom(Name), Vsn},
  124. [list_to_atom(Name)]},
  125. {release, {extended, Vsn, {extend, list_to_atom(Name)}},
  126. []},
  127. {lib_dirs, [AppDir]}]}])),
  128. rebar_test_utils:run_and_check(
  129. Config, RebarConfig,
  130. ["release", "-n", "extended"],
  131. {ok, [{release, extended, Vsn, false}]}
  132. ).
  133. %% Ensure proper ordering of sys_config and extended releases in profiles
  134. profile_ordering_sys_config_extend(Config) ->
  135. AppDir = ?config(apps, Config),
  136. Name = ?config(name, Config),
  137. Vsn = "1.0.0",
  138. TestSysConfig = filename:join(AppDir, "test.config"),
  139. OtherSysConfig = filename:join(AppDir, "other.config"),
  140. ok = file:write_file(TestSysConfig, "[]."),
  141. ok = file:write_file(OtherSysConfig, "[{some, content}]."),
  142. {ok, RebarConfig} =
  143. file:consult(rebar_test_utils:create_config(AppDir,
  144. [{relx, [{release, {list_to_atom(Name), Vsn},
  145. [list_to_atom(Name)]},
  146. {sys_config, OtherSysConfig},
  147. {lib_dirs, [AppDir]}]},
  148. {profiles, [{extended,
  149. [{relx, [
  150. {sys_config, TestSysConfig}]}]}]}])),
  151. rebar_test_utils:run_and_check(
  152. Config, RebarConfig,
  153. ["as", "extended", "release"],
  154. {ok, [{release, list_to_atom(Name), Vsn, false}]}
  155. ),
  156. ReleaseDir = filename:join([AppDir, "./_build/extended/rel/", Name, "releases", Vsn]),
  157. {ok, [[]]} = file:consult(filename:join(ReleaseDir, "sys.config")).
  158. %% test that tup_umerge works with tuples of different sizes
  159. profile_ordering_sys_config_extend_3_tuple_merge(Config) ->
  160. AppDir = ?config(apps, Config),
  161. Name = ?config(name, Config),
  162. Vsn = "1.0.0",
  163. TestSysConfig = filename:join(AppDir, "test.config"),
  164. OtherSysConfig = filename:join(AppDir, "other.config"),
  165. ok = file:write_file(TestSysConfig, "[]."),
  166. ok = file:write_file(OtherSysConfig, "[{some, content}]."),
  167. {ok, RebarConfig} =
  168. file:consult(rebar_test_utils:create_config(AppDir,
  169. [{relx, [{release, {list_to_atom(Name), Vsn},
  170. [list_to_atom(Name)]},
  171. {sys_config, OtherSysConfig},
  172. {lib_dirs, [AppDir]}]},
  173. {profiles, [{extended,
  174. [{relx, [
  175. {release, {extended, Vsn, {extend, list_to_atom(Name)}},
  176. []},
  177. {sys_config, TestSysConfig}]}]}]}])),
  178. rebar_test_utils:run_and_check(
  179. Config, RebarConfig,
  180. ["as", "extended", "release", "-n", Name],
  181. {ok, [{release, list_to_atom(Name), Vsn, false}]}
  182. ),
  183. ReleaseDir = filename:join([AppDir, "./_build/extended/rel/", Name, "releases", Vsn]),
  184. {ok, [[]]} = file:consult(filename:join(ReleaseDir, "sys.config")).
  185. user_output_dir(Config) ->
  186. AppDir = ?config(apps, Config),
  187. Name = ?config(name, Config),
  188. ReleaseDir = filename:join(AppDir, "./_rel"),
  189. Vsn = "1.0.0",
  190. {ok, RebarConfig} =
  191. file:consult(rebar_test_utils:create_config(AppDir,
  192. [{relx, [{release, {list_to_atom(Name), Vsn},
  193. [list_to_atom(Name)]},
  194. {lib_dirs, [AppDir]},
  195. {dev_mode, true}]}])),
  196. rebar_test_utils:run_and_check(
  197. Config, RebarConfig,
  198. ["release", "-o", ReleaseDir],
  199. {ok, []}
  200. ),
  201. ?assertNotMatch([], filelib:wildcard(filename:join([ReleaseDir, Name, "releases", Vsn, "*"]))).
  202. profile_overlays(Config) ->
  203. AppDir = ?config(apps, Config),
  204. Name = ?config(name, Config),
  205. Vsn = "1.0.0",
  206. file:write_file(filename:join(AppDir, "dev.file"), "dev.\n"),
  207. file:write_file(filename:join(AppDir, "prod.file"), "prod.\n"),
  208. file:write_file(filename:join(AppDir, "dev.vars"), "{env, \"dev\"}.\n"),
  209. file:write_file(filename:join(AppDir, "prod.vars"), "{env, \"prod\"}.\n"),
  210. {ok, RebarConfig} =
  211. file:consult(rebar_test_utils:create_config(AppDir,
  212. %% Paths are relative, but to cwd in relx, not the project root as
  213. %% seen by rebar3 (in non-test cases, they're the same).
  214. %% Work around by being explicit.
  215. [{relx, [{release, {list_to_atom(Name), Vsn},
  216. [list_to_atom(Name)]},
  217. {overlay_vars, filename:join(AppDir, "dev.vars")},
  218. {overlay, [{mkdir, "randomdir"},
  219. {copy, filename:join(AppDir,"./dev.file"), "profile.file"},
  220. {copy, filename:join(AppDir,"./dev.file"), "{{env}}.file"},
  221. {chmod, 8#00770, "profile.file"}]},
  222. {lib_dirs, [AppDir]}]},
  223. {profiles, [{prod,
  224. [{relx, [
  225. {debug_info, keep},
  226. {overlay_vars, filename:join(AppDir, "prod.vars")},
  227. {overlay, [{mkdir, "otherrandomdir"},
  228. {copy, filename:join(AppDir, "./prod.file"), "{{env}}.file"},
  229. {copy, filename:join(AppDir, "./prod.file"), "profile.file"},
  230. {chmod, 8#00770, "profile.file"}]}
  231. ]}]
  232. }]}
  233. ])),
  234. ReleaseDir = filename:join([AppDir, "./_build/prod/rel/", Name]),
  235. rebar_test_utils:run_and_check(
  236. Config, RebarConfig,
  237. ["as", "prod", "release"],
  238. {ok, [{release, list_to_atom(Name), Vsn, false},
  239. {dir, filename:join(ReleaseDir, "otherrandomdir")},
  240. {dir, filename:join(ReleaseDir, "randomdir")}]}
  241. ),
  242. ?assertMatch({ok,[prod]},
  243. file:consult(filename:join(ReleaseDir, "profile.file"))),
  244. ?assertMatch({ok,[prod]},
  245. file:consult(filename:join(ReleaseDir, "prod.file"))),
  246. ok.
  247. profile_overlay_merge (_Config) ->
  248. % when profile and relx overlays both exist, the profile overlays should be
  249. % first, then the relx overlays, all the rest of the config should come
  250. % after, rebar_relx:merge_overlays/1 should do this.
  251. RelxOverlay = [{mkdir, "1_from_relx"}, {mkdir, "2_from_relx"}],
  252. ProfileOverlay = [{mkdir, "0_from_other_profile"}],
  253. OtherConfig = [{other1, config}, {other2, config}],
  254. % test with no overlays
  255. ?assertEqual([{overlay,[]}] ++ OtherConfig,
  256. rebar_relx:merge_overlays(OtherConfig)),
  257. % test with relx only, just move overlays to the top
  258. RelxOnly = OtherConfig ++ [{overlay, RelxOverlay}],
  259. ?assertEqual([{overlay, RelxOverlay}]++OtherConfig,
  260. rebar_relx:merge_overlays(RelxOnly)),
  261. % now test with a profile (profiles end up after relx overlays
  262. ProfilesToMerge = OtherConfig ++
  263. [{overlay, RelxOverlay},
  264. {overlay, ProfileOverlay}],
  265. ?assertEqual([{overlay, ProfileOverlay ++ RelxOverlay}] ++ OtherConfig,
  266. rebar_relx:merge_overlays(ProfilesToMerge)).
  267. overlay_vars(Config) ->
  268. AppDir = ?config(apps, Config),
  269. Name = ?config(name, Config),
  270. Vsn = "1.0.0",
  271. {ok, RebarConfig} =
  272. file:consult(rebar_test_utils:create_config(AppDir,
  273. [{relx, [{release, {list_to_atom(Name), Vsn},
  274. [list_to_atom(Name)]},
  275. {overlay, [
  276. {template, filename:join([AppDir, "config/app.config"]),
  277. "releases/{{release_version}}/sys.config"}
  278. ]},
  279. {overlay_vars, filename:join([AppDir, "config/vars.config"])},
  280. {lib_dirs, [AppDir]}]}
  281. ])),
  282. ok = filelib:ensure_dir(filename:join([AppDir, "config", "dummy"])),
  283. OverlayVars = [{var_int, 1},
  284. {var_string, "\"test\""},
  285. {var_bin_string, "<<\"test\">>"},
  286. {var_tuple, "{t, ['atom']}"},
  287. {var_list, "[a, b, c, 'd']"},
  288. {var_bin, "<<23, 24, 25>>"}],
  289. rebar_test_utils:create_config(AppDir,
  290. filename:join([AppDir, "config", "vars.config"]),
  291. OverlayVars),
  292. AppConfig = [[{var_int, {{var_int}}},
  293. {var_string, {{{var_string}}}},
  294. {var_bin_string, {{{var_bin_string}}}},
  295. {var_tuple, {{{var_tuple}}}},
  296. {var_list, {{{var_list}}}},
  297. {var_bin, {{{var_bin}}}},
  298. {var_profile_string, {{profile_string}}}]], % this comes from `rebar3'
  299. rebar_test_utils:create_config(AppDir,
  300. filename:join([AppDir, "config", "app.config"]),
  301. AppConfig),
  302. rebar_test_utils:run_and_check(
  303. Config, RebarConfig,
  304. ["release"],
  305. {ok, [{release, list_to_atom(Name), Vsn, false}]}),
  306. %% now consult the sys.config file to make sure that is has the expected
  307. %% format
  308. ExpectedSysconfig = [{var_int, 1},
  309. {var_string, "test"},
  310. {var_bin_string, <<"test">>},
  311. {var_tuple, {t, ['atom']}},
  312. {var_list, [a, b, c, 'd']},
  313. {var_bin, <<23, 24, 25>>},
  314. {var_profile_string, 'default'}],
  315. {ok, [ExpectedSysconfig]} = file:consult(filename:join([AppDir, "_build/default/rel",
  316. Name, "releases", Vsn, "sys.config"])).