44 lines
2.2 KiB
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;
|
|
}
|