/* 隔离单测: 设备时钟同步模块 (方案B) — 与 net_srv.c dev_time_sync/dev_time_now 同构 */ #include #include static uint32_t _mock_ms = 0; static uint32_t mstick(void) { return _mock_ms; } #define PRINT(...) do{}while(0) /* ── 被测: 与固件同构 ── */ static uint32_t _dev_time_base_unix = 0; static uint32_t _dev_time_base_tick = 0; void dev_time_sync(uint32_t unix_ts) { if (unix_ts < 1600000000UL) return; _dev_time_base_unix = unix_ts; _dev_time_base_tick = mstick(); } uint32_t dev_time_now(void) { if (_dev_time_base_unix == 0) return (uint32_t)(mstick() / 1000); return _dev_time_base_unix + (uint32_t)((mstick() - _dev_time_base_tick) / 1000); } static int fails = 0; #define CHECK(c,m) do{ if(!(c)){ printf("FAIL: %s\n", m); fails++; } }while(0) int main(void) { /* T1: 未同步 → 返回上电秒数 */ _mock_ms = 372000; /* 上电 372s */ CHECK(dev_time_now() == 372, "T1 未同步=上电秒数372"); /* T2: 非法 ts(上电秒数/0/小值) 被门槛挡掉, 不污染基准 */ dev_time_sync(372); dev_time_sync(0); dev_time_sync(1599999999UL); /* 门槛下沿-1 */ CHECK(_dev_time_base_unix == 0, "T2 非法ts被拒, 仍未同步"); CHECK(dev_time_now() == 372, "T2 仍退回上电秒数"); /* T3: 平台经 report_config 下发真 Unix 时间 → 校准 */ uint32_t T = 1784000000UL; /* 某真实 Unix 秒 (>2020) */ _mock_ms = 373000; /* 校准时刻 373s */ dev_time_sync(T); CHECK(dev_time_now() == T, "T3 校准瞬间 = 下发 Unix 时间"); /* T4: 校准后随 mstick 前进, 真时间同步递增 */ _mock_ms = 373000 + 60000; /* 60s 后 */ CHECK(dev_time_now() == T + 60, "T4 60s后 = T+60"); _mock_ms = 373000 + 3600000; /* 1h 后 */ CHECK(dev_time_now() == T + 3600, "T4 1h后 = T+3600"); /* T5: 门槛边界 (>=1600000000 才认) */ _dev_time_base_unix = 0; _dev_time_base_tick = 0; _mock_ms = 1000; dev_time_sync(1600000000UL); CHECK(_dev_time_base_unix == 1600000000UL, "T5 门槛下沿被接受"); /* T6: mstick 49.7天回绕 — 无符号相减仍正确 */ _dev_time_base_unix = T; _dev_time_base_tick = 0xFFFFFF00UL; /* 接近 uint32 上限 */ _mock_ms = 0x00000100UL; /* 回绕后 = 基准 + 512ms */ /* 经过 (0x100 - 0xFFFFFF00) mod 2^32 = 0x200 = 512ms → +0s (整除) */ CHECK(dev_time_now() == T + 0, "T6 回绕512ms → +0s (无符号相减正确)"); _mock_ms = 0x00000100UL + 5000; /* +5.5s */ CHECK(dev_time_now() == T + 5, "T6 回绕后 +5s 正确"); printf(fails ? "\n== %d FAIL ==\n" : "\n== ALL PASS ==\n", fails); return fails; }