1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 2018. All Rights Reserved.
5%%
6%% Licensed under the Apache License, Version 2.0 (the "License");
7%% you may not use this file except in compliance with the License.
8%% You may obtain a copy of the License at
9%%
10%%     http://www.apache.org/licenses/LICENSE-2.0
11%%
12%% Unless required by applicable law or agreed to in writing, software
13%% distributed under the License is distributed on an "AS IS" BASIS,
14%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15%% See the License for the specific language governing permissions and
16%% limitations under the License.
17%%
18%% %CopyrightEnd%
19%%
20-module(logger_filters_SUITE).
21
22-compile(export_all).
23
24-include_lib("common_test/include/ct.hrl").
25-include_lib("kernel/include/logger.hrl").
26
27-define(ndlog,
28        #{level=>info,msg=>{"Line: ~p",[?LINE]},meta=>#{}}).
29-define(dlog(Domain),
30        #{level=>info,msg=>{"Line: ~p",[?LINE]},meta=>#{domain=>Domain}}).
31-define(llog(Level),
32        #{level=>Level,msg=>{"Line: ~p",[?LINE]},meta=>#{}}).
33-define(plog,
34        #{level=>info,
35          msg=>{report,#{label=>{?MODULE,progress}}},
36          meta=>#{line=>?LINE}}).
37-define(rlog(Node),
38        #{level=>info,
39          msg=>{"Line: ~p",[?LINE]},
40          meta=>#{gl=>rpc:call(Node,erlang,whereis,[user])}}).
41
42-define(TRY(X), my_try(fun() -> X end)).
43
44suite() ->
45    [{timetrap,{seconds,30}}].
46
47init_per_suite(Config) ->
48    Config.
49
50end_per_suite(_Config) ->
51    ok.
52
53init_per_group(_Group, Config) ->
54    Config.
55
56end_per_group(_Group, _Config) ->
57    ok.
58
59init_per_testcase(_TestCase, Config) ->
60    Config.
61
62end_per_testcase(Case, Config) ->
63    try apply(?MODULE,Case,[cleanup,Config])
64    catch error:undef -> ok
65    end,
66    ok.
67
68groups() ->
69    [].
70
71all() ->
72    [domain,
73     level,
74     progress,
75     remote_gl].
76
77domain(_Config) ->
78    L1 = logger_filters:domain(L1=?dlog([]),{log,super,[]}),
79    stop = logger_filters:domain(?dlog([]),{stop,super,[]}),
80    L2 = logger_filters:domain(L2=?dlog([]),{log,sub,[]}),
81    stop = logger_filters:domain(?dlog([]),{stop,sub,[]}),
82    L3 = logger_filters:domain(L3=?dlog([]),{log,equal,[]}),
83    stop = logger_filters:domain(?dlog([]),{stop,equal,[]}),
84    ignore = logger_filters:domain(?dlog([]),{log,not_equal,[]}),
85    ignore = logger_filters:domain(?dlog([]),{stop,not_equal,[]}),
86    ignore = logger_filters:domain(?dlog([]),{log,undefined,[]}),
87    ignore = logger_filters:domain(?dlog([]),{stop,undefined,[]}),
88
89    L4 = logger_filters:domain(L4=?dlog([a]),{log,super,[a,b]}),
90    stop = logger_filters:domain(?dlog([a]),{stop,super,[a,b]}),
91    ignore = logger_filters:domain(?dlog([a]),{log,sub,[a,b]}),
92    ignore = logger_filters:domain(?dlog([a]),{stop,sub,[a,b]}),
93    ignore = logger_filters:domain(?dlog([a]),{log,equal,[a,b]}),
94    ignore = logger_filters:domain(?dlog([a]),{stop,equal,[a,b]}),
95    L5 = logger_filters:domain(L5=?dlog([a]),{log,not_equal,[a,b]}),
96    stop = logger_filters:domain(?dlog([a]),{stop,not_equal,[a,b]}),
97    ignore = logger_filters:domain(?dlog([a]),{log,undefined,[a,b]}),
98    ignore = logger_filters:domain(?dlog([a]),{stop,undefined,[a,b]}),
99
100    ignore = logger_filters:domain(?dlog([a,b]),{log,super,[a]}),
101    ignore = logger_filters:domain(?dlog([a,b]),{stop,super,[a]}),
102    L6 = logger_filters:domain(L6=?dlog([a,b]),{log,sub,[a]}),
103    stop = logger_filters:domain(?dlog([a,b]),{stop,sub,[a]}),
104    ignore = logger_filters:domain(?dlog([a,b]),{log,equal,[a]}),
105    ignore = logger_filters:domain(?dlog([a,b]),{stop,equal,[a]}),
106    L7 = logger_filters:domain(L7=?dlog([a,b]),{log,not_equal,[a]}),
107    stop = logger_filters:domain(?dlog([a,b]),{stop,not_equal,[a]}),
108    ignore = logger_filters:domain(?dlog([a,b]),{log,undefined,[a]}),
109    ignore = logger_filters:domain(?dlog([a,b]),{stop,undefined,[a]}),
110
111    ignore = logger_filters:domain(?ndlog,{log,super,[a]}),
112    ignore = logger_filters:domain(?ndlog,{stop,super,[a]}),
113    ignore = logger_filters:domain(?ndlog,{log,sub,[a]}),
114    ignore = logger_filters:domain(?ndlog,{stop,sub,[a]}),
115    ignore = logger_filters:domain(?ndlog,{log,equal,[a]}),
116    ignore = logger_filters:domain(?ndlog,{stop,equal,[a]}),
117    L8 = logger_filters:domain(L8=?ndlog,{log,not_equal,[a]}),
118    stop = logger_filters:domain(?ndlog,{stop,not_equal,[a]}),
119    L9 = logger_filters:domain(L9=?ndlog,{log,undefined,[a]}),
120    stop = logger_filters:domain(?ndlog,{stop,undefined,[a]}),
121
122    L10 = logger_filters:domain(L10=?dlog([a,b,c,d]),{log,super,[a,b,c,d]}),
123    stop = logger_filters:domain(?dlog([a,b,c,d]),{stop,super,[a,b,c,d]}),
124    L11 = logger_filters:domain(L11=?dlog([a,b,c,d]),{log,sub,[a,b,c,d]}),
125    stop = logger_filters:domain(?dlog([a,b,c,d]),{stop,sub,[a,b,c,d]}),
126    L12 = logger_filters:domain(L12=?dlog([a,b,c,d]),{log,equal,[a,b,c,d]}),
127    stop = logger_filters:domain(?dlog([a,b,c,d]),{stop,equal,[a,b,c,d]}),
128    ignore = logger_filters:domain(?dlog([a,b,c,d]),{log,not_equal,[a,b,c,d]}),
129    ignore = logger_filters:domain(?dlog([a,b,c,d]),{stop,not_equal,[a,b,c,d]}),
130    ignore = logger_filters:domain(?dlog([a,b,c,d]),{log,undefined,[a,b,c,d]}),
131    ignore = logger_filters:domain(?dlog([a,b,c,d]),{stop,undefined,[a,b,c,d]}),
132
133    %% A domain field in meta which is not a list is allowed by the
134    %% filter, but since MatchDomain is always a list of atoms, only
135    %% Action=not_equal can ever match.
136    ignore = logger_filters:domain(?dlog(dummy),{log,super,[a,b,c,d]}),
137    ignore = logger_filters:domain(?dlog(dummy),{stop,super,[a,b,c,d]}),
138    ignore = logger_filters:domain(?dlog(dummy),{log,sub,[a,b,c,d]}),
139    ignore = logger_filters:domain(?dlog(dummy),{stop,sub,[a,b,c,d]}),
140    ignore = logger_filters:domain(?dlog(dummy),{log,equal,[a,b,c,d]}),
141    ignore = logger_filters:domain(?dlog(dummy),{stop,equal,[a,b,c,d]}),
142    L13 = logger_filters:domain(L13=?dlog(dummy),{log,not_equal,[a,b,c,d]}),
143    stop = logger_filters:domain(?dlog(dummy),{stop,not_equal,[a,b,c,d]}),
144    ignore = logger_filters:domain(?dlog(dummy),{log,undefined,[a,b,c,d]}),
145    ignore = logger_filters:domain(?dlog(dummy),{stop,undefined,[a,b,c,d]}),
146
147    {error,badarg} = ?TRY(logger_filters:domain(?ndlog,bad)),
148    {error,badarg} = ?TRY(logger_filters:domain(?ndlog,{bad,super,[]})),
149    {error,badarg} = ?TRY(logger_filters:domain(?ndlog,{log,bad,[]})),
150    {error,badarg} = ?TRY(logger_filters:domain(?ndlog,{log,super,bad})),
151
152    ok.
153
154level(_Config) ->
155    ignore = logger_filters:level(?llog(info),{log,lt,info}),
156    ignore = logger_filters:level(?llog(info),{stop,lt,info}),
157    ignore = logger_filters:level(?llog(info),{log,gt,info}),
158    ignore = logger_filters:level(?llog(info),{stop,gt,info}),
159    L1 = logger_filters:level(L1=?llog(info),{log,lteq,info}),
160    stop = logger_filters:level(?llog(info),{stop,lteq,info}),
161    L2 = logger_filters:level(L2=?llog(info),{log,gteq,info}),
162    stop = logger_filters:level(?llog(info),{stop,gteq,info}),
163    L3 = logger_filters:level(L3=?llog(info),{log,eq,info}),
164    stop = logger_filters:level(?llog(info),{stop,eq,info}),
165    ignore = logger_filters:level(?llog(info),{log,neq,info}),
166    ignore = logger_filters:level(?llog(info),{stop,neq,info}),
167
168    ignore = logger_filters:level(?llog(error),{log,lt,info}),
169    ignore = logger_filters:level(?llog(error),{stop,lt,info}),
170    L4 = logger_filters:level(L4=?llog(error),{log,gt,info}),
171    stop = logger_filters:level(?llog(error),{stop,gt,info}),
172    ignore = logger_filters:level(?llog(error),{log,lteq,info}),
173    ignore = logger_filters:level(?llog(error),{stop,lteq,info}),
174    L5 = logger_filters:level(L5=?llog(error),{log,gteq,info}),
175    stop = logger_filters:level(?llog(error),{stop,gteq,info}),
176    ignore = logger_filters:level(?llog(error),{log,eq,info}),
177    ignore = logger_filters:level(?llog(error),{stop,eq,info}),
178    L6 = logger_filters:level(L6=?llog(error),{log,neq,info}),
179    stop = logger_filters:level(?llog(error),{stop,neq,info}),
180
181    L7 = logger_filters:level(L7=?llog(info),{log,lt,error}),
182    stop = logger_filters:level(?llog(info),{stop,lt,error}),
183    ignore = logger_filters:level(?llog(info),{log,gt,error}),
184    ignore = logger_filters:level(?llog(info),{stop,gt,error}),
185    L8 = logger_filters:level(L8=?llog(info),{log,lteq,error}),
186    stop = logger_filters:level(?llog(info),{stop,lteq,error}),
187    ignore = logger_filters:level(?llog(info),{log,gteq,error}),
188    ignore = logger_filters:level(?llog(info),{stop,gteq,error}),
189    ignore = logger_filters:level(?llog(info),{log,eq,error}),
190    ignore = logger_filters:level(?llog(info),{stop,eq,error}),
191    L9 = logger_filters:level(L9=?llog(info),{log,neq,error}),
192    stop = logger_filters:level(?llog(info),{stop,neq,error}),
193
194    {error,badarg} = ?TRY(logger_filters:level(?llog(info),bad)),
195    {error,badarg} = ?TRY(logger_filters:level(?llog(info),{bad,eq,info})),
196    {error,badarg} = ?TRY(logger_filters:level(?llog(info),{log,bad,info})),
197    {error,badarg} = ?TRY(logger_filters:level(?llog(info),{log,eq,bad})),
198
199    ok.
200
201progress(_Config) ->
202    L1 = logger_filters:progress(L1=?plog,log),
203    stop = logger_filters:progress(?plog,stop),
204    ignore = logger_filters:progress(?ndlog,log),
205    ignore = logger_filters:progress(?ndlog,stop),
206
207    {error,badarg} = ?TRY(logger_filters:progress(?plog,bad)),
208
209    ok.
210
211remote_gl(_Config) ->
212    {ok,Node} = test_server:start_node(?FUNCTION_NAME,slave,[]),
213    L1 = logger_filters:remote_gl(L1=?rlog(Node),log),
214    stop = logger_filters:remote_gl(?rlog(Node),stop),
215    ignore = logger_filters:remote_gl(?ndlog,log),
216    ignore = logger_filters:remote_gl(?ndlog,stop),
217
218    {error,badarg} = ?TRY(logger_filters:remote_gl(?rlog(Node),bad)),
219    ok.
220
221remote_gl(cleanup,_Config) ->
222    [test_server:stop_node(N) || N<-nodes()].
223
224%%%-----------------------------------------------------------------
225%%% Called by macro ?TRY(X)
226my_try(Fun) ->
227    try Fun() catch C:R -> {C,R} end.
228