%%%
%%% Copyright 2011, Boundary
%%%
%%% 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.
%%%


%%%-------------------------------------------------------------------
%%% File:      folsom_tests.erl
%%% @author    joe williams <j@boundary.com>
%%% @doc
%%% @end
%%%------------------------------------------------------------------

-module(folsom_tests).

-include_lib("eunit/include/eunit.hrl").

run_test_() ->
    {setup,
     fun () -> folsom:start() end,
     fun (_) -> folsom:stop() end,
     [{"creating metrics",
       fun folsom_erlang_checks:create_metrics/0},
      {"tagging metrics",
       fun folsom_erlang_checks:tag_metrics/0},
      {"populating metrics",
       {timeout, 30, fun folsom_erlang_checks:populate_metrics/0}},
      {"checking metrics",
       fun folsom_erlang_checks:check_metrics/0},
      {"checking counter metric",
       fun () ->
               folsom_erlang_checks:counter_metric(10000, testcounter)
       end},
      {"checking group metrics",
       fun folsom_erlang_checks:check_group_metrics/0},
      {"checking erlang vm metrics",
       fun folsom_erlang_checks:vm_metrics/0},
      {"deleting metrics",
       fun folsom_erlang_checks:delete_metrics/0},
      {"cpu topology test",
       fun folsom_erlang_checks:cpu_topology/0},
      {"c compiler test",
       fun folsom_erlang_checks:c_compiler_used/0},
      {"create and delete tests",
       fun folsom_erlang_checks:create_delete_metrics/0}]}.

configure_test_() ->
    {foreach, fun setup_app/0, fun cleanup_app/1,
     [{"start with configured metrics",
       fun() ->
               ?assertMatch(ok, application:start(folsom)),
               [counter, slide, <<"gauge">>, <<"uniform">>] =
                   lists:sort(folsom_metrics:get_metrics())
       end}]}.

setup_app() ->
    application:unload(folsom),
    Env = [{counter, counter},
           {gauge, <<"gauge">>},
           {histogram, [[<<"uniform">>, uniform, 5000],
                        [slide, slide_uniform, {60, 1028}]]}],
    application:load({application, folsom, [{mod, {folsom, []}}, {env, Env}]}),
    ok.

cleanup_app(ok) ->
    lists:foreach(fun folsom_metrics:delete_metric/1,
                  [counter, slide, <<"gauge">>, <<"uniform">>]),
    application:stop(folsom),
    application:unload(folsom),
    ok.

update_counter_test() ->
    Tid = ets:new(sometable, [public, set]),
    Workers = [spawn_monitor(fun() -> timer:sleep(100-N), folsom_utils:update_counter(Tid, hello, N) end) || N <- lists:seq(1, 100)],
    wait_for_results(Workers),
    ?assertEqual([{hello, 5050}], ets:lookup(Tid, hello)).

wait_for_results([]) ->
    ok;
wait_for_results(Workers) ->
    receive
        {'DOWN', _, _, Pid, Reason} ->
            case lists:keyfind(Pid, 1, Workers) of
                false ->
                    wait_for_results(Workers);
                _ ->
                    case Reason of
                        normal ->
                            wait_for_results(lists:keydelete(Pid, 1, Workers));
                        _ ->
                            erlang:error(Reason)
                    end
            end
    end.
