mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-04-24 03:29:57 -07:00
Merge remote-tracking branch 'mntm/dev' into ofw-3822-nestednonces
This commit is contained in:
51
applications/debug/unit_tests/tests/furi/furi_errno_test.c
Normal file
51
applications/debug/unit_tests/tests/furi/furi_errno_test.c
Normal file
@@ -0,0 +1,51 @@
|
||||
#include <furi.h>
|
||||
#include <errno.h>
|
||||
#include "../test.h" // IWYU pragma: keep
|
||||
|
||||
#define TAG "ErrnoTest"
|
||||
#define THREAD_CNT 16
|
||||
#define ITER_CNT 1000
|
||||
|
||||
static int32_t errno_fuzzer(void* context) {
|
||||
int start_value = (int)context;
|
||||
int32_t fails = 0;
|
||||
|
||||
for(int i = start_value; i < start_value + ITER_CNT; i++) {
|
||||
errno = i;
|
||||
furi_thread_yield();
|
||||
if(errno != i) fails++;
|
||||
}
|
||||
|
||||
for(int i = 0; i < ITER_CNT; i++) {
|
||||
errno = 0;
|
||||
furi_thread_yield();
|
||||
UNUSED(strtol("123456", NULL, 10)); // -V530
|
||||
furi_thread_yield();
|
||||
if(errno != 0) fails++;
|
||||
|
||||
errno = 0;
|
||||
furi_thread_yield();
|
||||
UNUSED(strtol("123456123456123456123456123456123456123456123456", NULL, 10)); // -V530
|
||||
furi_thread_yield();
|
||||
if(errno != ERANGE) fails++;
|
||||
}
|
||||
|
||||
return fails;
|
||||
}
|
||||
|
||||
void test_errno_saving(void) {
|
||||
FuriThread* threads[THREAD_CNT];
|
||||
|
||||
for(int i = 0; i < THREAD_CNT; i++) {
|
||||
int start_value = i * ITER_CNT;
|
||||
threads[i] = furi_thread_alloc_ex("ErrnoFuzzer", 1024, errno_fuzzer, (void*)start_value);
|
||||
furi_thread_set_priority(threads[i], FuriThreadPriorityNormal);
|
||||
furi_thread_start(threads[i]);
|
||||
}
|
||||
|
||||
for(int i = 0; i < THREAD_CNT; i++) {
|
||||
furi_thread_join(threads[i]);
|
||||
mu_assert_int_eq(0, furi_thread_get_return_code(threads[i]));
|
||||
furi_thread_free(threads[i]);
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ void test_furi_concurrent_access(void);
|
||||
void test_furi_pubsub(void);
|
||||
void test_furi_memmgr(void);
|
||||
void test_furi_event_loop(void);
|
||||
void test_errno_saving(void);
|
||||
|
||||
static int foo = 0;
|
||||
|
||||
@@ -42,6 +43,10 @@ MU_TEST(mu_test_furi_event_loop) {
|
||||
test_furi_event_loop();
|
||||
}
|
||||
|
||||
MU_TEST(mu_test_errno_saving) {
|
||||
test_errno_saving();
|
||||
}
|
||||
|
||||
MU_TEST_SUITE(test_suite) {
|
||||
MU_SUITE_CONFIGURE(&test_setup, &test_teardown);
|
||||
MU_RUN_TEST(test_check);
|
||||
@@ -51,6 +56,7 @@ MU_TEST_SUITE(test_suite) {
|
||||
MU_RUN_TEST(mu_test_furi_pubsub);
|
||||
MU_RUN_TEST(mu_test_furi_memmgr);
|
||||
MU_RUN_TEST(mu_test_furi_event_loop);
|
||||
MU_RUN_TEST(mu_test_errno_saving);
|
||||
}
|
||||
|
||||
int run_minunit_test_furi(void) {
|
||||
|
||||
@@ -6,9 +6,10 @@
|
||||
// This is a hack to access internal storage functions and definitions
|
||||
#include <storage/storage_i.h>
|
||||
|
||||
#define UNIT_TESTS_PATH(path) EXT_PATH("unit_tests/" path)
|
||||
#define UNIT_TESTS_RESOURCES_PATH(path) EXT_PATH("unit_tests/" path)
|
||||
#define UNIT_TESTS_PATH(path) EXT_PATH(".tmp/unit_tests/" path)
|
||||
|
||||
#define STORAGE_LOCKED_FILE EXT_PATH("locked_file.test")
|
||||
#define STORAGE_LOCKED_FILE UNIT_TESTS_PATH("locked_file.test")
|
||||
#define STORAGE_LOCKED_DIR STORAGE_INT_PATH_PREFIX
|
||||
|
||||
#define STORAGE_TEST_DIR UNIT_TESTS_PATH("test_dir")
|
||||
@@ -369,33 +370,78 @@ MU_TEST(storage_file_rename) {
|
||||
Storage* storage = furi_record_open(RECORD_STORAGE);
|
||||
File* file = storage_file_alloc(storage);
|
||||
|
||||
mu_check(write_file_13DA(storage, EXT_PATH("file.old")));
|
||||
mu_check(check_file_13DA(storage, EXT_PATH("file.old")));
|
||||
mu_check(write_file_13DA(storage, UNIT_TESTS_PATH("file.old")));
|
||||
mu_check(check_file_13DA(storage, UNIT_TESTS_PATH("file.old")));
|
||||
mu_assert_int_eq(
|
||||
FSE_OK, storage_common_rename(storage, EXT_PATH("file.old"), EXT_PATH("file.new")));
|
||||
mu_assert_int_eq(FSE_NOT_EXIST, storage_common_stat(storage, EXT_PATH("file.old"), NULL));
|
||||
mu_assert_int_eq(FSE_OK, storage_common_stat(storage, EXT_PATH("file.new"), NULL));
|
||||
mu_check(check_file_13DA(storage, EXT_PATH("file.new")));
|
||||
mu_assert_int_eq(FSE_OK, storage_common_remove(storage, EXT_PATH("file.new")));
|
||||
FSE_OK,
|
||||
storage_common_rename(storage, UNIT_TESTS_PATH("file.old"), UNIT_TESTS_PATH("file.new")));
|
||||
mu_assert_int_eq(
|
||||
FSE_NOT_EXIST, storage_common_stat(storage, UNIT_TESTS_PATH("file.old"), NULL));
|
||||
mu_assert_int_eq(FSE_OK, storage_common_stat(storage, UNIT_TESTS_PATH("file.new"), NULL));
|
||||
mu_check(check_file_13DA(storage, UNIT_TESTS_PATH("file.new")));
|
||||
mu_assert_int_eq(FSE_OK, storage_common_remove(storage, UNIT_TESTS_PATH("file.new")));
|
||||
|
||||
storage_file_free(file);
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
}
|
||||
|
||||
static const char* dir_rename_tests[][2] = {
|
||||
{UNIT_TESTS_PATH("dir.old"), UNIT_TESTS_PATH("dir.new")},
|
||||
{UNIT_TESTS_PATH("test_dir"), UNIT_TESTS_PATH("test_dir-new")},
|
||||
{UNIT_TESTS_PATH("test"), UNIT_TESTS_PATH("test-test")},
|
||||
};
|
||||
|
||||
MU_TEST(storage_dir_rename) {
|
||||
Storage* storage = furi_record_open(RECORD_STORAGE);
|
||||
|
||||
storage_dir_create(storage, EXT_PATH("dir.old"));
|
||||
for(size_t i = 0; i < COUNT_OF(dir_rename_tests); i++) {
|
||||
const char* old_path = dir_rename_tests[i][0];
|
||||
const char* new_path = dir_rename_tests[i][1];
|
||||
|
||||
mu_check(storage_dir_rename_check(storage, EXT_PATH("dir.old")));
|
||||
storage_dir_create(storage, old_path);
|
||||
mu_check(storage_dir_rename_check(storage, old_path));
|
||||
|
||||
mu_assert_int_eq(FSE_OK, storage_common_rename(storage, old_path, new_path));
|
||||
mu_assert_int_eq(FSE_NOT_EXIST, storage_common_stat(storage, old_path, NULL));
|
||||
mu_check(storage_dir_rename_check(storage, new_path));
|
||||
|
||||
storage_dir_remove(storage, new_path);
|
||||
mu_assert_int_eq(FSE_NOT_EXIST, storage_common_stat(storage, new_path, NULL));
|
||||
}
|
||||
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
}
|
||||
|
||||
MU_TEST(storage_equiv_and_subdir) {
|
||||
Storage* storage = furi_record_open(RECORD_STORAGE);
|
||||
|
||||
mu_assert_int_eq(
|
||||
FSE_OK, storage_common_rename(storage, EXT_PATH("dir.old"), EXT_PATH("dir.new")));
|
||||
mu_assert_int_eq(FSE_NOT_EXIST, storage_common_stat(storage, EXT_PATH("dir.old"), NULL));
|
||||
mu_check(storage_dir_rename_check(storage, EXT_PATH("dir.new")));
|
||||
true,
|
||||
storage_common_equivalent_path(storage, UNIT_TESTS_PATH("blah"), UNIT_TESTS_PATH("blah")));
|
||||
mu_assert_int_eq(
|
||||
true,
|
||||
storage_common_equivalent_path(
|
||||
storage, UNIT_TESTS_PATH("blah/"), UNIT_TESTS_PATH("blah/")));
|
||||
mu_assert_int_eq(
|
||||
false,
|
||||
storage_common_equivalent_path(
|
||||
storage, UNIT_TESTS_PATH("blah"), UNIT_TESTS_PATH("blah-blah")));
|
||||
mu_assert_int_eq(
|
||||
false,
|
||||
storage_common_equivalent_path(
|
||||
storage, UNIT_TESTS_PATH("blah/"), UNIT_TESTS_PATH("blah-blah/")));
|
||||
|
||||
storage_dir_remove(storage, EXT_PATH("dir.new"));
|
||||
mu_assert_int_eq(FSE_NOT_EXIST, storage_common_stat(storage, EXT_PATH("dir.new"), NULL));
|
||||
mu_assert_int_eq(
|
||||
true, storage_common_is_subdir(storage, UNIT_TESTS_PATH("blah"), UNIT_TESTS_PATH("blah")));
|
||||
mu_assert_int_eq(
|
||||
true,
|
||||
storage_common_is_subdir(storage, UNIT_TESTS_PATH("blah"), UNIT_TESTS_PATH("blah/blah")));
|
||||
mu_assert_int_eq(
|
||||
false,
|
||||
storage_common_is_subdir(storage, UNIT_TESTS_PATH("blah/blah"), UNIT_TESTS_PATH("blah")));
|
||||
mu_assert_int_eq(
|
||||
false,
|
||||
storage_common_is_subdir(storage, UNIT_TESTS_PATH("blah"), UNIT_TESTS_PATH("blah-blah")));
|
||||
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
}
|
||||
@@ -403,10 +449,13 @@ MU_TEST(storage_dir_rename) {
|
||||
MU_TEST_SUITE(storage_rename) {
|
||||
MU_RUN_TEST(storage_file_rename);
|
||||
MU_RUN_TEST(storage_dir_rename);
|
||||
MU_RUN_TEST(storage_equiv_and_subdir);
|
||||
|
||||
Storage* storage = furi_record_open(RECORD_STORAGE);
|
||||
storage_dir_remove(storage, EXT_PATH("dir.old"));
|
||||
storage_dir_remove(storage, EXT_PATH("dir.new"));
|
||||
for(size_t i = 0; i < COUNT_OF(dir_rename_tests); i++) {
|
||||
storage_dir_remove(storage, dir_rename_tests[i][0]);
|
||||
storage_dir_remove(storage, dir_rename_tests[i][1]);
|
||||
}
|
||||
furi_record_close(RECORD_STORAGE);
|
||||
}
|
||||
|
||||
@@ -653,7 +702,7 @@ MU_TEST(test_md5_calc) {
|
||||
Storage* storage = furi_record_open(RECORD_STORAGE);
|
||||
File* file = storage_file_alloc(storage);
|
||||
|
||||
const char* path = UNIT_TESTS_PATH("storage/md5.txt");
|
||||
const char* path = UNIT_TESTS_RESOURCES_PATH("storage/md5.txt");
|
||||
const char* md5_cstr = "2a456fa43e75088fdde41c93159d62a2";
|
||||
const uint8_t md5[MD5_HASH_SIZE] = {
|
||||
0x2a,
|
||||
|
||||
@@ -677,6 +677,13 @@ MU_TEST(subghz_decoder_solight_te44_test) {
|
||||
"Test decoder " WS_PROTOCOL_SOLIGHT_TE44_NAME " error\r\n");
|
||||
}
|
||||
|
||||
MU_TEST(subghz_decoder_bresser_3ch_test) {
|
||||
mu_assert(
|
||||
subghz_decoder_test(
|
||||
EXT_PATH("unit_tests/subghz/bresser_3ch_raw.sub"), WS_PROTOCOL_BRESSER_3CH_NAME),
|
||||
"Test decoder " WS_PROTOCOL_BRESSER_3CH_NAME " error\r\n");
|
||||
}
|
||||
|
||||
//test encoders
|
||||
MU_TEST(subghz_encoder_princeton_test) {
|
||||
mu_assert(
|
||||
|
||||
Reference in New Issue
Block a user