%%% TODO: check that warnings are appearing
|
|
-module(rebar_deps_SUITE).
|
|
-compile(export_all).
|
|
-include_lib("common_test/include/ct.hrl").
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
|
|
all() -> [flat, pick_highest_left, pick_highest_right, pick_earliest,
|
|
circular1, circular2].
|
|
|
|
init_per_suite(Config) ->
|
|
application:start(meck),
|
|
Config.
|
|
|
|
end_per_suite(_Config) ->
|
|
application:stop(meck).
|
|
|
|
init_per_testcase(Case, Config) ->
|
|
{Deps, Expect} = deps(Case),
|
|
Expected = case Expect of
|
|
{ok, List} -> {ok, format_expected_deps(List)};
|
|
{error, Reason} -> {error, Reason}
|
|
end,
|
|
[{expect, Expected} | setup_project(Case, Config, expand_deps(Deps))].
|
|
|
|
format_expected_deps(Deps) ->
|
|
[case Dep of
|
|
{N,V} -> {dep, N, V};
|
|
N -> {dep, N}
|
|
end || Dep <- Deps].
|
|
|
|
deps(flat) ->
|
|
{[{"B", []},
|
|
{"C", []}],
|
|
{ok, ["B", "C"]}};
|
|
deps(pick_highest_left) ->
|
|
{[{"B", [{"C", "2", []}]},
|
|
{"C", "1", []}],
|
|
{ok, ["B", {"C", "1"}]}}; % Warn C2
|
|
deps(pick_highest_right) ->
|
|
{[{"B", "1", []},
|
|
{"C", [{"B", "2", []}]}],
|
|
{ok, [{"B","1"}, "C"]}}; % Warn B2
|
|
deps(pick_earliest) ->
|
|
{[{"B", [{"D", "1", []}]},
|
|
{"C", [{"D", "2", []}]}],
|
|
{ok, ["B","C",{"D","1"}]}}; % Warn D2
|
|
deps(circular1) ->
|
|
{[{"B", [{"A", []}]}, % A is the top-level app
|
|
{"C", []}],
|
|
{error, {cycles, [[<<"A">>,<<"B">>]]}}}; % circular dep
|
|
deps(circular2) ->
|
|
{[{"B", [{"C", [{"B", []}]}]},
|
|
{"C", []}],
|
|
{error, {cycles, [[<<"B">>,<<"C">>]]}}}. % circular dep
|
|
|
|
end_per_testcase(_, Config) ->
|
|
mock_git_resource:unmock(),
|
|
meck:unload(),
|
|
Config.
|
|
|
|
expand_deps([]) -> [];
|
|
expand_deps([{Name, Deps} | Rest]) ->
|
|
Dep = {Name, ".*", {git, "https://example.org/user/"++Name++".git", "master"}},
|
|
[{Dep, expand_deps(Deps)} | expand_deps(Rest)];
|
|
expand_deps([{Name, Vsn, Deps} | Rest]) ->
|
|
Dep = {Name, Vsn, {git, "https://example.org/user/"++Name++".git", {tag, Vsn}}},
|
|
[{Dep, expand_deps(Deps)} | expand_deps(Rest)].
|
|
|
|
setup_project(Case, Config0, Deps) ->
|
|
Config = rebar_test_utils:init_rebar_state(Config0, atom_to_list(Case)),
|
|
AppDir = ?config(apps, Config),
|
|
rebar_test_utils:create_app(AppDir, "A", "0.0.0", [kernel, stdlib]),
|
|
TopDeps = top_level_deps(Deps),
|
|
RebarConf = rebar_test_utils:create_config(AppDir, [{deps, TopDeps}]),
|
|
mock_git_resource:mock([{deps, flat_deps(Deps)}]),
|
|
[{rebarconfig, RebarConf} | Config].
|
|
|
|
|
|
flat_deps([]) -> [];
|
|
flat_deps([{{Name,_Vsn,_Ref}, Deps} | Rest]) ->
|
|
[{Name, top_level_deps(Deps)}]
|
|
++
|
|
flat_deps(Deps)
|
|
++
|
|
flat_deps(Rest).
|
|
|
|
top_level_deps(Deps) -> [{list_to_atom(Name),Vsn,Ref} || {{Name,Vsn,Ref},_} <- Deps].
|
|
|
|
%%% TESTS %%%
|
|
flat(Config) -> run(Config).
|
|
pick_highest_left(Config) -> run(Config).
|
|
pick_highest_right(Config) -> run(Config).
|
|
pick_earliest(Config) -> run(Config).
|
|
circular1(Config) -> run(Config).
|
|
circular2(Config) -> run(Config).
|
|
|
|
run(Config) ->
|
|
{ok, RebarConfig} = file:consult(?config(rebarconfig, Config)),
|
|
rebar_test_utils:run_and_check(
|
|
Config, RebarConfig, "install_deps", ?config(expect, Config)
|
|
).
|
|
|