Solaar/tests/logitech_receiver
Ken Sanislo 8a941c5553 Fix crash on exit from device cleanup during interpreter shutdown
`solaar show` (and any exit path) printed a cascade of "I/O operation
on closed file" / "sys.meta_path is None" logging errors at the bottom.

Two compounding causes:

- Device.close() was not idempotent. The CLI closes devices explicitly,
  then __del__ calls close() again during interpreter shutdown, re-running
  every device cleanup a second time. Guard with a _closed flag (not
  self.handle, which is legitimately None for receiver-paired devices).

- rgb_power.cleanup() read device.settings — the lazy property — which
  forces a first-time settings build. Running that build during shutdown
  fails because gettext can no longer import (sys.meta_path is None),
  raising inside a __del__ handler. Read the already-built settings (or
  the persister) via a new _rgb_control_off() helper that never triggers
  the build.

Either guard alone stops the crash; both are correct hardening for a
__del__-invoked path.
2026-07-31 16:36:04 -04:00
..
__init__.py tests: Add tests of common module 2024-02-18 06:10:53 -05:00
fake_hidpp.py centurion: Headset icon kind at construction (#3226) 2026-05-19 15:36:29 -04:00
test_base.py G522 LIGHTSPEED headphones support 2026-05-21 10:13:00 -04:00
test_base_usb.py Speedup lookup of known receivers 2025-01-01 11:33:07 -05:00
test_common.py ui: Show offline status for receiver-paired device batteries (#3217) 2026-05-13 17:32:03 -04:00
test_desktop_notifications.py tests: mock the libnotify backend so the suite raises no real notifications 2026-05-21 10:15:12 -04:00
test_device.py Fix crash on exit from device cleanup during interpreter shutdown 2026-07-31 16:36:04 -04:00
test_diversion.py Refactor: Introduce Feature enum 2024-10-14 07:28:09 -04:00
test_hidpp10.py device: Handle composite IntFlag.name on Python < 3.11 (#3187) 2026-04-16 11:38:25 -04:00
test_hidpp20_complex.py G522 LIGHTSPEED headphones support 2026-05-21 10:13:00 -04:00
test_hidpp20_simple.py device: Fix operator precedence bug and end-of-configuration timing in device.changed() (#3173) 2026-05-13 11:30:26 -04:00
test_notifications.py show better pairing errors (#3063) 2025-12-10 11:18:50 -05:00
test_receiver.py receiver: close paired devices before dropping the handle 2026-07-31 16:30:39 -04:00
test_rgb_power.py Fix crash on exit from device cleanup during interpreter shutdown 2026-07-31 16:36:04 -04:00
test_setting_templates.py headset RGB: regression tests for _HeadsetOnboardEffect color seeding 2026-05-21 10:13:00 -04:00
test_settings_validator.py common: render RGB color values as 0xrrggbb in config and solaar show 2026-05-12 12:51:36 -04:00