55 lines
		
	
	
		
			843 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			843 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| package wal
 | |
| 
 | |
| import (
 | |
| 	"io"
 | |
| 	"testing"
 | |
| 
 | |
| 	"git.crumpington.com/public/jldb/lib/errs"
 | |
| )
 | |
| 
 | |
| func TestCorruptWAL(t *testing.T) {
 | |
| 	t.Parallel()
 | |
| 
 | |
| 	tmpDir := t.TempDir()
 | |
| 	wal, err := Create(tmpDir, 100, Config{
 | |
| 		SegMinCount:  1024,
 | |
| 		SegMaxAgeSec: 3600,
 | |
| 	})
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	defer wal.Close()
 | |
| 
 | |
| 	appendRandomRecords(t, wal, 100)
 | |
| 
 | |
| 	f := wal.seg.f
 | |
| 	info, err := f.Stat()
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	offset := info.Size() / 2
 | |
| 	if _, err := f.WriteAt([]byte{1, 2, 3, 4, 5, 6, 7, 8}, offset); err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 
 | |
| 	it, err := wal.Iterator(-1)
 | |
| 	if err != nil {
 | |
| 		t.Fatal(err)
 | |
| 	}
 | |
| 	defer it.Close()
 | |
| 
 | |
| 	for it.Next(0) {
 | |
| 		rec := it.Record()
 | |
| 		if _, err := io.ReadAll(rec.Reader); err != nil {
 | |
| 			if errs.Corrupt.Is(err) {
 | |
| 				return
 | |
| 			}
 | |
| 			t.Fatal(err)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	if !errs.Corrupt.Is(it.Error()) {
 | |
| 		t.Fatal(it.Error())
 | |
| 	}
 | |
| }
 |