Skip to content

Commit

Permalink
improve debugger test stability
Browse files Browse the repository at this point in the history
  • Loading branch information
lukaszsamson committed Oct 13, 2022
1 parent d8642c7 commit 45149aa
Showing 1 changed file with 145 additions and 113 deletions.
258 changes: 145 additions & 113 deletions apps/elixir_ls_debugger/test/debugger_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -29,64 +29,86 @@ defmodule ElixirLS.Debugger.ServerTest do

describe "initialize" do
test "succeeds", %{server: server} do
Server.receive_packet(server, initialize_req(1, %{"clientID" => "some_id"}))
assert_receive(response(_, 1, "initialize", %{"supportsConfigurationDoneRequest" => true}))
assert :sys.get_state(server).client_info == %{"clientID" => "some_id"}
in_fixture(__DIR__, "mix_project", fn ->
Server.receive_packet(server, initialize_req(1, %{"clientID" => "some_id"}))

assert_receive(
response(_, 1, "initialize", %{"supportsConfigurationDoneRequest" => true})
)

assert :sys.get_state(server).client_info == %{"clientID" => "some_id"}
end)
end

test "fails when already initialized", %{server: server} do
Server.receive_packet(server, initialize_req(1, %{"clientID" => "some_id"}))
assert_receive(response(_, 1, "initialize", %{"supportsConfigurationDoneRequest" => true}))
Server.receive_packet(server, initialize_req(2, %{"clientID" => "some_id"}))
in_fixture(__DIR__, "mix_project", fn ->
Server.receive_packet(server, initialize_req(1, %{"clientID" => "some_id"}))

assert_receive(
error_response(
_,
2,
"initialize",
"invalidRequest",
"Debugger request {command} was not expected",
%{"command" => "initialize"}
assert_receive(
response(_, 1, "initialize", %{"supportsConfigurationDoneRequest" => true})
)
)

Server.receive_packet(server, initialize_req(2, %{"clientID" => "some_id"}))

assert_receive(
error_response(
_,
2,
"initialize",
"invalidRequest",
"Debugger request {command} was not expected",
%{"command" => "initialize"}
)
)
end)
end

test "rejects requests when not initialized", %{server: server} do
Server.receive_packet(
server,
set_breakpoints_req(1, %{"path" => "lib/mix_project.ex"}, [%{"line" => 3}])
)
in_fixture(__DIR__, "mix_project", fn ->
Server.receive_packet(
server,
set_breakpoints_req(1, %{"path" => "lib/mix_project.ex"}, [%{"line" => 3}])
)

assert_receive(
error_response(
_,
1,
"setBreakpoints",
"invalidRequest",
"Debugger request {command} was not expected",
%{"command" => "setBreakpoints"}
assert_receive(
error_response(
_,
1,
"setBreakpoints",
"invalidRequest",
"Debugger request {command} was not expected",
%{"command" => "setBreakpoints"}
)
)
)
end)
end
end

describe "disconnect" do
test "succeeds when not initialized", %{server: server} do
Process.flag(:trap_exit, true)
Server.receive_packet(server, request(1, "disconnect"))
assert_receive(response(_, 1, "disconnect", %{}))
assert_receive({:EXIT, ^server, {:exit_code, 0}})
Process.flag(:trap_exit, false)
in_fixture(__DIR__, "mix_project", fn ->
Process.flag(:trap_exit, true)
Server.receive_packet(server, request(1, "disconnect"))
assert_receive(response(_, 1, "disconnect", %{}))
assert_receive({:EXIT, ^server, {:exit_code, 0}})
Process.flag(:trap_exit, false)
end)
end

test "succeeds when initialized", %{server: server} do
Process.flag(:trap_exit, true)
Server.receive_packet(server, initialize_req(1, %{"clientID" => "some_id"}))
assert_receive(response(_, 1, "initialize", %{"supportsConfigurationDoneRequest" => true}))
Server.receive_packet(server, request(2, "disconnect"))
assert_receive(response(_, 2, "disconnect", %{}))
assert_receive({:EXIT, ^server, {:exit_code, 0}})
Process.flag(:trap_exit, false)
in_fixture(__DIR__, "mix_project", fn ->
Process.flag(:trap_exit, true)
Server.receive_packet(server, initialize_req(1, %{"clientID" => "some_id"}))

assert_receive(
response(_, 1, "initialize", %{"supportsConfigurationDoneRequest" => true})
)

Server.receive_packet(server, request(2, "disconnect"))
assert_receive(response(_, 2, "disconnect", %{}))
assert_receive({:EXIT, ^server, {:exit_code, 0}})
Process.flag(:trap_exit, false)
end)
end
end

Expand Down Expand Up @@ -1459,119 +1481,129 @@ defmodule ElixirLS.Debugger.ServerTest do
end

test "Evaluate expression with OK result", %{server: server} do
Server.receive_packet(server, initialize_req(1, %{}))
assert_receive(response(_, 1, "initialize", _))
in_fixture(__DIR__, "mix_project", fn ->
Server.receive_packet(server, initialize_req(1, %{}))
assert_receive(response(_, 1, "initialize", _))

Server.receive_packet(
server,
gen_watch_expression_packet("1 + 2 + 3 + 4")
)
Server.receive_packet(
server,
gen_watch_expression_packet("1 + 2 + 3 + 4")
)

assert_receive(%{"body" => %{"result" => "10"}}, 1000)
assert_receive(%{"body" => %{"result" => "10"}}, 1000)

assert Process.alive?(server)
assert Process.alive?(server)
end)
end

@tag :capture_log
test "Evaluate expression with ERROR result", %{server: server} do
Server.receive_packet(server, initialize_req(1, %{}))
assert_receive(response(_, 1, "initialize", _))
in_fixture(__DIR__, "mix_project", fn ->
Server.receive_packet(server, initialize_req(1, %{}))
assert_receive(response(_, 1, "initialize", _))

Server.receive_packet(
server,
gen_watch_expression_packet("1 = 2")
)
Server.receive_packet(
server,
gen_watch_expression_packet("1 = 2")
)

assert_receive(%{"body" => %{"result" => result}}, 1000)
assert_receive(%{"body" => %{"result" => result}}, 1000)

assert result =~ ~r/badmatch/
assert result =~ ~r/badmatch/

assert Process.alive?(server)
assert Process.alive?(server)
end)
end

test "Evaluate expression with attempt to exit debugger process", %{server: server} do
Server.receive_packet(server, initialize_req(1, %{}))
assert_receive(response(_, 1, "initialize", _))
in_fixture(__DIR__, "mix_project", fn ->
Server.receive_packet(server, initialize_req(1, %{}))
assert_receive(response(_, 1, "initialize", _))

Server.receive_packet(
server,
gen_watch_expression_packet("Process.exit(self(), :normal)")
)
Server.receive_packet(
server,
gen_watch_expression_packet("Process.exit(self(), :normal)")
)

assert_receive(%{"body" => %{"result" => result}}, 1000)
assert_receive(%{"body" => %{"result" => result}}, 1000)

assert result =~ ~r/:exit/
assert result =~ ~r/:exit/

assert Process.alive?(server)
assert Process.alive?(server)
end)
end

test "Evaluate expression with attempt to throw debugger process", %{server: server} do
Server.receive_packet(server, initialize_req(1, %{}))
assert_receive(response(_, 1, "initialize", _))
in_fixture(__DIR__, "mix_project", fn ->
Server.receive_packet(server, initialize_req(1, %{}))
assert_receive(response(_, 1, "initialize", _))

Server.receive_packet(
server,
gen_watch_expression_packet("throw(:goodmorning_bug)")
)
Server.receive_packet(
server,
gen_watch_expression_packet("throw(:goodmorning_bug)")
)

assert_receive(%{"body" => %{"result" => result}}, 1000)
assert_receive(%{"body" => %{"result" => result}}, 1000)

assert result =~ ~r/:goodmorning_bug/
assert result =~ ~r/:goodmorning_bug/

assert Process.alive?(server)
assert Process.alive?(server)
end)
end

test "Evaluate expression which has long execution", %{server: server} do
Server.receive_packet(server, initialize_req(1, %{}))
assert_receive(response(_, 1, "initialize", _))
in_fixture(__DIR__, "mix_project", fn ->
Server.receive_packet(server, initialize_req(1, %{}))
assert_receive(response(_, 1, "initialize", _))

Server.receive_packet(
server,
launch_req(2, %{
"request" => "launch",
"type" => "mix_task",
"task" => "test",
"projectDir" => File.cwd!(),
"debugExpressionTimeoutMs" => 500
})
)
Server.receive_packet(
server,
launch_req(2, %{
"request" => "launch",
"type" => "mix_task",
"task" => "test",
"projectDir" => File.cwd!(),
"debugExpressionTimeoutMs" => 500
})
)

assert_receive(response(_, 2, "launch", %{}), 5000)
assert_receive(response(_, 2, "launch", %{}), 5000)

Server.receive_packet(
server,
gen_watch_expression_packet(":timer.sleep(10_000)")
)
Server.receive_packet(
server,
gen_watch_expression_packet(":timer.sleep(10_000)")
)

assert_receive(%{"body" => %{"result" => result}}, 1100)
assert_receive(%{"body" => %{"result" => result}}, 1100)

assert result =~ ~r/:elixir_ls_expression_timeout/
assert result =~ ~r/:elixir_ls_expression_timeout/

assert Process.alive?(server)
assert Process.alive?(server)
end)
end
end

test "Completions", %{server: server} do
Server.receive_packet(server, initialize_req(1, %{}))
assert_receive(response(_, 1, "initialize", _))

Server.receive_packet(
server,
%{
"arguments" => %{
"text" => "DateTi",
"column" => 7
},
"command" => "completions",
"seq" => 1,
"type" => "request"
}
)
in_fixture(__DIR__, "mix_project", fn ->
Server.receive_packet(server, initialize_req(1, %{}))
assert_receive(response(_, 1, "initialize", _))

assert_receive(%{"body" => %{"targets" => _targets}}, 10000)
Server.receive_packet(
server,
%{
"arguments" => %{
"text" => "DateTi",
"column" => 7
},
"command" => "completions",
"seq" => 1,
"type" => "request"
}
)

assert Process.alive?(server)
assert_receive(%{"body" => %{"targets" => _targets}}, 10000)

# assert [%{}]
assert Process.alive?(server)
end)
end
end

0 comments on commit 45149aa

Please sign in to comment.