fix: local tui mode routes console logging to a file and disables download progress bars so stray output cannot scroll the TUI

This commit is contained in:
2026-07-16 18:39:07 +02:00
parent 9a1f301527
commit 3675a26407
4 changed files with 145 additions and 8 deletions

View File

@@ -88,18 +88,90 @@ defmodule BDS.ServerTest do
end
test "non-desktop modes disable wx so the :desktop dep boots inert" do
assert Server.prepare_boot_env(:tui) == :tui
assert Server.prepare_boot_env(:tui, fn -> :ok end) == :tui
assert System.get_env("NO_WX") == "1"
System.delete_env("NO_WX")
assert Server.prepare_boot_env(:server) == :server
assert Server.prepare_boot_env(:server, fn -> :ok end) == :server
assert System.get_env("NO_WX") == "1"
end
test "desktop mode leaves wx enabled" do
assert Server.prepare_boot_env(:desktop) == :desktop
assert Server.prepare_boot_env(:desktop, fn -> :ok end) == :desktop
assert System.get_env("NO_WX") == nil
end
test "tui mode silences terminal writers; desktop and server modes keep them" do
original = Application.get_env(:bumblebee, :progress_bar_enabled)
on_exit(fn ->
if original == nil do
Application.delete_env(:bumblebee, :progress_bar_enabled)
else
Application.put_env(:bumblebee, :progress_bar_enabled, original)
end
end)
parent = self()
assert Server.prepare_boot_env(:tui, fn -> send(parent, :redirected) end) == :tui
assert Application.get_env(:bumblebee, :progress_bar_enabled) == false
assert_received :redirected
Server.prepare_boot_env(:desktop, fn -> send(parent, :redirected) end)
Server.prepare_boot_env(:server, fn -> send(parent, :redirected) end)
refute_received :redirected
end
end
describe "tui logging redirect" do
setup do
dir = Path.join(System.tmp_dir!(), "bds-tui-log-#{System.unique_integer([:positive])}")
log_file = Path.join(dir, "bds.log")
Application.put_env(:bds, :tui_log_file, log_file)
on_exit(fn ->
Application.delete_env(:bds, :tui_log_file)
File.rm_rf(dir)
end)
{:ok, log_file: log_file}
end
test "tui_log_file defaults to the private app dir and honors the override", %{
log_file: log_file
} do
assert Server.tui_log_file() == log_file
Application.delete_env(:bds, :tui_log_file)
assert Server.tui_log_file() == Path.join([BDS.Projects.private_dir(), "logs", "bds.log"])
end
test "redirect_logging_to_file swaps the default handler to a rotating file handler", %{
log_file: log_file
} do
{:ok, original} = :logger.get_handler_config(:default)
on_exit(fn ->
_ = :logger.remove_handler(:default)
:ok =
:logger.add_handler(
:default,
original.module,
Map.take(original, [:level, :filters, :filter_default, :formatter, :config])
)
end)
assert Server.redirect_logging_to_file() == :ok
{:ok, handler} = :logger.get_handler_config(:default)
assert handler.module == :logger_std_h
assert handler.config.file == String.to_charlist(log_file)
assert handler.config.max_no_bytes > 0
# The swap must keep the Elixir log formatter, not fall back to OTP's.
assert handler.formatter == original.formatter
end
end
describe "ensure_ssh_dir!/1" do