#include #include #include #include "network_credentials.h" #include "network_state.h" static network_profile_t profile(const char *ssid, const char *password) { network_profile_t value = {0}; snprintf(value.ssid, sizeof(value.ssid), "%s", ssid); snprintf(value.password, sizeof(value.password), "%s", password); return value; } typedef struct { bool present; network_credential_record_t record; } memory_store_t; static bool read_record(void *context, network_credential_record_t *record) { memory_store_t *store = context; if (!store->present) return false; *record = store->record; return true; } static bool write_record(void *context, const network_credential_record_t *record) { memory_store_t *store = context; store->record = *record; store->present = true; return true; } static bool delete_record(void *context) { memory_store_t *store = context; store->present = false; memset(&store->record, 0, sizeof(store->record)); return true; } int main(void) { network_manager_t manager; network_profile_t home = profile("Home", "secret"); network_profile_t next = profile("Next", "newsecret"); assert(network_manager_init(&manager, NULL, 10U) == NETWORK_ACTION_FALLBACK && manager.state == NETWORK_STATE_FALLBACK); assert(network_manager_init(&manager, &home, 10U) == NETWORK_ACTION_CONNECT); assert(network_manager_tick(&manager, 30009U) == NETWORK_ACTION_NONE); assert(network_manager_tick(&manager, 30010U) == NETWORK_ACTION_FALLBACK); assert(network_manager_disconnected(&manager, 400U) == NETWORK_ACTION_CONNECT); assert(network_manager_connected(&manager) == NETWORK_ACTION_NONE && manager.state == NETWORK_STATE_EXTERNAL); assert(network_manager_begin_validation(&manager, &next)); assert(network_manager_finish_validation(&manager, false, 500U) == NETWORK_ACTION_NONE && strcmp(manager.profile.ssid, "Home") == 0); assert(network_manager_begin_validation(&manager, &next)); assert(network_manager_finish_validation(&manager, true, 600U) == NETWORK_ACTION_CONNECT && strcmp(manager.profile.ssid, "Next") == 0); network_credential_record_t record; network_profile_t restored = {0}; assert(network_credential_encode(&next, &record)); assert(network_credential_decode(&record, &restored)); assert(strcmp(restored.password, "newsecret") == 0); record.profile.ssid[0] = 'X'; assert(!network_credential_decode(&record, &restored)); memory_store_t store = {0}; network_credential_backend_t backend = {&store, read_record, write_record, delete_record}; assert(network_credential_replace(&backend, &home)); assert(network_credential_load(&backend, &restored)); assert(strcmp(restored.ssid, "Home") == 0); store.record.profile.ssid[0] = 'X'; assert(!network_credential_load(&backend, &restored)); assert(network_credential_replace(&backend, &next)); assert(network_credential_load(&backend, &restored)); assert(strcmp(restored.ssid, "Next") == 0); assert(network_credential_delete(&backend)); assert(!network_credential_load(&backend, &restored)); network_profile_t invalid = profile("", "x"); assert(!network_profile_valid(&invalid)); puts("network foundation tests passed"); return 0; }