llm(三协议 Provider)/ session(JSONL 持久化)/ tools(Registry、围栏、 builtin、computer)/ cdp(browser)/ skills / mcp / agent(循环、两级压缩、 编排、审批门控)+ 底座 jsonl/textx/execx/diag/scratch/spill/imagecache。 产品装配代码(config 桥接、schedule 工具、memory/plan/retro/prompt) 留在 AutoGo,宿主接入方式见 MIGRATION.md。
189 lines
3.8 KiB
Go
189 lines
3.8 KiB
Go
package imagecache
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestCache_StoreAndLoad(t *testing.T) {
|
|
dir := t.TempDir()
|
|
cache, err := New(dir, 0, 0)
|
|
if err != nil {
|
|
t.Fatalf("New() error = %v", err)
|
|
}
|
|
|
|
// 存储图片
|
|
data := []byte("fake image data")
|
|
filename, err := cache.Store(data, ".jpg")
|
|
if err != nil {
|
|
t.Fatalf("Store() error = %v", err)
|
|
}
|
|
|
|
// 验证文件存在
|
|
path := filepath.Join(dir, filename)
|
|
if _, err := os.Stat(path); os.IsNotExist(err) {
|
|
t.Errorf("Store() file not created: %s", path)
|
|
}
|
|
|
|
// 加载图片
|
|
loaded, err := cache.Load(filename)
|
|
if err != nil {
|
|
t.Fatalf("Load() error = %v", err)
|
|
}
|
|
|
|
if string(loaded) != string(data) {
|
|
t.Errorf("Load() = %s, want %s", loaded, data)
|
|
}
|
|
}
|
|
|
|
func TestCache_LoadBase64(t *testing.T) {
|
|
dir := t.TempDir()
|
|
cache, err := New(dir, 0, 0)
|
|
if err != nil {
|
|
t.Fatalf("New() error = %v", err)
|
|
}
|
|
|
|
data := []byte("test data")
|
|
filename, err := cache.Store(data, ".png")
|
|
if err != nil {
|
|
t.Fatalf("Store() error = %v", err)
|
|
}
|
|
|
|
b64, err := cache.LoadBase64(filename)
|
|
if err != nil {
|
|
t.Fatalf("LoadBase64() error = %v", err)
|
|
}
|
|
|
|
if b64 == "" {
|
|
t.Error("LoadBase64() returned empty string")
|
|
}
|
|
}
|
|
|
|
func TestCache_Exists(t *testing.T) {
|
|
dir := t.TempDir()
|
|
cache, err := New(dir, 0, 0)
|
|
if err != nil {
|
|
t.Fatalf("New() error = %v", err)
|
|
}
|
|
|
|
filename, _ := cache.Store([]byte("data"), ".jpg")
|
|
|
|
if !cache.Exists(filename) {
|
|
t.Error("Exists() = false, want true")
|
|
}
|
|
|
|
if cache.Exists("nonexistent.jpg") {
|
|
t.Error("Exists() = true for nonexistent file")
|
|
}
|
|
}
|
|
|
|
func TestCache_Delete(t *testing.T) {
|
|
dir := t.TempDir()
|
|
cache, err := New(dir, 0, 0)
|
|
if err != nil {
|
|
t.Fatalf("New() error = %v", err)
|
|
}
|
|
|
|
filename, _ := cache.Store([]byte("data"), ".jpg")
|
|
|
|
if err := cache.Delete(filename); err != nil {
|
|
t.Fatalf("Delete() error = %v", err)
|
|
}
|
|
|
|
if cache.Exists(filename) {
|
|
t.Error("Delete() file still exists")
|
|
}
|
|
}
|
|
|
|
func TestCache_List(t *testing.T) {
|
|
dir := t.TempDir()
|
|
cache, err := New(dir, 0, 0)
|
|
if err != nil {
|
|
t.Fatalf("New() error = %v", err)
|
|
}
|
|
|
|
cache.Store([]byte("data1"), ".jpg")
|
|
cache.Store([]byte("data2"), ".png")
|
|
|
|
files, err := cache.List()
|
|
if err != nil {
|
|
t.Fatalf("List() error = %v", err)
|
|
}
|
|
|
|
if len(files) != 2 {
|
|
t.Errorf("List() returned %d files, want 2", len(files))
|
|
}
|
|
}
|
|
|
|
func TestCache_Stats(t *testing.T) {
|
|
dir := t.TempDir()
|
|
cache, err := New(dir, 0, 0)
|
|
if err != nil {
|
|
t.Fatalf("New() error = %v", err)
|
|
}
|
|
|
|
cache.Store([]byte("data1"), ".jpg")
|
|
cache.Store([]byte("data2"), ".png")
|
|
|
|
count, totalSize, err := cache.Stats()
|
|
if err != nil {
|
|
t.Fatalf("Stats() error = %v", err)
|
|
}
|
|
|
|
if count != 2 {
|
|
t.Errorf("Stats() count = %d, want 2", count)
|
|
}
|
|
|
|
if totalSize <= 0 {
|
|
t.Errorf("Stats() totalSize = %d, want > 0", totalSize)
|
|
}
|
|
}
|
|
|
|
func TestCache_SafePath(t *testing.T) {
|
|
dir := t.TempDir()
|
|
cache, err := New(dir, 0, 0)
|
|
if err != nil {
|
|
t.Fatalf("New() error = %v", err)
|
|
}
|
|
|
|
// 测试路径遍历防护
|
|
tests := []struct {
|
|
input string
|
|
expected string
|
|
}{
|
|
{"test.jpg", filepath.Join(dir, "test.jpg")},
|
|
{"../etc/passwd", filepath.Join(dir, "passwd")},
|
|
{"/etc/passwd", filepath.Join(dir, "passwd")},
|
|
{"subdir/test.jpg", filepath.Join(dir, "test.jpg")},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
got := cache.safePath(tt.input)
|
|
if got != tt.expected {
|
|
t.Errorf("safePath(%q) = %q, want %q", tt.input, got, tt.expected)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDetectMIME(t *testing.T) {
|
|
tests := []struct {
|
|
filename string
|
|
expected string
|
|
}{
|
|
{"test.jpg", "image/jpeg"},
|
|
{"test.jpeg", "image/jpeg"},
|
|
{"test.png", "image/png"},
|
|
{"test.gif", "image/gif"},
|
|
{"test.webp", "image/webp"},
|
|
{"test.unknown", "image/jpeg"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
got := detectMIME(tt.filename)
|
|
if got != tt.expected {
|
|
t.Errorf("detectMIME(%q) = %q, want %q", tt.filename, got, tt.expected)
|
|
}
|
|
}
|
|
}
|