blob: dee88765ce03053cc0e874c43157d16e5de3a872 [file] [log] [blame]
#!/usr/bin/env escript
%% -*- erlang -*-
% 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.
main(_) ->
test_util:init_code_path(),
etap:plan(11),
case (catch test()) of
ok ->
etap:end_tests();
Other ->
etap:diag(io_lib:format("Test died abnormally: ~p", [Other])),
etap:bail()
end,
ok.
test() ->
couch_stats_collector:start(),
ok = test_counters(),
ok = test_abs_values(),
ok = test_proc_counting(),
ok = test_all(),
ok.
test_counters() ->
AddCount = fun() -> couch_stats_collector:increment(foo) end,
RemCount = fun() -> couch_stats_collector:decrement(foo) end,
repeat(AddCount, 100),
repeat(RemCount, 25),
repeat(AddCount, 10),
repeat(RemCount, 5),
etap:is(
couch_stats_collector:get(foo),
80,
"Incrememnt tracks correctly."
),
repeat(RemCount, 80),
etap:is(
couch_stats_collector:get(foo),
0,
"Decremented to zaro."
),
ok.
test_abs_values() ->
lists:map(fun(Val) ->
couch_stats_collector:record(bar, Val)
end, lists:seq(1, 15)),
etap:is(
couch_stats_collector:get(bar),
lists:seq(1, 15),
"Absolute values are recorded correctly."
),
couch_stats_collector:clear(bar),
etap:is(
couch_stats_collector:get(bar),
nil,
"Absolute values are cleared correctly."
),
ok.
test_proc_counting() ->
Self = self(),
OnePid = spawn(fun() ->
couch_stats_collector:track_process_count(hoopla),
Self ! reporting,
receive sepuku -> ok end
end),
R1 = erlang:monitor(process, OnePid),
receive reporting -> ok end,
etap:is(
couch_stats_collector:get(hoopla),
1,
"track_process_count incrememnts the counter."
),
TwicePid = spawn(fun() ->
couch_stats_collector:track_process_count(hoopla),
couch_stats_collector:track_process_count(hoopla),
Self ! reporting,
receive sepuku -> ok end
end),
R2 = erlang:monitor(process, TwicePid),
receive reporting -> ok end,
etap:is(
couch_stats_collector:get(hoopla),
3,
"track_process_count allows more than one incrememnt per Pid"
),
OnePid ! sepuku,
receive {'DOWN', R1, _, _, _} -> ok end,
timer:sleep(250),
etap:is(
couch_stats_collector:get(hoopla),
2,
"Process count is decremented when process exits."
),
TwicePid ! sepuku,
receive {'DOWN', R2, _, _, _} -> ok end,
timer:sleep(250),
etap:is(
couch_stats_collector:get(hoopla),
0,
"Process count is decremented for each call to track_process_count."
),
ok.
test_all() ->
couch_stats_collector:record(bar, 0.0),
couch_stats_collector:record(bar, 1.0),
etap:is(
couch_stats_collector:all(),
[{foo, 0}, {hoopla, 0}, {bar, [1.0, 0.0]}],
"all/0 returns all counters and absolute values."
),
etap:is(
couch_stats_collector:all(incremental),
[{foo, 0}, {hoopla, 0}],
"all/1 returns only the specified type."
),
couch_stats_collector:record(zing, 90),
etap:is(
couch_stats_collector:all(absolute),
[{zing, [90]}, {bar, [1.0, 0.0]}],
"all/1 returns only the specified type."
),
ok.
repeat(_, 0) ->
ok;
repeat(Fun, Count) ->
Fun(),
repeat(Fun, Count-1).