Files
LithosAnanke/kernel/tests/fakes.h
T
Claude d7b2f6bf54 fix(v4): the identity code wipes Zuse's seed after every drive it handles (#176, the identity code)
sk_v4_genesis never wiped its seed or its read-back; sk_v4_drive_arrived
never wiped the proxy's seed after her login; sk_v4_real_zuse_arrived wiped
the seed only on a match. (The logged-in Zuse's own key stays in g_zuse_seed,
by design.)

Option 1: the three use one buffer the identity module owns, g_seeds (seed,
then its read-back), and sk_v4_drive_arrived -- which every drive goes through,
and which alone calls the other two -- runs the drive's handling (now
handle_drive()) and then wipes it, whichever way it went.
sk_v4_identity_seeds() lets the host tests read it.

kernel/tests/test_sk_v4_identity.c, 10 checks, through the real drive-arrival
path: a fake xHCI controller marks a slot attach-pending, the identity code's
idle beat handles it, the real gpt.c reads the stick's table from the RAM disk;
the block layer, signatures, key mint, marker and console faked. Genesis; a
genesis not read back; the proxy logging in; a real Zuse named, then her stick
logging in. Against the code before the wipe: 5 failures (every case's seeds
left). Now: 0. The harness gains fake_disk_bind. Built for amd64, aarch64,
riscv64. #176 done with 2bac2ac8 (the mint).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017RzZgrf7V7Zk2iczBXDRbm
2026-11-12 18:20:09 +00:00

46 lines
1.8 KiB
C

/* SPDX-License-Identifier: LicenseRef-Starship-1.0
* Copyright (c) 2023-2026 Robert A. James
*/
/* fakes.h -- what a kernel unit calls, faked on the host: the console (captured), the RNG
* (deterministic), and a RAM disk whose reads or writes fail at chosen 1 KiB blocks
* (docs/v4.0.0/plans/2026-11-12-kernel-host-tests.md).
*/
#ifndef KERNEL_TESTS_FAKES_H
#define KERNEL_TESTS_FAKES_H
#include <stdint.h>
#include <stddef.h>
#include "blkio.h"
/* The console: every console_println/console_puts line, in order. */
void fake_console_reset(void);
int fake_console_said(const char *text); /* 1 if some line contains `text` */
unsigned fake_console_lines(void);
const char *fake_console_line(unsigned i);
/* The RNG: a fixed sequence, so a test's GUIDs are the same every run; fake_rng_fail makes
* rng_get_bytes return -1 (no backend). */
void fake_rng_reset(void);
void fake_rng_fail(int fail);
/* A RAM disk of `blocks` 1 KiB blocks (512-byte sectors, so 2 per block). A read or write of a
* block in its fail lists returns BLKIO_EIO and changes nothing; every write is counted. */
#define FAKE_DISK_MAX_FAULTS 8
typedef struct {
uint8_t *bytes;
uint32_t blocks;
uint32_t fail_read[FAKE_DISK_MAX_FAULTS], n_fail_read;
uint32_t fail_write[FAKE_DISK_MAX_FAULTS], n_fail_write;
unsigned writes, flushes;
int fail_flush;
} fake_disk;
int fake_disk_open(blkio_dev_t *dev, fake_disk *d, uint32_t blocks); /* zeroed; BLKIO_OK */
int fake_disk_bind(blkio_dev_t *dev, fake_disk *d); /* open another handle on d */
void fake_disk_free(fake_disk *d);
void fake_disk_fail_read(fake_disk *d, uint32_t block);
void fake_disk_fail_write(fake_disk *d, uint32_t block);
uint8_t *fake_disk_sector(fake_disk *d, uint64_t lba); /* a 512-byte sector */
#endif