blob: 5286da37b9d2780877651270c76c5a4d9e9c3b2b [file] [log] [blame]
#!/usr/bin/env escript
%% -*- erlang -*-
%%! -DTEST -env ERL_LIBS @abs_top_builddir@/src:$ERL_LIBS -pa @abs_top_builddir@/test/couchdb/ebin
%%
%% Licensed under the Apache License, Version 2.0 (the "License"); you may not
%% use this file except in compliance with the License. You may obtain a copy of
%% the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
%% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
%% License for the specific language governing permissions and limitations under
%% the License.
-define(BUILDDIR, "@abs_top_builddir@").
-define(SOURCEDIR, "@abs_top_srcdir@").
-define(TESTS_EBIN, filename:join([?BUILDDIR, "test", "couchdb", "ebin"])).
-define(TESTS_TEMP, filename:join([?BUILDDIR, "test", "couchdb", "temp"])).
main([]) ->
io:fwrite("Path to test file or directory wasn't specified.~n"),
erlang:halt(1);
main(["-v"]) ->
io:fwrite("Path to test file or directory wasn't specified.~n"),
erlang:halt(1);
main(["-v", Path]) ->
run(Path, [verbose]);
main(["-v", _ | _]) ->
io:fwrite("Only single tests source path is supported.~n"),
erlang:halt(1);
main([Path]) ->
run(Path, []),
ok;
main([_|_]) ->
io:fwrite("Only single tests source path is supported.~n"),
erlang:halt(1).
run(Path, Options) ->
ensure_dirs(),
Mask = "*_tests.erl",
Files = list_files(Path, Mask),
init_code_path(),
Mods = compile(Files),
run_tests(Mods, Options).
ensure_dirs() ->
ok = filelib:ensure_dir(?TESTS_EBIN),
ok = filelib:ensure_dir(?TESTS_TEMP),
ok.
list_files(Path, Mask)->
AbsPath = filename:absname(Path),
case filelib:is_file(AbsPath) of
true ->
ok;
false ->
io:fwrite("File or directory not found: ~p~n", [AbsPath]),
erlang:halt(1)
end,
case filelib:is_dir(AbsPath) of
true ->
case filelib:wildcard(filename:join([AbsPath, Mask])) of
[] ->
io:fwrite("No test files was found at ~p by mask ~p ~n",
[AbsPath, Mask]),
erlang:halt(1);
Files ->
Files
end;
false -> [AbsPath]
end.
compile(Files) ->
lists:map(
fun(File)->
io:fwrite("compile ~p~n", [File]),
Opts = [report, verbose, {outdir, ?TESTS_EBIN},
{i, filename:join([?BUILDDIR, "test", "couchdb",
"include"])},
{i, filename:join([?SOURCEDIR, "src"])}],
{ok, Mod} = compile:file(File, Opts),
Mod
end,
Files).
run_tests(Mods, Options) ->
%% disable error_logger to reduce noise in stdout
error_logger:tty(false),
case eunit:test(Mods, Options) of
error -> erlang:halt(1);
_ -> ok
end.
init_code_path() ->
Paths = [
"couchdb",
"ejson",
"erlang-oauth",
"ibrowse",
"mochiweb",
"snappy"
],
lists:foreach(fun(Name) ->
code:add_patha(filename:join([?BUILDDIR, "src", Name]))
end, Paths).