/* settings_reader_stub.c — 宿主测试用 meow_config_* 与 meow_log 最小实现(内存 KV)。 * * 只为让 logic/reader.c 在不链 SDK 的宿主测试里可编译/可断言: * - meow_config_get/set:8 个键的内存表,可注入写失败(模拟无卡/只读); * - meow_log:只统计 WARN 次数(验证「写失败只告警、不阻断切换」)。 * 与 test_pin.c 自带存根同思路,但抽成共用文件供多个 reader 相关测试链接。 */ #include "settings_reader_stub.h" #include "include/meow_ui_config.h" #include "include/meow_ui_log.h" #include #include #define ST_MAX 8 static struct { char key[64]; char val[64]; int used; } g_kv[ST_MAX]; static int g_fail_writes; static int g_warns; static int kv_find(const char *key) { for (int i = 0; i < ST_MAX; i++) if (g_kv[i].used && strcmp(g_kv[i].key, key) == 0) return i; return -1; } void mr_test_cfg_clear(void) { memset(g_kv, 0, sizeof g_kv); g_fail_writes = 0; } void mr_test_cfg_put(const char *key, const char *val) { if (!key || !key[0]) return; int i = kv_find(key); if (i < 0) { for (i = 0; i < ST_MAX; i++) if (!g_kv[i].used) break; if (i >= ST_MAX) return; g_kv[i].used = 1; snprintf(g_kv[i].key, sizeof g_kv[i].key, "%s", key); } snprintf(g_kv[i].val, sizeof g_kv[i].val, "%s", val ? val : ""); } int mr_test_cfg_get(const char *key, char *out, int outsz) { if (!out || outsz <= 0) return 0; out[0] = '\0'; int i = kv_find(key); if (i < 0) return 0; snprintf(out, (size_t)outsz, "%s", g_kv[i].val); return 1; } void mr_test_cfg_fail_writes(int on) { g_fail_writes = on ? 1 : 0; } int mr_test_log_warns(void) { return g_warns; } void mr_test_log_clear(void) { g_warns = 0; } /* ---- 被测代码调用的 SDK 接口 ---- */ int meow_config_set(const char *key, const char *val) { if (!key || !key[0]) return MEOW_CFG_ERR_INVAL; if (g_fail_writes) return MEOW_CFG_ERR_IO; mr_test_cfg_put(key, val); return MEOW_CFG_OK; } int meow_config_get(const char *key, char *out, int outsz) { if (!out || outsz <= 0) return MEOW_CFG_ERR_INVAL; out[0] = '\0'; if (!mr_test_cfg_get(key, out, outsz)) return MEOW_CFG_ERR_NOENT; return MEOW_CFG_OK; } void meow_log(meow_log_level lvl, const char *fmt, ...) { (void)fmt; if (lvl >= MEOW_LOG_WARN) g_warns++; }