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.`