mirror of
https://github.com/esphome/esphome.git
synced 2025-07-31 07:36:35 +00:00
cover
This commit is contained in:
parent
6c8df02d9c
commit
4fc6ef6d3e
@ -37,6 +37,15 @@ globals:
|
|||||||
- id: multiple_same_name_counter
|
- id: multiple_same_name_counter
|
||||||
type: int
|
type: int
|
||||||
initial_value: '0'
|
initial_value: '0'
|
||||||
|
- id: const_char_retry_counter
|
||||||
|
type: int
|
||||||
|
initial_value: '0'
|
||||||
|
- id: static_char_retry_counter
|
||||||
|
type: int
|
||||||
|
initial_value: '0'
|
||||||
|
- id: mixed_cancel_result
|
||||||
|
type: bool
|
||||||
|
initial_value: 'false'
|
||||||
|
|
||||||
# Using different component types for each test to ensure isolation
|
# Using different component types for each test to ensure isolation
|
||||||
sensor:
|
sensor:
|
||||||
@ -229,6 +238,56 @@ script:
|
|||||||
return RetryResult::RETRY;
|
return RetryResult::RETRY;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
# Test 8: Const char* overloads
|
||||||
|
- logger.log: "=== Test 8: Const char* overloads ==="
|
||||||
|
- lambda: |-
|
||||||
|
auto *component = id(simple_retry_sensor);
|
||||||
|
|
||||||
|
// Test 8a: Direct string literal
|
||||||
|
App.scheduler.set_retry(component, "const_char_test", 30, 2,
|
||||||
|
[](uint8_t retry_countdown) {
|
||||||
|
id(const_char_retry_counter)++;
|
||||||
|
ESP_LOGI("test", "Const char retry %d", id(const_char_retry_counter));
|
||||||
|
return RetryResult::DONE;
|
||||||
|
});
|
||||||
|
|
||||||
|
# Test 9: Static const char* variable
|
||||||
|
- logger.log: "=== Test 9: Static const char* ==="
|
||||||
|
- lambda: |-
|
||||||
|
auto *component = id(backoff_retry_sensor);
|
||||||
|
|
||||||
|
static const char* STATIC_NAME = "static_retry_test";
|
||||||
|
App.scheduler.set_retry(component, STATIC_NAME, 20, 1,
|
||||||
|
[](uint8_t retry_countdown) {
|
||||||
|
id(static_char_retry_counter)++;
|
||||||
|
ESP_LOGI("test", "Static const char retry %d", id(static_char_retry_counter));
|
||||||
|
return RetryResult::DONE;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cancel with same static const char*
|
||||||
|
App.scheduler.set_timeout(component, "static_cancel", 10, []() {
|
||||||
|
static const char* STATIC_NAME = "static_retry_test";
|
||||||
|
bool result = App.scheduler.cancel_retry(id(backoff_retry_sensor), STATIC_NAME);
|
||||||
|
ESP_LOGI("test", "Static cancel result: %s", result ? "true" : "false");
|
||||||
|
});
|
||||||
|
|
||||||
|
# Test 10: Mix string and const char* cancel
|
||||||
|
- logger.log: "=== Test 10: Mixed string/const char* ==="
|
||||||
|
- lambda: |-
|
||||||
|
auto *component = id(immediate_done_sensor);
|
||||||
|
|
||||||
|
// Set with std::string
|
||||||
|
std::string str_name = "mixed_retry";
|
||||||
|
App.scheduler.set_retry(component, str_name, 40, 3,
|
||||||
|
[](uint8_t retry_countdown) {
|
||||||
|
ESP_LOGI("test", "Mixed retry - should be cancelled");
|
||||||
|
return RetryResult::RETRY;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cancel with const char*
|
||||||
|
id(mixed_cancel_result) = App.scheduler.cancel_retry(component, "mixed_retry");
|
||||||
|
ESP_LOGI("test", "Mixed cancel result: %s", id(mixed_cancel_result) ? "true" : "false");
|
||||||
|
|
||||||
# Wait for all tests to complete before reporting
|
# Wait for all tests to complete before reporting
|
||||||
- delay: 500ms
|
- delay: 500ms
|
||||||
|
|
||||||
@ -242,4 +301,7 @@ script:
|
|||||||
ESP_LOGI("test", "Empty name retry counter: %d (expected 1-2)", id(empty_name_retry_counter));
|
ESP_LOGI("test", "Empty name retry counter: %d (expected 1-2)", id(empty_name_retry_counter));
|
||||||
ESP_LOGI("test", "Component retry counter: %d (expected 2)", id(script_retry_counter));
|
ESP_LOGI("test", "Component retry counter: %d (expected 2)", id(script_retry_counter));
|
||||||
ESP_LOGI("test", "Multiple same name counter: %d (expected 20+)", id(multiple_same_name_counter));
|
ESP_LOGI("test", "Multiple same name counter: %d (expected 20+)", id(multiple_same_name_counter));
|
||||||
|
ESP_LOGI("test", "Const char retry counter: %d (expected 1)", id(const_char_retry_counter));
|
||||||
|
ESP_LOGI("test", "Static char retry counter: %d (expected 1)", id(static_char_retry_counter));
|
||||||
|
ESP_LOGI("test", "Mixed cancel result: %s (expected true)", id(mixed_cancel_result) ? "true" : "false");
|
||||||
ESP_LOGI("test", "All retry tests completed");
|
ESP_LOGI("test", "All retry tests completed");
|
||||||
|
@ -23,6 +23,9 @@ async def test_scheduler_retry_test(
|
|||||||
empty_name_retry_done = asyncio.Event()
|
empty_name_retry_done = asyncio.Event()
|
||||||
component_retry_done = asyncio.Event()
|
component_retry_done = asyncio.Event()
|
||||||
multiple_name_done = asyncio.Event()
|
multiple_name_done = asyncio.Event()
|
||||||
|
const_char_done = asyncio.Event()
|
||||||
|
static_char_done = asyncio.Event()
|
||||||
|
mixed_cancel_done = asyncio.Event()
|
||||||
test_complete = asyncio.Event()
|
test_complete = asyncio.Event()
|
||||||
|
|
||||||
# Track retry counts
|
# Track retry counts
|
||||||
@ -33,16 +36,20 @@ async def test_scheduler_retry_test(
|
|||||||
empty_name_retry_count = 0
|
empty_name_retry_count = 0
|
||||||
component_retry_count = 0
|
component_retry_count = 0
|
||||||
multiple_name_count = 0
|
multiple_name_count = 0
|
||||||
|
const_char_retry_count = 0
|
||||||
|
static_char_retry_count = 0
|
||||||
|
|
||||||
# Track specific test results
|
# Track specific test results
|
||||||
cancel_result = None
|
cancel_result = None
|
||||||
empty_cancel_result = None
|
empty_cancel_result = None
|
||||||
|
mixed_cancel_result = None
|
||||||
backoff_intervals = []
|
backoff_intervals = []
|
||||||
|
|
||||||
def on_log_line(line: str) -> None:
|
def on_log_line(line: str) -> None:
|
||||||
nonlocal simple_retry_count, backoff_retry_count, immediate_done_count
|
nonlocal simple_retry_count, backoff_retry_count, immediate_done_count
|
||||||
nonlocal cancel_retry_count, empty_name_retry_count, component_retry_count
|
nonlocal cancel_retry_count, empty_name_retry_count, component_retry_count
|
||||||
nonlocal multiple_name_count, cancel_result, empty_cancel_result
|
nonlocal multiple_name_count, const_char_retry_count, static_char_retry_count
|
||||||
|
nonlocal cancel_result, empty_cancel_result, mixed_cancel_result
|
||||||
|
|
||||||
# Strip ANSI color codes
|
# Strip ANSI color codes
|
||||||
clean_line = re.sub(r"\x1b\[[0-9;]*m", "", line)
|
clean_line = re.sub(r"\x1b\[[0-9;]*m", "", line)
|
||||||
@ -106,6 +113,27 @@ async def test_scheduler_retry_test(
|
|||||||
if multiple_name_count >= 20:
|
if multiple_name_count >= 20:
|
||||||
multiple_name_done.set()
|
multiple_name_done.set()
|
||||||
|
|
||||||
|
# Const char retry test
|
||||||
|
elif "Const char retry" in clean_line:
|
||||||
|
if match := re.search(r"Const char retry (\d+)", clean_line):
|
||||||
|
const_char_retry_count = int(match.group(1))
|
||||||
|
const_char_done.set()
|
||||||
|
|
||||||
|
# Static const char retry test
|
||||||
|
elif "Static const char retry" in clean_line:
|
||||||
|
if match := re.search(r"Static const char retry (\d+)", clean_line):
|
||||||
|
static_char_retry_count = int(match.group(1))
|
||||||
|
static_char_done.set()
|
||||||
|
|
||||||
|
elif "Static cancel result:" in clean_line:
|
||||||
|
# This is part of test 9, but we don't track it separately
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Mixed cancel test
|
||||||
|
elif "Mixed cancel result:" in clean_line:
|
||||||
|
mixed_cancel_result = "true" in clean_line
|
||||||
|
mixed_cancel_done.set()
|
||||||
|
|
||||||
# Test completion
|
# Test completion
|
||||||
elif "All retry tests completed" in clean_line:
|
elif "All retry tests completed" in clean_line:
|
||||||
test_complete.set()
|
test_complete.set()
|
||||||
@ -227,6 +255,40 @@ async def test_scheduler_retry_test(
|
|||||||
f"Expected multiple name count >= 20 (second retry only), got {multiple_name_count}"
|
f"Expected multiple name count >= 20 (second retry only), got {multiple_name_count}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Wait for const char retry test
|
||||||
|
try:
|
||||||
|
await asyncio.wait_for(const_char_done.wait(), timeout=1.0)
|
||||||
|
except TimeoutError:
|
||||||
|
pytest.fail(
|
||||||
|
f"Const char retry test did not complete. Count: {const_char_retry_count}"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert const_char_retry_count == 1, (
|
||||||
|
f"Expected 1 const char retry call, got {const_char_retry_count}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Wait for static char retry test
|
||||||
|
try:
|
||||||
|
await asyncio.wait_for(static_char_done.wait(), timeout=1.0)
|
||||||
|
except TimeoutError:
|
||||||
|
pytest.fail(
|
||||||
|
f"Static char retry test did not complete. Count: {static_char_retry_count}"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert static_char_retry_count == 1, (
|
||||||
|
f"Expected 1 static char retry call, got {static_char_retry_count}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Wait for mixed cancel test
|
||||||
|
try:
|
||||||
|
await asyncio.wait_for(mixed_cancel_done.wait(), timeout=1.0)
|
||||||
|
except TimeoutError:
|
||||||
|
pytest.fail("Mixed cancel test did not complete")
|
||||||
|
|
||||||
|
assert mixed_cancel_result is True, (
|
||||||
|
"Mixed string/const char cancel should have succeeded"
|
||||||
|
)
|
||||||
|
|
||||||
# Wait for test completion
|
# Wait for test completion
|
||||||
try:
|
try:
|
||||||
await asyncio.wait_for(test_complete.wait(), timeout=1.0)
|
await asyncio.wait_for(test_complete.wait(), timeout=1.0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user