release: v0.5.1 — 存储后端生产级硬化(CRC-32/全库加密/WAL分片/页面化存储/多标签页锁/e2e)+ 深度审查修复(假实现接线/死代码清理)
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
/**
|
||||
* AriaEngine Page — 页面核心逻辑测试
|
||||
*
|
||||
* v0.4.5: 页面层精简后仅保留生产代码实际使用的函数:
|
||||
* - initPageHeader(FileManager 创建空页面)
|
||||
* - createPage(BufferPool 分配新页面)
|
||||
* - PAGE_HEADER_SIZE / PAGE_SIZE 常量
|
||||
* 页面内容为 SSTable 原始字节切片(PageSSTableStore 管理),无行级 slot 结构。
|
||||
*/
|
||||
import { createPage } from '../../src/engine/aria/page/format';
|
||||
import { initPageHeader } from '../../src/engine/aria/page/header';
|
||||
import { PAGE_SIZE, PAGE_HEADER_SIZE, PageType } from '../../src/engine/aria/types';
|
||||
|
||||
describe('AriaEngine — Page 核心', () => {
|
||||
it('initPageHeader 初始化 4KB 页面头部字段', () => {
|
||||
const buf = new ArrayBuffer(PAGE_SIZE);
|
||||
initPageHeader(buf, 42, PageType.DATA);
|
||||
const view = new DataView(buf);
|
||||
expect(view.getUint32(0, false)).toBe(42); // page_id
|
||||
expect(view.getUint8(4)).toBe(PageType.DATA); // type
|
||||
expect(view.getUint16(5, false)).toBe(PAGE_HEADER_SIZE); // free_start
|
||||
expect(view.getUint16(7, false)).toBe(PAGE_SIZE); // free_end
|
||||
expect(view.getUint16(9, false)).toBe(0); // slot_count
|
||||
expect(view.getUint8(15)).toBe(0); // reserved
|
||||
});
|
||||
|
||||
it('initPageHeader 支持不同页面类型', () => {
|
||||
const buf = new ArrayBuffer(PAGE_SIZE);
|
||||
initPageHeader(buf, 1, PageType.META);
|
||||
expect(new DataView(buf).getUint8(4)).toBe(PageType.META);
|
||||
});
|
||||
|
||||
it('createPage 创建脏页面(pins=0,初始化头部)', () => {
|
||||
const page = createPage(7, PageType.DATA);
|
||||
expect(page.pageId).toBe(7);
|
||||
expect(page.type).toBe(PageType.DATA);
|
||||
expect(page.data.byteLength).toBe(PAGE_SIZE);
|
||||
expect(page.dirty).toBe(true);
|
||||
expect(page.pins).toBe(0);
|
||||
// 头部已初始化
|
||||
expect(new DataView(page.data).getUint32(0, false)).toBe(7);
|
||||
expect(new DataView(page.data).getUint8(4)).toBe(PageType.DATA);
|
||||
});
|
||||
|
||||
it('页面数据区从头部之后开始(跳过 16 字节头)', () => {
|
||||
const page = createPage(1, PageType.DATA);
|
||||
// 头部之后写入数据,头部字段不受影响
|
||||
const view = new Uint8Array(page.data);
|
||||
view[PAGE_HEADER_SIZE] = 0xAB;
|
||||
view[PAGE_HEADER_SIZE + 1] = 0xCD;
|
||||
expect(view[PAGE_HEADER_SIZE]).toBe(0xAB);
|
||||
expect(view[PAGE_HEADER_SIZE + 1]).toBe(0xCD);
|
||||
// 头部字段保持
|
||||
expect(new DataView(page.data).getUint32(0, false)).toBe(1);
|
||||
});
|
||||
|
||||
it('createPage 的 dirty 标记在写入后保持(PageSSTableStore 依赖)', () => {
|
||||
const page = createPage(2, PageType.DATA);
|
||||
new Uint8Array(page.data)[100] = 0x01;
|
||||
expect(page.dirty).toBe(true);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user