#include "sd_file_browser.h" #include #include static unsigned checks; static unsigned failures; static unsigned calls; #define CHECK(condition) do { ++checks; if (!(condition)) ++failures; } while (0) /* Mock подтверждает, что core передаёт только проверенный bounded запрос. */ static SdFileBrowserStatus mock_list( void *context, const char *path, uint16_t offset, uint8_t limit, SdFileBrowserPage *page) { (void)context; ++calls; CHECK(strcmp(path, "/niceOne") == 0); CHECK(offset == 3U); CHECK(limit == 2U); memcpy(page->items[0].name, "July", sizeof("July")); page->items[0].is_directory = 1U; page->count = 1U; page->next_offset = 4U; return SD_FILE_BROWSER_OK; } int main(void) { static const char *const invalid[] = { "", "niceOne", "/../secret", "/./logs", "/a//b", "/a\\b", "/a:b", "/trailing/" }; SdFileBrowser browser = { NULL, mock_list }; SdFileBrowserPage page; unsigned index; CHECK(SdFileBrowser_ValidatePath("/") == SD_FILE_BROWSER_OK); CHECK(SdFileBrowser_ValidateLogFilePath("/TEMPLOG.MD") == SD_FILE_BROWSER_OK); CHECK(SdFileBrowser_ValidateLogFilePath( "/niceOne/mounth/2026-07_July/temperature_2026-07-18_10-00-00.md") == SD_FILE_BROWSER_OK); CHECK(SdFileBrowser_ValidateLogFilePath("/niceOne/settings/private.json") == SD_FILE_BROWSER_NOT_LOG_FILE); CHECK(SdFileBrowser_ValidateLogFilePath("/niceOne/mounth/fw.bin") == SD_FILE_BROWSER_NOT_LOG_FILE); CHECK(SdFileBrowser_ValidateLogFilePath("/niceOne/mounth/temperature_bad.md") == SD_FILE_BROWSER_NOT_LOG_FILE); CHECK(SdFileBrowser_ValidatePath("/niceOne/2026-07_July") == SD_FILE_BROWSER_OK); for (index = 0U; index < sizeof(invalid) / sizeof(invalid[0]); ++index) { CHECK(SdFileBrowser_ValidatePath(invalid[index]) == SD_FILE_BROWSER_INVALID_PATH); } memset(&page, 0xA5, sizeof(page)); CHECK(SdFileBrowser_ListPage(&browser, "/niceOne", 3U, 2U, &page) == SD_FILE_BROWSER_OK); CHECK(calls == 1U); CHECK(page.count == 1U); CHECK(strcmp(page.items[0].name, "July") == 0); CHECK(SdFileBrowser_ListPage(&browser, "/niceOne", 0U, 4U, &page) == SD_FILE_BROWSER_INVALID_CURSOR); CHECK(calls == 1U); (void)printf("SD browser core: %u checks, %u failures\n", checks, failures); return failures == 0U ? 0 : 1; }