github.com/scottcagno/storage@v1.8.0/pkg/lsmtree/readwrite_test.go (about) 1 package lsmtree 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "testing" 8 ) 9 10 func makeData(prefix string, i int) []byte { 11 return []byte(fmt.Sprintf("%s-%06d", prefix, i)) 12 } 13 14 func TestReadWriteEntries(t *testing.T) { 15 16 readAndWriteEntriesFunc := func(file *os.File) { 17 18 // offsets for read at later on 19 var offsets []int64 20 var err error 21 22 fmt.Println("writing entries...") 23 // write entries 24 for i := 0; i < 500; i++ { 25 // make entry 26 e := &Entry{ 27 Key: makeData("key", i), 28 Value: makeData("value", i), 29 } 30 // add checksum 31 e.CRC = checksum(append(e.Key, e.Value...)) 32 33 // get current offset for later 34 offset, err := file.Seek(0, io.SeekCurrent) 35 if err != nil { 36 t.Errorf("seek current offset: %v\n", err) 37 } 38 offsets = append(offsets, offset) 39 40 // write entry 41 _, err = writeEntry(file, e) 42 if err != nil { 43 t.Errorf("writing entry: %v\n", err) 44 } 45 } 46 47 // rewind 48 _, err = file.Seek(0, io.SeekStart) 49 if err != nil { 50 t.Errorf("rewind: %v\n", err) 51 } 52 53 fmt.Println("reading entries...") 54 // read entries 55 i := 0 56 for { 57 // read entry 58 e, err := readEntry(file) 59 if err != nil { 60 if err == io.EOF || err == io.ErrUnexpectedEOF { 61 break 62 } 63 t.Errorf("reading entry: %v\n", err) 64 } 65 if i%25 == 0 { 66 fmt.Printf("%s\n", e) 67 } 68 i++ 69 } 70 71 fmt.Println("reading entries at...") 72 // read entries at 73 for i := 500 - 1; i > 0; i -= 25 { 74 e, err := readEntryAt(file, offsets[i]) 75 if err != nil { 76 t.Errorf("reading entry at (%d): %v\n", err, offsets[i]) 77 } 78 fmt.Printf("offset: %d, %s\n", offsets[i], e) 79 } 80 81 } 82 83 GetTempFileForTesting(t, readAndWriteEntriesFunc) 84 85 }