diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/rebar_prv_common_test.erl | 57 | 
1 files changed, 50 insertions, 7 deletions
| diff --git a/src/rebar_prv_common_test.erl b/src/rebar_prv_common_test.erl index 8e72b7c..9565926 100644 --- a/src/rebar_prv_common_test.erl +++ b/src/rebar_prv_common_test.erl @@ -42,11 +42,17 @@ do(State) ->      ok = create_dirs(Opts),      InDirs = in_dirs(State, RawOpts),      ok = compile_tests(State, TestApps, InDirs), +    case resolve_ct_opts(State, TestApps, Opts) of +        {ok, CTOpts} -> +            run_test(State, RawOpts, CTOpts); +        {error, Reason} -> +            {error, {?MODULE, Reason}} +    end. + +run_test(State, RawOpts, CTOpts) ->      ok = maybe_cover_compile(State, RawOpts), -    CTOpts = resolve_ct_opts(State, Opts),      Verbose = proplists:get_value(verbose, RawOpts, false), -    TestDirs = test_dirs(State, TestApps), -    Result = run_test([{dir, TestDirs}|CTOpts], Verbose), +    Result = run_test(CTOpts, Verbose),      ok = rebar_prv_cover:maybe_write_coverdata(State, ?PROVIDER),      case Result of          {error, Reason} -> @@ -59,7 +65,9 @@ do(State) ->  format_error({failures_running_tests, FailedCount}) ->      io_lib:format("Failures occured running tests: ~p", [FailedCount]);  format_error({error_running_tests, Reason}) -> -    io_lib:format("Error running tests: ~p", [Reason]). +    io_lib:format("Error running tests: ~p", [Reason]); +format_error({error_processing_options, Reason}) -> +    io_lib:format("Error processing options: ~p", [Reason]).  run_test(CTOpts, true) ->      handle_results(ct:run_test(CTOpts)); @@ -217,6 +225,8 @@ transform_opts([{testcase, Testcase}|Rest], Acc) ->  transform_opts([{group, Group}|Rest], Acc) -> % @TODO handle ""      % Input is a list or an atom. It can also be a nested list.      transform_opts(Rest, [{group, parse_term(Group)}|Acc]); +transform_opts([{suite, Suite}|Rest], Acc) -> +    transform_opts(Rest, [{suite, split_string(Suite)}|Acc]);  transform_opts([{Key, Val}|Rest], Acc) when is_list(Val) ->      % Default to splitting a string on comma, that works fine for both flat      % lists of which there are many and single-items. @@ -308,13 +318,46 @@ first_files(State) ->      CTFirst = rebar_state:get(State, ct_first_files, []),      {erl_first_files, CTFirst}. -resolve_ct_opts(State, CmdLineOpts) -> +resolve_ct_opts(State, TestApps, CmdLineOpts) ->      CTOpts = rebar_state:get(State, ct_opts, []),      Opts = lists:ukeymerge(1,                      lists:ukeysort(1, CmdLineOpts),                      lists:ukeysort(1, CTOpts)), -    %% disable `auto_compile` and remove `dir` from the opts -    [{auto_compile, false}|lists:keydelete(dir, 1, Opts)]. +    TestDirs = test_dirs(State, TestApps), +    try resolve_ct_opts(TestDirs, Opts) of +        Opts2 -> +            %% disable `auto_compile` +            {ok, [{auto_compile, false} | Opts2]} +    catch +        throw:{error, Reason}-> +            {error, {error_processing_options, Reason}} +    end. + +resolve_ct_opts(Dirs, Opts) -> +    Opts2 = lists:keydelete(dir, 1, Opts), +    case lists:keytake(suite, 1, Opts2) of +        {value, {suite, Suites}, Opts3} -> +            %% Find full path to suites so that test names are consistent with +            %% names when testing all dirs. +            Suites2 = [resolve_suite(Dirs, Suite) || Suite <- Suites], +            [{suite, Suites2} | Opts3]; +        false -> +            %% No suites, test all dirs. +            [{dir, Dirs} | Opts2] +    end. + +resolve_suite(Dirs, Suite) -> +    File = Suite ++ code:objfile_extension(), +    case [Path || Dir <- Dirs, +                  Path <- [filename:join(Dir, File)], +                  filelib:is_file(Path)] of +        [Suite2] -> +            Suite2; +        [] -> +            throw({error, {unknown_suite, File}}); +        Suites -> +            throw({error, {duplicate_suites, Suites}}) +    end.  compile_tests(State, TestApps, InDirs) ->      F = fun(AppInfo) -> | 
