- 新增自启动幂等配置、统一错误语义、进程等待和进程树终止能力 - 增强服务生命周期管理,支持等待状态、重启、幂等创建和配置更新 - 新增 NTFS 卷索引、文件 ID 解析、文件遍历、USN 变更监听和 bookmark 持久化 - 修复 NTFS boot sector、fragment、MFT、USN 解析边界和路径重建问题 - 补充权限、进程、服务、NTFS 解析和工作流回归测试 - 增加 Windows 测试脚本和管理员 NTFS smoke 验证脚本 - 升级 Go 兼容版本到 1.18,并更新 stario、win32api 及相关间接依赖
62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
package fragment
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"testing"
|
|
)
|
|
|
|
type readSeekCloser struct {
|
|
*bytes.Reader
|
|
closed bool
|
|
}
|
|
|
|
func (r *readSeekCloser) Close() error {
|
|
r.closed = true
|
|
return nil
|
|
}
|
|
|
|
func TestReaderReadsFragmentsWithoutOwningEOF(t *testing.T) {
|
|
reader := NewReader(bytes.NewReader([]byte("abcdef")), []Fragment{
|
|
{Offset: 1, Length: 2},
|
|
{Offset: 4, Length: 2},
|
|
})
|
|
|
|
buf := make([]byte, 4)
|
|
n, err := reader.Read(buf)
|
|
if err != nil {
|
|
t.Fatalf("first read failed: %v", err)
|
|
}
|
|
if got := string(buf[:n]); got != "bc" {
|
|
t.Fatalf("first read = %q, want %q", got, "bc")
|
|
}
|
|
|
|
n, err = reader.Read(buf)
|
|
if err != nil {
|
|
t.Fatalf("second read failed: %v", err)
|
|
}
|
|
if got := string(buf[:n]); got != "ef" {
|
|
t.Fatalf("second read = %q, want %q", got, "ef")
|
|
}
|
|
|
|
n, err = reader.Read(buf)
|
|
if err != io.EOF {
|
|
t.Fatalf("third read error = %v, want %v", err, io.EOF)
|
|
}
|
|
if n != 0 {
|
|
t.Fatalf("third read count = %d, want 0", n)
|
|
}
|
|
}
|
|
|
|
func TestReaderCloseClosesUnderlyingCloser(t *testing.T) {
|
|
src := &readSeekCloser{Reader: bytes.NewReader([]byte("abcdef"))}
|
|
reader := NewReader(src, []Fragment{{Offset: 0, Length: 2}})
|
|
|
|
if err := reader.Close(); err != nil {
|
|
t.Fatalf("Close failed: %v", err)
|
|
}
|
|
if !src.closed {
|
|
t.Fatal("underlying closer was not closed")
|
|
}
|
|
}
|