-module(rebar_plugins_SUITE).
|
|
|
|
-export([suite/0,
|
|
init_per_suite/1,
|
|
end_per_suite/1,
|
|
init_per_testcase/2,
|
|
end_per_testcase/2,
|
|
all/0,
|
|
compile_plugins/1,
|
|
compile_global_plugins/1,
|
|
complex_plugins/1,
|
|
list/1,
|
|
upgrade/1,
|
|
upgrade_project_plugin/1,
|
|
sub_app_plugins/1,
|
|
sub_app_plugin_overrides/1,
|
|
project_plugins/1,
|
|
use_checkout_plugins/1]).
|
|
|
|
-include_lib("common_test/include/ct.hrl").
|
|
-include_lib("eunit/include/eunit.hrl").
|
|
-include_lib("kernel/include/file.hrl").
|
|
|
|
suite() ->
|
|
[].
|
|
|
|
init_per_suite(Config) ->
|
|
Config.
|
|
|
|
end_per_suite(_Config) ->
|
|
ok.
|
|
|
|
init_per_testcase(_, Config) ->
|
|
rebar_test_utils:init_rebar_state(Config).
|
|
|
|
end_per_testcase(_, _Config) ->
|
|
catch meck:unload().
|
|
|
|
all() ->
|
|
[compile_plugins, compile_global_plugins, complex_plugins, list, upgrade, upgrade_project_plugin,
|
|
sub_app_plugins, sub_app_plugin_overrides, project_plugins, use_checkout_plugins].
|
|
|
|
%% Tests that compiling a project installs and compiles the plugins of deps
|
|
compile_plugins(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
DepName = rebar_test_utils:create_random_name("dep1_"),
|
|
PluginName = rebar_test_utils:create_random_name("plugin1_"),
|
|
|
|
Plugins = rebar_test_utils:expand_deps(git, [{PluginName, Vsn, []}]),
|
|
{SrcDeps, _} = rebar_test_utils:flat_deps(Plugins),
|
|
mock_git_resource:mock([{deps, SrcDeps}]),
|
|
|
|
mock_pkg_resource:mock([{pkgdeps, [{{list_to_binary(DepName), list_to_binary(Vsn)}, []}]},
|
|
{config, [{plugins, [
|
|
{list_to_atom(PluginName),
|
|
{git, "http://site.com/user/"++PluginName++".git",
|
|
{tag, Vsn}}}]}]}]),
|
|
|
|
RConfFile =
|
|
rebar_test_utils:create_config(AppDir,
|
|
[{deps, [
|
|
list_to_atom(DepName)
|
|
]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
|
|
%% Build with deps.
|
|
rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name}, {plugin, PluginName}, {dep, DepName}]}
|
|
).
|
|
|
|
%% Tests that compiling a project installs and compiles the global plugins
|
|
compile_global_plugins(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
GlobalDir = filename:join(AppDir, "global"),
|
|
GlobalConfigDir = filename:join([GlobalDir, ".config", "rebar3"]),
|
|
GlobalConfig = filename:join([GlobalDir, ".config", "rebar3", "rebar.config"]),
|
|
|
|
meck:new(rebar_dir, [passthrough]),
|
|
meck:expect(rebar_dir, global_config, fun() -> GlobalConfig end),
|
|
meck:expect(rebar_dir, global_cache_dir, fun(_) -> GlobalDir end),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
Vsn2 = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
DepName = rebar_test_utils:create_random_name("dep1_"),
|
|
PluginName = rebar_test_utils:create_random_name("plugin1_"),
|
|
|
|
mock_git_resource:mock([{deps, [{list_to_atom(PluginName), Vsn},
|
|
{list_to_atom(PluginName), Vsn2},
|
|
{{iolist_to_binary(DepName), iolist_to_binary(Vsn)}, []}]}]),
|
|
|
|
|
|
rebar_test_utils:create_config(GlobalConfigDir,
|
|
[{plugins, [
|
|
{list_to_atom(PluginName), {git, "http://site.com/user/"++PluginName++".git", {tag, Vsn}}}
|
|
]}]),
|
|
RConfFile =
|
|
rebar_test_utils:create_config(AppDir,
|
|
[{deps, [
|
|
{list_to_atom(DepName), {git, "http://site.com/user/"++DepName++".git", {tag, Vsn}}}
|
|
]},
|
|
{plugins, [
|
|
{list_to_atom(PluginName), {git, "http://site.com/user/"++PluginName++".git", {tag, Vsn2}}}
|
|
]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
|
|
%% Runs global plugin install
|
|
rebar3:init_config(),
|
|
|
|
%% Build with deps.
|
|
rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name},
|
|
{global_plugin, PluginName, Vsn},
|
|
{plugin, PluginName, Vsn2},
|
|
{dep, DepName}]}
|
|
),
|
|
|
|
meck:unload(rebar_dir).
|
|
|
|
%% Tests installing of plugin with transitive deps
|
|
complex_plugins(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
meck:new(rebar_dir, [passthrough]),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
Vsn2 = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
DepName = rebar_test_utils:create_random_name("dep1_"),
|
|
DepName2 = rebar_test_utils:create_random_name("dep2_"),
|
|
DepName3 = rebar_test_utils:create_random_name("dep3_"),
|
|
PluginName = rebar_test_utils:create_random_name("plugin1_"),
|
|
|
|
Deps = rebar_test_utils:expand_deps(git, [{PluginName, Vsn2, [{DepName2, Vsn,
|
|
[{DepName3, Vsn, []}]}]}
|
|
,{DepName, Vsn, []}]),
|
|
{SrcDeps, _} = rebar_test_utils:flat_deps(Deps),
|
|
mock_git_resource:mock([{deps, SrcDeps}]),
|
|
|
|
RConfFile =
|
|
rebar_test_utils:create_config(AppDir,
|
|
[{deps, [
|
|
{list_to_atom(DepName), {git, "http://site.com/user/"++DepName++".git", {tag, Vsn}}}
|
|
]},
|
|
{plugins, [
|
|
{list_to_atom(PluginName), {git, "http://site.com/user/"++PluginName++".git", {tag, Vsn2}}}
|
|
]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
|
|
%% Build with deps.
|
|
rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name},
|
|
{plugin, PluginName, Vsn2},
|
|
{plugin, DepName2},
|
|
{plugin, DepName3},
|
|
{dep, DepName}]}
|
|
),
|
|
|
|
meck:unload(rebar_dir).
|
|
|
|
list(Config) ->
|
|
rebar_test_utils:run_and_check(
|
|
Config, [], ["plugins", "list"],
|
|
{ok, []}
|
|
).
|
|
|
|
upgrade(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
PkgName = rebar_test_utils:create_random_name("pkg1_"),
|
|
mock_git_resource:mock([]),
|
|
mock_pkg_resource:mock([
|
|
{pkgdeps, [{{iolist_to_binary(PkgName), <<"0.1.0">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.0.1">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.1.1">>}, []}]}
|
|
]),
|
|
|
|
RConfFile = rebar_test_utils:create_config(AppDir, [{plugins, [list_to_atom(PkgName)]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
|
|
%% Build with deps.
|
|
rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name}, {plugin, PkgName, <<"0.1.1">>}]}
|
|
),
|
|
|
|
catch mock_pkg_resource:unmock(),
|
|
mock_pkg_resource:mock([
|
|
{pkgdeps, [{{iolist_to_binary(PkgName), <<"0.1.0">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.0.1">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.1.3">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.1.1">>}, []}]},
|
|
{upgrade, [PkgName]}
|
|
]),
|
|
|
|
%% Build with deps.
|
|
rebar_test_utils:run_and_check(
|
|
Config, RConf, ["plugins", "upgrade", PkgName],
|
|
{ok, [{app, Name}, {plugin, PkgName, <<"0.1.3">>}]}
|
|
).
|
|
|
|
upgrade_project_plugin(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
PkgName = rebar_test_utils:create_random_name("pkg1_"),
|
|
mock_git_resource:mock([]),
|
|
mock_pkg_resource:mock([
|
|
{pkgdeps, [{{iolist_to_binary(PkgName), <<"0.1.0">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.0.1">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.1.1">>}, []}]}
|
|
]),
|
|
|
|
RConfFile = rebar_test_utils:create_config(AppDir, [{project_plugins, [list_to_atom(PkgName)]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
|
|
%% Build with deps.
|
|
rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name}, {plugin, PkgName, <<"0.1.1">>}]}
|
|
),
|
|
|
|
catch mock_pkg_resource:unmock(),
|
|
mock_pkg_resource:mock([
|
|
{pkgdeps, [{{iolist_to_binary(PkgName), <<"0.1.0">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.0.1">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.1.3">>}, []},
|
|
{{iolist_to_binary(PkgName), <<"0.1.1">>}, []}]},
|
|
{upgrade, [PkgName]}
|
|
]),
|
|
|
|
%% Build with deps.
|
|
rebar_test_utils:run_and_check(
|
|
Config, RConf, ["plugins", "upgrade", PkgName],
|
|
{ok, [{app, Name}, {plugin, PkgName, <<"0.1.3">>}]}
|
|
).
|
|
|
|
sub_app_plugins(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("sub_app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
|
|
DepName = rebar_test_utils:create_random_name("dep1_"),
|
|
PluginName = rebar_test_utils:create_random_name("plugin1_"),
|
|
|
|
mock_pkg_resource:mock([{pkgdeps, [{{list_to_binary(DepName), list_to_binary(Vsn)}, []},
|
|
{{list_to_binary(PluginName), list_to_binary(Vsn)}, []}]}]),
|
|
|
|
SubAppsDir = filename:join([AppDir, "apps", Name]),
|
|
|
|
rebar_test_utils:create_app(SubAppsDir, Name, Vsn, [kernel, stdlib]),
|
|
rebar_test_utils:create_config(SubAppsDir, [{deps, [{list_to_binary(DepName), list_to_binary(Vsn)}]},
|
|
{plugins, [list_to_atom(PluginName)]}]),
|
|
|
|
RConfFile =
|
|
rebar_test_utils:create_config(AppDir,
|
|
[{deps, [
|
|
list_to_atom(DepName)
|
|
]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
|
|
%% Build with deps.
|
|
rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name}, {dep, DepName}, {plugin, PluginName}]}
|
|
).
|
|
|
|
%% Tests that overrides in a dep that includes a plugin are applied to plugin fetching
|
|
sub_app_plugin_overrides(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("sub_app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
Dep2Name = rebar_test_utils:create_random_name("dep2_"),
|
|
|
|
DepName = rebar_test_utils:create_random_name("dep1_"),
|
|
PluginName = rebar_test_utils:create_random_name("plugin1_"),
|
|
Vsn2 = rebar_test_utils:create_random_vsn(),
|
|
|
|
Deps = rebar_test_utils:expand_deps(git, [{PluginName, Vsn, [{DepName, Vsn, []}]},
|
|
{DepName, Vsn, []}]),
|
|
{SrcDeps, _} = rebar_test_utils:flat_deps(Deps),
|
|
mock_git_resource:mock([{deps, SrcDeps}]),
|
|
|
|
mock_pkg_resource:mock([{pkgdeps, [{{list_to_binary(Dep2Name), list_to_binary(Vsn)}, []}]},
|
|
{config, [{plugins, [{list_to_atom(PluginName),
|
|
{git, "http://site.com/user/"++PluginName++".git",
|
|
{tag, Vsn}}}]},
|
|
%% Dep2 overrides the plugin's deps to have vsn2 of dep1
|
|
{overrides, [{override, list_to_atom(PluginName),
|
|
[{deps, [{list_to_atom(DepName),
|
|
{git, "http://site.com/user/"++DepName++".git",
|
|
{tag, Vsn2}}}]}]}]}]}]),
|
|
|
|
SubAppsDir = filename:join([AppDir, "apps", Name]),
|
|
|
|
rebar_test_utils:create_app(SubAppsDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
RConfFile = rebar_test_utils:create_config(AppDir, [{deps, [{list_to_binary(Dep2Name), list_to_binary(Vsn)}]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
|
|
%% Build with deps.
|
|
rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name}, {dep, Dep2Name, Vsn}, {plugin, DepName, Vsn2}, {plugin, PluginName}]}
|
|
).
|
|
|
|
%% Check that project plugins are first in providers even if they override defaults but that
|
|
%% normal plugins do not
|
|
project_plugins(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
DepName = rebar_test_utils:create_random_name("dep1_"),
|
|
PluginName = "compile_plugin",
|
|
PluginName2 = "release",
|
|
|
|
Plugins = rebar_test_utils:expand_deps(git, [{PluginName, Vsn, []}, {PluginName2, Vsn, []}]),
|
|
{SrcDeps, _} = rebar_test_utils:flat_deps(Plugins),
|
|
mock_git_resource:mock([{deps, SrcDeps}], create_plugin),
|
|
|
|
mock_pkg_resource:mock([{pkgdeps, [{{list_to_binary(DepName), list_to_binary(Vsn)}, []}]},
|
|
{config, [{plugins, [
|
|
{list_to_atom(PluginName),
|
|
{git, "http://site.com/user/"++PluginName++".git",
|
|
{tag, Vsn}}}]}]}]),
|
|
|
|
RConfFile =
|
|
rebar_test_utils:create_config(AppDir,
|
|
[{deps, [
|
|
list_to_atom(DepName)
|
|
]},
|
|
{project_plugins, [
|
|
{list_to_atom(PluginName2),
|
|
{git, "http://site.com/user/"++PluginName2++".git",
|
|
{tag, Vsn}}}]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
|
|
%% Build with deps.
|
|
{ok, State} = rebar_test_utils:run_and_check(
|
|
Config, RConf, ["compile"],
|
|
{ok, [{app, Name}, {plugin, PluginName}, {plugin, PluginName2}, {dep, DepName}]}
|
|
),
|
|
|
|
%% Should have 2 release providers but only 1 compile provider
|
|
Release = [P || P <- rebar_state:providers(State), providers:impl(P) =:= release, providers:namespace(P) =:= default],
|
|
Compile = [P || P <- rebar_state:providers(State), providers:impl(P) =:= compile, providers:namespace(P) =:= default],
|
|
|
|
?assertEqual(length(Release), 2),
|
|
?assertEqual(length(Compile), 1).
|
|
|
|
use_checkout_plugins(Config) ->
|
|
AppDir = ?config(apps, Config),
|
|
|
|
Name = rebar_test_utils:create_random_name("app1_"),
|
|
Vsn = rebar_test_utils:create_random_vsn(),
|
|
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
|
|
|
|
PluginName = "checkedout",
|
|
CheckoutsDir = filename:join(AppDir, "_checkouts/checkedout"),
|
|
rebar_test_utils:create_plugin(CheckoutsDir, PluginName, "1.0.0", []),
|
|
|
|
RConfFile =
|
|
rebar_test_utils:create_config(AppDir,
|
|
[{deps, []},
|
|
{plugins, [list_to_atom(PluginName)]}]),
|
|
{ok, RConf} = file:consult(RConfFile),
|
|
|
|
%% Verify we can run the plugin
|
|
?assertMatch({ok, _}, rebar_test_utils:run_and_check(
|
|
Config, RConf, ["checkedout"],
|
|
{ok, []}
|
|
)).
|