/ internal / agent / statecache_test.go
statecache_test.go
 1  package agent
 2  
 3  import (
 4  	"encoding/json"
 5  	"testing"
 6  )
 7  
 8  func TestResolveCallStateTraits(t *testing.T) {
 9  	t.Run("browser read is cacheable", func(t *testing.T) {
10  		traits := resolveCallStateTraits("browser_snapshot", `{}`)
11  		if !traits.Cacheable {
12  			t.Fatal("expected browser_snapshot to be cacheable")
13  		}
14  		if len(traits.Reads) != 1 || traits.Reads[0].Domain != StateDomainBrowser {
15  			t.Fatalf("expected browser read traits, got %+v", traits)
16  		}
17  	})
18  
19  	t.Run("file write tracks filesystem scope", func(t *testing.T) {
20  		traits := resolveCallStateTraits("file_write", `{"path":"/tmp/example.txt","content":"x"}`)
21  		if len(traits.Writes) != 1 {
22  			t.Fatalf("expected one filesystem write ref, got %+v", traits)
23  		}
24  		if traits.Writes[0].Domain != StateDomainFilesystem || traits.Writes[0].Scope != "/tmp/example.txt" {
25  			t.Fatalf("unexpected file write traits: %+v", traits)
26  		}
27  	})
28  
29  	t.Run("bash is unknown write", func(t *testing.T) {
30  		traits := resolveCallStateTraits("bash", `{"command":"pwd"}`)
31  		if !traits.UnknownWrite {
32  			t.Fatal("expected bash to be treated as an unknown write")
33  		}
34  		if len(traits.Writes) != 1 || traits.Writes[0].Domain != StateDomainProcess {
35  			t.Fatalf("unexpected bash traits: %+v", traits)
36  		}
37  	})
38  }
39  
40  func TestBuildStateAwareCacheKeyChangesAfterVersionBump(t *testing.T) {
41  	tracker := newStateVersionTracker()
42  	traits := resolveCallStateTraits("file_read", `{"path":"/tmp/example.txt"}`)
43  
44  	before := buildStateAwareCacheKey("file_read", json.RawMessage(`{"path":"/tmp/example.txt"}`), traits, tracker)
45  	if before == "" {
46  		t.Fatal("expected initial cache key")
47  	}
48  
49  	tracker.bump([]StateRef{{Domain: StateDomainFilesystem, Scope: "/tmp/example.txt"}})
50  	after := buildStateAwareCacheKey("file_read", json.RawMessage(`{"path":"/tmp/example.txt"}`), traits, tracker)
51  	if after == "" {
52  		t.Fatal("expected post-write cache key")
53  	}
54  	if before == after {
55  		t.Fatalf("expected cache key to change after version bump, got %q", before)
56  	}
57  }