From b06a6ecaddfc6fea16f3c24881fd41ac731ffa9e Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Wed, 20 May 2015 16:17:37 -0700 Subject: don't add `{extra_src_dirs, ["test"]}` to `test` profile adding it results in ct test suites being compiled before they're properly copied so changes made to suites between runs are not reflected if a run fails before test dirs are copied --- src/rebar_prv_eunit.erl | 69 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 20 deletions(-) (limited to 'src/rebar_prv_eunit.erl') diff --git a/src/rebar_prv_eunit.erl b/src/rebar_prv_eunit.erl index f04a150..3ad593d 100644 --- a/src/rebar_prv_eunit.erl +++ b/src/rebar_prv_eunit.erl @@ -85,8 +85,7 @@ format_error({error_running_tests, Reason}) -> test_state(State) -> ErlOpts = rebar_state:get(State, eunit_compile_opts, []), TestOpts = safe_define_test_macro(ErlOpts), - TestDir = [{extra_src_dirs, ["test"]}], - first_files(State) ++ [{erl_opts, TestOpts ++ TestDir}]. + first_files(State) ++ [{erl_opts, TestOpts}]. safe_define_test_macro(Opts) -> %% defining a compile macro twice results in an exception so @@ -107,38 +106,56 @@ first_files(State) -> prepare_tests(State) -> {RawOpts, _} = rebar_state:command_parsed_args(State), - ok = maybe_cover_compile(State, RawOpts), - ProjectApps = project_apps(State), - resolve_apps(ProjectApps, RawOpts). + resolve_apps(State, RawOpts). -maybe_cover_compile(State, Opts) -> - State1 = case proplists:get_value(cover, Opts, false) of - true -> rebar_state:set(State, cover_enabled, true); - false -> State - end, - rebar_prv_cover:maybe_cover_compile(State1). - -resolve_apps(ProjectApps, RawOpts) -> +resolve_apps(State, RawOpts) -> case proplists:get_value(app, RawOpts) of - undefined -> resolve_suites(ProjectApps, RawOpts); + undefined -> resolve_suites(State, RawOpts); %% convert app name strings to `rebar_app_info` objects Apps -> AppNames = string:tokens(Apps, [$,]), + ProjectApps = project_apps(State), case filter_apps_by_name(AppNames, ProjectApps) of - {ok, TestApps} -> resolve_suites(TestApps, RawOpts); + {ok, TestApps} -> resolve_suites(State, TestApps, RawOpts); Error -> Error end end. -resolve_suites(Apps, RawOpts) -> +resolve_suites(State, RawOpts) -> resolve_suites(State, project_apps(State), RawOpts). + +resolve_suites(State, Apps, RawOpts) -> case proplists:get_value(suite, RawOpts) of - undefined -> test_set(Apps, all); + undefined -> compile_tests(State, Apps, all, RawOpts); Suites -> SuiteNames = string:tokens(Suites, [$,]), case filter_suites_by_apps(SuiteNames, Apps) of - {ok, S} -> test_set(Apps, S); + {ok, S} -> compile_tests(State, Apps, S, RawOpts); Error -> Error end end. +compile_tests(State, TestApps, Suites, RawOpts) -> + F = fun(AppInfo) -> + AppDir = rebar_app_info:dir(AppInfo), + S = case rebar_app_info:state(AppInfo) of + undefined -> + C = rebar_config:consult(AppDir), + rebar_state:new(State, C, AppDir); + AppState -> + AppState + end, + ok = rebar_erlc_compiler:compile(replace_src_dirs(S), + ec_cnv:to_list(rebar_app_info:out_dir(AppInfo))) + end, + lists:foreach(F, TestApps), + ok = maybe_cover_compile(State, RawOpts), + {ok, test_set(TestApps, Suites)}. + +maybe_cover_compile(State, Opts) -> + State1 = case proplists:get_value(cover, Opts, false) of + true -> rebar_state:set(State, cover_enabled, true); + false -> State + end, + rebar_prv_cover:maybe_cover_compile(State1). + project_apps(State) -> filter_checkouts(rebar_state:project_apps(State)). @@ -205,8 +222,20 @@ app_modules([App|Rest], Acc) -> app_modules(Rest, NewAcc) end. -test_set(Apps, all) -> {ok, set_apps(Apps, [])}; -test_set(_Apps, Suites) -> {ok, set_suites(Suites, [])}. +replace_src_dirs(State) -> + %% replace any `src_dirs` with the test dirs + ErlOpts = rebar_state:get(State, erl_opts, []), + StrippedOpts = filter_src_dirs(ErlOpts), + case rebar_dir:extra_src_dirs(State) of + [] -> rebar_state:set(State, erl_opts, [{src_dirs, ["test"]}|StrippedOpts]); + _ -> rebar_state:set(State, erl_opts, StrippedOpts) + end. + +filter_src_dirs(ErlOpts) -> + lists:filter(fun({src_dirs, _}) -> false; (_) -> true end, ErlOpts). + +test_set(Apps, all) -> set_apps(Apps, []); +test_set(_Apps, Suites) -> set_suites(Suites, []). set_apps([], Acc) -> lists:reverse(Acc); set_apps([App|Rest], Acc) -> -- cgit v1.1