X-Git-Url: http://git.giacomolli.uk/onechat/blobdiff_plain/ecf2974df6ab9222978c259fdbb091fc8f8f4369..feda522eba3e2a27c91741c77d0d01f1840c0004:/log_test.go?ds=inline diff --git a/log_test.go b/log_test.go index f3218a9..60b9b64 100644 --- a/log_test.go +++ b/log_test.go @@ -34,13 +34,48 @@ func TestLogReopenLoadsTheSameMessages(t *testing.T) { 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) } +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() @@ -106,6 +141,11 @@ func TestLogRejectsAGapInTheIDs(t *testing.T) { 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