mirror of
https://github.com/esphome/esphome.git
synced 2026-09-17 10:08:40 +00:00
The scheduler was already managing SchedulerItem lifecycle explicitly through its object pool (recycle_item_main_loop_ / get_item_from_pool_locked_). The unique_ptr wrapper added overhead (11 destructor call sites on the hot path) without providing safety — if a lifecycle path was missed, the unique_ptr would silently delete the item and cause needless heap allocations instead of pool reuse. Replace unique_ptr<SchedulerItem, SchedulerItemDeleter> with raw SchedulerItem* throughout. Every item is now explicitly recycled to the pool or deleted via delete_item_(). This eliminates all 11 unique_ptr destructor calls from the hot path and saves ~256 bytes of firmware. Add debug leak detection under ESPHOME_DEBUG_SCHEDULER: a live-item counter verified at the end of every call() cycle asserts that all allocated items are accounted for in items_, to_add_, defer_queue_, or the pool. This turns silent heap churn from missed lifecycle management into an immediate assert failure caught by integration tests. Also moves the retry-cancelled check before item allocation in set_timer_common_ to avoid needless alloc+delete on the cold retry path, and fixes a thread-safety issue where recycle_item_main_loop_ (main-loop-only) was called from set_timer_common_ which can run on non-main-loop threads. Enable debug_scheduler: true in all 18 scheduler integration test fixtures.
Tests for ESPHome
This directory contains some tests for ESPHome.
At the moment, all the tests only work by simply executing
esphome over some YAML files that are made to test
whether the yaml gets converted to the proper C++ code.
Of course this is all just very high-level and things like unit tests would be much better. So if you have time and know how to set up a unit testing framework for python, please do give it a try.
When adding entries in test_.yaml files we usually need only
one file updated, unless conflicting code is generated for
different configurations, e.g. wifi and ethernet cannot
be tested on the same device.
Current test_.yaml file contents.
| Test name | Platform | Network | BLE |
|---|---|---|---|
| test1.yaml | ESP32 | wifi | None |
| test2.yaml | ESP32 | ethernet | esp32_ble_tracker |
| test3.yaml | ESP8266 | wifi | N/A |
| test4.yaml | ESP32 | ethernet | None |
| test5.yaml | ESP32 | wifi | ble_server |
| test6.yaml | RP2040 | wifi | N/A |
| test7.yaml | ESP32-C3 | wifi | N/A |
| test8.yaml | ESP32-S3 | wifi | None |
| test10.yaml | ESP32 | wifi | None |