返回 DeepSeek-Reasonix
delete_confinement_test.go
根目录 / internal / session / delete_confinement_test.go
1 package session
2
3 import (
4 "os"
5 "path/filepath"
6 "testing"
7 )
8
9 func TestDeleteConfinesTrashAndQueryCache(t *testing.T) {
10 for _, directory := range []string{".trash", ".query-cache"} {
11 t.Run(directory, func(t *testing.T) {
12 root, outside := t.TempDir(), t.TempDir()
13 persistence := NewFilesystemPersistence(root)
14 created, err := persistence.Create(CreateOptions{SessionID: "owned"})
15 if err != nil {
16 t.Fatal(err)
17 }
18 if err := created.Close(t.Context()); err != nil {
19 t.Fatal(err)
20 }
21 if err := os.MkdirAll(filepath.Join(outside, "owned"), 0o700); err != nil {
22 t.Fatal(err)
23 }
24 sentinel := filepath.Join(outside, "owned", "keep")
25 if err := os.WriteFile(sentinel, []byte("outside data"), 0o600); err != nil {
26 t.Fatal(err)
27 }
28 if err := os.Symlink(outside, filepath.Join(root, directory)); err != nil {
29 t.Skipf("symlink unavailable: %v", err)
30 }
31 err = persistence.Delete(t.Context(), "owned")
32 if directory == ".trash" {
33 if err == nil {
34 t.Fatal("delete moved the session outside the root")
35 }
36 if _, err := os.Stat(filepath.Join(root, "owned", "manifest.json")); err != nil {
37 t.Fatalf("failed delete removed the session: %v", err)
38 }
39 } else if err != nil {
40 t.Fatalf("delete with an unavailable advisory cache: %v", err)
41 }
42 body, err := os.ReadFile(sentinel)
43 if err != nil || string(body) != "outside data" {
44 t.Fatalf("delete changed external cache data: %q, %v", body, err)
45 }
46 entries, err := os.ReadDir(outside)
47 if err != nil || len(entries) != 1 || entries[0].Name() != "owned" {
48 t.Fatalf("delete wrote an external tombstone: %v, %v", entries, err)
49 }
50 })
51 }
52 }
53
53 lines GO