%% @copyright 2017 Takeru Ohta <phjgt308@gmail.com>
-module(passage_pd_tests).

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

%%------------------------------------------------------------------------------
%% Test Cases
%%------------------------------------------------------------------------------
passage_pd_test_() ->
    {foreach,
     fun () -> ok = application:start(passage) end,
     fun (_) -> ok = application:stop(passage) end,
     [
      {"basic test",
       fun () ->
               ok = start_test_tracer(),
               ok = passage_pd:start_span(basic_test, [{tracer, test_tracer}]),
               ok = passage_pd:finish_span(),

               [FinishedSpan] = finished_spans(),
               ?assertEqual(basic_test, passage_span:get_operation_name(FinishedSpan)),
               ?assertEqual([], passage_span:get_refs(FinishedSpan)),
               ?assertEqual([], passage_span:get_logs(FinishedSpan)),
               ?assertEqual(#{}, passage_span:get_tags(FinishedSpan)),
               ?assertEqual(#{}, passage_span:get_baggage_items(FinishedSpan))
       end},
      {"child span",
       fun () ->
               ok = start_test_tracer(),

               ok = passage_pd:start_span(root, [{tracer, test_tracer}]),
               ok = passage_pd:start_span(child),
               ok = passage_pd:finish_span(),
               ok = passage_pd:finish_span(),

               [FinishedChildSpan, FinishedRootSpan] = finished_spans(),
               ?assertEqual(child, passage_span:get_operation_name(FinishedChildSpan)),
               ?assertMatch([{child_of, _}], passage_span:get_refs(FinishedChildSpan)),
               [{child_of, ParentSpan}] = passage_span:get_refs(FinishedChildSpan),
               ?assertEqual(root, passage_span:get_operation_name(ParentSpan)),

               ?assertEqual(root, passage_span:get_operation_name(FinishedRootSpan))
       end},
      {"with span",
       fun () ->
               ok = start_test_tracer(),
               passage_pd:with_span(
                 root, [{tracer, test_tracer}],
                 fun () ->
                         passage_pd:with_span(child, fun () -> ok end)
                 end),

               [FinishedChildSpan, FinishedRootSpan] = finished_spans(),
               ?assertEqual(child, passage_span:get_operation_name(FinishedChildSpan)),
               ?assertMatch([{child_of, _}], passage_span:get_refs(FinishedChildSpan)),
               [{child_of, ParentSpan}] = passage_span:get_refs(FinishedChildSpan),
               ?assertEqual(root, passage_span:get_operation_name(ParentSpan)),

               ?assertEqual(root, passage_span:get_operation_name(FinishedRootSpan))
       end},
      {"operation name",
       fun () ->
               ok = start_test_tracer(),
               ok = passage_pd:start_span(root, [{tracer, test_tracer}]),
               ok = passage_pd:set_operation_name(foo),

               passage_pd:finish_span(),
               [FinishedSpan] = finished_spans(),
               ?assertEqual(foo, passage_span:get_operation_name(FinishedSpan))
       end},
      {"tag",
       fun () ->
               ok = start_test_tracer(),
               ok = passage_pd:start_span(
                      root, [{tracer, test_tracer}, {tags, #{foo => bar, 111 => 222}}]),
               ok = passage_pd:set_tags(#{baz => qux, 111 => 333}),

               ok = passage_pd:finish_span(),
               [FinishedSpan] = finished_spans(),
               ?assertEqual(#{foo => bar, baz => qux, 111 => 333},
                            passage_span:get_tags(FinishedSpan))
       end},
      {"baggage item",
       fun () ->
               ok = start_test_tracer(),
               ok = passage_pd:start_span(root, [{tracer, test_tracer}]),
               ok = passage_pd:set_baggage_items(#{<<"foo">> => <<"bar">>}),

               ok = passage_pd:start_span(child),
               ?assertEqual(#{<<"foo">> => <<"bar">>}, passage_pd:get_baggage_items()),

               ok = passage_pd:set_baggage_items(#{<<"baz">> => <<"qux">>}),
               ?assertEqual(#{<<"foo">> => <<"bar">>, <<"baz">> => <<"qux">>},
                            passage_pd:get_baggage_items())
       end},
      {"log",
       fun () ->
               ok = start_test_tracer(),
               ok = passage_pd:start_span(root, [{tracer, test_tracer}]),
               ok = passage_pd:log(#{hello => world}, [{time, {1, 2, 3}}]),
               ok = passage_pd:log(#{foo => bar}),

               ok = passage_pd:finish_span(),
               [FinishedSpan] = finished_spans(),
               ?assertMatch([{#{foo := bar}, {_, _, _}},
                             {#{hello := world}, {1, 2, 3}}],
                            passage_span:get_logs(FinishedSpan))
       end},
      {"error log",
       fun () ->
               ok = start_test_tracer(),
               ok = passage_pd:start_span(root, [{tracer, test_tracer}]),
               ok = passage_pd:log(#{message => "Hello World", kind => greeting}, [error]),

               ok = passage_pd:finish_span(),
               [FinishedSpan] = finished_spans(),
               ?assertMatch([{#{event := error, kind := greeting, message := "Hello World"},
                              {_, _, _}}],
                            passage_span:get_logs(FinishedSpan)),
               ?assertEqual(#{error => true},
                            passage_span:get_tags(FinishedSpan))
       end},
      {"'sampling.priority' = 0",
       fun () ->
               ok = start_test_tracer(),

               ok = passage_pd:start_span(
                      basic_test,
                      [{tracer, test_tracer}, {tags, #{'sampling.priority' => 0}}]),
               ok = passage_pd:finish_span(),
               ?assertEqual([], finished_spans())
       end},
      {"'sampling.priority' = 1",
       fun () ->
               Context = passage_span_context_null,
               Sampler = passage_sampler_null:new(),
               Reporter = passage_reporter_process:new(self(), span),
               ok = passage_tracer_registry:register(
                      test_tracer, Context, Sampler, Reporter),

               ok = passage_pd:start_span(
                      basic_test,
                      [{tracer, test_tracer},
                       {tags, #{'sampling.priority' => 1}}]),
               ok = passage_pd:finish_span(),
               ?assertMatch([_Span], finished_spans())
       end},
      {"unsampled parent",
       fun () ->
               ok = passage_pd:start_span(child),
               ok = passage_pd:set_operation_name(foo),
               ok = passage_pd:set_tags(#{111 => 222}),
               ok = passage_pd:set_baggage_items(#{<<"a">> => <<"b">>}),
               ok = passage_pd:log(#{event => debug}),

               ok = passage_pd:finish_span(),
               ?assertEqual([], finished_spans())
       end},
      {"additional references",
       fun () ->
               ok = start_test_tracer(),
               RootSpan = passage:start_span(root, [{tracer, test_tracer}]),

               ok = passage_pd:start_span(child, [{follows_from, RootSpan}]),
               ok = passage_pd:finish_span(),
               ?assertMatch([_Span], finished_spans())
       end},
      {"example module",
       fun () ->
               ok = start_test_tracer(),
               passage_pd:with_span(example, fun () -> passage_example:hello(foo) end)
       end}
      ]}.

%%------------------------------------------------------------------------------
%% Internal Functions
%%------------------------------------------------------------------------------
-spec start_test_tracer() -> ok.
start_test_tracer() ->
    Context = passage_span_context_null,
    Sampler = passage_sampler_all:new(),
    Reporter = passage_reporter_process:new(self(), span),
    ok = passage_tracer_registry:register(test_tracer, Context, Sampler, Reporter).

-spec finished_spans() -> [passage_span:span()].
finished_spans() ->
    receive
        {span, Span} -> [Span] ++ finished_spans()
    after 0 ->
            []
    end.
