feat: introduce the network state model and secure persistent storage
This commit is contained in:
+6
-2
@@ -1,7 +1,7 @@
|
||||
CC ?= cc
|
||||
CFLAGS ?= -std=c11 -Wall -Wextra -Werror -I../../include
|
||||
|
||||
all: test_command_queue test_game_domain test_bot_player test_game_lifecycle test_state_presenter test_http_api test_sync_service test_human_game_integration test_bot_game_integration test_robustness
|
||||
all: test_command_queue test_game_domain test_bot_player test_game_lifecycle test_state_presenter test_http_api test_sync_service test_human_game_integration test_bot_game_integration test_robustness test_network_foundation
|
||||
|
||||
test_command_queue: test_command_queue.c ../../src/command_queue.c
|
||||
$(CC) $(CFLAGS) $^ -o $@
|
||||
@@ -17,6 +17,7 @@ run: all
|
||||
./test_human_game_integration
|
||||
./test_bot_game_integration
|
||||
./test_robustness
|
||||
./test_network_foundation
|
||||
|
||||
test_game_domain: test_game_domain.c ../../src/fleet_generator.c ../../src/game_engine.c
|
||||
$(CC) $(CFLAGS) $^ -o $@
|
||||
@@ -46,5 +47,8 @@ test_robustness: test_robustness.c ../../src/http_api.c ../../src/sync_service.c
|
||||
|
||||
$(CC) $(CFLAGS) $^ -o $@
|
||||
|
||||
test_network_foundation: test_network_foundation.c ../../src/network_state.c ../../src/network_credentials.c
|
||||
$(CC) $(CFLAGS) $^ -o $@
|
||||
|
||||
clean:
|
||||
rm -f test_command_queue test_game_domain test_bot_player test_game_lifecycle test_state_presenter test_http_api test_sync_service test_human_game_integration test_bot_game_integration test_robustness
|
||||
rm -f test_command_queue test_game_domain test_bot_player test_game_lifecycle test_state_presenter test_http_api test_sync_service test_human_game_integration test_bot_game_integration test_robustness test_network_foundation
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user