github.com/scottcagno/storage@v1.8.0/pkg/lsmtree/lsmtree_test.go (about)

     1  package lsmtree
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  	"testing"
     7  )
     8  
     9  const thousand = 1000
    10  
    11  // lsmtree options
    12  var opt = &Options{
    13  	BaseDir:      "lsmtree-testing",
    14  	SyncOnWrite:  false,
    15  	LoggingLevel: LevelOff,
    16  }
    17  
    18  func logAndCheckErr(msg string, err error, t *testing.T) {
    19  	log.Println(msg)
    20  	if err != nil {
    21  		t.Fatalf("%s: %v\n", msg, err)
    22  	}
    23  }
    24  
    25  func doNTimes(n int, fn func(i int)) {
    26  	for i := 0; i < n; i++ {
    27  		fn(i)
    28  	}
    29  }
    30  
    31  func TestLSMTree_Put(t *testing.T) {
    32  
    33  	// open
    34  	db, err := OpenLSMTree(opt)
    35  	logAndCheckErr("opening", err, t)
    36  
    37  	// write
    38  	doNTimes(1*thousand, func(i int) {
    39  		// write entry
    40  		err := db.Put(makeData("key", i), []byte(mdVal))
    41  		if err != nil {
    42  			t.Fatalf("put: %v\n", err)
    43  		}
    44  	})
    45  
    46  	// close
    47  	err = db.Close()
    48  	logAndCheckErr("closing", err, t)
    49  }
    50  
    51  func TestLSMTree_PutBatch(t *testing.T) {
    52  
    53  	// open
    54  	db, err := OpenLSMTree(opt)
    55  	logAndCheckErr("opening", err, t)
    56  
    57  	// make new batch
    58  	batch := NewBatch()
    59  
    60  	// write
    61  	doNTimes(1*thousand, func(i int) {
    62  		// write entry to batch
    63  		err := batch.Write(makeData("key", i), []byte(smVal))
    64  		if err != nil {
    65  			t.Fatalf("batch write: %v\n", err)
    66  		}
    67  	})
    68  
    69  	// write batch
    70  	err = db.PutBatch(batch)
    71  	logAndCheckErr("put batch", err, t)
    72  
    73  	// close
    74  	err = db.Close()
    75  	logAndCheckErr("closing", err, t)
    76  
    77  }
    78  
    79  func TestLSMTree_Get(t *testing.T) {
    80  
    81  	// open
    82  	db, err := OpenLSMTree(opt)
    83  	logAndCheckErr("opening", err, t)
    84  
    85  	// read
    86  	doNTimes(1*thousand, func(i int) {
    87  		// get entry at i
    88  		k := makeData("key", i)
    89  		v, err := db.Get(k)
    90  		if err != nil {
    91  			t.Fatalf("get(%q): %v\n", k, err)
    92  		}
    93  		fmt.Printf("got(%q)->%q\n", k, v)
    94  	})
    95  
    96  	// close
    97  	err = db.Close()
    98  	logAndCheckErr("closing", err, t)
    99  }
   100  
   101  func TestLSMTree_GetBatch(t *testing.T) {
   102  
   103  	// open
   104  	db, err := OpenLSMTree(opt)
   105  	logAndCheckErr("opening", err, t)
   106  
   107  	// make keys
   108  	var keys [][]byte
   109  	doNTimes(1*thousand, func(i int) {
   110  		// get entry at i
   111  		k := makeData("key", i)
   112  		keys = append(keys, k)
   113  	})
   114  	// read using get batch
   115  	batch, err := db.GetBatch(keys...)
   116  	logAndCheckErr("read using get batch", err, t)
   117  	for i := range batch.Entries {
   118  		fmt.Printf("%s\n", batch.Entries[i])
   119  	}
   120  
   121  	// close
   122  	err = db.Close()
   123  	logAndCheckErr("closing", err, t)
   124  }
   125  
   126  func TestLSMTreeKeyOverride(t *testing.T) {
   127  
   128  	db, err := OpenLSMTree(opt)
   129  	logAndCheckErr("opening", err, t)
   130  
   131  	err = db.Put([]byte("Hi!"), []byte("Hello world, LSMTree!"))
   132  	logAndCheckErr("put (1st)", err, t)
   133  
   134  	err = db.Put([]byte("Does it override key?"), []byte("No!"))
   135  	logAndCheckErr("put (2nd)", err, t)
   136  
   137  	err = db.Put([]byte("Does it override key?"), []byte("Yes, absolutely! The key has been overridden."))
   138  	logAndCheckErr("put (2nd override)", err, t)
   139  
   140  	err = db.Close()
   141  	logAndCheckErr("closing", err, t)
   142  
   143  	db, err = OpenLSMTree(opt)
   144  	logAndCheckErr("opening", err, t)
   145  
   146  	key := []byte("Hi!")
   147  	val, err := db.Get(key)
   148  	logAndCheckErr("get (1st)", err, t)
   149  	fmt.Printf("get(%q)=%q\n", key, val)
   150  
   151  	key = []byte("Does it override key?")
   152  	val, err = db.Get(key)
   153  	logAndCheckErr("get (2nd)", err, t)
   154  	fmt.Printf("get(%q)=%q\n", key, val)
   155  
   156  	err = db.Close()
   157  	logAndCheckErr("closing", err, t)
   158  
   159  	// Expected output:
   160  	// Hello world, LSMTree!
   161  	// Yes, absolutely! The key has been overridden.
   162  }
   163  
   164  func TestLSMTreeForceFlush(t *testing.T) {
   165  
   166  	db, err := OpenLSMTree(opt)
   167  	logAndCheckErr("opening", err, t)
   168  
   169  	for i := 0; i < 2000; i++ {
   170  		key := makeData("key", i)
   171  		err = db.Put(key, []byte(mdVal))
   172  		logAndCheckErr("put("+fmt.Sprintf("%s", key)+")", err, t)
   173  	}
   174  
   175  	err = db.Close()
   176  	logAndCheckErr("closing", err, t)
   177  
   178  	// Expected output:
   179  	// Hello world, LSMTree!
   180  	// Yes, absolutely! The key has been overridden.
   181  }
   182  
   183  var smVal = `Praesent efficitur, ante eget eleifend scelerisque, neque erat malesuada neque, vel euismod 
   184  dui leo a nisl. Donec a eleifend dui. Maecenas necleo odio. In maximus convallis ligula eget sodales.`
   185  
   186  var mdVal = `Quisque bibendum tellus ac odio dictum vulputate. Sed imperdiet enim eget tortor vehicula, 
   187  nec vehicula erat lacinia. Praesent et bibendum turpis. Mauris ac blandit nulla, ac dignissim 
   188  quam. Ut ut est placerat quam suscipit sodales a quis lacus. Praesent hendrerit mattis diam et 
   189  sodales. In a augue sit amet odio iaculis tempus sed a erat. Donec quis nisi tellus. Nam hendrerit 
   190  purus ligula, id bibendum metus pulvinar sed. Nulla eu neque lobortis, porta elit quis, luctus 
   191  purus. Vestibulum et ultrices nulla. Curabitur sagittis, sem sed elementum aliquam, dui mauris 
   192  interdum libero, ullamcorper convallis urna tortor ornare metus. Integer non nibh id diam accumsan 
   193  tincidunt. Quisque sed felis aliquet, luctus dolor vitae, porta nibh. Vestibulum ac est mollis, 
   194  sodales erat et, pharetra nibh. Maecenas porta diam in elit venenatis, sed bibendum orci 
   195  feugiat. Suspendisse diam enim, dictum quis magna sed, aliquet porta turpis. Etiam scelerisque 
   196  aliquam neque, vel iaculis nibh laoreet ac. Sed placerat, arcu eu feugiat ullamcorper, massa 
   197  justo aliquet lorem, id imperdiet neque ipsum id diam. Vestibulum semper felis urna, sit amet 
   198  volutpat est porttitor nec. Phasellus lacinia volutpat orci, id eleifend ipsum semper non. 
   199  `
   200  
   201  var lgVal = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent libero turpis, aliquam quis 
   202  consequat ac, volutpat et arcu. Nullam varius, ligula eu venenatis dignissim, lectus ligula 
   203  ullamcorper odio, in rhoncus nisi nisl congue sem. In hac habitasse platea dictumst. Donec 
   204  sem est, rutrum ut libero nec, placerat vehicula neque. Nulla mollis dictum nunc, ut viverra 
   205  ex. Nam ac lacus at quam rhoncus finibus. Praesent efficitur, ante eget eleifend scelerisque, 
   206  neque erat malesuada neque, vel euismod dui leo a nisl. Donec a eleifend dui. Maecenas nec 
   207  leo odio. In maximus convallis ligula eget sodales. Nullam a mi hendrerit, finibus dolor eu, 
   208  pellentesque ligula. Proin ultricies vitae neque sit amet tempus. Sed a purus enim. Maecenas 
   209  maximus placerat risus, at commodo libero consectetur sed. Nullam pulvinar lobortis augue in 
   210  pulvinar. Aliquam erat volutpat. Vestibulum eget felis egestas, sollicitudin sem eu, venenatis 
   211  metus. Nam ac eros vel sem suscipit facilisis in ut ligula. Nulla porta eros eu arcu efficitur 
   212  molestie. Proin tristique eget quam quis ullamcorper. Integer pretium tellus non sapien euismod, 
   213  et ultrices leo placerat. Suspendisse potenti. Aenean pulvinar pretium diam, lobortis pretium 
   214  sapien congue quis. Fusce tempor, diam id commodo maximus, mi turpis rhoncus orci, ut blandit 
   215  ipsum turpis congue dolor. Aenean lobortis, turpis nec dignissim pulvinar, sem massa bibendum 
   216  lorem, ut scelerisque nibh odio sed odio. Sed sed nulla lectus. Donec vitae ipsum dolor. Donec 
   217  eu gravida lectus. In tempor ultrices malesuada. Cras sodales in lacus et volutpat. Vivamus 
   218  nibh ante, egestas vitae faucibus id, consectetur at augue. Pellentesque habitant morbi tristique 
   219  senectus et netus et malesuada fames ac turpis egestas. Pellentesque quis velit non quam convallis 
   220  molestie sit amet sit amet metus. Aenean eget sapien nisl. Lorem ipsum dolor sit amet, consectetur 
   221  adipiscing elit. Donec maximus nisi in nunc pellentesque imperdiet. Aliquam erat volutpat. 
   222  Quisque bibendum tellus ac odio dictum vulputate. Sed imperdiet enim eget tortor vehicula, nec 
   223  vehicula erat lacinia. Praesent et bibendum turpis. Mauris ac blandit nulla, ac dignissim quam. 
   224  Ut ut est placerat quam suscipit sodales a quis lacus. Praesent hendrerit mattis diam et sodales. 
   225  In a augue sit amet odio iaculis tempus sed a erat. Donec quis nisi tellus. Nam hendrerit purus 
   226  ligula, id bibendum metus pulvinar sed. Nulla eu neque lobortis, porta elit quis, luctus purus. 
   227  Vestibulum et ultrices nulla. Curabitur sagittis, sem sed elementum aliquam, dui mauris interdum 
   228  libero, ullamcorper convallis urna tortor ornare metus. Integer non nibh id diam accumsan 
   229  tincidunt. Quisque sed felis aliquet, luctus dolor vitae, porta nibh. Vestibulum ac est mollis, 
   230  sodales erat et, pharetra nibh. Maecenas porta diam in elit venenatis, sed bibendum orci 
   231  feugiat. Suspendisse diam enim, dictum quis magna sed, aliquet porta turpis. Etiam scelerisque 
   232  aliquam neque, vel iaculis nibh laoreet ac. Sed placerat, arcu eu feugiat ullamcorper, massa 
   233  justo aliquet lorem, id imperdiet neque ipsum id diam. Vestibulum semper felis urna, sit amet 
   234  volutpat est porttitor nec. Phasellus lacinia volutpat orci, id eleifend ipsum semper non. 
   235  Pellentesque quis velit non quam convallis molestie sit amet sit amet metus. Aenean eget sapien 
   236  nisl. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec maximus nisi in nunc 
   237  pellentesque imperdiet. Aliquam erat volutpat. Quisque bibendum tellus ac odio dictum vulputate. 
   238  Sed imperdiet enim eget tortor vehicula, nec vehicula erat lacinia. Praesent et bibendum turpis. 
   239  Mauris ac blandit nulla, ac dignissim quam. Ut ut est placerat quam suscipit sodales a quis 
   240  lacus. Praesent hendrerit mattis diam et sodales. In a augue sit amet odio iaculis tempus sed 
   241  a erat. Donec quis nisi tellus. Nam hendrerit purus ligula, id bibendum metus pulvinar sed. 
   242  Nulla eu neque lobortis, porta elit quis, luctus purus. Vestibulum et ultrices nulla.`