summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--priv/shell-completion/bash/rebar34
-rw-r--r--priv/shell-completion/fish/rebar3.fish9
-rw-r--r--priv/shell-completion/zsh/_rebar39
-rw-r--r--rebar.config.sample12
-rw-r--r--src/rebar_pkg_resource.erl18
-rw-r--r--src/rebar_prv_eunit.erl344
-rw-r--r--test/rebar_eunit_SUITE.erl820
-rw-r--r--test/rebar_eunit_SUITE_data/basic_app.zipbin0 -> 1735 bytes
-rwxr-xr-xtest/rebar_eunit_SUITE_data/deflate15
-rwxr-xr-xtest/rebar_eunit_SUITE_data/inflate15
-rw-r--r--test/rebar_eunit_SUITE_data/multi_app.zipbin0 -> 5482 bytes
-rw-r--r--test/rebar_profiles_SUITE.erl4
-rw-r--r--test/rebar_test_utils.erl2
13 files changed, 710 insertions, 542 deletions
diff --git a/priv/shell-completion/bash/rebar3 b/priv/shell-completion/bash/rebar3
index 30d74dd..87ee9eb 100644
--- a/priv/shell-completion/bash/rebar3
+++ b/priv/shell-completion/bash/rebar3
@@ -93,8 +93,8 @@ _rebar3()
elif [[ ${prev} == escriptize ]] ; then
:
elif [[ ${prev} == eunit ]] ; then
- sopts="-c -v"
- lopts="--app --cover --suite --verbose"
+ sopts="-c -e -v"
+ lopts="--app --application --cover --dir --error_on_warning --file --module --suite --verbose"
elif [[ ${prev} == help ]] ; then
:
elif [[ ${prev} == new ]] ; then
diff --git a/priv/shell-completion/fish/rebar3.fish b/priv/shell-completion/fish/rebar3.fish
index 31d38b7..0d5d302 100644
--- a/priv/shell-completion/fish/rebar3.fish
+++ b/priv/shell-completion/fish/rebar3.fish
@@ -109,9 +109,16 @@ complete -f -c 'rebar3' -n '__fish_rebar3_needs_command' -a edoc -d "Generate do
complete -f -c 'rebar3' -n '__fish_rebar3_needs_command' -a escriptize -d "Generate escript archive."
complete -f -c 'rebar3' -n '__fish_rebar3_needs_command' -a eunit -d "Run EUnit Tests."
+complete -f -c 'rebar3' -n '__fish_rebar3_using_command eunit' -l app -d "Comma separated list of application test suites to run. Equivalent to `[{application, App}]`"
+complete -f -c 'rebar3' -n '__fish_rebar3_using_command eunit' -l application -d "Comma separated list of application test suites to run. Equivalent to `[{application, App}]`"
complete -f -c 'rebar3' -n '__fish_rebar3_using_command eunit' -s c -l cover -d "Generate cover data"
+complete -f -c 'rebar3' -n '__fish_rebar3_using_command eunit' -l dir -d "Comma separated list of dirs to load tests from. Equivalent to `[{dir, Dir}]`"
+complete -f -c 'rebar3' -n '__fish_rebar3_using_command eunut' -s e -l error_on_warning -d "Error on invalid test specifications instead of warning"
+complete -f -c 'rebar3' -n '__fish_rebar3_using_command eunit' -l file -d "Comma separated list of files to load tests from. Equivalent to `[{file, File}]`"
+complete -f -c 'rebar3' -n '__fish_rebar3_using_command eunit' -l module -d "Comma separated list of modules to load tests from. Equivalent to `[{module, Module}]`"
+complete -f -c 'rebar3' -n '__fish_rebar3_using_command eunit' -l suite -d "Comma separated list of modules to load tests from. Equivalent to `[{module, Module}]`"
complete -f -c 'rebar3' -n '__fish_rebar3_using_command eunit' -s v -l verbose -d "Verbose output"
-complete -f -c 'rebar3' -n '__fish_rebar3_using_command eunit' -l app -d "List of applications to run tests for"
+
complete -f -c 'rebar3' -n '__fish_rebar3_using_command eunit' -l suite -d "Lists of test suites to run"
complete -f -c 'rebar3' -n '__fish_rebar3_needs_command' -a help -d "Display a list of tasks or help for a given task or subtask."
diff --git a/priv/shell-completion/zsh/_rebar3 b/priv/shell-completion/zsh/_rebar3
index c04791b..d4e1c35 100644
--- a/priv/shell-completion/zsh/_rebar3
+++ b/priv/shell-completion/zsh/_rebar3
@@ -92,9 +92,14 @@ _rebar3 () {
;;
(eunit)
_arguments \
- '(--app)--app[List of application test suites to run]:suites' \
- '(--suite)--suite[List of test suites to run]:suites' \
+ '(--app)--app[Comma separated list of application test suites to run]:suites' \
+ '(--application)--application[Comma separated list of application test suites to run]:applications' \
'(-c --cover)'{-c,--cover}'[Generate cover data]' \
+ '(--dir)--dir[Comma separated list of dirs to load tests from]:dirs' \
+ '(-e --error_on_warning)'{-e,--error_on_warning}'[Error on invalid test specifications instead of warning]' \
+ '(--file)--file[Comma separated list of files to load tests from]:files' \
+ '(--module)--module[Comma separated list of modules to load tests from]:modules' \
+ '(--suite)--suite[Comma separated list of modules to load tests from]:modules' \
'(-v --verbose)'{-v,--verbose}'[Verbose output]' \
&& ret=0
;;
diff --git a/rebar.config.sample b/rebar.config.sample
index 37f641f..de70998 100644
--- a/rebar.config.sample
+++ b/rebar.config.sample
@@ -47,7 +47,7 @@
{ct_compile_opts, []}.
%% {erl_first_files, ...} but for CT runs
{ct_first_files, []}.
-%% Same options as for ct:run_test(...)
+%% Same options as for ct:run_test(Opts)
{ct_opts, []}.
@@ -153,12 +153,14 @@
%% == EUnit ==
-%% Options for eunit:test(Tests, ...)
-{eunit_opts, []}.
+%% eunit:test(Tests)
+{eunit_tests, [{application, rebar3}]}
+%% Options for eunit:test(Tests, Opts)
+{eunit_opts, [verbose]}.
%% Additional compile options for eunit. erl_opts is also used
-{eunit_compile_opts, []}.
+{eunit_compile_opts, [{d, some_define}]}.
%% {erl_first_files, ...} but for Eunit
-{eunit_first_files, []}.
+{eunit_first_files, ["test/test_behaviour.erl"]}.
%% == Overrides ==
diff --git a/src/rebar_pkg_resource.erl b/src/rebar_pkg_resource.erl
index 97dc8a7..4f55ad1 100644
--- a/src/rebar_pkg_resource.erl
+++ b/src/rebar_pkg_resource.erl
@@ -129,6 +129,14 @@ etag(Path) ->
end.
ssl_opts(Url) ->
+ case get_ssl_config() of
+ ssl_verify_enabled ->
+ ssl_opts(ssl_verify_enabled, Url);
+ ssl_verify_disabled ->
+ [{verify, verify_none}]
+ end.
+
+ssl_opts(ssl_verify_enabled, Url) ->
case check_ssl_version() of
true ->
{ok, {_, _, Hostname, _, _, _}} = http_uri:parse(ec_cnv:to_list(Url)),
@@ -171,6 +179,16 @@ check_ssl_version() ->
false
end.
+get_ssl_config() ->
+ GlobalConfigFile = rebar_dir:global_config(),
+ Config = rebar_config:consult_file(GlobalConfigFile),
+ case proplists:get_value(ssl_verify, Config, []) of
+ false ->
+ ssl_verify_disabled;
+ _ ->
+ ssl_verify_enabled
+ end.
+
parse_vsn(Vsn) ->
version_pad(string:tokens(Vsn, ".-")).
diff --git a/src/rebar_prv_eunit.erl b/src/rebar_prv_eunit.erl
index 5d0f65f..959be3f 100644
--- a/src/rebar_prv_eunit.erl
+++ b/src/rebar_prv_eunit.erl
@@ -8,12 +8,15 @@
-export([init/1,
do/1,
format_error/1]).
+%% exported solely for tests
+-export([compile/1, prepare_tests/1, eunit_opts/1]).
-include("rebar.hrl").
-include_lib("providers/include/providers.hrl").
-define(PROVIDER, eunit).
--define(DEPS, [compile]).
+%% we need to modify app_info state before compile
+-define(DEPS, [lock]).
%% ===================================================================
%% Public API
@@ -36,7 +39,16 @@ init(State) ->
-spec do(rebar_state:t()) -> {ok, rebar_state:t()} | {error, string()}.
do(State) ->
+ case compile(State) of
+ %% successfully compiled apps
+ {ok, S} -> do_tests(S);
+ %% this should look like a compiler error, not an eunit error
+ Error -> Error
+ end.
+
+do_tests(State) ->
?INFO("Performing EUnit tests...", []),
+
rebar_utils:update_code(rebar_state:code_paths(State, all_deps)),
%% Run eunit provider prehooks
@@ -63,8 +75,10 @@ do(State) ->
do_tests(State, Tests) ->
EUnitOpts = resolve_eunit_opts(State),
+ ?DEBUG("eunit_tests ~p", [Tests]),
+ ?DEBUG("eunit_opts ~p", [EUnitOpts]),
Result = eunit:test(Tests, EUnitOpts),
- ok = rebar_prv_cover:maybe_write_coverdata(State, ?PROVIDER),
+ ok = maybe_write_coverdata(State),
case handle_results(Result) of
{error, Reason} ->
?PRV_ERROR(Reason);
@@ -76,17 +90,21 @@ do_tests(State, Tests) ->
format_error(unknown_error) ->
io_lib:format("Error running tests", []);
format_error({error_running_tests, Reason}) ->
- io_lib:format("Error running tests: ~p", [Reason]).
+ io_lib:format("Error running tests: ~p", [Reason]);
+format_error({eunit_test_errors, Errors}) ->
+ io_lib:format(lists:concat(["Error Running EUnit Tests:"] ++
+ lists:map(fun(Error) -> "~n " ++ Error end, Errors)), []);
+format_error({error, Error}) ->
+ format_error({error_running_tests, Error}).
%% ===================================================================
%% Internal functions
%% ===================================================================
test_state(State) ->
- ErlOpts = rebar_state:get(State, eunit_compile_opts, []),
+ ErlOpts = rebar_state:get(State, erl_opts, []),
TestOpts = safe_define_test_macro(ErlOpts),
- TestDir = [{extra_src_dirs, ["test"]}],
- first_files(State) ++ [{erl_opts, TestOpts ++ TestDir}].
+ [{extra_src_dirs, ["test"]}, {erl_opts, TestOpts}].
safe_define_test_macro(Opts) ->
%% defining a compile macro twice results in an exception so
@@ -96,68 +114,78 @@ safe_define_test_macro(Opts) ->
false -> [{d, 'TEST'}] ++ Opts
end.
+compile(State) ->
+ %% inject `eunit_first_files` and `eunit_compile_opts` into the applications to be compiled
+ NewState = inject_eunit_state(State),
+
+ case rebar_prv_compile:do(NewState) of
+ %% successfully compiled apps
+ {ok, S} ->
+ ok = maybe_cover_compile(S),
+ ok = maybe_compile_bare_testdir(S),
+ {ok, S};
+ %% this should look like a compiler error, not an eunit error
+ Error -> Error
+ end.
+
+inject_eunit_state(State) ->
+ Apps = project_apps(State),
+ ModdedApps = lists:map(fun(App) -> inject(State, App) end, Apps),
+ rebar_state:project_apps(State, ModdedApps).
+
+inject(State, App) ->
+ %% append `eunit_compile_opts` to app defined `erl_opts`
+ ErlOpts = rebar_app_info:get(App, erl_opts, []),
+ EUnitOpts = rebar_state:get(State, eunit_compile_opts, []),
+ NewOpts = EUnitOpts ++ ErlOpts,
+ %% append `eunit_first_files` to app defined `erl_first_files`
+ FirstFiles = rebar_app_info:get(App, erl_first_files, []),
+ EUnitFirstFiles = rebar_state:get(State, eunit_first_files, []),
+ NewFirstFiles = EUnitFirstFiles ++ FirstFiles,
+ %% insert the new keys into the app
+ lists:foldl(fun({K, V}, NewApp) -> rebar_app_info:set(NewApp, K, V) end,
+ App,
+ [{erl_opts, NewOpts}, {erl_first_files, NewFirstFiles}]).
+
test_defined([{d, 'TEST'}|_]) -> true;
test_defined([{d, 'TEST', true}|_]) -> true;
test_defined([_|Rest]) -> test_defined(Rest);
test_defined([]) -> false.
-first_files(State) ->
- EUnitFirst = rebar_state:get(State, eunit_first_files, []),
- [{erl_first_files, EUnitFirst}].
-
prepare_tests(State) ->
- {RawOpts, _} = rebar_state:command_parsed_args(State),
- ok = maybe_cover_compile(State, RawOpts),
+ %% parse and translate command line tests
+ CmdTests = resolve_tests(State),
+ CfgTests = rebar_state:get(State, eunit_tests, []),
ProjectApps = project_apps(State),
- resolve_tests(ProjectApps, 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_tests(ProjectApps, RawOpts) ->
- case proplists:get_value(file, RawOpts) of
- undefined -> resolve_apps(ProjectApps, RawOpts);
- Files -> resolve_files(ProjectApps, Files, RawOpts)
- end.
-
-resolve_files(ProjectApps, Files, RawOpts) ->
- case {proplists:get_value(app, RawOpts), proplists:get_value(suite, RawOpts)} of
- {undefined, undefined} -> resolve_files(Files, []);
- _ ->
- case resolve_apps(ProjectApps, RawOpts) of
- {ok, TestSet} -> resolve_files(Files, TestSet);
- Error -> Error
- end
- end.
-
-resolve_files(Files, TestSet) ->
- FileNames = string:tokens(Files, [$,]),
- {ok, TestSet ++ set_files(FileNames, [])}.
-
-resolve_apps(ProjectApps, RawOpts) ->
- case proplists:get_value(app, RawOpts) of
- undefined -> resolve_suites(ProjectApps, RawOpts);
- %% convert app name strings to `rebar_app_info` objects
- Apps -> AppNames = string:tokens(Apps, [$,]),
- case filter_apps_by_name(AppNames, ProjectApps) of
- {ok, TestApps} -> resolve_suites(TestApps, RawOpts);
- Error -> Error
- end
+ %% prioritize tests to run first trying any command line specified
+ %% tests falling back to tests specified in the config file finally
+ %% running a default set if no other tests are present
+ Tests = select_tests(State, ProjectApps, CmdTests, CfgTests),
+ %% check applications for existence in project, modules for existence
+ %% in applications, files and dirs for existence on disk and allow
+ %% any unrecognized tests through for eunit to handle
+ validate_tests(State, ProjectApps, Tests).
+
+resolve_tests(State) ->
+ {RawOpts, _} = rebar_state:command_parsed_args(State),
+ Apps = resolve(app, application, RawOpts),
+ Applications = resolve(application, RawOpts),
+ Dirs = resolve(dir, RawOpts),
+ Files = resolve(file, RawOpts),
+ Modules = resolve(module, RawOpts),
+ Suites = resolve(suite, module, RawOpts),
+ Apps ++ Applications ++ Dirs ++ Files ++ Modules ++ Suites.
+
+resolve(Flag, RawOpts) -> resolve(Flag, Flag, RawOpts).
+
+resolve(Flag, EUnitKey, RawOpts) ->
+ case proplists:get_value(Flag, RawOpts) of
+ undefined -> [];
+ Args -> lists:map(fun(Arg) -> normalize(EUnitKey, Arg) end, string:tokens(Args, [$,]))
end.
-resolve_suites(Apps, RawOpts) ->
- case proplists:get_value(suite, RawOpts) of
- undefined -> test_set(Apps, all);
- Suites -> SuiteNames = string:tokens(Suites, [$,]),
- case filter_suites_by_apps(SuiteNames, Apps) of
- {ok, S} -> test_set(Apps, S);
- Error -> Error
- end
- end.
+normalize(Key, Value) when Key == dir; Key == file -> {Key, Value};
+normalize(Key, Value) -> {Key, list_to_atom(Value)}.
project_apps(State) ->
filter_checkouts(rebar_state:project_apps(State)).
@@ -171,75 +199,93 @@ filter_checkouts([App|Rest], Acc) ->
false -> filter_checkouts(Rest, [App|Acc])
end.
-%% make sure applications specified actually exist
-filter_apps_by_name(AppNames, ProjectApps) ->
- filter_apps_by_name(AppNames, ProjectApps, []).
-
-filter_apps_by_name([], _ProjectApps, Acc) -> {ok, lists:reverse(Acc)};
-filter_apps_by_name([Name|Rest], ProjectApps, Acc) ->
- case find_app_by_name(Name, ProjectApps) of
- {error, app_not_found} ->
- ?PRV_ERROR({error_running_tests,
- "Application `" ++ Name ++ "' not found in project."});
- App ->
- filter_apps_by_name(Rest, ProjectApps, [App|Acc])
+select_tests(State, ProjectApps, [], []) -> default_tests(State, ProjectApps);
+select_tests(_State, _ProjectApps, [], Tests) -> Tests;
+select_tests(_State, _ProjectApps, Tests, _) -> Tests.
+
+default_tests(State, Apps) ->
+ Tests = set_apps(Apps, []),
+ BareTest = filename:join([rebar_state:dir(State), "test"]),
+ F = fun(App) -> rebar_app_info:dir(App) == rebar_state:dir(State) end,
+ case filelib:is_dir(BareTest) andalso not lists:any(F, Apps) of
+ %% `test` dir at root of project is already scheduled to be
+ %% included or `test` does not exist
+ false -> lists:reverse(Tests);
+ %% need to add `test` dir at root to dirs to be included
+ true -> lists:reverse([{dir, filename:join([rebar_dir:base_dir(State), "test"])}|Tests])
end.
-find_app_by_name(_, []) -> {error, app_not_found};
-find_app_by_name(Name, [App|Rest]) ->
- case Name == binary_to_list(rebar_app_info:name(App)) of
- true -> App;
- false -> find_app_by_name(Name, Rest)
- end.
+set_apps([], Acc) -> Acc;
+set_apps([App|Rest], Acc) ->
+ AppName = list_to_atom(binary_to_list(rebar_app_info:name(App))),
+ set_apps(Rest, [{application, AppName}|Acc]).
+
+validate_tests(State, ProjectApps, Tests) ->
+ gather_tests(fun(Elem) -> validate(State, ProjectApps, Elem) end, Tests, []).
-%% ensure specified suites are in the applications included
-filter_suites_by_apps(Suites, ProjectApps) ->
- filter_suites_by_apps(Suites, ProjectApps, []).
-
-filter_suites_by_apps([], _ProjectApps, Acc) -> {ok, lists:reverse(Acc)};
-filter_suites_by_apps([Suite|Rest], Apps, Acc) ->
- Modules = app_modules([binary_to_atom(rebar_app_info:name(A), unicode) || A <- Apps], []),
- case lists:member(list_to_atom(Suite), Modules) of
- false ->
- ?PRV_ERROR({error_running_tests,
- "Module `" ++ Suite ++ "' not found in applications."});
- true ->
- filter_suites_by_apps(Rest, Apps, [Suite|Acc])
+gather_tests(_F, [], Acc) -> {ok, lists:reverse(Acc)};
+gather_tests(F, [Test|Rest], Acc) ->
+ case F(Test) of
+ ok -> gather_tests(F, Rest, [Test|Acc]);
+ %% failure mode, switch to gathering errors
+ {error, Error} -> gather_errors(F, Rest, [Error])
end.
-app_modules([], Acc) -> Acc;
-app_modules([App|Rest], Acc) ->
- Unload = case application:load(App) of
- ok -> true;
- {error, {already_loaded, _}} -> false
- end,
- NewAcc = case application:get_key(App, modules) of
- {ok, Modules} -> Modules ++ Acc;
- undefined -> Acc
- end,
- case Unload of
- true ->
- application:unload(App),
- app_modules(Rest, NewAcc);
- false ->
- app_modules(Rest, NewAcc)
+gather_errors(_F, [], Acc) -> ?PRV_ERROR({eunit_test_errors, lists:reverse(Acc)});
+gather_errors(F, [Test|Rest], Acc) ->
+ case F(Test) of
+ ok -> gather_errors(F, Rest, Acc);
+ {error, Error} -> gather_errors(F, Rest, [Error|Acc])
end.
-test_set(Apps, all) -> {ok, set_apps(Apps, [])};
-test_set(_Apps, Suites) -> {ok, set_suites(Suites, [])}.
+validate(State, ProjectApps, {application, App}) ->
+ validate_app(State, ProjectApps, App);
+validate(State, _ProjectApps, {dir, Dir}) ->
+ validate_dir(State, Dir);
+validate(State, _ProjectApps, {file, File}) ->
+ validate_file(State, File);
+validate(State, _ProjectApps, {module, Module}) ->
+ validate_module(State, Module);
+validate(State, _ProjectApps, {suite, Module}) ->
+ validate_module(State, Module);
+validate(State, _ProjectApps, Module) when is_atom(Module) ->
+ validate_module(State, Module);
+validate(State, ProjectApps, Path) when is_list(Path) ->
+ case ec_file:is_dir(Path) of
+ true -> validate(State, ProjectApps, {dir, Path});
+ false -> validate(State, ProjectApps, {file, Path})
+ end;
+%% unrecognized tests should be included. if they're invalid eunit will error
+%% and rebar.config may contain arbitrarily complex tests that are effectively
+%% unvalidatable
+validate(_State, _ProjectApps, _Test) -> ok.
+
+validate_app(_State, [], AppName) ->
+ {error, lists:concat(["Application `", AppName, "' not found in project."])};
+validate_app(State, [App|Rest], AppName) ->
+ case AppName == binary_to_atom(rebar_app_info:name(App), unicode) of
+ true -> ok;
+ false -> validate_app(State, Rest, AppName)
+ end.
-set_apps([], Acc) -> lists:reverse(Acc);
-set_apps([App|Rest], Acc) ->
- AppName = list_to_atom(binary_to_list(rebar_app_info:name(App))),
- set_apps(Rest, [{application, AppName}|Acc]).
+validate_dir(_State, Dir) ->
+ case ec_file:is_dir(Dir) of
+ true -> ok;
+ false -> {error, lists:concat(["Directory `", Dir, "' not found."])}
+ end.
-set_suites([], Acc) -> lists:reverse(Acc);
-set_suites([Suite|Rest], Acc) ->
- set_suites(Rest, [{module, list_to_atom(Suite)}|Acc]).
+validate_file(_State, File) ->
+ case ec_file:exists(File) of
+ true -> ok;
+ false -> {error, lists:concat(["File `", File, "' not found."])}
+ end.
-set_files([], Acc) -> lists:reverse(Acc);
-set_files([File|Rest], Acc) ->
- set_files(Rest, [{file, File}|Acc]).
+validate_module(_State, Module) ->
+ Path = code:which(Module),
+ case beam_lib:chunks(Path, [exports]) of
+ {ok, _} -> ok;
+ {error, beam_lib, _} -> {error, lists:concat(["Module `", Module, "' not found in project."])}
+ end.
resolve_eunit_opts(State) ->
{Opts, _} = rebar_state:command_parsed_args(State),
@@ -256,6 +302,54 @@ set_verbose(Opts) ->
false -> [verbose] ++ Opts
end.
+maybe_cover_compile(State) ->
+ {RawOpts, _} = rebar_state:command_parsed_args(State),
+ State1 = case proplists:get_value(cover, RawOpts, false) of
+ true -> rebar_state:set(State, cover_enabled, true);
+ false -> State
+ end,
+ rebar_prv_cover:maybe_cover_compile(State1).
+
+maybe_cover_compile(State, Dir) ->
+ {RawOpts, _} = rebar_state:command_parsed_args(State),
+ State1 = case proplists:get_value(cover, RawOpts, false) of
+ true -> rebar_state:set(State, cover_enabled, true);
+ false -> State
+ end,
+ rebar_prv_cover:maybe_cover_compile(State1, [Dir]).
+
+maybe_write_coverdata(State) ->
+ {RawOpts, _} = rebar_state:command_parsed_args(State),
+ State1 = case proplists:get_value(cover, RawOpts, false) of
+ true -> rebar_state:set(State, cover_enabled, true);
+ false -> State
+ end,
+ rebar_prv_cover:maybe_write_coverdata(State1, ?PROVIDER).
+
+maybe_compile_bare_testdir(State) ->
+ Apps = project_apps(State),
+ BareTest = filename:join([rebar_state:dir(State), "test"]),
+ F = fun(App) -> rebar_app_info:dir(App) == rebar_state:dir(State) end,
+ case ec_file:is_dir(BareTest) andalso not lists:any(F, Apps) of
+ true ->
+ ErlOpts = rebar_state:get(State, erl_opts, []),
+ EUnitOpts = rebar_state:get(State, eunit_compile_opts, []),
+ NewErlOpts = safe_define_test_macro(EUnitOpts ++ ErlOpts),
+ %% append `eunit_first_files` to app defined `erl_first_files`
+ FirstFiles = rebar_state:get(State, erl_first_files, []),
+ EUnitFirstFiles = rebar_state:get(State, eunit_first_files, []),
+ NewFirstFiles = EUnitFirstFiles ++ FirstFiles,
+ Opts = rebar_state:opts(State),
+ NewOpts = lists:foldl(fun({K, V}, Dict) -> rebar_opts:set(Dict, K, V) end,
+ Opts,
+ [{erl_opts, NewErlOpts}, {erl_first_files, NewFirstFiles}, {src_dirs, ["test"]}]),
+ OutDir = filename:join([rebar_dir:base_dir(State), "test"]),
+ filelib:ensure_dir(filename:join([OutDir, "dummy.beam"])),
+ rebar_erlc_compiler:compile(NewOpts, rebar_state:dir(State), OutDir),
+ maybe_cover_compile(State, [OutDir]);
+ false -> ok
+ end.
+
handle_results(ok) -> ok;
handle_results(error) ->
{error, unknown_error};
@@ -264,13 +358,17 @@ handle_results({error, Reason}) ->
eunit_opts(_State) ->
[{app, undefined, "app", string, help(app)},
+ {application, undefined, "application", string, help(app)},
{cover, $c, "cover", boolean, help(cover)},
- {file, $f, "file", string, help(file)},
- {suite, undefined, "suite", string, help(suite)},
+ {dir, undefined, "dir", string, help(dir)},
+ {file, undefined, "file", string, help(file)},
+ {module, undefined, "module", string, help(module)},
+ {suite, undefined, "suite", string, help(module)},
{verbose, $v, "verbose", boolean, help(verbose)}].
-help(app) -> "Comma seperated list of application test suites to run. Equivalent to `[{application, App}]`.";
+help(app) -> "Comma separated list of application test suites to run. Equivalent to `[{application, App}]`.";
help(cover) -> "Generate cover data. Defaults to false.";
-help(file) -> "Comma seperated list of files to run. Equivalent to `[{file, File}]`.";
-help(suite) -> "Comma seperated list of test suites to run. Equivalent to `[{module, Suite}]`.";
+help(dir) -> "Comma separated list of dirs to load tests from. Equivalent to `[{dir, Dir}]`.";
+help(file) -> "Comma separated list of files to load tests from. Equivalent to `[{file, File}]`.";
+help(module) -> "Comma separated list of modules to load tests from. Equivalent to `[{module, Module}]`.";
help(verbose) -> "Verbose output. Defaults to false.".
diff --git a/test/rebar_eunit_SUITE.erl b/test/rebar_eunit_SUITE.erl
index d2dac1d..903bd96 100644
--- a/test/rebar_eunit_SUITE.erl
+++ b/test/rebar_eunit_SUITE.erl
@@ -1,464 +1,472 @@
-module(rebar_eunit_SUITE).
--export([suite/0,
- init_per_suite/1,
- end_per_suite/1,
- init_per_testcase/2,
- all/0]).
--export([test_basic_app/1,
- test_multi_app/1,
- test_profile/1,
- test_basic_exports/1,
- test_multi_exports/1,
- test_basic_defines/1,
- test_multi_defines/1,
- test_single_app_flag/1,
- test_multiple_app_flag/1,
- test_nonexistent_app_flag/1,
- test_single_suite_flag/1,
- test_suite_in_app_flag/1,
- test_suite_in_wrong_app_flag/1,
- test_nonexistent_suite_flag/1,
- test_single_file_flag/1,
- test_multiple_file_flag/1,
- test_nonexistent_file_flag/1]).
+-export([all/0, groups/0]).
+-export([init_per_suite/1, init_per_group/2, end_per_group/2]).
+-export([basic_app_compiles/1, basic_app_files/1, basic_app_exports/1, basic_app_testset/1]).
+-export([multi_app_compiles/1, multi_app_files/1, multi_app_exports/1, multi_app_testset/1]).
+-export([eunit_tests/1, eunit_opts/1, eunit_first_files/1]).
+-export([single_application_arg/1, multi_application_arg/1, missing_application_arg/1]).
+-export([single_module_arg/1, multi_module_arg/1, missing_module_arg/1]).
+-export([single_suite_arg/1, multi_suite_arg/1, missing_suite_arg/1]).
+-export([single_file_arg/1, multi_file_arg/1, missing_file_arg/1]).
+-export([single_dir_arg/1, multi_dir_arg/1, missing_dir_arg/1]).
+-export([multiple_arg_composition/1, multiple_arg_errors/1]).
-include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl").
-include_lib("kernel/include/file.hrl").
-suite() ->
- [].
-
+all() ->
+ [{group, basic_app}, {group, multi_app}, {group, cmd_line_args}].
+
+groups() ->
+ [{basic_app, [sequence], [basic_app_compiles, {group, basic_app_results}]},
+ {basic_app_results, [], [basic_app_files, basic_app_exports, basic_app_testset]},
+ {multi_app, [sequence], [multi_app_compiles, {group, multi_app_results}]},
+ {multi_app_results, [], [multi_app_files, multi_app_exports, multi_app_testset]},
+ {cmd_line_args, [], [eunit_tests, eunit_opts, eunit_first_files,
+ single_application_arg, multi_application_arg, missing_application_arg,
+ single_module_arg, multi_module_arg, missing_module_arg,
+ single_suite_arg, multi_suite_arg, missing_suite_arg,
+ single_file_arg, multi_file_arg, missing_file_arg,
+ single_dir_arg, multi_dir_arg, missing_dir_arg,
+ multiple_arg_composition, multiple_arg_errors]}].
+
+%% this just unzips the example apps used by tests to the priv dir for later use
init_per_suite(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ DataDir = ?config(data_dir, Config),
+ {ok, Cwd} = file:get_cwd(),
+ file:set_cwd(PrivDir),
+ ok = ec_file:copy(filename:join([DataDir, "basic_app.zip"]), filename:join([PrivDir, "basic_app.zip"])),
+ {ok, _} = zip:extract(filename:join([PrivDir, "basic_app.zip"])),
+ ok = ec_file:copy(filename:join([DataDir, "multi_app.zip"]), filename:join([PrivDir, "multi_app.zip"])),
+ {ok, _} = zip:extract(filename:join([PrivDir, "multi_app.zip"])),
+ file:set_cwd(Cwd),
Config.
-end_per_suite(_Config) ->
- ok.
+init_per_group(basic_app, Config) ->
+ GroupState = rebar_test_utils:init_rebar_state(Config, "basic_app_"),
-init_per_testcase(_, Config) ->
- rebar_test_utils:init_rebar_state(Config, "eunit_").
+ AppDir = ?config(apps, GroupState),
+ PrivDir = ?config(priv_dir, GroupState),
-all() ->
- [test_basic_app, test_multi_app, test_profile,
- test_basic_exports, test_multi_exports,
- test_basic_defines, test_multi_defines,
- test_single_app_flag, test_multiple_app_flag, test_nonexistent_app_flag,
- test_single_suite_flag, test_suite_in_app_flag,
- test_suite_in_wrong_app_flag, test_nonexistent_suite_flag,
- test_single_file_flag, test_multiple_file_flag, test_nonexistent_file_flag].
-
-test_basic_app(Config) ->
+ AppDirs = ["src", "include", "test"],
+
+ lists:foreach(fun(F) -> ec_file:copy(filename:join([PrivDir, "basic_app", F]),
+ filename:join([AppDir, F]),
+ [recursive]) end, AppDirs),
+
+ RebarConfig = [{erl_opts, [{d, config_define}]}, {eunit_compile_opts, [{d, eunit_compile_define}]}],
+
+ {ok, State} = rebar_test_utils:run_and_check(GroupState, RebarConfig, ["as", "test", "lock"], return),
+
+ [{result, State}|GroupState];
+init_per_group(multi_app, Config) ->
+ GroupState = rebar_test_utils:init_rebar_state(Config, "multi_app_"),
+
+ AppDir = ?config(apps, GroupState),
+ PrivDir = ?config(priv_dir, GroupState),
+
+ AppDirs = ["apps", "test"],
+
+ lists:foreach(fun(F) -> ec_file:copy(filename:join([PrivDir, "multi_app", F]),
+ filename:join([AppDir, F]),
+ [recursive]) end, AppDirs),
+
+ RebarConfig = [{erl_opts, [{d, config_define}]}, {eunit_compile_opts, [{d, eunit_compile_define}]}],
+
+ {ok, State} = rebar_test_utils:run_and_check(GroupState, RebarConfig, ["as", "test", "lock"], return),
+
+ [{result, State}|GroupState];
+init_per_group(cmd_line_args, Config) ->
+ GroupState = rebar_test_utils:init_rebar_state(Config, "cmd_line_args_"),
+
+ AppDir = ?config(apps, GroupState),
+ PrivDir = ?config(priv_dir, GroupState),
+
+ AppDirs = ["apps", "test"],
+
+ lists:foreach(fun(F) -> ec_file:copy(filename:join([PrivDir, "multi_app", F]),
+ filename:join([AppDir, F]),
+ [recursive]) end, AppDirs),
+
+ RebarConfig = [{erl_opts, [{d, config_define}]},
+ {eunit_compile_opts, [{d, eunit_compile_define}]},
+ %% test set not supported by cmd line args
+ {eunit_tests, [{test, multi_app_bar, sanity_test},
+ {test, multi_app_baz, sanity_test}]},
+ {eunit_opts, [verbose]},
+ {eunit_first_files, [filename:join(["apps", "multi_app_bar", "test", "multi_app_bar_tests_helper.erl"]),
+ filename:join(["apps", "multi_app_baz", "test", "multi_app_baz_tests_helper.erl"])]}],
+
+ {ok, State} = rebar_test_utils:run_and_check(GroupState, RebarConfig, ["eunit"], return),
+
+ [{result, State}|GroupState];
+init_per_group(_, Config) -> Config.
+
+end_per_group(_, Config) -> Config.
+
+
+
+%% === tests for a single application at the root of a project ===
+
+%% check that project compiles properly
+basic_app_compiles(Config) ->
AppDir = ?config(apps, Config),
+ State = ?config(result, Config),
- Name = rebar_test_utils:create_random_name("basic_"),
- Vsn = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(AppDir, Name, Vsn, [kernel, stdlib]),
+ {ok, _} = rebar_prv_eunit:do(State),
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- rebar_test_utils:run_and_check(Config, RebarConfig, ["eunit"], {ok, [{app, Name}]}).
+ rebar_test_utils:check_results(AppDir, [{app, "basic_app"}], "*").
-test_multi_app(Config) ->
+%% check that all files expected to be present are present
+basic_app_files(Config) ->
AppDir = ?config(apps, Config),
- Name1 = rebar_test_utils:create_random_name("multi_app1_"),
- Vsn1 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name1]),
- Name1,
- Vsn1,
- [kernel, stdlib]),
- Name2 = rebar_test_utils:create_random_name("multi_app2_"),
- Vsn2 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name2]),
- Name2,
- Vsn2,
- [kernel, stdlib]),
-
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit"],
- {ok, [{app, Name1}, {app, Name2}]}).
-
-test_profile(Config) ->
+ lists:foreach(fun(F) -> true = ec_file:exists(filename:join([AppDir, "_build", "test", "lib", "basic_app", "ebin", F])) end,
+ ["basic_app.app", "basic_app.beam", "basic_app_tests.beam", "basic_app_tests_helper.beam"]).
+
+%% check that the correct tests are exported from modules for project
+%% note that this implies `TEST` is set correctly
+basic_app_exports(_Config) ->
+ Tests = fun(Mod) ->
+ begin
+ Path = code:which(Mod),
+ {ok, {Mod, [{exports, Ex}]}} = beam_lib:chunks(Path, [exports]),
+ true = lists:member({sanity_test, 0}, Ex)
+ end
+ end,
+ Helpers = fun(Mod) ->
+ begin
+ Path = code:which(Mod),
+ {ok, {Mod, [{exports, Ex}]}} = beam_lib:chunks(Path, [exports]),
+ true = lists:member({help, 0}, Ex)
+ end
+ end,
+ lists:foreach(Tests, [basic_app, basic_app_tests]),
+ lists:foreach(Helpers, [basic_app_tests_helper]).
+
+%% check that the correct tests are schedule to run for project
+basic_app_testset(Config) ->
+ Result = ?config(result, Config),
+
+ {ok, [{application, basic_app}]} = rebar_prv_eunit:prepare_tests(Result).
+
+
+
+%% === tests for multiple applications in the `apps' directory of a project ===
+
+%% check that project compiles properly
+multi_app_compiles(Config) ->
AppDir = ?config(apps, Config),
+ State = ?config(result, Config),
- Name = rebar_test_utils:create_random_name("profile_"),
- Vsn = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
+ {ok, _} = rebar_prv_eunit:do(State),
- RebarConfig = [{erl_opts, [{d, some_define}]},
- {profiles, [{test, [{erl_opts, [debug_info]}]}]}],
- rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["as", "test", "eunit"],
- {ok, [{app, Name}]}).
+ rebar_test_utils:check_results(AppDir, [{app, "multi_app_bar"}, {app, "multi_app_baz"}], "*").
-test_basic_exports(Config) ->
+%% check that all files expected to be present are present
+multi_app_files(Config) ->
AppDir = ?config(apps, Config),
- Name = rebar_test_utils:create_random_name("basic_exports_"),
- Vsn = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(AppDir, Name, Vsn, [kernel, stdlib]),
-
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit"],
- {ok, [{app, Name}]}),
-
- App = list_to_atom("not_a_real_src_" ++ Name),
- Suite = list_to_atom("not_a_real_src_" ++ Name ++ "_tests"),
- AppExports = App:module_info(exports),
- SuiteExports = Suite:module_info(exports),
- AppExpect = [{some_test_, 0}],
- SuiteExpect = [{some_test_, 0}, {define_test_, 0}],
- lists:foreach(fun(Expect) -> true = lists:member(Expect, AppExports) end, AppExpect),
- lists:foreach(fun(Expect) -> true = lists:member(Expect, SuiteExports) end, SuiteExpect).
-
-test_multi_exports(Config) ->
+ lists:foreach(fun(F) -> true = ec_file:exists(filename:join([AppDir, "_build", "test", "lib", "multi_app_bar", "ebin", F])) end,
+ ["multi_app_bar.app", "multi_app_bar.beam", "multi_app_bar_tests.beam", "multi_app_bar_tests_helper.beam"]),
+ lists:foreach(fun(F) -> true = ec_file:exists(filename:join([AppDir, "_build", "test", "lib", "multi_app_baz", "ebin", F])) end,
+ ["multi_app_baz.app", "multi_app_baz.beam", "multi_app_baz_tests.beam", "multi_app_baz_tests_helper.beam"]),
+ lists:foreach(fun(F) -> true = ec_file:exists(filename:join([AppDir, "_build", "test", "test", F])) end,
+ ["multi_app_tests.beam", "multi_app_tests_helper.beam"]).
+
+%% check that the correct tests are exported from modules for project
+%% note that this implies `TEST` is set correctly
+multi_app_exports(_Config) ->
+ Tests = fun(Mod) ->
+ begin
+ Ex = Mod:module_info(exports),
+ true = lists:member({sanity_test, 0}, Ex)
+ end
+ end,
+ Helpers = fun(Mod) ->
+ begin
+ Ex = Mod:module_info(exports),
+ true = lists:member({help, 0}, Ex)
+ end
+ end,
+ lists:foreach(Tests, [multi_app_bar, multi_app_bar_tests,
+ multi_app_baz, multi_app_baz_tests,
+ multi_app_tests]),
+ lists:foreach(Helpers, [multi_app_bar_tests_helper, multi_app_baz_tests_helper, multi_app_tests_helper]).
+
+%% check that the correct tests are schedule to run for project
+multi_app_testset(Config) ->
AppDir = ?config(apps, Config),
+ Result = ?config(result, Config),
- Name1 = rebar_test_utils:create_random_name("multi_exports_app1_"),
- Vsn1 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name1]),
- Name1,
- Vsn1,
- [kernel, stdlib]),
- Name2 = rebar_test_utils:create_random_name("multi_exports_app2_"),
- Vsn2 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name2]),
- Name2,
- Vsn2,
- [kernel, stdlib]),
-
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit"],
- {ok, [{app, Name1}, {app, Name2}]}),
-
- App1 = list_to_atom("not_a_real_src_" ++ Name1),
- Suite1 = list_to_atom("not_a_real_src_" ++ Name1 ++ "_tests"),
- AppExports1 = App1:module_info(exports),
- SuiteExports1 = Suite1:module_info(exports),
- App2 = list_to_atom("not_a_real_src_" ++ Name2),
- Suite2 = list_to_atom("not_a_real_src_" ++ Name2 ++ "_tests"),
- AppExports2 = App2:module_info(exports),
- SuiteExports2 = Suite2:module_info(exports),
- AppExpect = [{some_test_, 0}],
- SuiteExpect = [{some_test_, 0}, {define_test_, 0}],
- lists:foreach(fun(Expect) -> true = lists:member(Expect, AppExports1) end, AppExpect),
- lists:foreach(fun(Expect) -> true = lists:member(Expect, SuiteExports1) end, SuiteExpect),
- lists:foreach(fun(Expect) -> true = lists:member(Expect, AppExports2) end, AppExpect),
- lists:foreach(fun(Expect) -> true = lists:member(Expect, SuiteExports2) end, SuiteExpect).
-
-test_basic_defines(Config) ->
- AppDir = ?config(apps, Config),
+ Set = {ok, [{application, multi_app_bar}, {application, multi_app_baz}, {dir, filename:join([AppDir, "_build", "test", "test"])}]},
+ Set = rebar_prv_eunit:prepare_tests(Result).
- Name = rebar_test_utils:create_random_name("basic_"),
- Vsn = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(AppDir, Name, Vsn, [kernel, stdlib]),
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- rebar_test_utils:run_and_check(Config, RebarConfig, ["eunit"], {ok, [{app, Name}]}),
- App = list_to_atom("not_a_real_src_" ++ Name),
- Suite = list_to_atom("not_a_real_src_" ++ Name ++ "_tests"),
- AppOpts = proplists:get_value(options, App:module_info(compile), []),
- SuiteOpts = proplists:get_value(options, Suite:module_info(compile), []),
- Expect = [{d, some_define}],
- lists:foreach(fun(E) -> true = lists:member(E, AppOpts) end, Expect),
- lists:foreach(fun(E) -> true = lists:member(E, SuiteOpts) end, Expect).
+%% === tests for command line arguments ===
-test_multi_defines(Config) ->
- AppDir = ?config(apps, Config),
+%% no explicit test for cmd line args taking precedence over the rebar.config since
+%% almost every single test implies it
- Name1 = rebar_test_utils:create_random_name("multi_app1_"),
- Vsn1 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name1]),
- Name1,
- Vsn1,
- [kernel, stdlib]),
- Name2 = rebar_test_utils:create_random_name("multi_app2_"),
- Vsn2 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name2]),
- Name2,
- Vsn2,
- [kernel, stdlib]),
-
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit"],
- {ok, [{app, Name1}, {app, Name2}]}),
-
- App1 = list_to_atom("not_a_real_src_" ++ Name1),
- Suite1 = list_to_atom("not_a_real_src_" ++ Name1 ++ "_tests"),
- AppOpts1 = proplists:get_value(options, App1:module_info(compile), []),
- SuiteOpts1 = proplists:get_value(options, Suite1:module_info(compile), []),
- App2 = list_to_atom("not_a_real_src_" ++ Name2),
- Suite2 = list_to_atom("not_a_real_src_" ++ Name2 ++ "_tests"),
- AppOpts2 = proplists:get_value(options, App2:module_info(compile), []),
- SuiteOpts2 = proplists:get_value(options, Suite2:module_info(compile), []),
- Expect = [{d, some_define}],
- lists:foreach(fun(E) -> true = lists:member(E, AppOpts1) end, Expect),
- lists:foreach(fun(E) -> true = lists:member(E, SuiteOpts1) end, Expect),
- lists:foreach(fun(E) -> true = lists:member(E, AppOpts2) end, Expect),
- lists:foreach(fun(E) -> true = lists:member(E, SuiteOpts2) end, Expect).
-
-test_single_app_flag(Config) ->
- AppDir = ?config(apps, Config),
+%% check tests in the rebar.config are run if no cmd line opts are specified
+eunit_tests(Config) ->
+ State = ?config(result, Config),
+
+ Expect = {ok, [{test, multi_app_bar, sanity_test}, {test, multi_app_baz, sanity_test}]},
+ Expect = rebar_prv_eunit:prepare_tests(State).
+
+%% check eunit_opts from the rebar.config are respected
+eunit_opts(Config) ->
+ State = ?config(result, Config),
+
+ Apps = rebar_state:project_apps(State),
+ lists:foreach(fun(App) -> [verbose] = rebar_app_info:get(App, eunit_opts) end,
+ Apps).
+
+%% check eunit_first_files from the rebar.config are respected
+eunit_first_files(Config) ->
+ State = ?config(result, Config),
+
+ FirstFiles = [filename:join(["apps", "multi_app_bar", "test", "multi_app_bar_tests_helper.erl"]),
+ filename:join(["apps", "multi_app_baz", "test", "multi_app_baz_tests_helper.erl"])],
+
+ Apps = rebar_state:project_apps(State),
+ lists:foreach(fun(App) -> FirstFiles = rebar_app_info:get(App, eunit_first_files) end,
+ Apps).
+
+%% check that the --application cmd line opt generates the correct test set
+single_application_arg(Config) ->
+ S = ?config(result, Config),
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--application=multi_app_bar"]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ {ok, [{application, multi_app_bar}]} = rebar_prv_eunit:prepare_tests(State).
+
+multi_application_arg(Config) ->
+ S = ?config(result, Config),
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--application=multi_app_bar,multi_app_baz"]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ {ok, [{application, multi_app_bar}, {application, multi_app_baz}]} = rebar_prv_eunit:prepare_tests(State).
+
+%% check that an invalid --application cmd line opt generates an error
+missing_application_arg(Config) ->
+ S = ?config(result, Config),
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--application=missing_app"]),
+ State = rebar_state:command_parsed_args(S, Args),
- Name1 = rebar_test_utils:create_random_name("multi_exports_app1_"),
- Vsn1 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name1]),
- Name1,
- Vsn1,
- [kernel, stdlib]),
- Name2 = rebar_test_utils:create_random_name("multi_exports_app2_"),
- Vsn2 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name2]),
- Name2,
- Vsn2,
- [kernel, stdlib]),
-
- BareSuite = io_lib:format("-module(all_tests).\n"
- "-compile(export_all).\n"
- "-include_lib(\"eunit/include/eunit.hrl\").\n"
- "some_test_() -> ?_assert(true).\n"
- "define_test_() -> ?_assertEqual(true, ?some_define).\n", []),
- FileName = filename:join([AppDir, "test", "all_tests.erl"]),
- ok = filelib:ensure_dir(FileName),
- ok = ec_file:write(FileName, BareSuite),
-
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit", "--app=" ++ Name1],
- {ok, [{app, Name1}, {app, Name2}]}),
-
- Suite1 = list_to_atom("not_a_real_src_" ++ Name1 ++ "_tests"),
- {module, Suite1} = code:ensure_loaded(Suite1),
- Suite2 = list_to_atom("not_a_real_src_" ++ Name2 ++ "_tests"),
- {error, nofile} = code:ensure_loaded(Suite2),
- {error, nofile} = code:ensure_loaded(all_tests).
-
-test_multiple_app_flag(Config) ->
+ Error = {error, {rebar_prv_eunit, {eunit_test_errors, ["Application `missing_app' not found in project."]}}},
+ Error = rebar_prv_eunit:prepare_tests(State).
+
+%% check that the --module cmd line opt generates the correct test set
+single_module_arg(Config) ->
AppDir = ?config(apps, Config),
+ S = ?config(result, Config),
+
+ %% necessary to fix paths
+ Path = code:get_path(),
+ code:add_paths([filename:join([AppDir, "_build", "test", "lib", "multi_app_bar", "ebin"])]),
+
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--module=multi_app_bar"]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ {ok, [{module, multi_app_bar}]} = rebar_prv_eunit:prepare_tests(State),
+
+ %% restore path
+ code:set_path(Path).
- Name1 = rebar_test_utils:create_random_name("multi_exports_app1_"),
- Vsn1 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name1]),
- Name1,
- Vsn1,
- [kernel, stdlib]),
- Name2 = rebar_test_utils:create_random_name("multi_exports_app2_"),
- Vsn2 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name2]),
- Name2,
- Vsn2,
- [kernel, stdlib]),
-
- BareSuite = io_lib:format("-module(all_tests).\n"
- "-compile(export_all).\n"
- "-include_lib(\"eunit/include/eunit.hrl\").\n"
- "some_test_() -> ?_assert(true).\n"
- "define_test_() -> ?_assertEqual(true, ?some_define).\n", []),
- FileName = filename:join([AppDir, "test", "all_tests.erl"]),
- ok = filelib:ensure_dir(FileName),
- ok = ec_file:write(FileName, BareSuite),
-
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit", "--app=" ++ Name1 ++ "," ++ Name2],
- {ok, [{app, Name1}, {app, Name2}]}),
-
- Suite1 = list_to_atom("not_a_real_src_" ++ Name1 ++ "_tests"),
- {module, Suite1} = code:ensure_loaded(Suite1),
- Suite2 = list_to_atom("not_a_real_src_" ++ Name2 ++ "_tests"),
- {module, Suite2} = code:ensure_loaded(Suite2),
- {error, nofile} = code:ensure_loaded(all_tests).
-
-test_nonexistent_app_flag(Config) ->
+multi_module_arg(Config) ->
AppDir = ?config(apps, Config),
+ S = ?config(result, Config),
+
+ %% necessary to fix paths
+ Path = code:get_path(),
+ code:add_paths([filename:join([AppDir, "_build", "test", "lib", "multi_app_bar", "ebin"])]),
+ code:add_paths([filename:join([AppDir, "_build", "test", "lib", "multi_app_baz", "ebin"])]),
+
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--module=multi_app_bar,multi_app_baz"]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ {ok, [{module, multi_app_bar}, {module, multi_app_baz}]} = rebar_prv_eunit:prepare_tests(State),
+
+ %% restore path
+ code:set_path(Path).
+
+%% check that an invalid --module cmd line opt generates an error
+missing_module_arg(Config) ->
+ S = ?config(result, Config),
- Name1 = rebar_test_utils:create_random_name("multi_exports_app1_"),
- Vsn1 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,Name1]),
- Name1,
- Vsn1,
- [kernel, stdlib]),
- Name2 = rebar_test_utils:create_random_name("multi_exports_app2_"),
- Vsn2 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name2]),
- Name2,
- Vsn2,
- [kernel, stdlib]),
-
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- {error, {_, Error}} = rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit", "--app=not_a_real_app"],
- return),
-
- Error = {error_running_tests, "Application `not_a_real_app' not found in project."}.
-
-test_single_suite_flag(Config) ->
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--module=missing_app"]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ Error = {error, {rebar_prv_eunit, {eunit_test_errors, ["Module `missing_app' not found in project."]}}},
+ Error = rebar_prv_eunit:prepare_tests(State).
+
+%% check that the --suite cmd line opt generates the correct test set
+single_suite_arg(Config) ->
AppDir = ?config(apps, Config),
+ S = ?config(result, Config),
+
+ %% necessary to fix paths
+ Path = code:get_path(),
+ code:add_paths([filename:join([AppDir, "_build", "test", "lib", "multi_app_bar", "ebin"])]),
+
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--suite=multi_app_bar"]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ {ok, [{module, multi_app_bar}]} = rebar_prv_eunit:prepare_tests(State),
- Name1 = rebar_test_utils:create_random_name("multi_exports_app1_"),
- Vsn1 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name1]),
- Name1,
- Vsn1,
- [kernel, stdlib]),
- Name2 = rebar_test_utils:create_random_name("multi_exports_app2_"),
- Vsn2 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name2]),
- Name2,
- Vsn2,
- [kernel, stdlib]),
-
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit", "--suite=not_a_real_src_" ++ Name1],
- {ok, [{app, Name1}, {app, Name2}]}),
-
- Suite1 = list_to_atom("not_a_real_src_" ++ Name1 ++ "_tests"),
- {module, Suite1} = code:ensure_loaded(Suite1).
-
-test_suite_in_app_flag(Config) ->
+ %% restore path
+ code:set_path(Path).
+
+multi_suite_arg(Config) ->
AppDir = ?config(apps, Config),
+ S = ?config(result, Config),
+
+ %% necessary to fix paths
+ Path = code:get_path(),
+ code:add_paths([filename:join([AppDir, "_build", "test", "lib", "multi_app_bar", "ebin"])]),
+ code:add_paths([filename:join([AppDir, "_build", "test", "lib", "multi_app_baz", "ebin"])]),
+
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--suite=multi_app_bar,multi_app_baz"]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ {ok, [{module, multi_app_bar}, {module, multi_app_baz}]} = rebar_prv_eunit:prepare_tests(State),
- Name1 = rebar_test_utils:create_random_name("multi_exports_app1_"),
- Vsn1 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name1]),
- Name1,
- Vsn1,
- [kernel, stdlib]),
- Name2 = rebar_test_utils:create_random_name("multi_exports_app2_"),
- Vsn2 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name2]),
- Name2,
- Vsn2,
- [kernel, stdlib]),
-
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit",
- "--app=" ++ Name1,
- "--suite=not_a_real_src_" ++ Name1],
- {ok, [{app, Name1}, {app, Name2}]}),
-
- Suite1 = list_to_atom("not_a_real_src_" ++ Name1 ++ "_tests"),
- {module, Suite1} = code:ensure_loaded(Suite1),
- Suite2 = list_to_atom("not_a_real_src_" ++ Name2 ++ "_tests"),
- {error, nofile} = code:ensure_loaded(Suite2).
-
-test_suite_in_wrong_app_flag(Config) ->
+ %% restore path
+ code:set_path(Path).
+
+%% check that an invalid --suite cmd line opt generates an error
+missing_suite_arg(Config) ->
+ S = ?config(result, Config),
+
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--suite=missing_app"]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ Error = {error, {rebar_prv_eunit, {eunit_test_errors, ["Module `missing_app' not found in project."]}}},
+ Error = rebar_prv_eunit:prepare_tests(State).
+
+%% check that the --file cmd line opt generates the correct test set
+single_file_arg(Config) ->
+ S = ?config(result, Config),
AppDir = ?config(apps, Config),
- Name1 = rebar_test_utils:create_random_name("multi_exports_app1_"),
- Vsn1 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name1]),
- Name1,
- Vsn1,
- [kernel, stdlib]),
- Name2 = rebar_test_utils:create_random_name("multi_exports_app2_"),
- Vsn2 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name2]),
- Name2,
- Vsn2,
- [kernel, stdlib]),
-
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- {error, {_, Error}} = rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit",
- "--app=" ++ Name1,
- "--suite=not_a_real_src_" ++ Name2],
- return),
-
- Error = {error_running_tests, "Module `not_a_real_src_" ++
- Name2 ++
- "' not found in applications."}.
-
-test_nonexistent_suite_flag(Config) ->
+ Path = filename:join([AppDir, "_build", "test", "lib", "multi_app_bar", "ebin", "multi_app_bar.beam"]),
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--file=" ++ Path]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ {ok, [{file, Path}]} = rebar_prv_eunit:prepare_tests(State).
+
+multi_file_arg(Config) ->
+ S = ?config(result, Config),
AppDir = ?config(apps, Config),
- Name1 = rebar_test_utils:create_random_name("multi_exports_app1_"),
- Vsn1 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name1]),
- Name1,
- Vsn1,
- [kernel, stdlib]),
- Name2 = rebar_test_utils:create_random_name("multi_exports_app2_"),
- Vsn2 = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(filename:join([AppDir,"apps",Name2]),
- Name2,
- Vsn2,
- [kernel, stdlib]),
-
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- {error, {_, Error}} = rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit", "--suite=not_a_real_module"],
- return),
-
- Error = {error_running_tests, "Module `not_a_real_module' not found in applications."}.
-
-test_single_file_flag(Config) ->
+ BarPath = filename:join([AppDir, "_build", "test", "lib", "multi_app_bar", "ebin", "multi_app_bar.beam"]),
+ BazPath = filename:join([AppDir, "_build", "test", "lib", "multi_app_baz", "ebin", "multi_app_baz.beam"]),
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--file=" ++ BarPath ++ "," ++ BazPath]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ {ok, [{file, BarPath}, {file, BazPath}]} = rebar_prv_eunit:prepare_tests(State).
+
+%% check that an invalid --file cmd line opt generates an error
+missing_file_arg(Config) ->
+ S = ?config(result, Config),
AppDir = ?config(apps, Config),
- Name = rebar_test_utils:create_random_name("single_file_flag_app_"),
- Vsn = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(AppDir, Name, Vsn, [kernel, stdlib]),
+ Path = filename:join([AppDir, "_build", "test", "lib", "missing_app", "ebin", "missing_app.beam"]),
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--file=" ++ Path]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ Error = {error, {rebar_prv_eunit, {eunit_test_errors, ["File `" ++ Path ++"' not found."]}}},
+ Error = rebar_prv_eunit:prepare_tests(State).
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit", "--file=not_a_real_src_" ++ Name ++ "_tests.beam"],
- {ok, [{app, Name}]}),
+%% check that the --dir cmd line opt generates the correct test set
+single_dir_arg(Config) ->
+ S = ?config(result, Config),
+ AppDir = ?config(apps, Config),
+
+ Path = filename:join([AppDir, "_build", "test", "lib", "multi_app_bar", "ebin"]),
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--dir=" ++ Path]),
+ State = rebar_state:command_parsed_args(S, Args),
- File = list_to_atom("not_a_real_src_" ++ Name ++ "_tests"),
- {module, File} = code:ensure_loaded(File).
+ {ok, [{dir, Path}]} = rebar_prv_eunit:prepare_tests(State).
-test_multiple_file_flag(Config) ->
+multi_dir_arg(Config) ->
+ S = ?config(result, Config),
AppDir = ?config(apps, Config),
- Name = rebar_test_utils:create_random_name("multiple_file_flag_app_"),
- Vsn = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(AppDir, Name, Vsn, [kernel, stdlib]),
+ BarPath = filename:join([AppDir, "_build", "test", "lib", "multi_app_bar", "ebin"]),
+ BazPath = filename:join([AppDir, "_build", "test", "lib", "multi_app_baz", "ebin"]),
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--dir=" ++ BarPath ++ "," ++ BazPath]),
+ State = rebar_state:command_parsed_args(S, Args),
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit", "--file=not_a_real_src_" ++ Name ++ "_tests.beam,not_a_real_src_" ++ Name ++ ".beam"],
- {ok, [{app, Name}]}),
+ {ok, [{dir, BarPath}, {dir, BazPath}]} = rebar_prv_eunit:prepare_tests(State).
- File1 = list_to_atom("not_a_real_src_" ++ Name ++ "_tests"),
- {module, File1} = code:ensure_loaded(File1),
+%% check that an invalid --dir cmd line opt generates an error
+missing_dir_arg(Config) ->
+ S = ?config(result, Config),
+ AppDir = ?config(apps, Config),
- File2 = list_to_atom("not_a_real_src_" ++ Name),
- {module, File2} = code:ensure_loaded(File2).
+ Path = filename:join([AppDir, "_build", "test", "lib", "missing_app", "ebin"]),
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--dir=" ++ Path]),
+ State = rebar_state:command_parsed_args(S, Args),
-test_nonexistent_file_flag(Config) ->
+ Error = {error, {rebar_prv_eunit, {eunit_test_errors, ["Directory `" ++ Path ++"' not found."]}}},
+ Error = rebar_prv_eunit:prepare_tests(State).
+
+%% check that multiple args are composed
+multiple_arg_composition(Config) ->
+ S = ?config(result, Config),
AppDir = ?config(apps, Config),
- Name = rebar_test_utils:create_random_name("nonexistent_file_flag_app_"),
- Vsn = rebar_test_utils:create_random_vsn(),
- rebar_test_utils:create_eunit_app(AppDir,
- Name,
- Vsn,
- [kernel, stdlib]),
-
- RebarConfig = [{erl_opts, [{d, some_define}]}],
- {error, {rebar_prv_eunit, _Error}} = rebar_test_utils:run_and_check(Config,
- RebarConfig,
- ["eunit", "--file=" ++ filename:join(["some_path", "not_a_real_file.erl"])],
- return).
+ %% necessary to fix paths
+ Path = code:get_path(),
+ code:add_paths([filename:join([AppDir, "_build", "test", "lib", "multi_app_bar", "ebin"])]),
+ FilePath = filename:join([AppDir, "_build", "test", "lib", "multi_app_bar", "ebin", "multi_app_bar.beam"]),
+ DirPath = filename:join([AppDir, "_build", "test", "lib", "multi_app_bar", "ebin"]),
+
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--application=multi_app_bar",
+ "--module=multi_app_bar",
+ "--suite=multi_app_bar",
+ "--file=" ++ FilePath,
+ "--dir=" ++ DirPath]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ Expect = [{application, multi_app_bar},
+ {dir, DirPath},
+ {file, FilePath},
+ {module, multi_app_bar},
+ {module, multi_app_bar}],
+
+ {ok, Expect} = rebar_prv_eunit:prepare_tests(State),
+
+ %% restore path
+ code:set_path(Path).
+
+%% check that multiple errors are reported
+multiple_arg_errors(Config) ->
+ S = ?config(result, Config),
+ AppDir = ?config(apps, Config),
+
+ FilePath = filename:join([AppDir, "_build", "test", "lib", "missing_app", "ebin", "missing_app.beam"]),
+ DirPath = filename:join([AppDir, "_build", "test", "lib", "missing_app", "ebin"]),
+
+ {ok, Args} = getopt:parse(rebar_prv_eunit:eunit_opts(S), ["--application=missing_app",
+ "--module=missing_app",
+ "--suite=missing_app",
+ "--file=" ++ FilePath,
+ "--dir=" ++ DirPath]),
+ State = rebar_state:command_parsed_args(S, Args),
+
+ Expect = ["Application `missing_app' not found in project.",
+ "Directory `" ++ DirPath ++ "' not found.",
+ "File `" ++ FilePath ++ "' not found.",
+ "Module `missing_app' not found in project.",
+ "Module `missing_app' not found in project."],
+
+ {error, {rebar_prv_eunit, {eunit_test_errors, Expect}}} = rebar_prv_eunit:prepare_tests(State).
diff --git a/test/rebar_eunit_SUITE_data/basic_app.zip b/test/rebar_eunit_SUITE_data/basic_app.zip
new file mode 100644
index 0000000..0eaa0af
--- /dev/null
+++ b/test/rebar_eunit_SUITE_data/basic_app.zip
Binary files differ
diff --git a/test/rebar_eunit_SUITE_data/deflate b/test/rebar_eunit_SUITE_data/deflate
new file mode 100755
index 0000000..368228f
--- /dev/null
+++ b/test/rebar_eunit_SUITE_data/deflate
@@ -0,0 +1,15 @@
+#!/usr/bin/env escript
+
+main(["basic_app"]) ->
+ case filelib:is_dir("basic_app") of
+ true -> zip:create("basic_app.zip", ["basic_app"]), halt(0);
+ false -> io:format("unable to locate basic_app directory~n", []), halt(1)
+ end;
+main(["multi_app"]) ->
+ case filelib:is_dir("multi_app") of
+ true -> zip:create("multi_app.zip", ["multi_app"]), halt(0);
+ false -> io:format("unable to locate multi_app directory~n", []), halt(1)
+ end,
+ halt(0);
+main(_) ->
+ io:format("usage: deflate basic_app | multi_app~n", []), halt(1). \ No newline at end of file
diff --git a/test/rebar_eunit_SUITE_data/inflate b/test/rebar_eunit_SUITE_data/inflate
new file mode 100755
index 0000000..d402f80
--- /dev/null
+++ b/test/rebar_eunit_SUITE_data/inflate
@@ -0,0 +1,15 @@
+#!/usr/bin/env escript
+
+main(["basic_app"]) ->
+ case filelib:is_file("basic_app.zip") of
+ true -> zip:unzip("basic_app.zip"), halt(0);
+ false -> io:format("unable to locate basic_app.zip~n", []), halt(1)
+ end;
+main(["multi_app"]) ->
+ case filelib:is_file("multi_app.zip") of
+ true -> zip:unzip("multi_app.zip"), halt(0);
+ false -> io:format("unable to locate multi_app.zip~n", []), halt(1)
+ end,
+ halt(0);
+main(_) ->
+ io:format("usage: inflate basic_app | multi_app~n", []), halt(1). \ No newline at end of file
diff --git a/test/rebar_eunit_SUITE_data/multi_app.zip b/test/rebar_eunit_SUITE_data/multi_app.zip
new file mode 100644
index 0000000..36bf9a6
--- /dev/null
+++ b/test/rebar_eunit_SUITE_data/multi_app.zip
Binary files differ
diff --git a/test/rebar_profiles_SUITE.erl b/test/rebar_profiles_SUITE.erl
index d4c10c5..a31a4c9 100644
--- a/test/rebar_profiles_SUITE.erl
+++ b/test/rebar_profiles_SUITE.erl
@@ -375,8 +375,8 @@ test_profile_applied_at_completion(Config) ->
["eunit"],
return),
- Opts = rebar_state:opts(State),
- ErlOpts = dict:fetch(erl_opts, Opts),
+ [App] = rebar_state:project_apps(State),
+ ErlOpts = rebar_app_info:get(App, erl_opts),
true = lists:member({d, 'TEST'}, ErlOpts).
test_profile_applied_before_compile(Config) ->
diff --git a/test/rebar_test_utils.erl b/test/rebar_test_utils.erl
index 8d1d408..ca5e91a 100644
--- a/test/rebar_test_utils.erl
+++ b/test/rebar_test_utils.erl
@@ -1,7 +1,7 @@
-module(rebar_test_utils).
-include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl").
--export([init_rebar_state/1, init_rebar_state/2, run_and_check/4]).
+-export([init_rebar_state/1, init_rebar_state/2, run_and_check/4, check_results/3]).
-export([expand_deps/2, flat_deps/1, top_level_deps/1]).
-export([create_app/4, create_eunit_app/4, create_empty_app/4, create_config/2,
package_app/3]).