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  }