mirror of
https://github.com/esphome/esphome.git
synced 2025-09-01 19:02:18 +01:00
110 lines
3.9 KiB
YAML
110 lines
3.9 KiB
YAML
esphome:
|
|
name: scheduler-defer-fifo-simple
|
|
|
|
host:
|
|
|
|
logger:
|
|
level: DEBUG
|
|
|
|
api:
|
|
services:
|
|
- service: test_set_timeout
|
|
then:
|
|
- lambda: |-
|
|
// Test set_timeout with 0 delay (direct scheduler call)
|
|
static int set_timeout_order = 0;
|
|
static bool set_timeout_passed = true;
|
|
|
|
// Reset for this test
|
|
set_timeout_order = 0;
|
|
set_timeout_passed = true;
|
|
|
|
ESP_LOGD("defer_test", "Testing set_timeout(0) for FIFO order...");
|
|
for (int i = 0; i < 10; i++) {
|
|
int expected = i;
|
|
App.scheduler.set_timeout((Component*)nullptr, nullptr, 0, [expected]() {
|
|
ESP_LOGD("defer_test", "set_timeout(0) item %d executed, order %d", expected, set_timeout_order);
|
|
if (set_timeout_order != expected) {
|
|
ESP_LOGE("defer_test", "FIFO violation in set_timeout: expected %d but got execution order %d", expected, set_timeout_order);
|
|
set_timeout_passed = false;
|
|
}
|
|
set_timeout_order++;
|
|
|
|
if (set_timeout_order == 10) {
|
|
if (set_timeout_passed) {
|
|
ESP_LOGI("defer_test", "✓ Test PASSED - set_timeout(0) maintains FIFO order");
|
|
id(test_result)->trigger("passed");
|
|
} else {
|
|
ESP_LOGE("defer_test", "✗ Test FAILED - set_timeout(0) executed out of order");
|
|
id(test_result)->trigger("failed");
|
|
}
|
|
id(test_complete)->trigger("test_finished");
|
|
}
|
|
});
|
|
}
|
|
|
|
ESP_LOGD("defer_test", "Deferred 10 items using set_timeout(0), waiting for execution...");
|
|
|
|
- service: test_defer
|
|
then:
|
|
- lambda: |-
|
|
// Test defer() method (component method)
|
|
static int defer_order = 0;
|
|
static bool defer_passed = true;
|
|
|
|
// Reset for this test
|
|
defer_order = 0;
|
|
defer_passed = true;
|
|
|
|
ESP_LOGD("defer_test", "Testing defer() for FIFO order...");
|
|
|
|
// Create a test component class that exposes defer()
|
|
class TestComponent : public Component {
|
|
public:
|
|
void test_defer() {
|
|
for (int i = 0; i < 10; i++) {
|
|
int expected = i;
|
|
this->defer([expected]() {
|
|
ESP_LOGD("defer_test", "defer() item %d executed, order %d", expected, defer_order);
|
|
if (defer_order != expected) {
|
|
ESP_LOGE("defer_test", "FIFO violation in defer: expected %d but got execution order %d", expected, defer_order);
|
|
defer_passed = false;
|
|
}
|
|
defer_order++;
|
|
|
|
if (defer_order == 10) {
|
|
if (defer_passed) {
|
|
ESP_LOGI("defer_test", "✓ Test PASSED - defer() maintains FIFO order");
|
|
id(test_result)->trigger("passed");
|
|
} else {
|
|
ESP_LOGE("defer_test", "✗ Test FAILED - defer() executed out of order");
|
|
id(test_result)->trigger("failed");
|
|
}
|
|
id(test_complete)->trigger("test_finished");
|
|
}
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
// Use a static instance so it doesn't go out of scope
|
|
static TestComponent test_component;
|
|
test_component.test_defer();
|
|
|
|
ESP_LOGD("defer_test", "Deferred 10 items using defer(), waiting for execution...");
|
|
|
|
event:
|
|
- platform: template
|
|
name: "Test Complete"
|
|
id: test_complete
|
|
device_class: button
|
|
event_types:
|
|
- "test_finished"
|
|
- platform: template
|
|
name: "Test Result"
|
|
id: test_result
|
|
device_class: button
|
|
event_types:
|
|
- "passed"
|
|
- "failed"
|