Skip to content

Commit 55c24db

Browse files
authored
Further improve the tests (#290)
The previous `:elixir_ls_test_process` approach was not reliable and seemed to suffer from a race condition. Instead always manually start the server so we can be in full control of the processes. Unfortunately aliases are not well supported in umbrella projects so use `cmd mix test` as specified in: https://elixirforum.com/t/mix-task-aliases-and-umbrellas/12666
1 parent 8063574 commit 55c24db

File tree

7 files changed

+57
-35
lines changed

7 files changed

+57
-35
lines changed

apps/elixir_ls_utils/lib/wire_protocol.ex

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,8 @@ defmodule ElixirLS.Utils.WireProtocol do
1010
IO.binwrite(pid, "Content-Length: #{byte_size(body)}\r\n\r\n" <> body)
1111
end
1212

13-
case Mix.env() do
14-
:test ->
15-
defp io_dest do
16-
Process.whereis(:raw_user) || Process.whereis(:elixir_ls_test_process) ||
17-
Process.group_leader()
18-
end
19-
20-
_ ->
21-
defp io_dest do
22-
Process.whereis(:raw_user) || Process.group_leader()
23-
end
13+
defp io_dest do
14+
Process.whereis(:raw_user) || Process.group_leader()
2415
end
2516

2617
def io_intercepted? do

apps/language_server/lib/language_server/build.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ defmodule ElixirLS.LanguageServer.Build do
166166
end
167167
end
168168

169-
defp load_all_modules do
169+
def load_all_modules do
170170
apps =
171171
cond do
172172
Mix.Project.umbrella?() ->

apps/language_server/mix.exs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ defmodule ElixirLS.LanguageServer.Mixfile do
1010
config_path: "../../config/config.exs",
1111
deps_path: "../../deps",
1212
lockfile: "../../mix.lock",
13+
aliases: aliases(),
1314
elixirc_paths: elixirc_paths(Mix.env()),
1415
build_embedded: false,
1516
start_permanent: true,
@@ -33,6 +34,12 @@ defmodule ElixirLS.LanguageServer.Mixfile do
3334
]
3435
end
3536

37+
defp aliases do
38+
[
39+
test: "test --no-start"
40+
]
41+
end
42+
3643
defp elixirc_paths(:test), do: ["lib", "test/support"]
3744
defp elixirc_paths(_), do: ["lib"]
3845
end

apps/language_server/test/providers/completion_test.exs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@ defmodule ElixirLS.LanguageServer.Providers.CompletionTest do
1919
"command" => "editor.action.triggerParameterHints"
2020
}
2121

22+
setup context do
23+
ElixirLS.LanguageServer.Build.load_all_modules()
24+
25+
unless context[:skip_server] do
26+
server = ElixirLS.LanguageServer.Test.ServerTestHelpers.start_server()
27+
28+
{:ok, %{server: server}}
29+
else
30+
:ok
31+
end
32+
end
33+
2234
test "returns all Logger completions on normal require" do
2335
text = """
2436
defmodule MyModule do

apps/language_server/test/providers/workspace_symbols_test.exs

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
22
use ExUnit.Case, async: false
33
alias ElixirLS.LanguageServer.Providers.WorkspaceSymbols
44

5-
@server_name WorkspaceSymbolsTestServer
6-
75
setup do
86
alias ElixirLS.Utils.PacketCapture
97
packet_capture = start_supervised!({PacketCapture, self()})
10-
Process.register(packet_capture, :elixir_ls_test_process)
118

12-
{:ok, pid} = WorkspaceSymbols.start_link(name: @server_name)
9+
{:ok, pid} = WorkspaceSymbols.start_link(name: nil)
10+
Process.group_leader(pid, packet_capture)
1311

1412
state = :sys.get_state(pid)
1513

@@ -29,23 +27,23 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
2927
}
3028
end)
3129

32-
WorkspaceSymbols.notify_build_complete(@server_name)
30+
WorkspaceSymbols.notify_build_complete(pid)
3331

3432
wait_until_indexed(pid)
3533

36-
{:ok, %{}}
34+
{:ok, server: pid}
3735
end
3836

39-
test "empty query" do
40-
assert {:ok, []} == WorkspaceSymbols.symbols("", @server_name)
37+
test "empty query", %{server: server} do
38+
assert {:ok, []} == WorkspaceSymbols.symbols("", server)
4139

4240
assert_receive %{
4341
"method" => "window/logMessage",
4442
"params" => %{"message" => "[ElixirLS WorkspaceSymbols] Updating index..."}
4543
}
4644
end
4745

48-
test "returns modules" do
46+
test "returns modules", %{server: server} do
4947
assert {:ok,
5048
[
5149
%{
@@ -56,7 +54,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
5654
},
5755
name: "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols"
5856
}
59-
]} = WorkspaceSymbols.symbols("ElixirLS.LanguageServer.Fixtures.", @server_name)
57+
]} = WorkspaceSymbols.symbols("ElixirLS.LanguageServer.Fixtures.", server)
6058

6159
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
6260

@@ -70,12 +68,12 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
7068
},
7169
name: "ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols"
7270
}
73-
]} = WorkspaceSymbols.symbols("work", @server_name)
71+
]} = WorkspaceSymbols.symbols("work", server)
7472

7573
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
7674
end
7775

78-
test "returns functions" do
76+
test "returns functions", %{server: server} do
7977
assert {
8078
:ok,
8179
[
@@ -123,7 +121,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
123121
name: "f ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.__info__/1"
124122
}
125123
]
126-
} = WorkspaceSymbols.symbols("f ElixirLS.LanguageServer.Fixtures.", @server_name)
124+
} = WorkspaceSymbols.symbols("f ElixirLS.LanguageServer.Fixtures.", server)
127125

128126
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
129127

@@ -137,12 +135,12 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
137135
},
138136
name: "f ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_function/1"
139137
}
140-
]} = WorkspaceSymbols.symbols("f fun", @server_name)
138+
]} = WorkspaceSymbols.symbols("f fun", server)
141139

142140
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
143141
end
144142

145-
test "returns types" do
143+
test "returns types", %{server: server} do
146144
assert {
147145
:ok,
148146
[
@@ -162,7 +160,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
162160
name: "t ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_opaque_type/0"
163161
}
164162
]
165-
} = WorkspaceSymbols.symbols("t ElixirLS.LanguageServer.Fixtures.", @server_name)
163+
} = WorkspaceSymbols.symbols("t ElixirLS.LanguageServer.Fixtures.", server)
166164

167165
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
168166

@@ -178,12 +176,12 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
178176
name: "t ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_opaque_type/0"
179177
}
180178
]
181-
} = WorkspaceSymbols.symbols("t opa", @server_name)
179+
} = WorkspaceSymbols.symbols("t opa", server)
182180

183181
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
184182
end
185183

186-
test "returns callbacks" do
184+
test "returns callbacks", %{server: server} do
187185
assert {
188186
:ok,
189187
[
@@ -203,7 +201,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
203201
name: "c ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_macrocallback/1"
204202
}
205203
]
206-
} = WorkspaceSymbols.symbols("c ElixirLS.LanguageServer.Fixtures.", @server_name)
204+
} = WorkspaceSymbols.symbols("c ElixirLS.LanguageServer.Fixtures.", server)
207205

208206
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
209207

@@ -217,7 +215,7 @@ defmodule ElixirLS.LanguageServer.Providers.WorkspaceSymbolsTest do
217215
},
218216
name: "c ElixirLS.LanguageServer.Fixtures.WorkspaceSymbols.some_macrocallback/1"
219217
}
220-
]} = WorkspaceSymbols.symbols("c macr", @server_name)
218+
]} = WorkspaceSymbols.symbols("c macr", server)
221219

222220
assert uri |> String.ends_with?("test/support/fixtures/workspace_symbols.ex")
223221
end

apps/language_server/test/support/server_test_helpers.ex

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
11
defmodule ElixirLS.LanguageServer.Test.ServerTestHelpers do
22
import ExUnit.Callbacks, only: [start_supervised!: 1]
3+
34
alias ElixirLS.LanguageServer.Server
5+
alias ElixirLS.LanguageServer.JsonRpc
6+
alias ElixirLS.LanguageServer.Providers.WorkspaceSymbols
47
alias ElixirLS.Utils.PacketCapture
58

69
def start_server do
7-
server = start_supervised!({Server, nil})
810
packet_capture = start_supervised!({PacketCapture, self()})
11+
12+
server = start_supervised!({Server, nil})
913
Process.group_leader(server, packet_capture)
1014

11-
Process.whereis(ElixirLS.LanguageServer.Providers.WorkspaceSymbols)
12-
|> Process.group_leader(packet_capture)
15+
json_rpc = start_supervised!({JsonRpc, name: JsonRpc})
16+
Process.group_leader(json_rpc, packet_capture)
17+
18+
workspace_symbols = start_supervised!({WorkspaceSymbols, []})
19+
Process.group_leader(workspace_symbols, packet_capture)
1320

1421
server
1522
end

mix.exs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ defmodule ElixirLS.Mixfile do
44
def project do
55
[
66
apps_path: "apps",
7+
aliases: aliases(),
78
build_embedded: Mix.env() == :prod,
89
start_permanent: Mix.env() == :prod,
910
build_per_environment: false,
@@ -27,4 +28,10 @@ defmodule ElixirLS.Mixfile do
2728
defp deps do
2829
[]
2930
end
31+
32+
defp aliases do
33+
[
34+
test: "cmd mix test"
35+
]
36+
end
3037
end

0 commit comments

Comments
 (0)