feat: implement Wi-Fi provisioning and persistent configuration

This commit is contained in:
2026-09-03 22:58:57 +03:00
parent 8ffd6dabcf
commit b10c7f5972
29 changed files with 1713 additions and 16 deletions
+115
View File
@@ -0,0 +1,115 @@
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "maze32_wifi_config.h"
typedef struct {
int guard_result;
int guard_calls;
int save_calls;
int clear_calls;
maze32_wifi_credentials_t saved;
} fixture_t;
static int guard(void *context)
{
fixture_t *fixture = context;
++fixture->guard_calls;
return fixture->guard_result;
}
static int save(const maze32_wifi_credentials_t *credentials, void *context)
{
fixture_t *fixture = context;
++fixture->save_calls;
fixture->saved = *credentials;
return 0;
}
static int clear(void *context)
{
fixture_t *fixture = context;
++fixture->clear_calls;
return 0;
}
static maze32_wifi_credentials_t valid_credentials(void)
{
maze32_wifi_credentials_t credentials = {0};
memcpy(credentials.ssid, "Labyrinth", sizeof("Labyrinth"));
memcpy(credentials.password, "eight888", sizeof("eight888"));
return credentials;
}
static void test_validation_boundaries(void)
{
maze32_wifi_credentials_t credentials = valid_credentials();
assert(maze32_wifi_credentials_validate(&credentials) == MAZE32_WIFI_CONFIG_VALID);
credentials.password[0] = '\0';
assert(maze32_wifi_credentials_validate(&credentials) == MAZE32_WIFI_CONFIG_VALID);
memcpy(credentials.password, "short", sizeof("short"));
assert(maze32_wifi_credentials_validate(&credentials) ==
MAZE32_WIFI_CONFIG_INVALID_PASSWORD);
credentials = valid_credentials();
credentials.ssid[0] = '\0';
assert(maze32_wifi_credentials_validate(&credentials) == MAZE32_WIFI_CONFIG_INVALID_SSID);
memset(credentials.ssid, 's', sizeof(credentials.ssid));
assert(maze32_wifi_credentials_validate(&credentials) == MAZE32_WIFI_CONFIG_INVALID_SSID);
credentials = valid_credentials();
credentials.ssid[2] = '\n';
assert(maze32_wifi_credentials_validate(&credentials) == MAZE32_WIFI_CONFIG_INVALID_SSID);
}
static void test_invalid_input_never_mutates_storage(void)
{
fixture_t fixture = {0};
maze32_wifi_credentials_t credentials = valid_credentials();
credentials.password[0] = 'x';
credentials.password[1] = '\0';
assert(maze32_wifi_config_apply(&credentials, guard, save, &fixture) == -1);
assert(fixture.guard_calls == 0);
assert(fixture.save_calls == 0);
}
static void test_guard_precedes_every_mutation(void)
{
fixture_t fixture = {.guard_result = -1};
maze32_wifi_credentials_t credentials = valid_credentials();
assert(maze32_wifi_config_apply(&credentials, guard, save, &fixture) == -2);
assert(fixture.guard_calls == 1);
assert(fixture.save_calls == 0);
assert(maze32_wifi_config_reset(guard, clear, &fixture) == -2);
assert(fixture.guard_calls == 2);
assert(fixture.clear_calls == 0);
}
static void test_valid_apply_and_reset(void)
{
fixture_t fixture = {0};
maze32_wifi_credentials_t credentials = valid_credentials();
assert(maze32_wifi_config_apply(&credentials, guard, save, &fixture) == 0);
assert(fixture.guard_calls == 1);
assert(fixture.save_calls == 1);
assert(strcmp(fixture.saved.ssid, credentials.ssid) == 0);
assert(strcmp(fixture.saved.password, credentials.password) == 0);
assert(maze32_wifi_config_reset(guard, clear, &fixture) == 0);
assert(fixture.guard_calls == 2);
assert(fixture.clear_calls == 1);
}
int main(void)
{
test_validation_boundaries();
test_invalid_input_never_mutates_storage();
test_guard_precedes_every_mutation();
test_valid_apply_and_reset();
puts("wifi configuration tests: PASS");
return 0;
}