From 249be4985c130f8cc096033e2aa8305b99817aa5 Mon Sep 17 00:00:00 2001 From: Fred Hebert Date: Mon, 23 Feb 2015 15:44:52 +0000 Subject: Reuse test code and drop duplicated stuff --- test/rebar_install_deps_SUITE.erl | 56 +++------------------------------------ test/rebar_test_utils.erl | 11 +++++++- test/rebar_upgrade_SUITE.erl | 51 +++++------------------------------ 3 files changed, 20 insertions(+), 98 deletions(-) (limited to 'test') diff --git a/test/rebar_install_deps_SUITE.erl b/test/rebar_install_deps_SUITE.erl index 5e56029..28cc277 100644 --- a/test/rebar_install_deps_SUITE.erl +++ b/test/rebar_install_deps_SUITE.erl @@ -39,7 +39,7 @@ init_per_testcase(Case, Config) -> mock_warnings(), [{expect, Expected}, {warnings, Warnings} - | setup_project(Case, Config, expand_deps(DepsType, Deps))]. + | setup_project(Case, Config, rebar_test_utils:expand_deps(DepsType, Deps))]. end_per_testcase(_, Config) -> meck:unload(), @@ -110,20 +110,6 @@ deps(circular_skip) -> [{"C","2"}], {ok, ["B", {"C","1"}, "D"]}}. -expand_deps(_, []) -> []; -expand_deps(git, [{Name, Deps} | Rest]) -> - Dep = {Name, ".*", {git, "https://example.org/user/"++Name++".git", "master"}}, - [{Dep, expand_deps(git, Deps)} | expand_deps(git, Rest)]; -expand_deps(git, [{Name, Vsn, Deps} | Rest]) -> - Dep = {Name, Vsn, {git, "https://example.org/user/"++Name++".git", {tag, Vsn}}}, - [{Dep, expand_deps(git, Deps)} | expand_deps(git, Rest)]; -expand_deps(pkg, [{Name, Deps} | Rest]) -> - Dep = {pkg, Name, "0.0.0", "https://example.org/user/"++Name++".tar.gz"}, - [{Dep, expand_deps(pkg, Deps)} | expand_deps(pkg, Rest)]; -expand_deps(pkg, [{Name, Vsn, Deps} | Rest]) -> - Dep = {pkg, Name, Vsn, "https://example.org/user/"++Name++".tar.gz"}, - [{Dep, expand_deps(pkg, Deps)} | expand_deps(pkg, Rest)]. - setup_project(Case, Config0, Deps) -> DepsType = ?config(deps_type, Config0), Config = rebar_test_utils:init_rebar_state( @@ -132,50 +118,16 @@ setup_project(Case, Config0, Deps) -> ), AppDir = ?config(apps, Config), rebar_test_utils:create_app(AppDir, "A", "0.0.0", [kernel, stdlib]), - TopDeps = top_level_deps(Deps), + TopDeps = rebar_test_utils:top_level_deps(Deps), RebarConf = rebar_test_utils:create_config(AppDir, [{deps, TopDeps}]), case DepsType of git -> - mock_git_resource:mock([{deps, flat_deps(Deps)}]); + mock_git_resource:mock([{deps, rebar_test_utils:flat_deps(Deps)}]); pkg -> - mock_pkg_resource:mock([{pkgdeps, flat_pkgdeps(Deps)}]) + mock_pkg_resource:mock([{pkgdeps, rebar_test_utils:flat_pkgdeps(Deps)}]) end, [{rebarconfig, RebarConf} | Config]. - -flat_deps([]) -> []; -flat_deps([{{Name,_Vsn,Ref}, Deps} | Rest]) -> - [{{Name,vsn_from_ref(Ref)}, top_level_deps(Deps)}] - ++ - flat_deps(Deps) - ++ - flat_deps(Rest). - -vsn_from_ref({git, _, {_, Vsn}}) -> Vsn; -vsn_from_ref({git, _, Vsn}) -> Vsn. - -flat_pkgdeps([]) -> []; -flat_pkgdeps([{{pkg, Name, Vsn, _Url}, Deps} | Rest]) -> - [{{iolist_to_binary(Name),iolist_to_binary(Vsn)}, top_level_deps(Deps)}] - ++ - flat_pkgdeps(Deps) - ++ - flat_pkgdeps(Rest). - -top_level_deps([]) -> []; -top_level_deps([{{Name, Vsn, Ref}, _} | Deps]) -> - [{list_to_atom(Name), Vsn, Ref} | top_level_deps(Deps)]; -top_level_deps([{{pkg, Name, Vsn, _URL}, _} | Deps]) -> - [{list_to_atom(Name), Vsn} | top_level_deps(Deps)]. - -app_vsn([]) -> []; -app_vsn([{Source, Deps} | Rest]) -> - {Name, Vsn} = case Source of - {N,V,_Ref} -> {N,V}; - {pkg, N, V, _} -> {N,V} - end, - [{Name, Vsn}] ++ app_vsn(Deps) ++ app_vsn(Rest). - mock_warnings() -> %% just let it do its thing, we check warnings through %% the call log. diff --git a/test/rebar_test_utils.erl b/test/rebar_test_utils.erl index acefd8b..e1fb050 100644 --- a/test/rebar_test_utils.erl +++ b/test/rebar_test_utils.erl @@ -2,7 +2,7 @@ -include_lib("common_test/include/ct.hrl"). -include_lib("eunit/include/eunit.hrl"). -export([init_rebar_state/1, init_rebar_state/2, run_and_check/4]). --export([expand_deps/2, flat_deps/1, top_level_deps/1]). +-export([expand_deps/2, flat_deps/1, flat_pkgdeps/1, top_level_deps/1]). -export([create_app/4, create_empty_app/4, create_config/2]). -export([create_random_name/1, create_random_vsn/0]). @@ -120,6 +120,15 @@ flat_deps([{{Name,_Vsn,Ref}, Deps} | Rest]) -> ++ flat_deps(Rest). +flat_pkgdeps([]) -> []; +flat_pkgdeps([{{pkg, Name, Vsn}, Deps} | Rest]) -> + [{{iolist_to_binary(Name),iolist_to_binary(Vsn)}, top_level_deps(Deps)}] + ++ + flat_pkgdeps(Deps) + ++ + flat_pkgdeps(Rest). + + vsn_from_ref({git, _, {_, Vsn}}) -> Vsn; vsn_from_ref({git, _, Vsn}) -> Vsn. diff --git a/test/rebar_upgrade_SUITE.erl b/test/rebar_upgrade_SUITE.erl index ed0b2d8..f35ebb9 100644 --- a/test/rebar_upgrade_SUITE.erl +++ b/test/rebar_upgrade_SUITE.erl @@ -34,8 +34,8 @@ end_per_group(_, Config) -> init_per_testcase(Case, Config) -> DepsType = ?config(deps_type, Config), {Deps, UpDeps, ToUp, Expectations} = upgrades(Case), - Expanded = expand_deps(DepsType, Deps), - UpExpanded = expand_deps(DepsType, UpDeps), + Expanded = rebar_test_utils:expand_deps(DepsType, Deps), + UpExpanded = rebar_test_utils:expand_deps(DepsType, UpDeps), [{expected, normalize_unlocks(Expectations)}, {mock, fun() -> mock_deps(DepsType, Expanded, []) end}, {mock_update, fun() -> mock_deps(DepsType, UpExpanded, ToUp) end} @@ -53,10 +53,10 @@ setup_project(Case, Config0, Deps, UpDeps) -> ), AppDir = ?config(apps, Config), rebar_test_utils:create_app(AppDir, "Root", "0.0.0", [kernel, stdlib]), - TopDeps = top_level_deps(Deps), + TopDeps = rebar_test_utils:top_level_deps(Deps), RebarConf = rebar_test_utils:create_config(AppDir, [{deps, TopDeps}]), [{rebarconfig, RebarConf}, - {next_top_deps, top_level_deps(UpDeps)} | Config]. + {next_top_deps, rebar_test_utils:top_level_deps(UpDeps)} | Config]. upgrades(top_a) -> @@ -356,51 +356,12 @@ upgrades(delete_d) -> %% TODO: add a test that verifies that unlocking files and then %% running the upgrade code is enough to properly upgrade things. -top_level_deps([]) -> []; -top_level_deps([{{pkg, Name, Vsn}, _} | Deps]) -> - [{list_to_atom(Name), Vsn} | top_level_deps(Deps)]; -top_level_deps([{{Name, Vsn, Ref}, _} | Deps]) -> - [{list_to_atom(Name), Vsn, Ref} | top_level_deps(Deps)]. - mock_deps(git, Deps, Upgrades) -> catch mock_git_resource:unmock(), - mock_git_resource:mock([{deps, flat_deps(Deps)}, {upgrade, Upgrades}]); + mock_git_resource:mock([{deps, rebar_test_utils:flat_deps(Deps)}, {upgrade, Upgrades}]); mock_deps(pkg, Deps, Upgrades) -> catch mock_pkg_resource:unmock(), - mock_pkg_resource:mock([{pkgdeps, flat_pkgdeps(Deps)}, {upgrade, Upgrades}]). - -flat_deps([]) -> []; -flat_deps([{{Name,_Vsn,Ref}, Deps} | Rest]) -> - [{{Name,vsn_from_ref(Ref)}, top_level_deps(Deps)}] - ++ - flat_deps(Deps) - ++ - flat_deps(Rest). - -vsn_from_ref({git, _, {_, Vsn}}) -> Vsn; -vsn_from_ref({git, _, Vsn}) -> Vsn. - -flat_pkgdeps([]) -> []; -flat_pkgdeps([{{pkg, Name, Vsn}, Deps} | Rest]) -> - [{{iolist_to_binary(Name),iolist_to_binary(Vsn)}, top_level_deps(Deps)}] - ++ - flat_pkgdeps(Deps) - ++ - flat_pkgdeps(Rest). - -expand_deps(_, []) -> []; -expand_deps(git, [{Name, Deps} | Rest]) -> - Dep = {Name, ".*", {git, "https://example.org/user/"++Name++".git", "master"}}, - [{Dep, expand_deps(git, Deps)} | expand_deps(git, Rest)]; -expand_deps(git, [{Name, Vsn, Deps} | Rest]) -> - Dep = {Name, Vsn, {git, "https://example.org/user/"++Name++".git", {tag, Vsn}}}, - [{Dep, expand_deps(git, Deps)} | expand_deps(git, Rest)]; -expand_deps(pkg, [{Name, Deps} | Rest]) -> - Dep = {pkg, Name, "0.0.0"}, - [{Dep, expand_deps(pkg, Deps)} | expand_deps(pkg, Rest)]; -expand_deps(pkg, [{Name, Vsn, Deps} | Rest]) -> - Dep = {pkg, Name, Vsn}, - [{Dep, expand_deps(pkg, Deps)} | expand_deps(pkg, Rest)]. + mock_pkg_resource:mock([{pkgdeps, rebar_test_utils:flat_pkgdeps(Deps)}, {upgrade, Upgrades}]). normalize_unlocks({App, Locks}) -> {iolist_to_binary(App), -- cgit v1.1 From c283dd2c69174586e5964654a5fec8eeb66f6b6c Mon Sep 17 00:00:00 2001 From: Fred Hebert Date: Mon, 23 Feb 2015 22:57:34 +0000 Subject: Add tests and fixes for packages upgrades - Track level of packages properly, they're not level 0 anymore (this could yield an issue where a src dep takes precedence over a pkg dep) - Proper stable sort of vertices in the digraph module - PkgDeps no longer 'see themselves' when fetching and upgrading after locking themselves - Pkg Locks are added to pkg deps rather than source deps - Updating test cases to support pkg mocking on top of src mocking --- test/mock_pkg_resource.erl | 4 ++-- test/rebar_test_utils.erl | 3 +++ test/rebar_upgrade_SUITE.erl | 21 +++++++++++++++------ 3 files changed, 20 insertions(+), 8 deletions(-) (limited to 'test') diff --git a/test/mock_pkg_resource.erl b/test/mock_pkg_resource.erl index c7276b6..a22d1b0 100644 --- a/test/mock_pkg_resource.erl +++ b/test/mock_pkg_resource.erl @@ -47,11 +47,11 @@ mock_lock(_) -> %% @doc The config passed to the `mock/2' function can specify which apps %% should be updated on a per-name basis: `{update, ["App1", "App3"]}'. mock_update(Opts) -> - ToUpdate = proplists:get_value(update, Opts, []), + ToUpdate = proplists:get_value(upgrade, Opts, []), meck:expect( ?MOD, needs_update, fun(_Dir, {pkg, App, _Vsn}) -> - lists:member(App, ToUpdate) + lists:member(binary_to_list(App), ToUpdate) end). %% @doc Replicated an unsupported call. diff --git a/test/rebar_test_utils.erl b/test/rebar_test_utils.erl index e1fb050..a036619 100644 --- a/test/rebar_test_utils.erl +++ b/test/rebar_test_utils.erl @@ -205,6 +205,9 @@ check_results(AppDir, Expected) -> case lists:keyfind(iolist_to_binary(Name), 1, Locks) of false -> error({lock_not_found, Name}); + {_LockName, {pkg, _, LockVsn}, _} -> + ?assertEqual(iolist_to_binary(Vsn), + iolist_to_binary(LockVsn)); {_LockName, {_, _, {ref, LockVsn}}, _} -> ?assertEqual(iolist_to_binary(Vsn), iolist_to_binary(LockVsn)) diff --git a/test/rebar_upgrade_SUITE.erl b/test/rebar_upgrade_SUITE.erl index f35ebb9..14186be 100644 --- a/test/rebar_upgrade_SUITE.erl +++ b/test/rebar_upgrade_SUITE.erl @@ -3,7 +3,7 @@ -include_lib("eunit/include/eunit.hrl"). -compile(export_all). -all() -> [{group, git}].%, {group, pkg}]. +all() -> [{group, git}, {group, pkg}]. groups() -> [{all, [], [top_a, top_b, top_c, top_d1, top_d2, top_e, @@ -38,7 +38,7 @@ init_per_testcase(Case, Config) -> UpExpanded = rebar_test_utils:expand_deps(DepsType, UpDeps), [{expected, normalize_unlocks(Expectations)}, {mock, fun() -> mock_deps(DepsType, Expanded, []) end}, - {mock_update, fun() -> mock_deps(DepsType, UpExpanded, ToUp) end} + {mock_update, fun() -> mock_deps(DepsType, Expanded, UpExpanded, ToUp) end} | setup_project(Case, Config, Expanded, UpExpanded)]. end_per_testcase(_, Config) -> @@ -206,7 +206,7 @@ upgrades(triplet_b) -> {"G",[]}]}, {"C", "0", [{"H","3",[]}, {"I",[]}]}], - [{"A", "1", [{"D",[]}, + [{"A", "2", [{"D",[]}, {"E","2",[]}]}, {"B", "1", [{"F","1",[]}, {"G",[]}]}, @@ -223,7 +223,7 @@ upgrades(triplet_c) -> {"G",[]}]}, {"C", "0", [{"H","3",[]}, {"I",[]}]}], - [{"A", "1", [{"D",[]}, + [{"A", "2", [{"D",[]}, {"E","2",[]}]}, {"B", "1", [{"F","1",[]}, {"G",[]}]}, @@ -245,7 +245,7 @@ upgrades(tree_a) -> {"E",[{"I","1",[]}]}]}, {"B", "1", [{"F",[]}, {"G",[]}]}, - {"C", "1", [{"H",[]}]} + {"C", "2", [{"H",[]}]} ], ["C"], {"A", [{"A","1"}, "D", "J", "E", @@ -263,7 +263,7 @@ upgrades(tree_b) -> {"E",[{"I","1",[]}]}]}, {"B", "1", [{"F",[]}, {"G",[]}]}, - {"C", "1", [{"H",[]}]} + {"C", "2", [{"H",[]}]} ], ["C"], {"B", [{"A","1"}, "D", "J", "E", @@ -363,6 +363,15 @@ mock_deps(pkg, Deps, Upgrades) -> catch mock_pkg_resource:unmock(), mock_pkg_resource:mock([{pkgdeps, rebar_test_utils:flat_pkgdeps(Deps)}, {upgrade, Upgrades}]). +mock_deps(git, _OldDeps, Deps, Upgrades) -> + catch mock_git_resource:unmock(), + mock_git_resource:mock([{deps, rebar_test_utils:flat_deps(Deps)}, {upgrade, Upgrades}]); +mock_deps(pkg, OldDeps, Deps, Upgrades) -> + Merged = Deps ++ [Dep || Dep <- OldDeps, + not lists:keymember(element(1, Dep), 1, Deps)], + catch mock_pkg_resource:unmock(), + mock_pkg_resource:mock([{pkgdeps, rebar_test_utils:flat_pkgdeps(Merged)}, {upgrade, Upgrades}]). + normalize_unlocks({App, Locks}) -> {iolist_to_binary(App), normalize_unlocks_expect(Locks)}; -- cgit v1.1