Skip to content

Commit 470dae6

Browse files
committed
feat(test): shutdown_client!/1 and shutdown_server!/1
1 parent 90ee4c2 commit 470dae6

2 files changed

Lines changed: 75 additions & 33 deletions

File tree

lib/gen_lsp/test.ex

Lines changed: 66 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@ defmodule GenLSP.Test do
1010
@typedoc """
1111
The test server data structure.
1212
"""
13-
@opaque server :: %{lsp: pid(), buffer: pid(), port: integer()}
13+
@opaque server :: %{
14+
lsp: pid(),
15+
lsp_id: atom(),
16+
buffer: pid(),
17+
buffer_id: atom(),
18+
port: integer()
19+
}
1420

1521
@typedoc """
1622
The test client data structure.
1723
"""
18-
@opaque client :: %{socket: :gen_tcp.socket()}
24+
@opaque client :: %{socket: :gen_tcp.socket(), listener: pid()}
1925

2026
@doc """
2127
Starts a new server.
@@ -30,14 +36,19 @@ defmodule GenLSP.Test do
3036
"""
3137
@spec server(mod :: atom()) :: server()
3238
def server(mod, opts \\ []) do
39+
buffer_id = Keyword.get(opts, :buffer_id, :buffer)
40+
lsp_id = Keyword.get(opts, :lsp_id, :lsp)
41+
3342
buffer =
34-
start_supervised!({GenLSP.Buffer, communication: {GenLSP.Communication.TCP, [port: 0]}})
43+
start_supervised!({GenLSP.Buffer, communication: {GenLSP.Communication.TCP, [port: 0]}},
44+
id: buffer_id
45+
)
3546

3647
{:ok, port} = :inet.port(GenLSP.Buffer.comm_state(buffer).lsocket)
3748

38-
lsp = start_supervised!({mod, Keyword.merge([buffer: buffer], opts)})
49+
lsp = start_supervised!({mod, Keyword.merge([buffer: buffer], opts)}, id: lsp_id)
3950

40-
%{lsp: lsp, buffer: buffer, port: port}
51+
%{lsp: lsp, buffer: buffer, port: port, buffer_id: buffer_id, lsp_id: lsp_id}
4152
end
4253

4354
@doc """
@@ -62,37 +73,59 @@ defmodule GenLSP.Test do
6273

6374
me = self()
6475

65-
Task.start_link(fn ->
66-
Stream.resource(
67-
fn -> "" end,
68-
fn buffer ->
69-
case GenLSP.Communication.TCP.read(%{socket: socket}, buffer) do
70-
:eof ->
71-
{:halt, :ok}
76+
{:ok, listener} =
77+
Task.start_link(fn ->
78+
Stream.resource(
79+
fn -> "" end,
80+
fn buffer ->
81+
case GenLSP.Communication.TCP.read(%{socket: socket}, buffer) do
82+
:eof ->
83+
{:halt, :ok}
84+
85+
{:ok, body, buffer} ->
86+
send(me, Jason.decode!(body))
87+
88+
{[body], buffer}
89+
end
90+
end,
91+
fn
92+
:ok ->
93+
:ok
94+
95+
{:error, reason} ->
96+
IO.warn("Unable to read from device: #{inspect(reason)}")
97+
98+
other ->
99+
IO.warn(
100+
"Ended stream with value: #{inspect(other)}. This was probably due to something going wrong."
101+
)
102+
end
103+
)
104+
|> Enum.to_list()
105+
end)
72106

73-
{:ok, body, buffer} ->
74-
send(me, Jason.decode!(body))
107+
%{socket: socket, listener: listener}
108+
end
75109

76-
{[body], buffer}
77-
end
78-
end,
79-
fn
80-
:ok ->
81-
:ok
82-
83-
{:error, reason} ->
84-
IO.warn("Unable to read from device: #{inspect(reason)}")
85-
86-
other ->
87-
IO.warn(
88-
"Ended stream with value: #{inspect(other)}. This was probably due to something going wrong."
89-
)
90-
end
91-
)
92-
|> Enum.to_list()
93-
end)
110+
@doc """
111+
Shuts down an LSP server.
112+
"""
113+
@spec shutdown_server!(server :: server()) :: :ok
114+
def shutdown_server!(server) do
115+
stop_supervised!(server.buffer_id)
116+
stop_supervised!(server.lsp_id)
117+
118+
:ok
119+
end
120+
121+
@doc """
122+
Shuts down an LSP client.
123+
"""
124+
@spec shutdown_client!(client :: client()) :: :ok
125+
def shutdown_client!(client) do
126+
Process.exit(client.listener, :normal)
94127

95-
%{socket: socket}
128+
:ok
96129
end
97130

98131
@doc ~S"""

test/gen_lsp_test.exs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,4 +189,13 @@ defmodule GenLSPTest do
189189
"message" => "Method Not Found"
190190
})
191191
end
192+
193+
test "can shutdown a client and server", %{client: client, server: server} do
194+
assert alive?(server)
195+
196+
shutdown_client!(client)
197+
shutdown_server!(server)
198+
199+
refute alive?(server)
200+
end
192201
end

0 commit comments

Comments
 (0)