X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/d4dc9a3b10a6092d18fb30cfb36526556aa33227..7cc0014244124aea59672904de65a979a8e5fb2c:/memory_test.go
diff --git a/memory_test.go b/memory_test.go
index ddbb014..8b418d8 100644
--- a/memory_test.go
+++ b/memory_test.go
@@ -54,6 +54,33 @@ func TestMemoryRestartLoadsTheSameView(t *testing.T) {
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)
@@ -107,16 +134,16 @@ func TestMemoryRunsAtMostEightBuilds(t *testing.T) {
require.Equal(t, []nodeKey{{0, 0}, {0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}, {0, 6}, {0, 7}}, running)
require.Eventually(t, func() bool {
- return summarizer.Active() == maxBuilds
+ return summarizer.Active() == buildMax
}, 10*time.Second, time.Millisecond)
close(summarizer.gate)
require.NoError(t, memory.Wait(t.Context()))
- require.Equal(t, maxBuilds, summarizer.peak)
+ require.Equal(t, buildMax, summarizer.peak)
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.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()))
- 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) {
@@ -169,12 +196,12 @@ func TestMemoryMergesAfterBothHalves(t *testing.T) {
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, "\n0+1|"+left.Text+"\n1+1|"+right.Text+"\n", merge.Context)
- require.True(t, memory.tree.Built(1, 0))
+ require.True(t, isBuilt(t, memory.tree, 1, 0))
}
func TestMemoryRestartRestoresTheQueue(t *testing.T) {
@@ -201,7 +228,7 @@ func TestMemoryRestartRestoresTheQueue(t *testing.T) {
}()
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) {
@@ -217,8 +244,7 @@ func TestMemoryBuildsFreeParents(t *testing.T) {
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)
}
@@ -235,14 +261,17 @@ func TestMemoryKeepsALongMessageOutOfTheView(t *testing.T) {
_, err = memory.Append("echo", longText(0))
require.NoError(t, err)
require.NoError(t, memory.Wait(t.Context()))
- require.Equal(t, "\n0+1|"+pending+"\n", memory.View())
+ require.Equal(t, "\n0+1|"+viewPending+"\n", memory.View())
summarizer.SetFailing(false)
_, err = memory.Append("user", "again")
require.NoError(t, err)
require.NoError(t, memory.Wait(t.Context()))
- require.Equal(t, "\n0+1|"+fakeLine(memory.task(nodeKey{0, 0}))+"\n1+1|user: again\n", memory.View())
+
+ task, err := memory.task(nodeKey{0, 0})
+ require.NoError(t, err)
+ require.Equal(t, "\n0+1|"+fakeLine(task)+"\n1+1|user: again\n", memory.View())
}
func TestMemoryCoversMessagesAfterTheSavedView(t *testing.T) {