# SPDX-FileCopyrightText: 2021 Rosa Richter
#
# SPDX-License-Identifier: MIT
defmodule Liberator.ResourcePerformanceTest do
use ExUnit.Case, async: true
use Plug.Test
@tag :skip
test "performance" do
defmodule PerformanceTracingResource do
use Liberator.Resource
end
conn = conn(:get, "/", "hello!") |> put_req_header("content-type", "text/plain")
conn = PerformanceTracingResource.call(conn, [])
assert conn.state == :sent
assert conn.status == 200
assert conn.resp_body == "OK"
trace = conn.private.liberator_trace
{[start], rest} = Enum.split(trace, 1)
{step_latency_results, _end_time} =
Enum.map_reduce(rest, start.timestamp, fn %{step: step_name, timestamp: start_timestamp},
previous_timestamp ->
step_duration = Timex.diff(start_timestamp, previous_timestamp, :microseconds)
{{step_name, step_duration}, start_timestamp}
end)
Enum.each(step_latency_results, fn {step_name, step_duration} ->
IO.puts("Before #{inspect(step_name)}: #{step_duration} µs")
end)
decision_traces = Enum.slice(trace, 1, Enum.count(trace) - 2)
Enum.each(decision_traces, fn %{step: step_name, duration: step_duration} ->
duration_us = System.convert_time_unit(step_duration, :native, :nanosecond)
IO.puts("Step #{inspect(step_name)}: #{duration_us} ns")
end)
end
end