#!/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).