Skip to content

Commit 9a692df

Browse files
committed
wip
1 parent 8e49286 commit 9a692df

File tree

12 files changed

+101
-4
lines changed

12 files changed

+101
-4
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@
1515
/.eunit
1616
.elixir.plt
1717
erl_crash.dump
18+
/cover/

Makefile

+18
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ lib/$(1)/ebin/Elixir.$(2).beam: $(wildcard lib/$(1)/lib/*.ex) $(wildcard lib/$(1
5353
test_$(1): test_formatted $(1)
5454
@ echo "==> $(1) (ex_unit)"
5555
$(Q) cd lib/$(1) && ../../bin/elixir -r "test/test_helper.exs" -pr "test/**/$(TEST_FILES)";
56+
57+
cover/exunit_$(1).coverdata:
58+
$(Q) mkdir -p cover
59+
$(Q) COVER_FILE="$(realpath cover)/exunit_$(1).coverdata" $(MAKE) test_$(1)
60+
cover/combined.coverdata: cover/exunit_$(1).coverdata
5661
endef
5762

5863
define WRITE_SOURCE_DATE_EPOCH
@@ -175,6 +180,7 @@ clean: clean_man
175180
rm -rf lib/mix/test/fixtures/git_sparse_repo/
176181
rm -rf lib/mix/test/fixtures/archive/ebin/
177182
rm -f erl_crash.dump
183+
rm -rf cover/*
178184

179185
clean_elixir:
180186
$(Q) rm -f lib/*/ebin/Elixir.*.beam
@@ -287,6 +293,18 @@ test_stdlib: compile
287293
cd lib/elixir && ../../bin/elixir --sname primary -r "test/elixir/test_helper.exs" -pr "test/elixir/**/$(TEST_FILES)"; \
288294
fi
289295

296+
cover/eunit_stdlib.coverdata:
297+
$(Q) mkdir -p cover
298+
$(Q) COVER_FILE="$(realpath cover)/eunit_stdlib.coverdata" $(MAKE) test_erlang
299+
cover/combined.coverdata: cover/eunit_stdlib.coverdata
300+
301+
cover/combined.coverdata:
302+
$(Q) bin/elixir ./cover_combine.exs
303+
304+
.PHONY: cover_html
305+
cover_html:
306+
$(Q) bin/elixir ./cover_export.exs
307+
290308
#==> Dialyzer tasks
291309

292310
DIALYZER_OPTS = --no_check_plt --fullpath -Werror_handling -Wunmatched_returns -Wunderspecs

cover.exs

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
case System.fetch_env("COVER_FILE") do
2+
{:ok, file} ->
3+
_ = :cover.stop()
4+
{:ok, _pid} = :cover.start()
5+
6+
ebins = __ENV__.file |> Path.dirname() |> Path.join("lib/*/ebin") |> Path.wildcard()
7+
8+
for ebin <- ebins do
9+
# TODO: Check result
10+
:cover.compile_beam_directory(String.to_charlist(ebin))
11+
end
12+
13+
System.at_exit(fn _status ->
14+
:ok = :cover.export(String.to_charlist(file))
15+
end)
16+
17+
:error ->
18+
:ok
19+
end

cover_combine.exs

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#!bin/elixir
2+
3+
cover_dir = __ENV__.file |> Path.dirname() |> Path.join("cover")
4+
coverdata_inputs = cover_dir |> Path.join("{exunit,eunit}_*.coverdata") |> Path.wildcard()
5+
coverdata_output = Path.join(cover_dir, "combined.coverdata")
6+
7+
_ = :cover.stop()
8+
{:ok, _pid} = :cover.start()
9+
10+
for file <- coverdata_inputs do
11+
dbg file
12+
:ok = :cover.import(String.to_charlist(file))
13+
end
14+
15+
:ok = :cover.export(String.to_charlist(coverdata_output))

cover_export.exs

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!bin/elixir
2+
3+
cover_dir = __ENV__.file |> Path.dirname() |> Path.join("cover")
4+
coverdata_path = Path.join(cover_dir, "combined.coverdata")
5+
6+
_ = :cover.stop()
7+
{:ok, _pid} = :cover.start()
8+
9+
:ok = :cover.import(String.to_charlist(coverdata_path))
10+
11+
{:result, _files, []} = :cover.analyse_to_file(:_, [:html, {:outdir, cover_dir}])

lib/eex/test/test_helper.exs

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
{line_exclude, line_include} =
66
if line = System.get_env("LINE"), do: {[:test], [line: line]}, else: {[], []}
77

8+
Code.eval_file("../../../../cover.exs", __ENV__.file)
9+
810
ExUnit.start(
911
trace: !!System.get_env("TRACE"),
1012
include: line_include,

lib/elixir/test/elixir/test_helper.exs

+2
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ source_exclude =
120120
[]
121121
end
122122

123+
Code.eval_file("../../../../../cover.exs", __ENV__.file)
124+
123125
ExUnit.start(
124126
trace: !!System.get_env("TRACE"),
125127
assert_receive_timeout: assert_timeout,

lib/elixir/test/erlang/test_helper.erl

+25-4
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@
1414

1515
test() ->
1616
application:ensure_all_started(elixir),
17-
case eunit:test(?TESTS) of
18-
error -> erlang:halt(1);
19-
_Res -> erlang:halt(0)
20-
end.
17+
enable_coverage_report(),
18+
ExitCode = case eunit:test(?TESTS) of
19+
error -> 1;
20+
_Res -> 0
21+
end,
22+
write_report_coverage(),
23+
erlang:halt(ExitCode).
2124

2225
% Execute a piece of code and purge given modules right after
2326
run_and_remove(Fun, Modules) ->
@@ -39,3 +42,21 @@ throw_erlang(String) ->
3942
{ok, Tokens, _} = erl_scan:string(String),
4043
{ok, [Form]} = erl_parse:parse_exprs(Tokens),
4144
erlang:error(io:format("~p~n", [Form])).
45+
46+
enable_coverage_report() ->
47+
case os:getenv("COVER_FILE") of
48+
false -> ok;
49+
_File ->
50+
_ = cover:stop(),
51+
{ok, _Pid} = cover:start(),
52+
Ebin = filename:join(filename:dirname(?FILE), "/../../ebin"),
53+
% TODO: Check Result
54+
cover:compile_beam_directory(Ebin)
55+
end.
56+
57+
write_report_coverage() ->
58+
case os:getenv("COVER_FILE") of
59+
false -> ok;
60+
File -> cover:export(File),
61+
erlang:display(File)
62+
end.

lib/ex_unit/test/test_helper.exs

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ Logger.configure_backend(:console, colors: [enabled: false])
77
{line_exclude, line_include} =
88
if line = System.get_env("LINE"), do: {[:test], [line: line]}, else: {[], []}
99

10+
Code.eval_file("../../../../cover.exs", __ENV__.file)
11+
1012
ExUnit.start(
1113
trace: !!System.get_env("TRACE"),
1214
include: line_include,

lib/iex/test/test_helper.exs

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ source_exclude =
2626
[]
2727
end
2828

29+
Code.eval_file("../../../../cover.exs", __ENV__.file)
30+
2931
ExUnit.start(
3032
assert_receive_timeout: assert_timeout,
3133
trace: !!System.get_env("TRACE"),

lib/logger/test/test_helper.exs

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
{line_exclude, line_include} =
66
if line = System.get_env("LINE"), do: {[:test], [line: line]}, else: {[], []}
77

8+
Code.eval_file("../../../../cover.exs", __ENV__.file)
9+
810
ExUnit.start(
911
trace: !!System.get_env("TRACE"),
1012
include: line_include,

lib/mix/test/test_helper.exs

+2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ cover_exclude =
4646
[]
4747
end
4848

49+
Code.eval_file("../../../../cover.exs", __ENV__.file)
50+
4951
ExUnit.start(
5052
trace: !!System.get_env("TRACE"),
5153
exclude: epmd_exclude ++ os_exclude ++ git_exclude ++ line_exclude ++ cover_exclude,

0 commit comments

Comments
 (0)