test: kernel host tests -- the harness, and gpt.c tested on the host
Captain Bob, 2026-11-12: "Build an appropriate test harness! Love the idea." The kernel had no tests below the boots, so defects QEMU cannot provoke could not be tested first. Plan: docs/v4.0.0/plans/2026-11-12-kernel-host-tests.md. kernel/tests/: one host program per kernel source, built with that source as it is, the kernel's flags (-std=c99 -Wall -Wextra -Werror), and fakes -- the console captured line by line, a deterministic RNG that can fail, and a RAM disk whose reads, writes or flushes fail at chosen 1 KiB blocks. make -C kernel/tests test runs them; SRC_<test>= runs a test against other code, which is how a test is seen to fail against the code before a fix. test_gpt.c, 12 checks: a table written and read back; 16, 17 and 18 used entries against max 16 and an entry out of range after the 16th (#180); the RNG, the first write, a later write and a flush failing (#168). Against gpt.c before #168 and #180: 4 failures, each defect caught. Now: 0. Both runs in logs/.../kernel-tests/. Not yet a protocol stage: to rule (the plan, step 5). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017RzZgrf7V7Zk2iczBXDRbm
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
/* 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 */
|
||||
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
|
||||
Reference in New Issue
Block a user