]> git.giacomolli.uk - onechat/blobdiff - memory_test.go
Version the package and command from the commit
[onechat] / memory_test.go
index 4dee8b2951e18d2cb6d47ca60a0414e02054545d..fe050c4f001dce923fefecbd3244387d53d31ce3 100644 (file)
@@ -3,6 +3,7 @@ package main
 import (
        "context"
        "fmt"
+       "log"
        "maps"
        "os"
        "path/filepath"
@@ -17,11 +18,12 @@ import (
 func TestMemoryRestartLoadsTheSameView(t *testing.T) {
        root := t.TempDir()
        clock := newTestClock()
-       memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer())
+       memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog())
        require.NoError(t, err)
 
        memory.chat.high = 200
        memory.chat.low = 100
+
        memory.cview.high = 80
        memory.cview.low = 40
        for n := range 100 {
@@ -36,7 +38,7 @@ func TestMemoryRestartLoadsTheSameView(t *testing.T) {
        require.Less(t, len(memory.chat.lines), 100)
        require.NoError(t, memory.Close())
 
-       memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer())
+       memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog())
        require.NoError(t, err)
 
        defer func() {
@@ -54,7 +56,7 @@ func TestMemoryRestartLoadsTheSameView(t *testing.T) {
 func TestMemoryOpensAfterACrashBeforeTheViewSave(t *testing.T) {
        root := t.TempDir()
        clock := newTestClock()
-       memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer())
+       memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog())
        require.NoError(t, err)
 
        _, err = memory.Append("user", "first")
@@ -72,14 +74,14 @@ func TestMemoryOpensAfterACrashBeforeTheViewSave(t *testing.T) {
        // 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())
+       memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog())
        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())
+       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer(), discardLog())
        require.NoError(t, err)
 
        defer func() {
@@ -88,6 +90,7 @@ func TestMemoryKeepsTheCompactionViewCoarser(t *testing.T) {
 
        memory.chat.high = 200
        memory.chat.low = 100
+
        memory.cview.high = 80
        memory.cview.low = 40
        for n := range 64 {
@@ -110,7 +113,7 @@ func TestMemoryKeepsTheCompactionViewCoarser(t *testing.T) {
 func TestMemoryRunsAtMostEightBuilds(t *testing.T) {
        summarizer := newFakeSummarizer()
        summarizer.gate = make(chan struct{})
-       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer)
+       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, discardLog())
        require.NoError(t, err)
 
        defer func() {
@@ -123,6 +126,7 @@ func TestMemoryRunsAtMostEightBuilds(t *testing.T) {
        }
 
        memory.mutex.Lock()
+
        running := slices.Collect(maps.Keys(memory.queue.running))
        memory.mutex.Unlock()
        slices.SortFunc(running, func(a, b NodeKey) int {
@@ -148,7 +152,7 @@ func TestMemoryRunsAtMostEightBuilds(t *testing.T) {
 func TestMemorySettleWaitsForThePendingLines(t *testing.T) {
        summarizer := newFakeSummarizer()
        summarizer.gate = make(chan struct{})
-       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer)
+       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, discardLog())
        require.NoError(t, err)
 
        defer func() {
@@ -178,7 +182,9 @@ func TestMemorySettleWaitsForThePendingLines(t *testing.T) {
 func TestMemorySettleFailsWhileABuildFailed(t *testing.T) {
        summarizer := newFakeSummarizer()
        summarizer.SetFailing(true)
-       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer)
+
+       logs := &SyncBuffer{}
+       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, log.New(logs, "", 0))
        require.NoError(t, err)
 
        defer func() {
@@ -188,8 +194,10 @@ func TestMemorySettleFailsWhileABuildFailed(t *testing.T) {
        _, err = memory.Append("echo", memoryLongText(0))
        require.NoError(t, err)
        require.ErrorIs(t, memory.Settle(t.Context()), errMemoryUnsettled)
+       require.Equal(t, "summary failed, retry at next message: node (0, 0): fake failure\n", logs.String())
 
        summarizer.SetFailing(false)
+
        _, err = memory.Append("user", "retry")
        require.NoError(t, err)
        require.NoError(t, memory.Settle(t.Context()))
@@ -198,7 +206,7 @@ func TestMemorySettleFailsWhileABuildFailed(t *testing.T) {
 func TestMemorySettleEndsWithItsContext(t *testing.T) {
        summarizer := newFakeSummarizer()
        summarizer.gate = make(chan struct{})
-       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer)
+       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, discardLog())
        require.NoError(t, err)
 
        defer func() {
@@ -217,7 +225,8 @@ func TestMemorySettleEndsWithItsContext(t *testing.T) {
 func TestMemoryStartsALeafAfterFewerThanEightUnbuilt(t *testing.T) {
        summarizer := newFakeSummarizer()
        summarizer.SetFailing(true)
-       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer)
+
+       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, discardLog())
        require.NoError(t, err)
 
        defer func() {
@@ -230,6 +239,7 @@ func TestMemoryStartsALeafAfterFewerThanEightUnbuilt(t *testing.T) {
        }
 
        require.NoError(t, memory.Wait(t.Context()))
+
        for _, task := range summarizer.Tasks() {
                require.Less(t, task.Index, 8)
        }
@@ -246,7 +256,7 @@ func TestMemoryStartsALeafAfterFewerThanEightUnbuilt(t *testing.T) {
 
 func TestMemoryMergesAfterBothHalves(t *testing.T) {
        summarizer := newFakeSummarizer()
-       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer)
+       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, discardLog())
        require.NoError(t, err)
 
        defer func() {
@@ -275,7 +285,8 @@ func TestMemoryRestartRestoresTheQueue(t *testing.T) {
        clock := newTestClock()
        summarizer := newFakeSummarizer()
        summarizer.SetFailing(true)
-       memory, err := openMemory(t.Context(), root, clock.Now, summarizer)
+
+       memory, err := openMemory(t.Context(), root, clock.Now, summarizer, discardLog())
        require.NoError(t, err)
 
        for n := range 4 {
@@ -286,7 +297,7 @@ func TestMemoryRestartRestoresTheQueue(t *testing.T) {
        require.NoError(t, memory.Wait(t.Context()))
        require.NoError(t, memory.Close())
 
-       memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer())
+       memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog())
        require.NoError(t, err)
 
        defer func() {
@@ -298,7 +309,7 @@ func TestMemoryRestartRestoresTheQueue(t *testing.T) {
 }
 
 func TestMemoryBuildsFreeParents(t *testing.T) {
-       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer())
+       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, newFakeSummarizer(), discardLog())
        require.NoError(t, err)
 
        defer func() {
@@ -317,7 +328,8 @@ func TestMemoryBuildsFreeParents(t *testing.T) {
 func TestMemoryKeepsALongMessageOutOfTheView(t *testing.T) {
        summarizer := newFakeSummarizer()
        summarizer.SetFailing(true)
-       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer)
+
+       memory, err := openMemory(t.Context(), t.TempDir(), newTestClock().Now, summarizer, discardLog())
        require.NoError(t, err)
 
        defer func() {
@@ -343,7 +355,7 @@ func TestMemoryKeepsALongMessageOutOfTheView(t *testing.T) {
 func TestMemoryCoversMessagesAfterTheSavedView(t *testing.T) {
        root := t.TempDir()
        clock := newTestClock()
-       memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer())
+       memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog())
        require.NoError(t, err)
 
        _, err = memory.Append("user", "a")
@@ -353,7 +365,7 @@ func TestMemoryCoversMessagesAfterTheSavedView(t *testing.T) {
        require.NoError(t, err)
        require.NoError(t, memory.Close())
 
-       memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer())
+       memory, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog())
        require.NoError(t, err)
 
        defer func() {
@@ -366,7 +378,7 @@ func TestMemoryCoversMessagesAfterTheSavedView(t *testing.T) {
 func TestMemoryRefusesToRebuildAMissingView(t *testing.T) {
        root := t.TempDir()
        clock := newTestClock()
-       memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer())
+       memory, err := openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog())
        require.NoError(t, err)
 
        _, err = memory.Append("user", "a")
@@ -374,7 +386,7 @@ func TestMemoryRefusesToRebuildAMissingView(t *testing.T) {
        require.NoError(t, memory.Close())
        require.NoError(t, os.Remove(filepath.Join(root, "view.json")))
 
-       _, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer())
+       _, err = openMemory(t.Context(), root, clock.Now, newFakeSummarizer(), discardLog())
        require.ErrorIs(t, err, errMemoryNoView)
 }