1 // Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
2 //  This source code is licensed under both the GPLv2 (found in the
3 //  COPYING file in the root directory) and Apache 2.0 License
4 //  (found in the LICENSE.Apache file in the root directory).
5 
6 package org.rocksdb;
7 
8 import static org.assertj.core.api.Assertions.assertThat;
9 import static org.junit.Assert.*;
10 
11 import java.io.IOException;
12 import java.nio.file.Files;
13 import java.nio.file.Paths;
14 import java.util.*;
15 import java.util.concurrent.atomic.AtomicBoolean;
16 import org.junit.ClassRule;
17 import org.junit.Test;
18 import org.rocksdb.test.RemoveEmptyValueCompactionFilterFactory;
19 
20 public class OptionsTest {
21 
22   @ClassRule
23   public static final RocksNativeLibraryResource ROCKS_NATIVE_LIBRARY_RESOURCE =
24       new RocksNativeLibraryResource();
25 
26   public static final Random rand = PlatformRandomHelper.
27       getPlatformSpecificRandomFactory();
28 
29   @Test
copyConstructor()30   public void copyConstructor() {
31     Options origOpts = new Options();
32     origOpts.setNumLevels(rand.nextInt(8));
33     origOpts.setTargetFileSizeMultiplier(rand.nextInt(100));
34     origOpts.setLevel0StopWritesTrigger(rand.nextInt(50));
35     Options copyOpts = new Options(origOpts);
36     assertThat(origOpts.numLevels()).isEqualTo(copyOpts.numLevels());
37     assertThat(origOpts.targetFileSizeMultiplier()).isEqualTo(copyOpts.targetFileSizeMultiplier());
38     assertThat(origOpts.level0StopWritesTrigger()).isEqualTo(copyOpts.level0StopWritesTrigger());
39   }
40 
41   @Test
setIncreaseParallelism()42   public void setIncreaseParallelism() {
43     try (final Options opt = new Options()) {
44       final int threads = Runtime.getRuntime().availableProcessors() * 2;
45       opt.setIncreaseParallelism(threads);
46     }
47   }
48 
49   @Test
writeBufferSize()50   public void writeBufferSize() throws RocksDBException {
51     try (final Options opt = new Options()) {
52       final long longValue = rand.nextLong();
53       opt.setWriteBufferSize(longValue);
54       assertThat(opt.writeBufferSize()).isEqualTo(longValue);
55     }
56   }
57 
58   @Test
maxWriteBufferNumber()59   public void maxWriteBufferNumber() {
60     try (final Options opt = new Options()) {
61       final int intValue = rand.nextInt();
62       opt.setMaxWriteBufferNumber(intValue);
63       assertThat(opt.maxWriteBufferNumber()).isEqualTo(intValue);
64     }
65   }
66 
67   @Test
minWriteBufferNumberToMerge()68   public void minWriteBufferNumberToMerge() {
69     try (final Options opt = new Options()) {
70       final int intValue = rand.nextInt();
71       opt.setMinWriteBufferNumberToMerge(intValue);
72       assertThat(opt.minWriteBufferNumberToMerge()).isEqualTo(intValue);
73     }
74   }
75 
76   @Test
numLevels()77   public void numLevels() {
78     try (final Options opt = new Options()) {
79       final int intValue = rand.nextInt();
80       opt.setNumLevels(intValue);
81       assertThat(opt.numLevels()).isEqualTo(intValue);
82     }
83   }
84 
85   @Test
levelZeroFileNumCompactionTrigger()86   public void levelZeroFileNumCompactionTrigger() {
87     try (final Options opt = new Options()) {
88       final int intValue = rand.nextInt();
89       opt.setLevelZeroFileNumCompactionTrigger(intValue);
90       assertThat(opt.levelZeroFileNumCompactionTrigger()).isEqualTo(intValue);
91     }
92   }
93 
94   @Test
levelZeroSlowdownWritesTrigger()95   public void levelZeroSlowdownWritesTrigger() {
96     try (final Options opt = new Options()) {
97       final int intValue = rand.nextInt();
98       opt.setLevelZeroSlowdownWritesTrigger(intValue);
99       assertThat(opt.levelZeroSlowdownWritesTrigger()).isEqualTo(intValue);
100     }
101   }
102 
103   @Test
levelZeroStopWritesTrigger()104   public void levelZeroStopWritesTrigger() {
105     try (final Options opt = new Options()) {
106       final int intValue = rand.nextInt();
107       opt.setLevelZeroStopWritesTrigger(intValue);
108       assertThat(opt.levelZeroStopWritesTrigger()).isEqualTo(intValue);
109     }
110   }
111 
112   @Test
targetFileSizeBase()113   public void targetFileSizeBase() {
114     try (final Options opt = new Options()) {
115       final long longValue = rand.nextLong();
116       opt.setTargetFileSizeBase(longValue);
117       assertThat(opt.targetFileSizeBase()).isEqualTo(longValue);
118     }
119   }
120 
121   @Test
targetFileSizeMultiplier()122   public void targetFileSizeMultiplier() {
123     try (final Options opt = new Options()) {
124       final int intValue = rand.nextInt();
125       opt.setTargetFileSizeMultiplier(intValue);
126       assertThat(opt.targetFileSizeMultiplier()).isEqualTo(intValue);
127     }
128   }
129 
130   @Test
maxBytesForLevelBase()131   public void maxBytesForLevelBase() {
132     try (final Options opt = new Options()) {
133       final long longValue = rand.nextLong();
134       opt.setMaxBytesForLevelBase(longValue);
135       assertThat(opt.maxBytesForLevelBase()).isEqualTo(longValue);
136     }
137   }
138 
139   @Test
levelCompactionDynamicLevelBytes()140   public void levelCompactionDynamicLevelBytes() {
141     try (final Options opt = new Options()) {
142       final boolean boolValue = rand.nextBoolean();
143       opt.setLevelCompactionDynamicLevelBytes(boolValue);
144       assertThat(opt.levelCompactionDynamicLevelBytes())
145           .isEqualTo(boolValue);
146     }
147   }
148 
149   @Test
maxBytesForLevelMultiplier()150   public void maxBytesForLevelMultiplier() {
151     try (final Options opt = new Options()) {
152       final double doubleValue = rand.nextDouble();
153       opt.setMaxBytesForLevelMultiplier(doubleValue);
154       assertThat(opt.maxBytesForLevelMultiplier()).isEqualTo(doubleValue);
155     }
156   }
157 
158   @Test
maxBytesForLevelMultiplierAdditional()159   public void maxBytesForLevelMultiplierAdditional() {
160     try (final Options opt = new Options()) {
161       final int intValue1 = rand.nextInt();
162       final int intValue2 = rand.nextInt();
163       final int[] ints = new int[]{intValue1, intValue2};
164       opt.setMaxBytesForLevelMultiplierAdditional(ints);
165       assertThat(opt.maxBytesForLevelMultiplierAdditional()).isEqualTo(ints);
166     }
167   }
168 
169   @Test
maxCompactionBytes()170   public void maxCompactionBytes() {
171     try (final Options opt = new Options()) {
172       final long longValue = rand.nextLong();
173       opt.setMaxCompactionBytes(longValue);
174       assertThat(opt.maxCompactionBytes()).isEqualTo(longValue);
175     }
176   }
177 
178   @Test
softPendingCompactionBytesLimit()179   public void softPendingCompactionBytesLimit() {
180     try (final Options opt = new Options()) {
181       final long longValue = rand.nextLong();
182       opt.setSoftPendingCompactionBytesLimit(longValue);
183       assertThat(opt.softPendingCompactionBytesLimit()).isEqualTo(longValue);
184     }
185   }
186 
187   @Test
hardPendingCompactionBytesLimit()188   public void hardPendingCompactionBytesLimit() {
189     try (final Options opt = new Options()) {
190       final long longValue = rand.nextLong();
191       opt.setHardPendingCompactionBytesLimit(longValue);
192       assertThat(opt.hardPendingCompactionBytesLimit()).isEqualTo(longValue);
193     }
194   }
195 
196   @Test
level0FileNumCompactionTrigger()197   public void level0FileNumCompactionTrigger() {
198     try (final Options opt = new Options()) {
199       final int intValue = rand.nextInt();
200       opt.setLevel0FileNumCompactionTrigger(intValue);
201       assertThat(opt.level0FileNumCompactionTrigger()).isEqualTo(intValue);
202     }
203   }
204 
205   @Test
level0SlowdownWritesTrigger()206   public void level0SlowdownWritesTrigger() {
207     try (final Options opt = new Options()) {
208       final int intValue = rand.nextInt();
209       opt.setLevel0SlowdownWritesTrigger(intValue);
210       assertThat(opt.level0SlowdownWritesTrigger()).isEqualTo(intValue);
211     }
212   }
213 
214   @Test
level0StopWritesTrigger()215   public void level0StopWritesTrigger() {
216     try (final Options opt = new Options()) {
217       final int intValue = rand.nextInt();
218       opt.setLevel0StopWritesTrigger(intValue);
219       assertThat(opt.level0StopWritesTrigger()).isEqualTo(intValue);
220     }
221   }
222 
223   @Test
arenaBlockSize()224   public void arenaBlockSize() throws RocksDBException {
225     try (final Options opt = new Options()) {
226       final long longValue = rand.nextLong();
227       opt.setArenaBlockSize(longValue);
228       assertThat(opt.arenaBlockSize()).isEqualTo(longValue);
229     }
230   }
231 
232   @Test
disableAutoCompactions()233   public void disableAutoCompactions() {
234     try (final Options opt = new Options()) {
235       final boolean boolValue = rand.nextBoolean();
236       opt.setDisableAutoCompactions(boolValue);
237       assertThat(opt.disableAutoCompactions()).isEqualTo(boolValue);
238     }
239   }
240 
241   @Test
maxSequentialSkipInIterations()242   public void maxSequentialSkipInIterations() {
243     try (final Options opt = new Options()) {
244       final long longValue = rand.nextLong();
245       opt.setMaxSequentialSkipInIterations(longValue);
246       assertThat(opt.maxSequentialSkipInIterations()).isEqualTo(longValue);
247     }
248   }
249 
250   @Test
inplaceUpdateSupport()251   public void inplaceUpdateSupport() {
252     try (final Options opt = new Options()) {
253       final boolean boolValue = rand.nextBoolean();
254       opt.setInplaceUpdateSupport(boolValue);
255       assertThat(opt.inplaceUpdateSupport()).isEqualTo(boolValue);
256     }
257   }
258 
259   @Test
inplaceUpdateNumLocks()260   public void inplaceUpdateNumLocks() throws RocksDBException {
261     try (final Options opt = new Options()) {
262       final long longValue = rand.nextLong();
263       opt.setInplaceUpdateNumLocks(longValue);
264       assertThat(opt.inplaceUpdateNumLocks()).isEqualTo(longValue);
265     }
266   }
267 
268   @Test
memtablePrefixBloomSizeRatio()269   public void memtablePrefixBloomSizeRatio() {
270     try (final Options opt = new Options()) {
271       final double doubleValue = rand.nextDouble();
272       opt.setMemtablePrefixBloomSizeRatio(doubleValue);
273       assertThat(opt.memtablePrefixBloomSizeRatio()).isEqualTo(doubleValue);
274     }
275   }
276 
277   @Test
memtableHugePageSize()278   public void memtableHugePageSize() {
279     try (final Options opt = new Options()) {
280       final long longValue = rand.nextLong();
281       opt.setMemtableHugePageSize(longValue);
282       assertThat(opt.memtableHugePageSize()).isEqualTo(longValue);
283     }
284   }
285 
286   @Test
bloomLocality()287   public void bloomLocality() {
288     try (final Options opt = new Options()) {
289       final int intValue = rand.nextInt();
290       opt.setBloomLocality(intValue);
291       assertThat(opt.bloomLocality()).isEqualTo(intValue);
292     }
293   }
294 
295   @Test
maxSuccessiveMerges()296   public void maxSuccessiveMerges() throws RocksDBException {
297     try (final Options opt = new Options()) {
298       final long longValue = rand.nextLong();
299       opt.setMaxSuccessiveMerges(longValue);
300       assertThat(opt.maxSuccessiveMerges()).isEqualTo(longValue);
301     }
302   }
303 
304   @Test
optimizeFiltersForHits()305   public void optimizeFiltersForHits() {
306     try (final Options opt = new Options()) {
307       final boolean aBoolean = rand.nextBoolean();
308       opt.setOptimizeFiltersForHits(aBoolean);
309       assertThat(opt.optimizeFiltersForHits()).isEqualTo(aBoolean);
310     }
311   }
312 
313   @Test
createIfMissing()314   public void createIfMissing() {
315     try (final Options opt = new Options()) {
316       final boolean boolValue = rand.nextBoolean();
317       opt.setCreateIfMissing(boolValue);
318       assertThat(opt.createIfMissing()).
319           isEqualTo(boolValue);
320     }
321   }
322 
323   @Test
createMissingColumnFamilies()324   public void createMissingColumnFamilies() {
325     try (final Options opt = new Options()) {
326       final boolean boolValue = rand.nextBoolean();
327       opt.setCreateMissingColumnFamilies(boolValue);
328       assertThat(opt.createMissingColumnFamilies()).
329           isEqualTo(boolValue);
330     }
331   }
332 
333   @Test
errorIfExists()334   public void errorIfExists() {
335     try (final Options opt = new Options()) {
336       final boolean boolValue = rand.nextBoolean();
337       opt.setErrorIfExists(boolValue);
338       assertThat(opt.errorIfExists()).isEqualTo(boolValue);
339     }
340   }
341 
342   @Test
paranoidChecks()343   public void paranoidChecks() {
344     try (final Options opt = new Options()) {
345       final boolean boolValue = rand.nextBoolean();
346       opt.setParanoidChecks(boolValue);
347       assertThat(opt.paranoidChecks()).
348           isEqualTo(boolValue);
349     }
350   }
351 
352   @Test
maxTotalWalSize()353   public void maxTotalWalSize() {
354     try (final Options opt = new Options()) {
355       final long longValue = rand.nextLong();
356       opt.setMaxTotalWalSize(longValue);
357       assertThat(opt.maxTotalWalSize()).
358           isEqualTo(longValue);
359     }
360   }
361 
362   @Test
maxOpenFiles()363   public void maxOpenFiles() {
364     try (final Options opt = new Options()) {
365       final int intValue = rand.nextInt();
366       opt.setMaxOpenFiles(intValue);
367       assertThat(opt.maxOpenFiles()).isEqualTo(intValue);
368     }
369   }
370 
371   @Test
maxFileOpeningThreads()372   public void maxFileOpeningThreads() {
373     try (final Options opt = new Options()) {
374       final int intValue = rand.nextInt();
375       opt.setMaxFileOpeningThreads(intValue);
376       assertThat(opt.maxFileOpeningThreads()).isEqualTo(intValue);
377     }
378   }
379 
380   @Test
useFsync()381   public void useFsync() {
382     try (final Options opt = new Options()) {
383       final boolean boolValue = rand.nextBoolean();
384       opt.setUseFsync(boolValue);
385       assertThat(opt.useFsync()).isEqualTo(boolValue);
386     }
387   }
388 
389   @Test
dbPaths()390   public void dbPaths() {
391     final List<DbPath> dbPaths = new ArrayList<>();
392     dbPaths.add(new DbPath(Paths.get("/a"), 10));
393     dbPaths.add(new DbPath(Paths.get("/b"), 100));
394     dbPaths.add(new DbPath(Paths.get("/c"), 1000));
395 
396     try (final Options opt = new Options()) {
397       assertThat(opt.dbPaths()).isEqualTo(Collections.emptyList());
398 
399       opt.setDbPaths(dbPaths);
400 
401       assertThat(opt.dbPaths()).isEqualTo(dbPaths);
402     }
403   }
404 
405   @Test
dbLogDir()406   public void dbLogDir() {
407     try (final Options opt = new Options()) {
408       final String str = "path/to/DbLogDir";
409       opt.setDbLogDir(str);
410       assertThat(opt.dbLogDir()).isEqualTo(str);
411     }
412   }
413 
414   @Test
walDir()415   public void walDir() {
416     try (final Options opt = new Options()) {
417       final String str = "path/to/WalDir";
418       opt.setWalDir(str);
419       assertThat(opt.walDir()).isEqualTo(str);
420     }
421   }
422 
423   @Test
deleteObsoleteFilesPeriodMicros()424   public void deleteObsoleteFilesPeriodMicros() {
425     try (final Options opt = new Options()) {
426       final long longValue = rand.nextLong();
427       opt.setDeleteObsoleteFilesPeriodMicros(longValue);
428       assertThat(opt.deleteObsoleteFilesPeriodMicros()).
429           isEqualTo(longValue);
430     }
431   }
432 
433   @SuppressWarnings("deprecated")
434   @Test
baseBackgroundCompactions()435   public void baseBackgroundCompactions() {
436     try (final Options opt = new Options()) {
437       final int intValue = rand.nextInt();
438       opt.setBaseBackgroundCompactions(intValue);
439       assertThat(opt.baseBackgroundCompactions()).
440           isEqualTo(intValue);
441     }
442   }
443 
444   @SuppressWarnings("deprecated")
445   @Test
maxBackgroundCompactions()446   public void maxBackgroundCompactions() {
447     try (final Options opt = new Options()) {
448       final int intValue = rand.nextInt();
449       opt.setMaxBackgroundCompactions(intValue);
450       assertThat(opt.maxBackgroundCompactions()).
451           isEqualTo(intValue);
452     }
453   }
454 
455   @Test
maxSubcompactions()456   public void maxSubcompactions() {
457     try (final Options opt = new Options()) {
458       final int intValue = rand.nextInt();
459       opt.setMaxSubcompactions(intValue);
460       assertThat(opt.maxSubcompactions()).
461           isEqualTo(intValue);
462     }
463   }
464 
465   @SuppressWarnings("deprecated")
466   @Test
maxBackgroundFlushes()467   public void maxBackgroundFlushes() {
468     try (final Options opt = new Options()) {
469       final int intValue = rand.nextInt();
470       opt.setMaxBackgroundFlushes(intValue);
471       assertThat(opt.maxBackgroundFlushes()).
472           isEqualTo(intValue);
473     }
474   }
475 
476   @Test
maxBackgroundJobs()477   public void maxBackgroundJobs() {
478     try (final Options opt = new Options()) {
479       final int intValue = rand.nextInt();
480       opt.setMaxBackgroundJobs(intValue);
481       assertThat(opt.maxBackgroundJobs()).isEqualTo(intValue);
482     }
483   }
484 
485   @Test
maxLogFileSize()486   public void maxLogFileSize() throws RocksDBException {
487     try (final Options opt = new Options()) {
488       final long longValue = rand.nextLong();
489       opt.setMaxLogFileSize(longValue);
490       assertThat(opt.maxLogFileSize()).isEqualTo(longValue);
491     }
492   }
493 
494   @Test
logFileTimeToRoll()495   public void logFileTimeToRoll() throws RocksDBException {
496     try (final Options opt = new Options()) {
497       final long longValue = rand.nextLong();
498       opt.setLogFileTimeToRoll(longValue);
499       assertThat(opt.logFileTimeToRoll()).
500           isEqualTo(longValue);
501     }
502   }
503 
504   @Test
keepLogFileNum()505   public void keepLogFileNum() throws RocksDBException {
506     try (final Options opt = new Options()) {
507       final long longValue = rand.nextLong();
508       opt.setKeepLogFileNum(longValue);
509       assertThat(opt.keepLogFileNum()).isEqualTo(longValue);
510     }
511   }
512 
513   @Test
recycleLogFileNum()514   public void recycleLogFileNum() throws RocksDBException {
515     try (final Options opt = new Options()) {
516       final long longValue = rand.nextLong();
517       opt.setRecycleLogFileNum(longValue);
518       assertThat(opt.recycleLogFileNum()).isEqualTo(longValue);
519     }
520   }
521 
522   @Test
maxManifestFileSize()523   public void maxManifestFileSize() {
524     try (final Options opt = new Options()) {
525       final long longValue = rand.nextLong();
526       opt.setMaxManifestFileSize(longValue);
527       assertThat(opt.maxManifestFileSize()).
528           isEqualTo(longValue);
529     }
530   }
531 
532   @Test
tableCacheNumshardbits()533   public void tableCacheNumshardbits() {
534     try (final Options opt = new Options()) {
535       final int intValue = rand.nextInt();
536       opt.setTableCacheNumshardbits(intValue);
537       assertThat(opt.tableCacheNumshardbits()).
538           isEqualTo(intValue);
539     }
540   }
541 
542   @Test
walSizeLimitMB()543   public void walSizeLimitMB() {
544     try (final Options opt = new Options()) {
545       final long longValue = rand.nextLong();
546       opt.setWalSizeLimitMB(longValue);
547       assertThat(opt.walSizeLimitMB()).isEqualTo(longValue);
548     }
549   }
550 
551   @Test
walTtlSeconds()552   public void walTtlSeconds() {
553     try (final Options opt = new Options()) {
554       final long longValue = rand.nextLong();
555       opt.setWalTtlSeconds(longValue);
556       assertThat(opt.walTtlSeconds()).isEqualTo(longValue);
557     }
558   }
559 
560   @Test
manifestPreallocationSize()561   public void manifestPreallocationSize() throws RocksDBException {
562     try (final Options opt = new Options()) {
563       final long longValue = rand.nextLong();
564       opt.setManifestPreallocationSize(longValue);
565       assertThat(opt.manifestPreallocationSize()).
566           isEqualTo(longValue);
567     }
568   }
569 
570   @Test
useDirectReads()571   public void useDirectReads() {
572     try(final Options opt = new Options()) {
573       final boolean boolValue = rand.nextBoolean();
574       opt.setUseDirectReads(boolValue);
575       assertThat(opt.useDirectReads()).isEqualTo(boolValue);
576     }
577   }
578 
579   @Test
useDirectIoForFlushAndCompaction()580   public void useDirectIoForFlushAndCompaction() {
581     try(final Options opt = new Options()) {
582       final boolean boolValue = rand.nextBoolean();
583       opt.setUseDirectIoForFlushAndCompaction(boolValue);
584       assertThat(opt.useDirectIoForFlushAndCompaction()).isEqualTo(boolValue);
585     }
586   }
587 
588   @Test
allowFAllocate()589   public void allowFAllocate() {
590     try (final Options opt = new Options()) {
591       final boolean boolValue = rand.nextBoolean();
592       opt.setAllowFAllocate(boolValue);
593       assertThat(opt.allowFAllocate()).isEqualTo(boolValue);
594     }
595   }
596 
597   @Test
allowMmapReads()598   public void allowMmapReads() {
599     try (final Options opt = new Options()) {
600       final boolean boolValue = rand.nextBoolean();
601       opt.setAllowMmapReads(boolValue);
602       assertThat(opt.allowMmapReads()).isEqualTo(boolValue);
603     }
604   }
605 
606   @Test
allowMmapWrites()607   public void allowMmapWrites() {
608     try (final Options opt = new Options()) {
609       final boolean boolValue = rand.nextBoolean();
610       opt.setAllowMmapWrites(boolValue);
611       assertThat(opt.allowMmapWrites()).isEqualTo(boolValue);
612     }
613   }
614 
615   @Test
isFdCloseOnExec()616   public void isFdCloseOnExec() {
617     try (final Options opt = new Options()) {
618       final boolean boolValue = rand.nextBoolean();
619       opt.setIsFdCloseOnExec(boolValue);
620       assertThat(opt.isFdCloseOnExec()).isEqualTo(boolValue);
621     }
622   }
623 
624   @Test
statsDumpPeriodSec()625   public void statsDumpPeriodSec() {
626     try (final Options opt = new Options()) {
627       final int intValue = rand.nextInt();
628       opt.setStatsDumpPeriodSec(intValue);
629       assertThat(opt.statsDumpPeriodSec()).isEqualTo(intValue);
630     }
631   }
632 
633   @Test
statsPersistPeriodSec()634   public void statsPersistPeriodSec() {
635     try (final Options opt = new Options()) {
636       final int intValue = rand.nextInt();
637       opt.setStatsPersistPeriodSec(intValue);
638       assertThat(opt.statsPersistPeriodSec()).isEqualTo(intValue);
639     }
640   }
641 
642   @Test
statsHistoryBufferSize()643   public void statsHistoryBufferSize() {
644     try (final Options opt = new Options()) {
645       final long longValue = rand.nextLong();
646       opt.setStatsHistoryBufferSize(longValue);
647       assertThat(opt.statsHistoryBufferSize()).isEqualTo(longValue);
648     }
649   }
650 
651   @Test
adviseRandomOnOpen()652   public void adviseRandomOnOpen() {
653     try (final Options opt = new Options()) {
654       final boolean boolValue = rand.nextBoolean();
655       opt.setAdviseRandomOnOpen(boolValue);
656       assertThat(opt.adviseRandomOnOpen()).isEqualTo(boolValue);
657     }
658   }
659 
660   @Test
dbWriteBufferSize()661   public void dbWriteBufferSize() {
662     try (final Options opt = new Options()) {
663       final long longValue = rand.nextLong();
664       opt.setDbWriteBufferSize(longValue);
665       assertThat(opt.dbWriteBufferSize()).isEqualTo(longValue);
666     }
667   }
668 
669   @Test
setWriteBufferManager()670   public void setWriteBufferManager() throws RocksDBException {
671     try (final Options opt = new Options();
672          final Cache cache = new LRUCache(1 * 1024 * 1024);
673          final WriteBufferManager writeBufferManager = new WriteBufferManager(2000l, cache)) {
674       opt.setWriteBufferManager(writeBufferManager);
675       assertThat(opt.writeBufferManager()).isEqualTo(writeBufferManager);
676     }
677   }
678 
679   @Test
setWriteBufferManagerWithZeroBufferSize()680   public void setWriteBufferManagerWithZeroBufferSize() throws RocksDBException {
681     try (final Options opt = new Options();
682          final Cache cache = new LRUCache(1 * 1024 * 1024);
683          final WriteBufferManager writeBufferManager = new WriteBufferManager(0l, cache)) {
684       opt.setWriteBufferManager(writeBufferManager);
685       assertThat(opt.writeBufferManager()).isEqualTo(writeBufferManager);
686     }
687   }
688 
689   @Test
accessHintOnCompactionStart()690   public void accessHintOnCompactionStart() {
691     try (final Options opt = new Options()) {
692       final AccessHint accessHint = AccessHint.SEQUENTIAL;
693       opt.setAccessHintOnCompactionStart(accessHint);
694       assertThat(opt.accessHintOnCompactionStart()).isEqualTo(accessHint);
695     }
696   }
697 
698   @Test
newTableReaderForCompactionInputs()699   public void newTableReaderForCompactionInputs() {
700     try (final Options opt = new Options()) {
701       final boolean boolValue = rand.nextBoolean();
702       opt.setNewTableReaderForCompactionInputs(boolValue);
703       assertThat(opt.newTableReaderForCompactionInputs()).isEqualTo(boolValue);
704     }
705   }
706 
707   @Test
compactionReadaheadSize()708   public void compactionReadaheadSize() {
709     try (final Options opt = new Options()) {
710       final long longValue = rand.nextLong();
711       opt.setCompactionReadaheadSize(longValue);
712       assertThat(opt.compactionReadaheadSize()).isEqualTo(longValue);
713     }
714   }
715 
716   @Test
randomAccessMaxBufferSize()717   public void randomAccessMaxBufferSize() {
718     try (final Options opt = new Options()) {
719       final long longValue = rand.nextLong();
720       opt.setRandomAccessMaxBufferSize(longValue);
721       assertThat(opt.randomAccessMaxBufferSize()).isEqualTo(longValue);
722     }
723   }
724 
725   @Test
writableFileMaxBufferSize()726   public void writableFileMaxBufferSize() {
727     try (final Options opt = new Options()) {
728       final long longValue = rand.nextLong();
729       opt.setWritableFileMaxBufferSize(longValue);
730       assertThat(opt.writableFileMaxBufferSize()).isEqualTo(longValue);
731     }
732   }
733 
734   @Test
useAdaptiveMutex()735   public void useAdaptiveMutex() {
736     try (final Options opt = new Options()) {
737       final boolean boolValue = rand.nextBoolean();
738       opt.setUseAdaptiveMutex(boolValue);
739       assertThat(opt.useAdaptiveMutex()).isEqualTo(boolValue);
740     }
741   }
742 
743   @Test
bytesPerSync()744   public void bytesPerSync() {
745     try (final Options opt = new Options()) {
746       final long longValue = rand.nextLong();
747       opt.setBytesPerSync(longValue);
748       assertThat(opt.bytesPerSync()).isEqualTo(longValue);
749     }
750   }
751 
752   @Test
walBytesPerSync()753   public void walBytesPerSync() {
754     try (final Options opt = new Options()) {
755       final long longValue = rand.nextLong();
756       opt.setWalBytesPerSync(longValue);
757       assertThat(opt.walBytesPerSync()).isEqualTo(longValue);
758     }
759   }
760 
761   @Test
strictBytesPerSync()762   public void strictBytesPerSync() {
763     try (final Options opt = new Options()) {
764       assertThat(opt.strictBytesPerSync()).isFalse();
765       opt.setStrictBytesPerSync(true);
766       assertThat(opt.strictBytesPerSync()).isTrue();
767     }
768   }
769 
770   @Test
enableThreadTracking()771   public void enableThreadTracking() {
772     try (final Options opt = new Options()) {
773       final boolean boolValue = rand.nextBoolean();
774       opt.setEnableThreadTracking(boolValue);
775       assertThat(opt.enableThreadTracking()).isEqualTo(boolValue);
776     }
777   }
778 
779   @Test
delayedWriteRate()780   public void delayedWriteRate() {
781     try (final Options opt = new Options()) {
782       final long longValue = rand.nextLong();
783       opt.setDelayedWriteRate(longValue);
784       assertThat(opt.delayedWriteRate()).isEqualTo(longValue);
785     }
786   }
787 
788   @Test
enablePipelinedWrite()789   public void enablePipelinedWrite() {
790     try(final Options opt = new Options()) {
791       assertThat(opt.enablePipelinedWrite()).isFalse();
792       opt.setEnablePipelinedWrite(true);
793       assertThat(opt.enablePipelinedWrite()).isTrue();
794     }
795   }
796 
797   @Test
unordredWrite()798   public void unordredWrite() {
799     try(final Options opt = new Options()) {
800       assertThat(opt.unorderedWrite()).isFalse();
801       opt.setUnorderedWrite(true);
802       assertThat(opt.unorderedWrite()).isTrue();
803     }
804   }
805 
806   @Test
allowConcurrentMemtableWrite()807   public void allowConcurrentMemtableWrite() {
808     try (final Options opt = new Options()) {
809       final boolean boolValue = rand.nextBoolean();
810       opt.setAllowConcurrentMemtableWrite(boolValue);
811       assertThat(opt.allowConcurrentMemtableWrite()).isEqualTo(boolValue);
812     }
813   }
814 
815   @Test
enableWriteThreadAdaptiveYield()816   public void enableWriteThreadAdaptiveYield() {
817     try (final Options opt = new Options()) {
818       final boolean boolValue = rand.nextBoolean();
819       opt.setEnableWriteThreadAdaptiveYield(boolValue);
820       assertThat(opt.enableWriteThreadAdaptiveYield()).isEqualTo(boolValue);
821     }
822   }
823 
824   @Test
writeThreadMaxYieldUsec()825   public void writeThreadMaxYieldUsec() {
826     try (final Options opt = new Options()) {
827       final long longValue = rand.nextLong();
828       opt.setWriteThreadMaxYieldUsec(longValue);
829       assertThat(opt.writeThreadMaxYieldUsec()).isEqualTo(longValue);
830     }
831   }
832 
833   @Test
writeThreadSlowYieldUsec()834   public void writeThreadSlowYieldUsec() {
835     try (final Options opt = new Options()) {
836       final long longValue = rand.nextLong();
837       opt.setWriteThreadSlowYieldUsec(longValue);
838       assertThat(opt.writeThreadSlowYieldUsec()).isEqualTo(longValue);
839     }
840   }
841 
842   @Test
skipStatsUpdateOnDbOpen()843   public void skipStatsUpdateOnDbOpen() {
844     try (final Options opt = new Options()) {
845       final boolean boolValue = rand.nextBoolean();
846       opt.setSkipStatsUpdateOnDbOpen(boolValue);
847       assertThat(opt.skipStatsUpdateOnDbOpen()).isEqualTo(boolValue);
848     }
849   }
850 
851   @Test
walRecoveryMode()852   public void walRecoveryMode() {
853     try (final Options opt = new Options()) {
854       for (final WALRecoveryMode walRecoveryMode : WALRecoveryMode.values()) {
855         opt.setWalRecoveryMode(walRecoveryMode);
856         assertThat(opt.walRecoveryMode()).isEqualTo(walRecoveryMode);
857       }
858     }
859   }
860 
861   @Test
allow2pc()862   public void allow2pc() {
863     try (final Options opt = new Options()) {
864       final boolean boolValue = rand.nextBoolean();
865       opt.setAllow2pc(boolValue);
866       assertThat(opt.allow2pc()).isEqualTo(boolValue);
867     }
868   }
869 
870   @Test
rowCache()871   public void rowCache() {
872     try (final Options opt = new Options()) {
873       assertThat(opt.rowCache()).isNull();
874 
875       try(final Cache lruCache = new LRUCache(1000)) {
876         opt.setRowCache(lruCache);
877         assertThat(opt.rowCache()).isEqualTo(lruCache);
878       }
879 
880       try(final Cache clockCache = new ClockCache(1000)) {
881         opt.setRowCache(clockCache);
882         assertThat(opt.rowCache()).isEqualTo(clockCache);
883       }
884     }
885   }
886 
887   @Test
walFilter()888   public void walFilter() {
889     try (final Options opt = new Options()) {
890       assertThat(opt.walFilter()).isNull();
891 
892       try (final AbstractWalFilter walFilter = new AbstractWalFilter() {
893         @Override
894         public void columnFamilyLogNumberMap(
895             final Map<Integer, Long> cfLognumber,
896             final Map<String, Integer> cfNameId) {
897           // no-op
898         }
899 
900         @Override
901         public LogRecordFoundResult logRecordFound(final long logNumber,
902             final String logFileName, final WriteBatch batch,
903             final WriteBatch newBatch) {
904           return new LogRecordFoundResult(
905               WalProcessingOption.CONTINUE_PROCESSING, false);
906         }
907 
908         @Override
909         public String name() {
910           return "test-wal-filter";
911         }
912       }) {
913         opt.setWalFilter(walFilter);
914         assertThat(opt.walFilter()).isEqualTo(walFilter);
915       }
916     }
917   }
918 
919   @Test
failIfOptionsFileError()920   public void failIfOptionsFileError() {
921     try (final Options opt = new Options()) {
922       final boolean boolValue = rand.nextBoolean();
923       opt.setFailIfOptionsFileError(boolValue);
924       assertThat(opt.failIfOptionsFileError()).isEqualTo(boolValue);
925     }
926   }
927 
928   @Test
dumpMallocStats()929   public void dumpMallocStats() {
930     try (final Options opt = new Options()) {
931       final boolean boolValue = rand.nextBoolean();
932       opt.setDumpMallocStats(boolValue);
933       assertThat(opt.dumpMallocStats()).isEqualTo(boolValue);
934     }
935   }
936 
937   @Test
avoidFlushDuringRecovery()938   public void avoidFlushDuringRecovery() {
939     try (final Options opt = new Options()) {
940       final boolean boolValue = rand.nextBoolean();
941       opt.setAvoidFlushDuringRecovery(boolValue);
942       assertThat(opt.avoidFlushDuringRecovery()).isEqualTo(boolValue);
943     }
944   }
945 
946   @Test
avoidFlushDuringShutdown()947   public void avoidFlushDuringShutdown() {
948     try (final Options opt = new Options()) {
949       final boolean boolValue = rand.nextBoolean();
950       opt.setAvoidFlushDuringShutdown(boolValue);
951       assertThat(opt.avoidFlushDuringShutdown()).isEqualTo(boolValue);
952     }
953   }
954 
955 
956   @Test
allowIngestBehind()957   public void allowIngestBehind() {
958     try (final Options opt = new Options()) {
959       assertThat(opt.allowIngestBehind()).isFalse();
960       opt.setAllowIngestBehind(true);
961       assertThat(opt.allowIngestBehind()).isTrue();
962     }
963   }
964 
965   @Test
preserveDeletes()966   public void preserveDeletes() {
967     try (final Options opt = new Options()) {
968       assertThat(opt.preserveDeletes()).isFalse();
969       opt.setPreserveDeletes(true);
970       assertThat(opt.preserveDeletes()).isTrue();
971     }
972   }
973 
974   @Test
twoWriteQueues()975   public void twoWriteQueues() {
976     try (final Options opt = new Options()) {
977       assertThat(opt.twoWriteQueues()).isFalse();
978       opt.setTwoWriteQueues(true);
979       assertThat(opt.twoWriteQueues()).isTrue();
980     }
981   }
982 
983   @Test
manualWalFlush()984   public void manualWalFlush() {
985     try (final Options opt = new Options()) {
986       assertThat(opt.manualWalFlush()).isFalse();
987       opt.setManualWalFlush(true);
988       assertThat(opt.manualWalFlush()).isTrue();
989     }
990   }
991 
992   @Test
atomicFlush()993   public void atomicFlush() {
994     try (final Options opt = new Options()) {
995       assertThat(opt.atomicFlush()).isFalse();
996       opt.setAtomicFlush(true);
997       assertThat(opt.atomicFlush()).isTrue();
998     }
999   }
1000 
1001   @Test
env()1002   public void env() {
1003     try (final Options options = new Options();
1004          final Env env = Env.getDefault()) {
1005       options.setEnv(env);
1006       assertThat(options.getEnv()).isSameAs(env);
1007     }
1008   }
1009 
1010   @Test
linkageOfPrepMethods()1011   public void linkageOfPrepMethods() {
1012     try (final Options options = new Options()) {
1013       options.optimizeUniversalStyleCompaction();
1014       options.optimizeUniversalStyleCompaction(4000);
1015       options.optimizeLevelStyleCompaction();
1016       options.optimizeLevelStyleCompaction(3000);
1017       options.optimizeForPointLookup(10);
1018       options.optimizeForSmallDb();
1019       options.prepareForBulkLoad();
1020     }
1021   }
1022 
1023   @Test
compressionTypes()1024   public void compressionTypes() {
1025     try (final Options options = new Options()) {
1026       for (final CompressionType compressionType :
1027           CompressionType.values()) {
1028         options.setCompressionType(compressionType);
1029         assertThat(options.compressionType()).
1030             isEqualTo(compressionType);
1031         assertThat(CompressionType.valueOf("NO_COMPRESSION")).
1032             isEqualTo(CompressionType.NO_COMPRESSION);
1033       }
1034     }
1035   }
1036 
1037   @Test
compressionPerLevel()1038   public void compressionPerLevel() {
1039     try (final Options options = new Options()) {
1040       assertThat(options.compressionPerLevel()).isEmpty();
1041       List<CompressionType> compressionTypeList =
1042           new ArrayList<>();
1043       for (int i = 0; i < options.numLevels(); i++) {
1044         compressionTypeList.add(CompressionType.NO_COMPRESSION);
1045       }
1046       options.setCompressionPerLevel(compressionTypeList);
1047       compressionTypeList = options.compressionPerLevel();
1048       for (final CompressionType compressionType : compressionTypeList) {
1049         assertThat(compressionType).isEqualTo(
1050             CompressionType.NO_COMPRESSION);
1051       }
1052     }
1053   }
1054 
1055   @Test
differentCompressionsPerLevel()1056   public void differentCompressionsPerLevel() {
1057     try (final Options options = new Options()) {
1058       options.setNumLevels(3);
1059 
1060       assertThat(options.compressionPerLevel()).isEmpty();
1061       List<CompressionType> compressionTypeList = new ArrayList<>();
1062 
1063       compressionTypeList.add(CompressionType.BZLIB2_COMPRESSION);
1064       compressionTypeList.add(CompressionType.SNAPPY_COMPRESSION);
1065       compressionTypeList.add(CompressionType.LZ4_COMPRESSION);
1066 
1067       options.setCompressionPerLevel(compressionTypeList);
1068       compressionTypeList = options.compressionPerLevel();
1069 
1070       assertThat(compressionTypeList.size()).isEqualTo(3);
1071       assertThat(compressionTypeList).
1072           containsExactly(
1073               CompressionType.BZLIB2_COMPRESSION,
1074               CompressionType.SNAPPY_COMPRESSION,
1075               CompressionType.LZ4_COMPRESSION);
1076 
1077     }
1078   }
1079 
1080   @Test
bottommostCompressionType()1081   public void bottommostCompressionType() {
1082     try (final Options options = new Options()) {
1083       assertThat(options.bottommostCompressionType())
1084           .isEqualTo(CompressionType.DISABLE_COMPRESSION_OPTION);
1085 
1086       for (final CompressionType compressionType : CompressionType.values()) {
1087         options.setBottommostCompressionType(compressionType);
1088         assertThat(options.bottommostCompressionType())
1089             .isEqualTo(compressionType);
1090       }
1091     }
1092   }
1093 
1094   @Test
bottommostCompressionOptions()1095   public void bottommostCompressionOptions() {
1096     try (final Options options = new Options();
1097          final CompressionOptions bottommostCompressionOptions = new CompressionOptions()
1098              .setMaxDictBytes(123)) {
1099 
1100       options.setBottommostCompressionOptions(bottommostCompressionOptions);
1101       assertThat(options.bottommostCompressionOptions())
1102           .isEqualTo(bottommostCompressionOptions);
1103       assertThat(options.bottommostCompressionOptions().maxDictBytes())
1104           .isEqualTo(123);
1105     }
1106   }
1107 
1108   @Test
compressionOptions()1109   public void compressionOptions() {
1110     try (final Options options = new Options();
1111          final CompressionOptions compressionOptions = new CompressionOptions()
1112              .setMaxDictBytes(123)) {
1113 
1114       options.setCompressionOptions(compressionOptions);
1115       assertThat(options.compressionOptions())
1116           .isEqualTo(compressionOptions);
1117       assertThat(options.compressionOptions().maxDictBytes())
1118           .isEqualTo(123);
1119     }
1120   }
1121 
1122   @Test
compactionStyles()1123   public void compactionStyles() {
1124     try (final Options options = new Options()) {
1125       for (final CompactionStyle compactionStyle :
1126           CompactionStyle.values()) {
1127         options.setCompactionStyle(compactionStyle);
1128         assertThat(options.compactionStyle()).
1129             isEqualTo(compactionStyle);
1130         assertThat(CompactionStyle.valueOf("FIFO")).
1131             isEqualTo(CompactionStyle.FIFO);
1132       }
1133     }
1134   }
1135 
1136   @Test
maxTableFilesSizeFIFO()1137   public void maxTableFilesSizeFIFO() {
1138     try (final Options opt = new Options()) {
1139       long longValue = rand.nextLong();
1140       // Size has to be positive
1141       longValue = (longValue < 0) ? -longValue : longValue;
1142       longValue = (longValue == 0) ? longValue + 1 : longValue;
1143       opt.setMaxTableFilesSizeFIFO(longValue);
1144       assertThat(opt.maxTableFilesSizeFIFO()).
1145           isEqualTo(longValue);
1146     }
1147   }
1148 
1149   @Test
rateLimiter()1150   public void rateLimiter() {
1151     try (final Options options = new Options();
1152          final Options anotherOptions = new Options();
1153          final RateLimiter rateLimiter =
1154              new RateLimiter(1000, 100 * 1000, 1)) {
1155       options.setRateLimiter(rateLimiter);
1156       // Test with parameter initialization
1157       anotherOptions.setRateLimiter(
1158           new RateLimiter(1000));
1159     }
1160   }
1161 
1162   @Test
sstFileManager()1163   public void sstFileManager() throws RocksDBException {
1164     try (final Options options = new Options();
1165          final SstFileManager sstFileManager =
1166              new SstFileManager(Env.getDefault())) {
1167       options.setSstFileManager(sstFileManager);
1168     }
1169   }
1170 
1171   @Test
shouldSetTestPrefixExtractor()1172   public void shouldSetTestPrefixExtractor() {
1173     try (final Options options = new Options()) {
1174       options.useFixedLengthPrefixExtractor(100);
1175       options.useFixedLengthPrefixExtractor(10);
1176     }
1177   }
1178 
1179   @Test
shouldSetTestCappedPrefixExtractor()1180   public void shouldSetTestCappedPrefixExtractor() {
1181     try (final Options options = new Options()) {
1182       options.useCappedPrefixExtractor(100);
1183       options.useCappedPrefixExtractor(10);
1184     }
1185   }
1186 
1187   @Test
shouldTestMemTableFactoryName()1188   public void shouldTestMemTableFactoryName()
1189       throws RocksDBException {
1190     try (final Options options = new Options()) {
1191       options.setMemTableConfig(new VectorMemTableConfig());
1192       assertThat(options.memTableFactoryName()).
1193           isEqualTo("VectorRepFactory");
1194       options.setMemTableConfig(
1195           new HashLinkedListMemTableConfig());
1196       assertThat(options.memTableFactoryName()).
1197           isEqualTo("HashLinkedListRepFactory");
1198     }
1199   }
1200 
1201   @Test
statistics()1202   public void statistics() {
1203     try(final Options options = new Options()) {
1204       final Statistics statistics = options.statistics();
1205       assertThat(statistics).isNull();
1206     }
1207 
1208     try(final Statistics statistics = new Statistics();
1209         final Options options = new Options().setStatistics(statistics);
1210         final Statistics stats = options.statistics()) {
1211       assertThat(stats).isNotNull();
1212     }
1213   }
1214 
1215   @Test
maxWriteBufferNumberToMaintain()1216   public void maxWriteBufferNumberToMaintain() {
1217     try (final Options options = new Options()) {
1218       int intValue = rand.nextInt();
1219       // Size has to be positive
1220       intValue = (intValue < 0) ? -intValue : intValue;
1221       intValue = (intValue == 0) ? intValue + 1 : intValue;
1222       options.setMaxWriteBufferNumberToMaintain(intValue);
1223       assertThat(options.maxWriteBufferNumberToMaintain()).
1224           isEqualTo(intValue);
1225     }
1226   }
1227 
1228   @Test
compactionPriorities()1229   public void compactionPriorities() {
1230     try (final Options options = new Options()) {
1231       for (final CompactionPriority compactionPriority :
1232           CompactionPriority.values()) {
1233         options.setCompactionPriority(compactionPriority);
1234         assertThat(options.compactionPriority()).
1235             isEqualTo(compactionPriority);
1236       }
1237     }
1238   }
1239 
1240   @Test
reportBgIoStats()1241   public void reportBgIoStats() {
1242     try (final Options options = new Options()) {
1243       final boolean booleanValue = true;
1244       options.setReportBgIoStats(booleanValue);
1245       assertThat(options.reportBgIoStats()).
1246           isEqualTo(booleanValue);
1247     }
1248   }
1249 
1250   @Test
ttl()1251   public void ttl() {
1252     try (final Options options = new Options()) {
1253       options.setTtl(1000 * 60);
1254       assertThat(options.ttl()).
1255           isEqualTo(1000 * 60);
1256     }
1257   }
1258 
1259   @Test
periodicCompactionSeconds()1260   public void periodicCompactionSeconds() {
1261     try (final Options options = new Options()) {
1262       options.setPeriodicCompactionSeconds(1000 * 60);
1263       assertThat(options.periodicCompactionSeconds()).isEqualTo(1000 * 60);
1264     }
1265   }
1266 
1267   @Test
compactionOptionsUniversal()1268   public void compactionOptionsUniversal() {
1269     try (final Options options = new Options();
1270          final CompactionOptionsUniversal optUni = new CompactionOptionsUniversal()
1271              .setCompressionSizePercent(7)) {
1272       options.setCompactionOptionsUniversal(optUni);
1273       assertThat(options.compactionOptionsUniversal()).
1274           isEqualTo(optUni);
1275       assertThat(options.compactionOptionsUniversal().compressionSizePercent())
1276           .isEqualTo(7);
1277     }
1278   }
1279 
1280   @Test
compactionOptionsFIFO()1281   public void compactionOptionsFIFO() {
1282     try (final Options options = new Options();
1283          final CompactionOptionsFIFO optFifo = new CompactionOptionsFIFO()
1284              .setMaxTableFilesSize(2000)) {
1285       options.setCompactionOptionsFIFO(optFifo);
1286       assertThat(options.compactionOptionsFIFO()).
1287           isEqualTo(optFifo);
1288       assertThat(options.compactionOptionsFIFO().maxTableFilesSize())
1289           .isEqualTo(2000);
1290     }
1291   }
1292 
1293   @Test
forceConsistencyChecks()1294   public void forceConsistencyChecks() {
1295     try (final Options options = new Options()) {
1296       final boolean booleanValue = true;
1297       options.setForceConsistencyChecks(booleanValue);
1298       assertThat(options.forceConsistencyChecks()).
1299           isEqualTo(booleanValue);
1300     }
1301   }
1302 
1303   @Test
compactionFilter()1304   public void compactionFilter() {
1305     try(final Options options = new Options();
1306         final RemoveEmptyValueCompactionFilter cf = new RemoveEmptyValueCompactionFilter()) {
1307       options.setCompactionFilter(cf);
1308       assertThat(options.compactionFilter()).isEqualTo(cf);
1309     }
1310   }
1311 
1312   @Test
compactionFilterFactory()1313   public void compactionFilterFactory() {
1314     try(final Options options = new Options();
1315         final RemoveEmptyValueCompactionFilterFactory cff = new RemoveEmptyValueCompactionFilterFactory()) {
1316       options.setCompactionFilterFactory(cff);
1317       assertThat(options.compactionFilterFactory()).isEqualTo(cff);
1318     }
1319   }
1320 
1321   @Test
compactionThreadLimiter()1322   public void compactionThreadLimiter() {
1323     try (final Options options = new Options();
1324          final ConcurrentTaskLimiter compactionThreadLimiter =
1325              new ConcurrentTaskLimiterImpl("name", 3)) {
1326       options.setCompactionThreadLimiter(compactionThreadLimiter);
1327       assertThat(options.compactionThreadLimiter()).isEqualTo(compactionThreadLimiter);
1328     }
1329   }
1330 
1331   @Test
oldDefaults()1332   public void oldDefaults() {
1333     try (final Options options = new Options()) {
1334       options.oldDefaults(4, 6);
1335       assertThat(options.writeBufferSize()).isEqualTo(4 << 20);
1336       assertThat(options.compactionPriority()).isEqualTo(CompactionPriority.ByCompensatedSize);
1337       assertThat(options.targetFileSizeBase()).isEqualTo(2 * 1048576);
1338       assertThat(options.maxBytesForLevelBase()).isEqualTo(10 * 1048576);
1339       assertThat(options.softPendingCompactionBytesLimit()).isEqualTo(0);
1340       assertThat(options.hardPendingCompactionBytesLimit()).isEqualTo(0);
1341       assertThat(options.level0StopWritesTrigger()).isEqualTo(24);
1342     }
1343   }
1344 
1345   @Test
optimizeForSmallDbWithCache()1346   public void optimizeForSmallDbWithCache() {
1347     try (final Options options = new Options(); final Cache cache = new LRUCache(1024)) {
1348       assertThat(options.optimizeForSmallDb(cache)).isEqualTo(options);
1349     }
1350   }
1351 
1352   @Test
cfPaths()1353   public void cfPaths() {
1354     try (final Options options = new Options()) {
1355       final List<DbPath> paths = Arrays.asList(
1356           new DbPath(Paths.get("test1"), 2 << 25), new DbPath(Paths.get("/test2/path"), 2 << 25));
1357       assertThat(options.cfPaths()).isEqualTo(Collections.emptyList());
1358       assertThat(options.setCfPaths(paths)).isEqualTo(options);
1359       assertThat(options.cfPaths()).isEqualTo(paths);
1360     }
1361   }
1362 
1363   @Test
avoidUnnecessaryBlockingIO()1364   public void avoidUnnecessaryBlockingIO() {
1365     try (final Options options = new Options()) {
1366       assertThat(options.avoidUnnecessaryBlockingIO()).isEqualTo(false);
1367       assertThat(options.setAvoidUnnecessaryBlockingIO(true)).isEqualTo(options);
1368       assertThat(options.avoidUnnecessaryBlockingIO()).isEqualTo(true);
1369     }
1370   }
1371 
1372   @Test
persistStatsToDisk()1373   public void persistStatsToDisk() {
1374     try (final Options options = new Options()) {
1375       assertThat(options.persistStatsToDisk()).isEqualTo(false);
1376       assertThat(options.setPersistStatsToDisk(true)).isEqualTo(options);
1377       assertThat(options.persistStatsToDisk()).isEqualTo(true);
1378     }
1379   }
1380 
1381   @Test
writeDbidToManifest()1382   public void writeDbidToManifest() {
1383     try (final Options options = new Options()) {
1384       assertThat(options.writeDbidToManifest()).isEqualTo(false);
1385       assertThat(options.setWriteDbidToManifest(true)).isEqualTo(options);
1386       assertThat(options.writeDbidToManifest()).isEqualTo(true);
1387     }
1388   }
1389 
1390   @Test
logReadaheadSize()1391   public void logReadaheadSize() {
1392     try (final Options options = new Options()) {
1393       assertThat(options.logReadaheadSize()).isEqualTo(0);
1394       final int size = 1024 * 1024 * 100;
1395       assertThat(options.setLogReadaheadSize(size)).isEqualTo(options);
1396       assertThat(options.logReadaheadSize()).isEqualTo(size);
1397     }
1398   }
1399 
1400   @Test
bestEffortsRecovery()1401   public void bestEffortsRecovery() {
1402     try (final Options options = new Options()) {
1403       assertThat(options.bestEffortsRecovery()).isEqualTo(false);
1404       assertThat(options.setBestEffortsRecovery(true)).isEqualTo(options);
1405       assertThat(options.bestEffortsRecovery()).isEqualTo(true);
1406     }
1407   }
1408 
1409   @Test
maxBgerrorResumeCount()1410   public void maxBgerrorResumeCount() {
1411     try (final Options options = new Options()) {
1412       final int INT_MAX = 2147483647;
1413       assertThat(options.maxBgerrorResumeCount()).isEqualTo(INT_MAX);
1414       assertThat(options.setMaxBgErrorResumeCount(-1)).isEqualTo(options);
1415       assertThat(options.maxBgerrorResumeCount()).isEqualTo(-1);
1416     }
1417   }
1418 
1419   @Test
bgerrorResumeRetryInterval()1420   public void bgerrorResumeRetryInterval() {
1421     try (final Options options = new Options()) {
1422       assertThat(options.bgerrorResumeRetryInterval()).isEqualTo(1000000);
1423       final long newRetryInterval = 24 * 3600 * 1000000L;
1424       assertThat(options.setBgerrorResumeRetryInterval(newRetryInterval)).isEqualTo(options);
1425       assertThat(options.bgerrorResumeRetryInterval()).isEqualTo(newRetryInterval);
1426     }
1427   }
1428 
1429   @Test
maxWriteBatchGroupSizeBytes()1430   public void maxWriteBatchGroupSizeBytes() {
1431     try (final Options options = new Options()) {
1432       assertThat(options.maxWriteBatchGroupSizeBytes()).isEqualTo(1024 * 1024);
1433       final long size = 1024 * 1024 * 1024 * 10L;
1434       assertThat(options.setMaxWriteBatchGroupSizeBytes(size)).isEqualTo(options);
1435       assertThat(options.maxWriteBatchGroupSizeBytes()).isEqualTo(size);
1436     }
1437   }
1438 
1439   @Test
skipCheckingSstFileSizesOnDbOpen()1440   public void skipCheckingSstFileSizesOnDbOpen() {
1441     try (final Options options = new Options()) {
1442       assertThat(options.skipCheckingSstFileSizesOnDbOpen()).isEqualTo(false);
1443       assertThat(options.setSkipCheckingSstFileSizesOnDbOpen(true)).isEqualTo(options);
1444       assertThat(options.skipCheckingSstFileSizesOnDbOpen()).isEqualTo(true);
1445     }
1446   }
1447 
1448   @Test
eventListeners()1449   public void eventListeners() {
1450     final AtomicBoolean wasCalled1 = new AtomicBoolean();
1451     final AtomicBoolean wasCalled2 = new AtomicBoolean();
1452     try (final Options options = new Options();
1453          final AbstractEventListener el1 =
1454              new AbstractEventListener() {
1455                @Override
1456                public void onTableFileDeleted(final TableFileDeletionInfo tableFileDeletionInfo) {
1457                  wasCalled1.set(true);
1458                }
1459              };
1460          final AbstractEventListener el2 =
1461              new AbstractEventListener() {
1462                @Override
1463                public void onMemTableSealed(final MemTableInfo memTableInfo) {
1464                  wasCalled2.set(true);
1465                }
1466              }) {
1467       assertThat(options.setListeners(Arrays.asList(el1, el2))).isEqualTo(options);
1468       List<AbstractEventListener> listeners = options.listeners();
1469       assertEquals(el1, listeners.get(0));
1470       assertEquals(el2, listeners.get(1));
1471       options.setListeners(Collections.<AbstractEventListener>emptyList());
1472       listeners.get(0).onTableFileDeleted(null);
1473       assertTrue(wasCalled1.get());
1474       listeners.get(1).onMemTableSealed(null);
1475       assertTrue(wasCalled2.get());
1476       List<AbstractEventListener> listeners2 = options.listeners();
1477       assertNotNull(listeners2);
1478       assertEquals(0, listeners2.size());
1479     }
1480   }
1481 }
1482