Files
templates/c/settings-backup/Tests/test_settings_backup.c

44 lines
2.2 KiB
C

#include "settings_backup.h"
#include <assert.h>
#include <string.h>
typedef struct { uint32_t now; unsigned writes, unmounts; int fail; } mock_t;
static uint32_t tick(void *p) { return ((mock_t*)p)->now; }
static SettingsBackupPortResult mount(void *p) { (void)p; return SETTINGS_BACKUP_PORT_OK; }
static void unmount(void *p) { ++((mock_t*)p)->unmounts; }
static SettingsBackupPortResult find(void *p,uint32_t r,uint32_t c,uint8_t *found)
{ (void)p; (void)r; (void)c; *found=0; return SETTINGS_BACKUP_PORT_OK; }
static SettingsBackupPortResult paths(void *p,const SettingsBackupSnapshot *s,char *f,uint32_t fc,char *t,uint32_t tc)
{ (void)p; (void)s; assert(fc>8 && tc>8); memcpy(f,"ok.json",8); memcpy(t,"ok.tmp",7); return SETTINGS_BACKUP_PORT_OK; }
static SettingsBackupPortResult write_json(void *p,const char *t,const char *f,const char *json,uint32_t n)
{
mock_t *m=p; (void)t; (void)f;
assert(n==strlen(json) && n>10 && json[0]=='{');
if (m->fail) return SETTINGS_BACKUP_PORT_IO_ERROR;
++m->writes; return SETTINGS_BACKUP_PORT_OK;
}
static SettingsBackupPortResult retain(void *p,uint16_t n)
{ (void)p; assert(n==2); return SETTINGS_BACKUP_PORT_OK; }
int main(void)
{
SettingsBackup b; SettingsBackupSnapshot s={0}; mock_t m={0}; char json[16000];
SettingsBackupPort port={tick,mount,unmount,find,paths,write_json,retain};
unsigned i; uint32_t crc;
s.revision=1; s.room_count=SETTINGS_BACKUP_MAX_ROOMS;
for(i=0;i<s.room_count;++i) { s.rooms[i].setpoint_x10=200; s.rooms[i].hysteresis_x10=10; s.rooms[i].full_open_time_100ms=100; }
crc=SettingsBackup_CalculateContentCrc(&s);
s.rtc.year=2026; s.active_backend=1;
assert(SettingsBackup_CalculateContentCrc(&s)==crc);
assert(SettingsBackup_FormatJson(&s,json,5)<0);
assert(SettingsBackup_Init(&b,&port,&m,json,sizeof(json),2));
assert(SettingsBackup_Notify(&b,&s));
s.rooms[0].setpoint_x10=300;
assert(b.pending_snapshot.rooms[0].setpoint_x10==200);
m.fail=1;
for(i=0;i<4;++i) SettingsBackup_Service(&b);
assert(m.writes==0 && b.pending && b.status==SETTINGS_BACKUP_LAST_IO_ERROR);
m.fail=0; m.now=b.next_retry_ms;
for(i=0;i<5;++i) SettingsBackup_Service(&b);
assert(m.writes==1 && !b.pending && b.status==SETTINGS_BACKUP_LAST_OK);
return 0;
}