1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
Code.require_file("../test_helper.exs", __DIR__)
defmodule ExUnit.CaptureLogTest do
use ExUnit.Case
require Logger
import ExUnit.CaptureLog
test "no output" do
assert capture_log(fn -> nil end) == ""
end
test "assert inside" do
group_leader = Process.group_leader()
try do
capture_log(fn ->
assert false
end)
rescue
error in [ExUnit.AssertionError] ->
assert error.message == "Expected truthy, got false"
end
# Ensure no leakage on failures
assert group_leader == Process.group_leader()
refute_received {:gen_event_EXIT, _, _}
end
test "level aware" do
assert capture_log([level: :warning], fn ->
Logger.info("here")
end) == ""
end
@tag timeout: 2000
test "capture removal on exit" do
{_pid, ref} =
spawn_monitor(fn ->
capture_log(fn ->
spawn_link(Kernel, :exit, [:shutdown])
Process.sleep(:infinity)
end)
end)
assert_receive {:DOWN, ^ref, _, _, :shutdown}
wait_capture_removal()
end
test "log tracking" do
logged =
capture_log(fn ->
Logger.info("one")
logged = capture_log(fn -> Logger.error("one") end)
send(test = self(), {:nested, logged})
Logger.warning("two")
spawn(fn ->
Logger.debug("three")
send(test, :done)
end)
receive do: (:done -> :ok)
end)
assert logged
assert logged =~ "[info] one\n"
assert logged =~ "[warning] two\n"
assert logged =~ "[debug] three\n"
assert logged =~ "[error] one\n"
receive do
{:nested, logged} ->
assert logged =~ "[error] one\n"
refute logged =~ "[warning] two\n"
end
end
describe "with_log/2" do
test "returns the result and the log" do
{result, log} =
with_log(fn ->
Logger.error("calculating...")
2 + 2
end)
assert result == 4
assert log =~ "calculating..."
end
test "respects the :format, :metadata, and :colors options" do
options = [format: "$metadata| $message", metadata: [:id], colors: [enabled: false]]
assert {4, log} =
with_log(options, fn ->
Logger.info("hello", id: 123)
2 + 2
end)
assert log == "id=123 | hello"
end
end
defp wait_capture_removal() do
if ExUnit.CaptureServer in Enum.map(:logger.get_handler_config(), & &1.id) do
Process.sleep(20)
wait_capture_removal()
else
:ok
end
end
end
|