Skip to content

Commit 0dfd42b

Browse files
authored
Make tests less flaky (#792)
* monitor group leader in logger backend * format * warn on app unload * raise on unload * add some logs * add apps to allowed list * add one more app * add wait * avoid restoring wrong mix deps cache * format * cleanup * disable windows tests due to erlef/setup-beam#167
1 parent 25dc8f0 commit 0dfd42b

File tree

5 files changed

+97
-50
lines changed

5 files changed

+97
-50
lines changed

.github/workflows/ci.yml

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -49,48 +49,50 @@ jobs:
4949
mix deps.get --only test
5050
- run: mix test
5151

52-
mix_test_windows:
53-
name: mix test windows (Elixir ${{matrix.elixir}} | Erlang/OTP ${{matrix.otp}})
54-
runs-on: windows-2019
55-
strategy:
56-
fail-fast: false
57-
matrix:
58-
include:
59-
- elixir: 1.12.x
60-
otp: 22.x
61-
- elixir: 1.12.x
62-
otp: 23.x
63-
- elixir: 1.13.x
64-
otp: 22.x
65-
- elixir: 1.13.x
66-
otp: 23.x
67-
- elixir: 1.13.x
68-
otp: 24.x
69-
- elixir: 1.13.x
70-
otp: 25.x
71-
- elixir: 1.14.x
72-
otp: 23.x
73-
- elixir: 1.14.x
74-
otp: 24.x
75-
- elixir: 1.14.x
76-
otp: 25.x
77-
env:
78-
MIX_ENV: test
79-
steps:
80-
- name: Set git to use original line ending
81-
run: |
82-
git config --global core.autocrlf false
83-
- uses: actions/checkout@v3
84-
- uses: erlef/setup-beam@v1
85-
with:
86-
otp-version: ${{matrix.otp}}
87-
elixir-version: ${{matrix.elixir}}
88-
- name: Install Dependencies
89-
run: |
90-
mix local.hex --force
91-
mix local.rebar --force
92-
mix deps.get --only test
93-
- run: mix test
52+
# TODO reenable when https://github.com/erlef/setup-beam/issues/167 is fixed
53+
# currently windows builds are failing with 403s on setup_beam action
54+
# mix_test_windows:
55+
# name: mix test windows (Elixir ${{matrix.elixir}} | Erlang/OTP ${{matrix.otp}})
56+
# runs-on: windows-2019
57+
# strategy:
58+
# fail-fast: false
59+
# matrix:
60+
# include:
61+
# - elixir: 1.12.x
62+
# otp: 22.x
63+
# - elixir: 1.12.x
64+
# otp: 23.x
65+
# - elixir: 1.13.x
66+
# otp: 22.x
67+
# - elixir: 1.13.x
68+
# otp: 23.x
69+
# - elixir: 1.13.x
70+
# otp: 24.x
71+
# - elixir: 1.13.x
72+
# otp: 25.x
73+
# - elixir: 1.14.x
74+
# otp: 23.x
75+
# - elixir: 1.14.x
76+
# otp: 24.x
77+
# - elixir: 1.14.x
78+
# otp: 25.x
79+
# env:
80+
# MIX_ENV: test
81+
# steps:
82+
# - name: Set git to use original line ending
83+
# run: |
84+
# git config --global core.autocrlf false
85+
# - uses: actions/checkout@v3
86+
# - uses: erlef/setup-beam@v1
87+
# with:
88+
# otp-version: ${{matrix.otp}}
89+
# elixir-version: ${{matrix.elixir}}
90+
# - name: Install Dependencies
91+
# run: |
92+
# mix local.hex --force
93+
# mix local.rebar --force
94+
# mix deps.get --only test
95+
# - run: mix test
9496

9597
static_analysis:
9698
name: static analysis (Elixir ${{matrix.elixir}} | Erlang/OTP ${{matrix.otp}})

apps/elixir_ls_utils/test/support/mix_test.case.ex

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,24 @@ defmodule ElixirLS.Utils.MixTest.Case do
1010
end
1111

1212
@apps Enum.map(Application.loaded_applications(), &elem(&1, 0))
13-
@allowed_apps ~w(docsh xmerl syntax_tools edoc elixir_sense elixir_ls_debugger elixir_ls_utils language_server stream_data)a
13+
@allowed_apps ~w(
14+
iex
15+
elixir_sense
16+
elixir_ls_debugger
17+
elixir_ls_utils
18+
language_server
19+
stream_data
20+
statistex
21+
patch
22+
deep_merge
23+
erlex
24+
benchee
25+
path_glob_vendored
26+
dialyzer
27+
dialyxir_vendored
28+
erl2ex
29+
jason_vendored
30+
)a
1431

1532
setup do
1633
on_exit(fn ->

apps/language_server/lib/language_server/build.ex

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,21 @@ defmodule ElixirLS.LanguageServer.Build do
255255
end
256256

257257
defp purge_dep(%Mix.Dep{app: app} = dep) do
258+
if app in [
259+
:language_server,
260+
:elixir_ls_utils,
261+
:elixir_sense,
262+
:stream_data,
263+
:jason_vendored,
264+
:path_glob_vendored,
265+
:dialyxir_vendored,
266+
:erl2ex,
267+
:patch,
268+
:benchee
269+
] do
270+
raise "Unloading #{app}"
271+
end
272+
258273
for path <- Mix.Dep.load_paths(dep) do
259274
Code.delete_path(path)
260275
end
@@ -338,7 +353,9 @@ defmodule ElixirLS.LanguageServer.Build do
338353
defp read_cached_deps() do
339354
# FIXME: Private api
340355
# we cannot use Mix.Dep.cached() here as it tries to load deps
341-
if project = Mix.Project.get() do
356+
project = Mix.Project.get()
357+
# in test do not try to load cache from elixir_ls
358+
if project != nil and project != ElixirLS.LanguageServer.Mixfile do
342359
env_target = {Mix.env(), Mix.target()}
343360

344361
case Mix.State.read_cache({:cached_deps, project}) do

apps/language_server/lib/language_server/json_rpc_logger_backend.ex

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ defmodule Logger.Backends.JsonRpc do
2424

2525
@behaviour :gen_event
2626

27-
defstruct format: nil,
27+
defstruct group_leader: nil,
28+
default_group_leader: nil,
29+
format: nil,
2830
level: nil,
2931
metadata: nil
3032

@@ -46,8 +48,10 @@ defmodule Logger.Backends.JsonRpc do
4648
end
4749

4850
def handle_call({:set_group_leader, pid}, state) do
51+
Process.monitor(pid)
52+
default_group_leader = Process.group_leader()
4953
Process.group_leader(self(), pid)
50-
{:ok, :ok, state}
54+
{:ok, :ok, %{state | group_leader: pid, default_group_leader: default_group_leader}}
5155
end
5256

5357
@impl true
@@ -74,6 +78,14 @@ defmodule Logger.Backends.JsonRpc do
7478
end
7579

7680
@impl true
81+
def handle_info(
82+
{:DOWN, _, :process, pid, _},
83+
state = %{group_leader: pid, default_group_leader: default_group_leader}
84+
) do
85+
Process.group_leader(self(), default_group_leader)
86+
{:ok, %{state | group_leader: nil}}
87+
end
88+
7789
def handle_info(_, state) do
7890
{:ok, state}
7991
end
@@ -125,10 +137,8 @@ defmodule Logger.Backends.JsonRpc do
125137
end
126138

127139
defp log_event(level, msg, ts, md, state) do
128-
if function_exported?(ElixirLS.Utils.WireProtocol, :send, 1) do
129-
output = format_event(level, msg, ts, md, state) |> IO.chardata_to_string()
130-
ElixirLS.LanguageServer.JsonRpc.log_message(elixir_log_level_to_lsp(level), output)
131-
end
140+
output = format_event(level, msg, ts, md, state) |> IO.chardata_to_string()
141+
ElixirLS.LanguageServer.JsonRpc.log_message(elixir_log_level_to_lsp(level), output)
132142

133143
state
134144
end

apps/language_server/test/server_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,6 +1533,7 @@ defmodule ElixirLS.LanguageServer.ServerTest do
15331533
try do
15341534
func.(server)
15351535
after
1536+
wait_until_compiled(server)
15361537
stop_supervised(Server)
15371538
stop_supervised(PacketCapture)
15381539
flush_mailbox()

0 commit comments

Comments
 (0)