Files
天天的鸟蛋蛋 b9655a5ab1 SnowCat 雪猫底层全源码:NapCat 4.18.28 底座 + SnowLuma 能力移植 + V8 通道适配 9.9.37
26 包 monorepo(TS 全源码):
- snowcat-core: NT 内核 API 封装 + listener(含 9.9.37 六回调适配)+ Packet 发包
- snowcat-onebot: OneBot v11 全动作 + MCP Streamable HTTP 适配器 + 稳定线
- snowcat-webui-frontend/backend: 雪猫控制台(React+HeroUI)
- snowcat-shell: 单文件 bundle 出口(vite inlineDynamicImports)
- snowcat-native: napi2native / MoeHoo / ffmpeg / pty 运行时
- 56 项 SnowLuma 独门动作移植(qzone 全家桶/群相册/装扮/闪照/收藏)
- 工具件: 解包器/启动器/便携制作器/doctor

GitHub 关联已全量指向 DandanLLab/SnowCatQQ
2026-11-12 06:27:36 +08:00

88 lines
3.2 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import crypto from 'crypto';
import { Sha1Stream } from 'snowcat-core/packet/utils/crypto/sha1Stream';
describe('Sha1Stream', () => {
it('should compute correct SHA-1 hash for empty string', () => {
const sha1Stream = new Sha1Stream();
const hash = sha1Stream.final();
const expected = crypto.createHash('sha1').update('').digest();
expect(hash).toEqual(expected);
});
it('should compute correct SHA-1 hash for simple string', () => {
const testData = 'Hello, World!';
const sha1Stream = new Sha1Stream();
sha1Stream.update(Buffer.from(testData));
const hash = sha1Stream.final();
const expected = crypto.createHash('sha1').update(testData).digest();
expect(hash).toEqual(expected);
});
it('should compute correct SHA-1 hash for binary data', () => {
const testData = Buffer.from([0x00, 0x01, 0x02, 0x03, 0x04, 0x05]);
const sha1Stream = new Sha1Stream();
sha1Stream.update(testData);
const hash = sha1Stream.final();
const expected = crypto.createHash('sha1').update(testData).digest();
expect(hash).toEqual(expected);
});
it('should handle multiple update calls', () => {
const part1 = 'Hello';
const part2 = ', World!';
const sha1Stream = new Sha1Stream();
sha1Stream.update(Buffer.from(part1));
sha1Stream.update(Buffer.from(part2));
const hash = sha1Stream.final();
const expected = crypto.createHash('sha1').update(part1 + part2).digest();
expect(hash).toEqual(expected);
});
it('should handle large data correctly', () => {
const testData = crypto.randomBytes(1024 * 10); // 10KB random data
const sha1Stream = new Sha1Stream();
sha1Stream.update(testData);
const hash = sha1Stream.final();
const expected = crypto.createHash('sha1').update(testData).digest();
expect(hash).toEqual(expected);
});
it('should produce consistent results for same input', () => {
const testData = 'Consistent test data';
const sha1Stream1 = new Sha1Stream();
sha1Stream1.update(Buffer.from(testData));
const hash1 = sha1Stream1.final();
const sha1Stream2 = new Sha1Stream();
sha1Stream2.update(Buffer.from(testData));
const hash2 = sha1Stream2.final();
expect(hash1).toEqual(hash2);
});
it('should handle edge case with exact block size', () => {
// SHA-1 block size is 64 bytes
const testData = 'a'.repeat(64);
const sha1Stream = new Sha1Stream();
sha1Stream.update(Buffer.from(testData));
const hash = sha1Stream.final();
const expected = crypto.createHash('sha1').update(testData).digest();
expect(hash).toEqual(expected);
});
it('should handle random data correctly', () => {
// Run multiple random tests (reduced from 100000 to 100 for performance)
for (let i = 0; i < 100; i++) {
const randomLength = Math.floor(Math.random() * 1024);
const randomData = crypto.randomBytes(randomLength);
const sha1Stream = new Sha1Stream();
sha1Stream.update(randomData);
const hash = sha1Stream.final();
const expectedDigest = crypto.createHash('sha1').update(randomData).digest();
expect(hash).toEqual(expectedDigest);
}
});
});