2022-05-09 04:44:37 -04:00
|
|
|
/*
|
|
|
|
* SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
|
|
|
*/
|
|
|
|
#include "string.h"
|
|
|
|
#include "esp_system.h"
|
|
|
|
#include "unity.h"
|
|
|
|
#include "esp_system.h"
|
|
|
|
#include "esp_event.h"
|
|
|
|
#include "esp_wifi_types.h"
|
|
|
|
#include "utils/common.h"
|
|
|
|
#include "utils/eloop.h"
|
|
|
|
#include "common/ieee802_11_defs.h"
|
|
|
|
#include "../esp_supplicant/src/esp_wifi_driver.h"
|
|
|
|
#include "esp_log.h"
|
|
|
|
#include "test_utils.h"
|
|
|
|
#include "memory_checks.h"
|
2022-06-09 05:56:23 -04:00
|
|
|
#include <time.h>
|
2022-05-09 04:44:37 -04:00
|
|
|
|
|
|
|
uint32_t timeouts_usec[6] = { 10000, 1000, 10000, 5000, 15000, 1000 };
|
|
|
|
uint32_t timeouts_sec[6] = { 10, 1, 10, 5, 15, 1 };
|
|
|
|
int executed_order[6];
|
|
|
|
int t;
|
|
|
|
struct os_reltime ts;
|
|
|
|
|
2022-06-09 05:56:23 -04:00
|
|
|
|
2022-05-09 04:44:37 -04:00
|
|
|
/* there is only single instance of esp_timer so no need of protection */
|
|
|
|
void callback(void *a, void *b)
|
|
|
|
{
|
|
|
|
int *i = a;
|
|
|
|
struct os_time age, now;
|
|
|
|
|
|
|
|
os_get_reltime(&now);
|
|
|
|
os_time_sub(&now, &ts, &age);
|
|
|
|
|
2022-06-09 05:56:23 -04:00
|
|
|
int32_t ms_diff = (age.sec - timeouts_sec[*i]) * 1000 +
|
|
|
|
(age.usec - timeouts_usec[*i]) / 1000;
|
|
|
|
|
|
|
|
/* let's give 50 ms offset for this small block */
|
|
|
|
if (ms_diff > 50) {
|
2022-05-09 04:44:37 -04:00
|
|
|
executed_order[t] = -1;
|
|
|
|
} else {
|
|
|
|
executed_order[t] = *i;
|
|
|
|
}
|
|
|
|
t++;
|
|
|
|
|
2022-06-09 05:56:23 -04:00
|
|
|
ESP_LOGI("Eloop Test", "timer[%d] ran after %d msec of scheduled time",
|
|
|
|
*i, ms_diff);
|
2022-05-09 04:44:37 -04:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-05-26 07:24:09 -04:00
|
|
|
extern const wifi_osi_funcs_t *wifi_funcs;
|
2022-05-09 04:44:37 -04:00
|
|
|
/* Check if eloop runs its timers correctly & in correct order */
|
|
|
|
TEST_CASE("Test eloop timers run", "[eloop]")
|
|
|
|
{
|
|
|
|
int execution_order[6] = {1, 5, 3, 0, 2, 4};
|
|
|
|
int index[6] = {0,1,2,3,4,5};
|
|
|
|
|
2022-05-26 07:24:09 -04:00
|
|
|
wifi_funcs = WIFI_OSI_FUNCS_INITIALIZER();
|
|
|
|
if (!wifi_funcs) {
|
|
|
|
TEST_ASSERT(1);
|
|
|
|
}
|
2022-05-09 04:44:37 -04:00
|
|
|
eloop_init();
|
|
|
|
os_get_reltime(&ts);
|
|
|
|
for (int i = 0; i < 6; i++) {
|
|
|
|
eloop_register_timeout(timeouts_sec[i], timeouts_usec[i],
|
|
|
|
callback, &index[i], NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* wait for all timers to run */
|
|
|
|
os_sleep(20, 0);
|
2022-05-26 07:24:09 -04:00
|
|
|
t = 0;
|
2022-05-09 04:44:37 -04:00
|
|
|
/* check the execution order, this will also check whether they were fired at correct time */
|
|
|
|
TEST_ASSERT(memcmp(execution_order, executed_order, 6*sizeof(int)) == 0);
|
|
|
|
eloop_destroy();
|
|
|
|
}
|