]> git.giacomolli.uk - onechat/blobdiff - memory_test.go
Run the tools of an agent and log each call
[onechat] / memory_test.go
index ddbb014030f7cc26bf7f63fc5b128cb047ad05a9..7b3979503a012f666acc99d887ed792fd16bd485 100644 (file)
@@ -54,6 +54,33 @@ func TestMemoryRestartLoadsTheSameView(t *testing.T) {
        require.Equal(t, saved, loaded)
 }
 
        require.Equal(t, saved, loaded)
 }
 
+func TestMemoryOpensAfterACrashBeforeTheViewSave(t *testing.T) {
+       root := t.TempDir()
+       clock := newTestClock()
+       memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer())
+       require.NoError(t, err)
+
+       _, err = memory.Append("user", "first")
+       require.NoError(t, err)
+
+       saved, err := os.ReadFile(filepath.Join(root, "view.json"))
+       require.NoError(t, err)
+
+       _, err = memory.Append("user", "second")
+       require.NoError(t, err)
+
+       view := memory.View()
+       require.NoError(t, memory.Close())
+
+       // The log and the tree hold message 1, but the view does not.
+       require.NoError(t, os.WriteFile(filepath.Join(root, "view.json"), saved, 0o600))
+
+       memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer())
+       require.NoError(t, err)
+       require.Equal(t, view, memory.View())
+       require.NoError(t, memory.Close())
+}
+
 func TestMemoryKeepsTheCompactionViewCoarser(t *testing.T) {
        memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer())
        require.NoError(t, err)
 func TestMemoryKeepsTheCompactionViewCoarser(t *testing.T) {
        memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer())
        require.NoError(t, err)
@@ -116,7 +143,7 @@ func TestMemoryRunsAtMostEightBuilds(t *testing.T) {
 
        for level, count := range []int{12, 6, 3, 1} {
                for index := range count {
 
        for level, count := range []int{12, 6, 3, 1} {
                for index := range count {
-                       require.True(t, memory.tree.Built(level, index), "node (%d, %d)", level, index)
+                       require.True(t, isBuilt(t, memory.tree, level, index), "node (%d, %d)", level, index)
                }
        }
 }
                }
        }
 }
@@ -141,14 +168,14 @@ func TestMemoryStartsALeafAfterFewerThanEightUnbuilt(t *testing.T) {
                require.Less(t, task.Index, 8)
        }
 
                require.Less(t, task.Index, 8)
        }
 
-       require.False(t, memory.tree.Built(0, 8))
+       require.False(t, isBuilt(t, memory.tree, 0, 8))
        summarizer.SetFailing(false)
 
        _, err = memory.Append("user", "retry")
        require.NoError(t, err)
        require.NoError(t, memory.Wait(t.Context()))
        summarizer.SetFailing(false)
 
        _, err = memory.Append("user", "retry")
        require.NoError(t, err)
        require.NoError(t, memory.Wait(t.Context()))
-       require.True(t, memory.tree.Built(0, 8))
-       require.True(t, memory.tree.Built(3, 0))
+       require.True(t, isBuilt(t, memory.tree, 0, 8))
+       require.True(t, isBuilt(t, memory.tree, 3, 0))
 }
 
 func TestMemoryMergesAfterBothHalves(t *testing.T) {
 }
 
 func TestMemoryMergesAfterBothHalves(t *testing.T) {
@@ -169,12 +196,12 @@ func TestMemoryMergesAfterBothHalves(t *testing.T) {
        require.NoError(t, memory.Wait(t.Context()))
        require.Len(t, summarizer.Tasks(), 3)
 
        require.NoError(t, memory.Wait(t.Context()))
        require.Len(t, summarizer.Tasks(), 3)
 
-       left, _ := memory.tree.Node(0, 0)
-       right, _ := memory.tree.Node(0, 1)
+       left := readNode(t, memory.tree, 0, 0)
+       right := readNode(t, memory.tree, 0, 1)
        merge := summarizer.Tasks()[2]
        require.Equal(t, []string{left.Text, right.Text}, merge.Input)
        require.Equal(t, "<chat>\n0+1|"+left.Text+"\n1+1|"+right.Text+"\n</chat>", merge.Context)
        merge := summarizer.Tasks()[2]
        require.Equal(t, []string{left.Text, right.Text}, merge.Input)
        require.Equal(t, "<chat>\n0+1|"+left.Text+"\n1+1|"+right.Text+"\n</chat>", merge.Context)
-       require.True(t, memory.tree.Built(1, 0))
+       require.True(t, isBuilt(t, memory.tree, 1, 0))
 }
 
 func TestMemoryRestartRestoresTheQueue(t *testing.T) {
 }
 
 func TestMemoryRestartRestoresTheQueue(t *testing.T) {
@@ -201,7 +228,7 @@ func TestMemoryRestartRestoresTheQueue(t *testing.T) {
        }()
 
        require.NoError(t, memory.Wait(t.Context()))
        }()
 
        require.NoError(t, memory.Wait(t.Context()))
-       require.True(t, memory.tree.Built(2, 0))
+       require.True(t, isBuilt(t, memory.tree, 2, 0))
 }
 
 func TestMemoryBuildsFreeParents(t *testing.T) {
 }
 
 func TestMemoryBuildsFreeParents(t *testing.T) {
@@ -217,8 +244,7 @@ func TestMemoryBuildsFreeParents(t *testing.T) {
                require.NoError(t, err)
        }
 
                require.NoError(t, err)
        }
 
-       node, built := memory.tree.Node(2, 0)
-       require.True(t, built)
+       node := readNode(t, memory.tree, 2, 0)
        require.Equal(t, "user: a\nuser: b\nuser: c\nuser: d", node.Text)
 }
 
        require.Equal(t, "user: a\nuser: b\nuser: c\nuser: d", node.Text)
 }
 
@@ -242,7 +268,10 @@ func TestMemoryKeepsALongMessageOutOfTheView(t *testing.T) {
        _, err = memory.Append("user", "again")
        require.NoError(t, err)
        require.NoError(t, memory.Wait(t.Context()))
        _, err = memory.Append("user", "again")
        require.NoError(t, err)
        require.NoError(t, memory.Wait(t.Context()))
-       require.Equal(t, "<chat>\n0+1|"+fakeLine(memory.task(nodeKey{0, 0}))+"\n1+1|user: again\n</chat>", memory.View())
+
+       task, err := memory.task(nodeKey{0, 0})
+       require.NoError(t, err)
+       require.Equal(t, "<chat>\n0+1|"+fakeLine(task)+"\n1+1|user: again\n</chat>", memory.View())
 }
 
 func TestMemoryCoversMessagesAfterTheSavedView(t *testing.T) {
 }
 
 func TestMemoryCoversMessagesAfterTheSavedView(t *testing.T) {