From 543fe579a6d7c71fb4ed6a898540b573f6255dd0 Mon Sep 17 00:00:00 2001 From: Fred Hebert Date: Fri, 20 Apr 2018 21:03:05 -0400 Subject: 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. --- src/rebar3.erl | 6 +++++- test/rebar_profiles_SUITE.erl | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/rebar3.erl b/src/rebar3.erl index 80b4e4d..eb5ad58 100644 --- a/src/rebar3.erl +++ b/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}]. diff --git a/test/rebar_profiles_SUITE.erl b/test/rebar_profiles_SUITE.erl index ddc3cf1..512832a 100644 --- a/test/rebar_profiles_SUITE.erl +++ b/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"]}, -- cgit v1.1