]> git.giacomolli.uk - onechat/blobdiff - log_test.go
Name the fields of the config test cases
[onechat] / log_test.go
index 83e2aca3c9a60c943ba05ff1f36b1d6ea1fe4488..60b9b6428e68d2576fd35b933125e4e50f186ebc 100644 (file)
@@ -16,7 +16,7 @@ func TestLogReopenLoadsTheSameMessages(t *testing.T) {
        require.NoError(t, err)
 
        var written []Message
        require.NoError(t, err)
 
        var written []Message
-       for _, kind := range []string{"user", "unii", "tool", "echo", "work", "note"} {
+       for _, kind := range []string{"user", "reply", "tool", "echo", "work", "note"} {
                message, err := log.Append(kind, kind+" text ✓")
                require.NoError(t, err)
 
                message, err := log.Append(kind, kind+" text ✓")
                require.NoError(t, err)
 
@@ -34,13 +34,48 @@ func TestLogReopenLoadsTheSameMessages(t *testing.T) {
                require.NoError(t, log.Close())
        }()
 
                require.NoError(t, log.Close())
        }()
 
-       require.Equal(t, written, log.messages)
+       require.Equal(t, len(written), log.Len())
+       for _, message := range written {
+               read, err := log.Message(message.ID)
+               require.NoError(t, err)
+               require.Equal(t, message, read)
+       }
 
        message, err := log.Append("user", "after the reopen")
        require.NoError(t, err)
        require.Equal(t, 6, message.ID)
 }
 
 
        message, err := log.Append("user", "after the reopen")
        require.NoError(t, err)
        require.Equal(t, 6, message.ID)
 }
 
+func TestLogBuildsAMissingIndexAgain(t *testing.T) {
+       root := t.TempDir()
+       clock := newTestClock()
+       log, err := openLog(t.Context(), root, clock.Now)
+       require.NoError(t, err)
+
+       for _, text := range []string{"a", "b", "c"} {
+               _, err = log.Append("user", text)
+               require.NoError(t, err)
+
+               clock.now = clock.now.Add(24 * time.Hour)
+       }
+
+       require.NoError(t, log.Close())
+
+       // A missing index, and an index that a crash cut in a record.
+       for _, cut := range []func(string) error{os.Remove, truncateToOneAndAHalf} {
+               require.NoError(t, cut(filepath.Join(root, "index", "main.idx")))
+
+               log, err = openLog(t.Context(), root, clock.Now)
+               require.NoError(t, err)
+               require.Equal(t, 3, log.Len())
+
+               message, err := log.Message(2)
+               require.NoError(t, err)
+               require.Equal(t, "c", message.Text)
+               require.NoError(t, log.Close())
+       }
+}
+
 func TestLogWritesOneFilePerDay(t *testing.T) {
        root := t.TempDir()
        clock := newTestClock()
 func TestLogWritesOneFilePerDay(t *testing.T) {
        root := t.TempDir()
        clock := newTestClock()
@@ -106,6 +141,11 @@ func TestLogRejectsAGapInTheIDs(t *testing.T) {
        require.ErrorContains(t, err, "expected message 0, found 1")
 }
 
        require.ErrorContains(t, err, "expected message 0, found 1")
 }
 
+// truncateToOneAndAHalf cuts the index at path in its second record.
+func truncateToOneAndAHalf(path string) error {
+       return os.Truncate(path, positionBytes+positionBytes/2)
+}
+
 // testClock is a clock that tests set by hand.
 type testClock struct {
        now time.Time
 // testClock is a clock that tests set by hand.
 type testClock struct {
        now time.Time