Просмотр исходного кода

Fix precedence rules of erl_opts for test profile

When adding the 'TEST' macro to the test profile, we mistakenly sourced
the erl_opts values from the base profile rather than the test profile
itself.

This means that in cases where the base profile set an option such as
'no_debug_info' and a profile overrode it with 'debug_info', the default
options would get injected within the test profile, and broke the
precedence rules, yielding incompatible values.

This patch fixes things by adding the macro to the values sourced from
the test profile itself, fixing the issue.
pull/1759/head
Fred Hebert 7 лет назад
Родитель
Сommit
543fe579a6
2 измененных файлов: 37 добавлений и 1 удалений
  1. +5
    -1
      src/rebar3.erl
  2. +32
    -0
      test/rebar_profiles_SUITE.erl

+ 5
- 1
src/rebar3.erl Просмотреть файл

@ -389,7 +389,11 @@ state_from_global_config(Config, GlobalConfigFile) ->
rebar_state:providers(rebar_state:new(GlobalConfig3, Config), GlobalPlugins).
test_state(State) ->
ErlOpts = rebar_state:get(State, erl_opts, []),
%% Fetch the test profile's erl_opts only
Opts = rebar_state:opts(State),
Profiles = rebar_opts:get(Opts, profiles, []),
ProfileOpts = proplists:get_value(test, Profiles, []),
ErlOpts = proplists:get_value(erl_opts, ProfileOpts, []),
TestOpts = safe_define_test_macro(ErlOpts),
[{extra_src_dirs, ["test"]}, {erl_opts, TestOpts}].

+ 32
- 0
test/rebar_profiles_SUITE.erl Просмотреть файл

@ -28,6 +28,7 @@
test_profile_erl_opts_order_4/1,
test_profile_erl_opts_order_5/1,
test_erl_opts_debug_info/1,
test_profile_erl_opts_precedence/1,
first_files_exception/1]).
-include_lib("common_test/include/ct.hrl").
@ -52,6 +53,7 @@ all() ->
test_profile_erl_opts_order_4,
test_profile_erl_opts_order_5,
test_erl_opts_debug_info,
test_profile_erl_opts_precedence,
first_files_exception].
init_per_suite(Config) ->
@ -527,6 +529,36 @@ test_erl_opts_debug_info(_Config) ->
no_debug_info,b,c,{debug_info,{mod,"123"}}])),
ok.
test_profile_erl_opts_precedence(Config) ->
AppDir = ?config(apps, Config),
Name = rebar_test_utils:create_random_name("profile_new_key_"),
Vsn = rebar_test_utils:create_random_vsn(),
rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
RebarConfig = [{erl_opts, [no_debug_info]},
{profiles, [
{test, [{erl_opts, [debug_info, {d,'HI'}]}]},
{other, [{erl_opts, [debug_info, {d,'HI'}]}]}
]}],
{ok, State1} = rebar_test_utils:run_and_check(
Config, RebarConfig, ["as", "test", "compile"], return
),
{ok, State2} = rebar_test_utils:run_and_check(
Config, RebarConfig, ["as", "other", "compile"], return
),
{ok, State3} = rebar_test_utils:run_and_check(
Config, RebarConfig, ["compile"], return
),
Opts1 = rebar_state:opts(State1),
Opts2 = rebar_state:opts(State2),
Opts3 = rebar_state:opts(State3),
ErlOpts1 = rebar_opts:erl_opts(Opts1),
ErlOpts2 = rebar_opts:erl_opts(Opts2),
ErlOpts3 = rebar_opts:erl_opts(Opts3),
?assertEqual([{d,'TEST'}, debug_info, {d,'HI'}], ErlOpts1),
?assertEqual([debug_info, {d,'HI'}], ErlOpts2),
?assertEqual([], ErlOpts3),
ok.
first_files_exception(_Config) ->
RebarConfig = [{erl_first_files, ["c","a","b"]},
{mib_first_files, ["c","a","b"]},

Загрузка…
Отмена
Сохранить