Skip to content

Commit

Permalink
Covering 100% of the Tracer context
Browse files Browse the repository at this point in the history
  • Loading branch information
thiagoesteves committed Dec 3, 2024
1 parent c1049e0 commit b9de9c9
Show file tree
Hide file tree
Showing 2 changed files with 106 additions and 31 deletions.
10 changes: 2 additions & 8 deletions lib/deployex/tracer/server.ex
Original file line number Diff line number Diff line change
Expand Up @@ -133,14 +133,6 @@ defmodule Deployex.Tracer.Server do
end

@impl true
def handle_info(
{:trace_session_timeout, session_id_timed_out},
%DeployexT{session_id: session_id} = state
)
when session_id != session_id_timed_out do
{:noreply, state}
end

def handle_info({:trace_session_timeout, rcv_session_id} = msg, %DeployexT{
session_id: session_id,
request_pid: request_pid
Expand All @@ -159,6 +151,7 @@ defmodule Deployex.Tracer.Server do
{:noreply, state}
end

# NOTE: Messages from handle_trace
def handle_info({:stop_tracing, rcv_session_id} = msg, %DeployexT{
session_id: session_id,
max_messages: max_messages,
Expand All @@ -182,6 +175,7 @@ defmodule Deployex.Tracer.Server do
%{request_pid: request_pid}
)
when target_pid == request_pid do
IO.puts("hi")
Logger.warning("target process was terminated")

:dbg.stop()
Expand Down
127 changes: 104 additions & 23 deletions test/deployex/tracer_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ defmodule Deployex.TracerTest do
use ExUnit.Case, async: true

import Mox
import ExUnit.CaptureLog

alias Deployex.Tracer, as: DeployexT
alias Deployex.TracerFixtures
Expand Down Expand Up @@ -54,9 +55,7 @@ defmodule Deployex.TracerTest do
assert {:error, :already_started} =
DeployexT.start_trace(functions, %{max_messages: 1})

assert :ok == DeployexT.stop_trace(session_id)

:timer.sleep(50)
terminate_tracing(session_id)
end

test "Success requesting only module" do
Expand All @@ -83,9 +82,7 @@ defmodule Deployex.TracerTest do

assert msg =~ "TracerFixtures"

assert :ok == DeployexT.stop_trace(session_id)

:timer.sleep(50)
terminate_tracing(session_id)
end

test "Success requesting module/function" do
Expand All @@ -111,9 +108,7 @@ defmodule Deployex.TracerTest do
assert msg =~ "TracerFixtures"
assert msg =~ "testing_adding_fun"

assert :ok == DeployexT.stop_trace(session_id)

:timer.sleep(50)
terminate_tracing(session_id)
end

test "Success requesting module/function with match_spec [return_trace]" do
Expand All @@ -140,9 +135,7 @@ defmodule Deployex.TracerTest do
assert msg =~ "testing_adding_fun"
assert msg =~ "453"

assert :ok == DeployexT.stop_trace(session_id)

:timer.sleep(50)
terminate_tracing(session_id)
end

test "Success requesting module/function with match_spec [caller]" do
Expand All @@ -169,9 +162,7 @@ defmodule Deployex.TracerTest do
assert msg =~ "testing_adding_fun"
assert msg =~ "caller: {Deployex.TracerTest"

assert :ok == DeployexT.stop_trace(session_id)

:timer.sleep(50)
terminate_tracing(session_id)
end

@tag :capture_log
Expand Down Expand Up @@ -201,14 +192,12 @@ defmodule Deployex.TracerTest do
assert msg =~ "testing_exception_fun"
assert msg =~ "exception_value: {:error, :badarith}"

assert :ok == DeployexT.stop_trace(session_id)

:timer.sleep(50)
terminate_tracing(session_id)
end
end

describe "stop_trace/2" do
test "Ignore stop_trace with invalid session_id" do
test "Ignore stop_trace with invalid session_id [handle_call]" do
functions = [
%{
arity: :_,
Expand All @@ -220,16 +209,108 @@ defmodule Deployex.TracerTest do
]

assert {:ok, %{session_id: session_id}} =
DeployexT.start_trace(functions, %{max_messages: 1})
DeployexT.start_trace(functions, %{max_messages: 30})

assert %DeployexT{status: :running} = DeployexT.state()

assert :ok == DeployexT.stop_trace("123456789")

assert :ok == DeployexT.stop_trace(session_id)
assert %DeployexT{status: :running} = DeployexT.state()

terminate_tracing(session_id)
end

test "Ignore stop_trace with invalid session_id [handle_info]" do
functions = [
%{
arity: :_,
function: :_,
match_spec: [],
module: TracerFixtures,
node: Node.self()
}
]

assert {:ok, %{session_id: session_id}} =
DeployexT.start_trace(functions, %{max_messages: 30})

assert %DeployexT{status: :running} = DeployexT.state()

send(Deployex.Tracer.Server, {:stop_tracing, "123456789"})

assert %DeployexT{status: :running} = DeployexT.state()

terminate_tracing(session_id)
end
end

describe "Timeouts" do
test "Session Timed out" do
functions = [
%{
arity: :_,
function: :_,
match_spec: [],
module: TracerFixtures,
node: Node.self()
}
]

assert {:ok, %{session_id: _session_id}} =
DeployexT.start_trace(functions, %{max_messages: 30, session_timeout_ms: 50})

assert_receive {:trace_session_timeout, _session_id}, 1_000
end

test "Ignore Timeout messages with invalid ID" do
functions = [
%{
arity: :_,
function: :_,
match_spec: [],
module: TracerFixtures,
node: Node.self()
}
]

assert {:ok, %{session_id: session_id}} =
DeployexT.start_trace(functions, %{max_messages: 20})

assert %DeployexT{status: :running} = DeployexT.state()

send(Deployex.Tracer.Server, {:trace_session_timeout, "invalid-session"})

assert %DeployexT{status: :running} = DeployexT.state()

assert %DeployexT{status: :idle} = DeployexT.state()
:timer.sleep(50)
terminate_tracing(session_id)
end
end

test "Request Function terminate" do
functions = [
%{
arity: :_,
function: :_,
match_spec: [],
module: TracerFixtures,
node: Node.self()
}
]

assert capture_log(fn ->
spawn(fn ->
{:ok, %{session_id: _session_id}} =
DeployexT.start_trace(functions, %{max_messages: 20})
end)

:timer.sleep(50)

assert %DeployexT{status: :idle} = DeployexT.state()
end) =~ "target process was terminated"
end

defp terminate_tracing(session_id) do
:ok = DeployexT.stop_trace(session_id)
:timer.sleep(50)
end
end

0 comments on commit b9de9c9

Please sign in to comment.