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.

662 rindas
26 KiB

pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
pirms 10 gadiem
  1. -module(rebar_compile_SUITE).
  2. -export([suite/0,
  3. init_per_suite/1,
  4. end_per_suite/1,
  5. init_per_testcase/2,
  6. end_per_testcase/2,
  7. all/0,
  8. build_basic_app/1,
  9. build_release_apps/1,
  10. build_checkout_apps/1,
  11. build_checkout_deps/1,
  12. build_all_srcdirs/1,
  13. recompile_when_hrl_changes/1,
  14. recompile_when_opts_change/1,
  15. dont_recompile_when_opts_dont_change/1,
  16. dont_recompile_yrl_or_xrl/1,
  17. deps_in_path/1,
  18. delete_beam_if_source_deleted/1,
  19. checkout_priority/1,
  20. highest_version_of_pkg_dep/1,
  21. parse_transform_test/1,
  22. erl_first_files_test/1,
  23. mib_test/1,
  24. only_default_transitive_deps/1,
  25. clean_all/1,
  26. override_deps/1,
  27. profile_override_deps/1,
  28. build_more_sources/1]).
  29. -include_lib("common_test/include/ct.hrl").
  30. -include_lib("eunit/include/eunit.hrl").
  31. -include_lib("kernel/include/file.hrl").
  32. suite() ->
  33. [].
  34. init_per_suite(Config) ->
  35. Config.
  36. end_per_suite(_Config) ->
  37. ok.
  38. init_per_testcase(_, Config) ->
  39. rebar_test_utils:init_rebar_state(Config).
  40. end_per_testcase(_, _Config) ->
  41. catch meck:unload().
  42. all() ->
  43. [build_basic_app, build_release_apps,
  44. build_checkout_apps, build_checkout_deps,
  45. build_all_srcdirs, recompile_when_hrl_changes,
  46. recompile_when_opts_change, dont_recompile_when_opts_dont_change,
  47. dont_recompile_yrl_or_xrl, delete_beam_if_source_deleted,
  48. deps_in_path, checkout_priority, highest_version_of_pkg_dep,
  49. parse_transform_test, erl_first_files_test, mib_test, only_default_transitive_deps,
  50. clean_all, override_deps, profile_override_deps, build_more_sources].
  51. build_basic_app(Config) ->
  52. AppDir = ?config(apps, Config),
  53. Name = rebar_test_utils:create_random_name("app1_"),
  54. Vsn = rebar_test_utils:create_random_vsn(),
  55. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  56. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}).
  57. build_release_apps(Config) ->
  58. AppDir = ?config(apps, Config),
  59. Name1 = rebar_test_utils:create_random_name("relapp1_"),
  60. Vsn1 = rebar_test_utils:create_random_vsn(),
  61. rebar_test_utils:create_app(filename:join([AppDir,"apps",Name1]), Name1, Vsn1, [kernel, stdlib]),
  62. Name2 = rebar_test_utils:create_random_name("relapp2_"),
  63. Vsn2 = rebar_test_utils:create_random_vsn(),
  64. rebar_test_utils:create_app(filename:join([AppDir,"apps",Name2]), Name2, Vsn2, [kernel, stdlib]),
  65. rebar_test_utils:run_and_check(
  66. Config, [], ["compile"],
  67. {ok, [{app, Name1}, {app, Name2}]}
  68. ).
  69. build_checkout_apps(Config) ->
  70. AppDir = ?config(apps, Config),
  71. CheckoutsDir = ?config(checkouts, Config),
  72. Name1 = rebar_test_utils:create_random_name("checkapp1_"),
  73. Vsn1 = rebar_test_utils:create_random_vsn(),
  74. rebar_test_utils:create_app(AppDir, Name1, Vsn1, [kernel, stdlib]),
  75. Name2 = rebar_test_utils:create_random_name("checkapp2_"),
  76. Vsn2 = rebar_test_utils:create_random_vsn(),
  77. rebar_test_utils:create_app(filename:join([CheckoutsDir,Name2]), Name2, Vsn2, [kernel, stdlib]),
  78. rebar_test_utils:run_and_check(
  79. Config, [], ["compile"],
  80. {ok, [{app, Name1}, {checkout, Name2}]}
  81. ).
  82. build_checkout_deps(Config) ->
  83. AppDir = ?config(apps, Config),
  84. CheckoutsDir = ?config(checkouts, Config),
  85. DepsDir = filename:join([AppDir, "_build", "default", "lib"]),
  86. Name1 = rebar_test_utils:create_random_name("checkapp1_"),
  87. Vsn1 = rebar_test_utils:create_random_vsn(),
  88. rebar_test_utils:create_app(AppDir, Name1, Vsn1, [kernel, stdlib]),
  89. Name2 = rebar_test_utils:create_random_name("checkapp2_"),
  90. Vsn2 = rebar_test_utils:create_random_vsn(),
  91. rebar_test_utils:create_app(filename:join([CheckoutsDir,Name2]), Name2, Vsn2, [kernel, stdlib]),
  92. rebar_test_utils:create_app(filename:join([DepsDir,Name2]), Name2, Vsn1, [kernel, stdlib]),
  93. Deps = [{list_to_atom(Name2), Vsn2, {git, "", ""}}],
  94. {ok, RebarConfig} = file:consult(rebar_test_utils:create_config(AppDir, [{deps, Deps}])),
  95. {ok, State} = rebar_test_utils:run_and_check(
  96. Config, RebarConfig, ["compile"],
  97. {ok, [{app, Name1}, {checkout, Name2}]}
  98. ),
  99. code:add_paths(rebar_state:code_paths(State, all_deps)),
  100. ok = application:load(list_to_atom(Name2)),
  101. Loaded = application:loaded_applications(),
  102. {_, _, Vsn2} = lists:keyfind(list_to_atom(Name2), 1, Loaded).
  103. build_all_srcdirs(Config) ->
  104. AppDir = ?config(apps, Config),
  105. RebarConfig = [{erl_opts, [{src_dirs, ["src", "extra"]}]}],
  106. Name = rebar_test_utils:create_random_name("app1_"),
  107. Vsn = rebar_test_utils:create_random_vsn(),
  108. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  109. ExtraSrc = <<"-module(extra_src).\n"
  110. "-export([ok/0]).\n"
  111. "ok() -> ok.\n">>,
  112. ok = filelib:ensure_dir(filename:join([AppDir, "extra", "dummy"])),
  113. ok = file:write_file(filename:join([AppDir, "extra", "extra_src.erl"]), ExtraSrc),
  114. rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}),
  115. %% check a beam corresponding to the src in the extra src_dir exists in ebin
  116. EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
  117. true = filelib:is_file(filename:join([EbinDir, "extra_src.beam"])),
  118. %% check the extra src_dir was linked into the _build dir
  119. true = filelib:is_dir(filename:join([AppDir, "_build", "default", "lib", Name, "extra"])).
  120. recompile_when_hrl_changes(Config) ->
  121. AppDir = ?config(apps, Config),
  122. Name = rebar_test_utils:create_random_name("app1_"),
  123. Vsn = rebar_test_utils:create_random_vsn(),
  124. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  125. ExtraSrc = <<"-module(test_header_include).\n"
  126. "-export([main/0]).\n"
  127. "-include(\"test_header_include.hrl\").\n"
  128. "main() -> ?SOME_DEFINE.\n">>,
  129. ExtraHeader = <<"-define(SOME_DEFINE, true).\n">>,
  130. HeaderFile = filename:join([AppDir, "src", "test_header_include.hrl"]),
  131. ok = file:write_file(filename:join([AppDir, "src", "test_header_include.erl"]), ExtraSrc),
  132. ok = file:write_file(HeaderFile, ExtraHeader),
  133. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  134. EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
  135. {ok, Files} = file:list_dir(EbinDir),
  136. ModTime = [filelib:last_modified(filename:join([EbinDir, F]))
  137. || F <- Files, filename:extension(F) == ".beam"],
  138. timer:sleep(1000),
  139. rebar_file_utils:touch(HeaderFile),
  140. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  141. {ok, NewFiles} = file:list_dir(EbinDir),
  142. NewModTime = [filelib:last_modified(filename:join([EbinDir, F]))
  143. || F <- NewFiles, filename:extension(F) == ".beam"],
  144. ?assert(ModTime =/= NewModTime).
  145. recompile_when_opts_change(Config) ->
  146. AppDir = ?config(apps, Config),
  147. Name = rebar_test_utils:create_random_name("app1_"),
  148. Vsn = rebar_test_utils:create_random_vsn(),
  149. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  150. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  151. EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
  152. {ok, Files} = file:list_dir(EbinDir),
  153. ModTime = [filelib:last_modified(filename:join([EbinDir, F]))
  154. || F <- Files, filename:extension(F) == ".beam"],
  155. timer:sleep(1000),
  156. rebar_test_utils:create_config(AppDir, [{erl_opts, [{d, some_define}]}]),
  157. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  158. {ok, NewFiles} = file:list_dir(EbinDir),
  159. NewModTime = [filelib:last_modified(filename:join([EbinDir, F]))
  160. || F <- NewFiles, filename:extension(F) == ".beam"],
  161. ?assert(ModTime =/= NewModTime).
  162. dont_recompile_when_opts_dont_change(Config) ->
  163. AppDir = ?config(apps, Config),
  164. Name = rebar_test_utils:create_random_name("app1_"),
  165. Vsn = rebar_test_utils:create_random_vsn(),
  166. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  167. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  168. EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
  169. {ok, Files} = file:list_dir(EbinDir),
  170. ModTime = [filelib:last_modified(filename:join([EbinDir, F]))
  171. || F <- Files, filename:extension(F) == ".beam"],
  172. timer:sleep(1000),
  173. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  174. {ok, NewFiles} = file:list_dir(EbinDir),
  175. NewModTime = [filelib:last_modified(filename:join([EbinDir, F]))
  176. || F <- NewFiles, filename:extension(F) == ".beam"],
  177. ?assert(ModTime == NewModTime).
  178. dont_recompile_yrl_or_xrl(Config) ->
  179. AppDir = ?config(apps, Config),
  180. Name = rebar_test_utils:create_random_name("app1_"),
  181. Vsn = rebar_test_utils:create_random_vsn(),
  182. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  183. Xrl = filename:join([AppDir, "src", "not_a_real_xrl_" ++ Name ++ ".xrl"]),
  184. ok = filelib:ensure_dir(Xrl),
  185. XrlBody =
  186. "Definitions."
  187. "\n\n"
  188. "D = [0-9]"
  189. "\n\n"
  190. "Rules."
  191. "\n\n"
  192. "{D}+ :"
  193. " {token,{integer,TokenLine,list_to_integer(TokenChars)}}."
  194. "\n\n"
  195. "{D}+\\.{D}+((E|e)(\\+|\\-)?{D}+)? :"
  196. " {token,{float,TokenLine,list_to_float(TokenChars)}}."
  197. "\n\n"
  198. "Erlang code.",
  199. ok = ec_file:write(Xrl, XrlBody),
  200. XrlBeam = filename:join([AppDir, "ebin", filename:basename(Xrl, ".xrl") ++ ".beam"]),
  201. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  202. ModTime = filelib:last_modified(XrlBeam),
  203. timer:sleep(1000),
  204. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  205. NewModTime = filelib:last_modified(XrlBeam),
  206. ?assert(ModTime == NewModTime).
  207. delete_beam_if_source_deleted(Config) ->
  208. AppDir = ?config(apps, Config),
  209. Name = rebar_test_utils:create_random_name("app1_"),
  210. Vsn = rebar_test_utils:create_random_vsn(),
  211. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  212. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  213. EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
  214. _SrcDir = filename:join([AppDir, "_build", "default", "lib", Name, "src"]),
  215. ?assert(filelib:is_regular(filename:join(EbinDir, "not_a_real_src_" ++ Name ++ ".beam"))),
  216. file:delete(filename:join([AppDir, "src", "not_a_real_src_" ++ Name ++ ".erl"])),
  217. rebar_test_utils:run_and_check(Config, [], ["compile"], {ok, [{app, Name}]}),
  218. ?assertNot(filelib:is_regular(filename:join(EbinDir, "not_a_real_src_" ++ Name ++ ".beam"))).
  219. deps_in_path(Config) ->
  220. AppDir = ?config(apps, Config),
  221. StartPaths = code:get_path(),
  222. Name = rebar_test_utils:create_random_name("app1_"),
  223. Vsn = rebar_test_utils:create_random_vsn(),
  224. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  225. DepName = rebar_test_utils:create_random_name("dep1_"),
  226. PkgName = rebar_test_utils:create_random_name("pkg1_"),
  227. mock_git_resource:mock([]),
  228. mock_pkg_resource:mock([
  229. {pkgdeps, [{{iolist_to_binary(PkgName), iolist_to_binary(Vsn)}, []}]}
  230. ]),
  231. RConfFile = rebar_test_utils:create_config(AppDir, [{deps, [
  232. {list_to_atom(DepName), {git, "http://site.com/user/"++DepName++".git", {tag, Vsn}}},
  233. {list_to_atom(PkgName), Vsn}
  234. ]}]),
  235. {ok, RConf} = file:consult(RConfFile),
  236. %% Make sure apps we look for are not visible
  237. %% Hope not to find src name
  238. ?assertEqual([], [Path || Path <- code:get_path(),
  239. {match, _} <- [re:run(Path, DepName)]]),
  240. %% Hope not to find pkg name in there
  241. ?assertEqual([], [Path || Path <- code:get_path(),
  242. {match, _} <- [re:run(Path, PkgName)]]),
  243. %% Build things
  244. {ok, State} = rebar_test_utils:run_and_check(
  245. Config, RConf, ["compile"],
  246. {ok, [{app, Name}, {dep, DepName}, {dep, PkgName}]}
  247. ),
  248. code:add_paths(rebar_state:code_paths(State, all_deps)),
  249. %% Find src name in there
  250. ?assertNotEqual([], [Path || Path <- code:get_path(),
  251. {match, _} <- [re:run(Path, DepName)]]),
  252. %% find pkg name in there
  253. ?assertNotEqual([], [Path || Path <- code:get_path(),
  254. {match, _} <- [re:run(Path, PkgName)]]),
  255. code:set_path(StartPaths),
  256. %% Make sure apps we look for are not visible again
  257. %% Hope not to find src name
  258. ?assertEqual([], [Path || Path <- code:get_path(),
  259. {match, _} <- [re:run(Path, DepName)]]),
  260. %% Hope not to find pkg name in there
  261. ?assertEqual([], [Path || Path <- code:get_path(),
  262. {match, _} <- [re:run(Path, PkgName)]]),
  263. %% Rebuild
  264. {ok, State1} = rebar_test_utils:run_and_check(
  265. Config, RConf, ["compile"],
  266. {ok, [{app, Name}, {dep, DepName}, {dep, PkgName}]}
  267. ),
  268. %% Find src name in there
  269. code:add_paths(rebar_state:code_paths(State1, all_deps)),
  270. ?assertNotEqual([], [Path || Path <- code:get_path(),
  271. {match, _} <- [re:run(Path, DepName)]]),
  272. %% find pkg name in there
  273. ?assertNotEqual([], [Path || Path <- code:get_path(),
  274. {match, _} <- [re:run(Path, PkgName)]]).
  275. checkout_priority(Config) ->
  276. AppDir = ?config(apps, Config),
  277. CheckoutsDir = ?config(checkouts, Config),
  278. StartPaths = code:get_path(),
  279. Name = rebar_test_utils:create_random_name("app1_"),
  280. Vsn = rebar_test_utils:create_random_vsn(),
  281. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  282. DepName = rebar_test_utils:create_random_name("dep1_"),
  283. PkgName = rebar_test_utils:create_random_name("pkg1_"),
  284. mock_git_resource:mock([]),
  285. mock_pkg_resource:mock([
  286. {pkgdeps, [{{iolist_to_binary(PkgName), iolist_to_binary(Vsn)}, []}]}
  287. ]),
  288. RConfFile = rebar_test_utils:create_config(AppDir, [{deps, [
  289. {list_to_atom(DepName), {git, "http://site.com/user/"++DepName++".git", {tag, Vsn}}},
  290. {list_to_atom(PkgName), Vsn}
  291. ]}]),
  292. {ok, RConf} = file:consult(RConfFile),
  293. %% Build with deps.
  294. rebar_test_utils:run_and_check(
  295. Config, RConf, ["compile"],
  296. {ok, [{app, Name}, {dep, DepName}, {dep, PkgName}]}
  297. ),
  298. %% Build two checkout apps similar to dependencies to be fetched,
  299. %% but on a different version
  300. Vsn2 = rebar_test_utils:create_random_vsn(),
  301. rebar_test_utils:create_app(filename:join([CheckoutsDir,DepName]), DepName, Vsn2, [kernel, stdlib]),
  302. rebar_test_utils:create_app(filename:join([CheckoutsDir,PkgName]), PkgName, Vsn2, [kernel, stdlib]),
  303. %% Rebuild and make sure the checkout apps are in path
  304. code:set_path(StartPaths),
  305. {ok, State} = rebar_test_utils:run_and_check(
  306. Config, RConf, ["compile"],
  307. {ok, [{app, Name}, {checkout, DepName}, {checkout, PkgName}]}
  308. ),
  309. code:add_paths(rebar_state:code_paths(State, all_deps)),
  310. [DepPath] = [Path || Path <- code:get_path(),
  311. {match, _} <- [re:run(Path, DepName)]],
  312. [PkgPath] = [Path || Path <- code:get_path(),
  313. {match, _} <- [re:run(Path, PkgName)]],
  314. {ok, [DepApp]} = file:consult(filename:join([DepPath, DepName ++ ".app"])),
  315. {ok, [PkgApp]} = file:consult(filename:join([PkgPath, PkgName ++ ".app"])),
  316. {application, _, DepProps} = DepApp,
  317. {application, _, PkgProps} = PkgApp,
  318. ?assertEqual(Vsn2, proplists:get_value(vsn, DepProps)),
  319. ?assertEqual(Vsn2, proplists:get_value(vsn, PkgProps)).
  320. highest_version_of_pkg_dep(Config) ->
  321. AppDir = ?config(apps, Config),
  322. Name = rebar_test_utils:create_random_name("app1_"),
  323. Vsn = rebar_test_utils:create_random_vsn(),
  324. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  325. PkgName = rebar_test_utils:create_random_name("pkg1_"),
  326. mock_git_resource:mock([]),
  327. mock_pkg_resource:mock([
  328. {pkgdeps, [{{iolist_to_binary(PkgName), <<"0.1.0">>}, []},
  329. {{iolist_to_binary(PkgName), <<"0.0.1">>}, []},
  330. {{iolist_to_binary(PkgName), <<"0.1.3">>}, []},
  331. {{iolist_to_binary(PkgName), <<"0.1.1">>}, []}]}
  332. ]),
  333. RConfFile = rebar_test_utils:create_config(AppDir, [{deps, [list_to_atom(PkgName)]}]),
  334. {ok, RConf} = file:consult(RConfFile),
  335. %% Build with deps.
  336. rebar_test_utils:run_and_check(
  337. Config, RConf, ["compile"],
  338. {ok, [{app, Name}, {dep, PkgName, <<"0.1.3">>}]}
  339. ).
  340. parse_transform_test(Config) ->
  341. AppDir = ?config(apps, Config),
  342. RebarConfig = [{erl_opts, [{parse_transform, pascal}]}],
  343. Name = rebar_test_utils:create_random_name("app1_"),
  344. Vsn = rebar_test_utils:create_random_vsn(),
  345. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  346. ExtraSrc = <<"-module(pascal). "
  347. "-export([parse_transform/2]). "
  348. "parse_transform(Forms, _Options) -> "
  349. "Forms.">>,
  350. ok = file:write_file(filename:join([AppDir, "src", "pascal.erl"]), ExtraSrc),
  351. rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}),
  352. EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
  353. true = filelib:is_file(filename:join([EbinDir, "pascal.beam"])).
  354. erl_first_files_test(Config) ->
  355. AppDir = ?config(apps, Config),
  356. RebarConfig = [{erl_opts, [{parse_transform, mark_time}]},
  357. {erl_first_files, ["src/mark_time.erl",
  358. "src/b.erl",
  359. "src/d.erl",
  360. "src/a.erl"]}],
  361. Name = rebar_test_utils:create_random_name("app1_"),
  362. Vsn = rebar_test_utils:create_random_vsn(),
  363. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  364. rebar_test_utils:write_src_file(AppDir, "a.erl"),
  365. rebar_test_utils:write_src_file(AppDir, "b.erl"),
  366. rebar_test_utils:write_src_file(AppDir, "d.erl"),
  367. rebar_test_utils:write_src_file(AppDir, "e.erl"),
  368. ExtraSrc = <<"-module(mark_time). "
  369. "-export([parse_transform/2]). "
  370. "parse_transform([Form={attribute,_,module,Mod}|Forms], Options) -> "
  371. " [Form, {attribute,1,number, os:timestamp()} | Forms];"
  372. "parse_transform([Form|Forms], Options) -> "
  373. " [Form | parse_transform(Forms, Options)].">>,
  374. ok = file:write_file(filename:join([AppDir, "src", "mark_time.erl"]), ExtraSrc),
  375. rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}),
  376. EbinDir = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]),
  377. true = filelib:is_file(filename:join([EbinDir, "mark_time.beam"])),
  378. code:load_abs(filename:join([EbinDir, "a"])),
  379. code:load_abs(filename:join([EbinDir, "b"])),
  380. code:load_abs(filename:join([EbinDir, "d"])),
  381. code:load_abs(filename:join([EbinDir, "e"])),
  382. A = proplists:get_value(number, a:module_info(attributes)),
  383. B = proplists:get_value(number, b:module_info(attributes)),
  384. D = proplists:get_value(number, d:module_info(attributes)),
  385. E = proplists:get_value(number, e:module_info(attributes)),
  386. ?assertEqual([B,D,A,E], lists:sort([A,B,D,E])).
  387. mib_test(Config) ->
  388. AppDir = ?config(apps, Config),
  389. RebarConfig = [],
  390. Name = rebar_test_utils:create_random_name("app1_"),
  391. Vsn = rebar_test_utils:create_random_vsn(),
  392. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  393. MibsSrc = <<"-- SIMPLE-MIB.\n"
  394. "-- This is just a simple MIB used for testing!\n"
  395. "--\n"
  396. "SIMPLE-MIB DEFINITIONS ::= BEGIN\n"
  397. "IMPORTS\n"
  398. " MODULE-IDENTITY, enterprises\n"
  399. " FROM SNMPv2-SMI;\n"
  400. "\n"
  401. "ericsson MODULE-IDENTITY\n"
  402. " LAST-UPDATED\n"
  403. " \"201403060000Z\"\n"
  404. " ORGANIZATION\n"
  405. " \"rebar\"\n"
  406. " CONTACT-INFO\n"
  407. " \"rebar <rebar@example.com>\n"
  408. " or\n"
  409. " whoever is currently responsible for the SIMPLE\n"
  410. " enterprise MIB tree branch (enterprises.999).\"\n"
  411. " DESCRIPTION\n"
  412. " \"This very small module is made available\n"
  413. " for mib-compilation testing.\"\n"
  414. " ::= { enterprises 999 }\n"
  415. "END\n">>,
  416. ok = filelib:ensure_dir(filename:join([AppDir, "mibs", "dummy"])),
  417. ok = file:write_file(filename:join([AppDir, "mibs", "SIMPLE-MIB.mib"]), MibsSrc),
  418. rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}),
  419. %% check a beam corresponding to the src in the extra src_dir exists in ebin
  420. PrivMibsDir = filename:join([AppDir, "_build", "default", "lib", Name, "priv", "mibs"]),
  421. true = filelib:is_file(filename:join([PrivMibsDir, "SIMPLE-MIB.bin"])),
  422. %% check the extra src_dir was linked into the _build dir
  423. true = filelib:is_dir(filename:join([AppDir, "_build", "default", "lib", Name, "mibs"])).
  424. only_default_transitive_deps(Config) ->
  425. AppDir = ?config(apps, Config),
  426. Name = rebar_test_utils:create_random_name("app1_"),
  427. Vsn = rebar_test_utils:create_random_vsn(),
  428. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  429. GitDeps = rebar_test_utils:expand_deps(git, [{"a", "1.0.0", []}]),
  430. PkgName = rebar_test_utils:create_random_name("pkg1_"),
  431. {SrcDeps, _} = rebar_test_utils:flat_deps(GitDeps),
  432. mock_git_resource:mock([{deps, SrcDeps},
  433. {config, [{profiles, [{test, [{deps, [list_to_atom(PkgName)]}]}]}]}]),
  434. mock_pkg_resource:mock([{pkgdeps, [{{iolist_to_binary(PkgName), <<"0.1.0">>}, []}]}]),
  435. Deps = rebar_test_utils:top_level_deps(GitDeps),
  436. RConfFile = rebar_test_utils:create_config(AppDir, [{deps, Deps}]),
  437. {ok, RConf} = file:consult(RConfFile),
  438. %% Build with deps.
  439. rebar_test_utils:run_and_check(
  440. Config, RConf, ["as", "test", "compile"],
  441. {ok, [{app, Name}, {dep, "a", <<"1.0.0">>}, {dep_not_exist, PkgName}]}
  442. ).
  443. clean_all(Config) ->
  444. AppDir = ?config(apps, Config),
  445. Name = rebar_test_utils:create_random_name("app1_"),
  446. Vsn = rebar_test_utils:create_random_vsn(),
  447. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  448. DepName = rebar_test_utils:create_random_name("dep1_"),
  449. PkgName = rebar_test_utils:create_random_name("pkg1_"),
  450. mock_git_resource:mock([]),
  451. mock_pkg_resource:mock([
  452. {pkgdeps, [{{iolist_to_binary(PkgName), iolist_to_binary(Vsn)}, []}]}
  453. ]),
  454. RConfFile = rebar_test_utils:create_config(AppDir, [{deps, [
  455. {list_to_atom(DepName), {git, "http://site.com/user/"++DepName++".git", {tag, Vsn}}},
  456. {list_to_atom(PkgName), Vsn}
  457. ]}]),
  458. {ok, RConf} = file:consult(RConfFile),
  459. %% Build things
  460. rebar_test_utils:run_and_check(
  461. Config, RConf, ["compile"],
  462. {ok, [{app, Name}, {app, DepName}, {app, PkgName}]}
  463. ),
  464. %% Clean all
  465. rebar_test_utils:run_and_check(
  466. Config, RConf, ["clean", "--all"],
  467. {ok, [{app, Name, invalid}, {app, DepName, invalid}, {app, PkgName, invalid}]}
  468. ).
  469. override_deps(Config) ->
  470. mock_git_resource:mock([{deps, [{some_dep, "0.0.1"},{other_dep, "0.0.1"}]}]),
  471. Deps = rebar_test_utils:expand_deps(git, [{"some_dep", "0.0.1", [{"other_dep", "0.0.1", []}]}]),
  472. TopDeps = rebar_test_utils:top_level_deps(Deps),
  473. RebarConfig = [
  474. {deps, TopDeps},
  475. {overrides, [
  476. {override, some_dep, [
  477. {deps, []}
  478. ]}
  479. ]}
  480. ],
  481. rebar_test_utils:run_and_check(
  482. Config, RebarConfig, ["compile"],
  483. {ok, [{dep, "some_dep"},{dep_not_exist, "other_dep"}]}
  484. ).
  485. profile_override_deps(Config) ->
  486. mock_git_resource:mock([{deps, [{some_dep, "0.0.1"},{other_dep, "0.0.1"}]}]),
  487. Deps = rebar_test_utils:expand_deps(git, [{"some_dep", "0.0.1", [{"other_dep", "0.0.1", []}]}]),
  488. TopDeps = rebar_test_utils:top_level_deps(Deps),
  489. RebarConfig = [
  490. {deps, TopDeps},
  491. {profiles, [{a,
  492. [{overrides, [
  493. {override, some_dep, [
  494. {deps, []}
  495. ]}
  496. ]}
  497. ]}
  498. ]}],
  499. rebar_test_utils:run_and_check(
  500. Config, RebarConfig, ["as", "a", "compile"],
  501. {ok, [{dep, "some_dep"},{dep_not_exist, "other_dep"}]}
  502. ).
  503. build_more_sources(Config) ->
  504. AppDir = ?config(apps, Config),
  505. ASrc = <<"-module(a_src).\n-export([ok/0]).\nok() -> ok.\n">>,
  506. BSrc = <<"-module(b_src).\n-export([ok/0]).\nok() -> ok.\n">>,
  507. CSrc = <<"-module(c_src).\n-export([ok/0]).\nok() -> ok.\n">>,
  508. ok = filelib:ensure_dir(filename:join([AppDir, "more", "dummy"])),
  509. ok = filelib:ensure_dir(filename:join([AppDir, "ebin", "dummy"])),
  510. ok = file:write_file(filename:join([AppDir, "more", "a_src.erl"]), ASrc),
  511. ok = file:write_file(filename:join([AppDir, "more", "b_src.erl"]), BSrc),
  512. ok = file:write_file(filename:join([AppDir, "more", "c_src.erl"]), CSrc),
  513. Opts = dict:new(),
  514. rebar_erlc_compiler:compile(Opts,
  515. filename:join([AppDir, "more"]),
  516. filename:join([AppDir, "ebin"]),
  517. [filename:join([AppDir, "more", "a_src.erl"]),
  518. filename:join([AppDir, "more", "b_src.erl"]),
  519. filename:join([AppDir, "more", "c_src.erl"])]),
  520. EbinDir = filename:join([AppDir, "ebin"]),
  521. true = filelib:is_file(filename:join([EbinDir, "a_src.beam"])),
  522. true = filelib:is_file(filename:join([EbinDir, "b_src.beam"])),
  523. true = filelib:is_file(filename:join([EbinDir, "c_src.beam"])).