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 
10 import java.util.Random;
11 
12 import org.junit.ClassRule;
13 import org.junit.Rule;
14 import org.junit.Test;
15 import org.junit.rules.ExpectedException;
16 
17 public class BackupableDBOptionsTest {
18 
19   private final static String ARBITRARY_PATH =
20       System.getProperty("java.io.tmpdir");
21 
22   @ClassRule
23   public static final RocksNativeLibraryResource ROCKS_NATIVE_LIBRARY_RESOURCE =
24       new RocksNativeLibraryResource();
25 
26   @Rule
27   public ExpectedException exception = ExpectedException.none();
28 
29   public static final Random rand = PlatformRandomHelper.
30       getPlatformSpecificRandomFactory();
31 
32   @Test
backupDir()33   public void backupDir() {
34     try (final BackupableDBOptions backupableDBOptions =
35              new BackupableDBOptions(ARBITRARY_PATH)) {
36       assertThat(backupableDBOptions.backupDir()).
37           isEqualTo(ARBITRARY_PATH);
38     }
39   }
40 
41   @Test
env()42   public void env() {
43     try (final BackupableDBOptions backupableDBOptions =
44              new BackupableDBOptions(ARBITRARY_PATH)) {
45       assertThat(backupableDBOptions.backupEnv()).
46           isNull();
47 
48       try(final Env env = new RocksMemEnv(Env.getDefault())) {
49         backupableDBOptions.setBackupEnv(env);
50         assertThat(backupableDBOptions.backupEnv())
51             .isEqualTo(env);
52       }
53     }
54   }
55 
56   @Test
shareTableFiles()57   public void shareTableFiles() {
58     try (final BackupableDBOptions backupableDBOptions =
59              new BackupableDBOptions(ARBITRARY_PATH)) {
60       final boolean value = rand.nextBoolean();
61       backupableDBOptions.setShareTableFiles(value);
62       assertThat(backupableDBOptions.shareTableFiles()).
63           isEqualTo(value);
64     }
65   }
66 
67   @Test
infoLog()68   public void infoLog() {
69     try (final BackupableDBOptions backupableDBOptions =
70              new BackupableDBOptions(ARBITRARY_PATH)) {
71       assertThat(backupableDBOptions.infoLog()).
72           isNull();
73 
74       try(final Options options = new Options();
75           final Logger logger = new Logger(options){
76             @Override
77             protected void log(InfoLogLevel infoLogLevel, String logMsg) {
78 
79             }
80           }) {
81         backupableDBOptions.setInfoLog(logger);
82         assertThat(backupableDBOptions.infoLog())
83             .isEqualTo(logger);
84       }
85     }
86   }
87 
88   @Test
sync()89   public void sync() {
90     try (final BackupableDBOptions backupableDBOptions =
91              new BackupableDBOptions(ARBITRARY_PATH)) {
92       final boolean value = rand.nextBoolean();
93       backupableDBOptions.setSync(value);
94       assertThat(backupableDBOptions.sync()).isEqualTo(value);
95     }
96   }
97 
98   @Test
destroyOldData()99   public void destroyOldData() {
100     try (final BackupableDBOptions backupableDBOptions =
101              new BackupableDBOptions(ARBITRARY_PATH);) {
102       final boolean value = rand.nextBoolean();
103       backupableDBOptions.setDestroyOldData(value);
104       assertThat(backupableDBOptions.destroyOldData()).
105           isEqualTo(value);
106     }
107   }
108 
109   @Test
backupLogFiles()110   public void backupLogFiles() {
111     try (final BackupableDBOptions backupableDBOptions =
112              new BackupableDBOptions(ARBITRARY_PATH)) {
113       final boolean value = rand.nextBoolean();
114       backupableDBOptions.setBackupLogFiles(value);
115       assertThat(backupableDBOptions.backupLogFiles()).
116           isEqualTo(value);
117     }
118   }
119 
120   @Test
backupRateLimit()121   public void backupRateLimit() {
122     try (final BackupableDBOptions backupableDBOptions =
123              new BackupableDBOptions(ARBITRARY_PATH)) {
124       final long value = Math.abs(rand.nextLong());
125       backupableDBOptions.setBackupRateLimit(value);
126       assertThat(backupableDBOptions.backupRateLimit()).
127           isEqualTo(value);
128       // negative will be mapped to 0
129       backupableDBOptions.setBackupRateLimit(-1);
130       assertThat(backupableDBOptions.backupRateLimit()).
131           isEqualTo(0);
132     }
133   }
134 
135   @Test
backupRateLimiter()136   public void backupRateLimiter() {
137     try (final BackupableDBOptions backupableDBOptions =
138              new BackupableDBOptions(ARBITRARY_PATH)) {
139       assertThat(backupableDBOptions.backupEnv()).
140           isNull();
141 
142       try(final RateLimiter backupRateLimiter =
143               new RateLimiter(999)) {
144         backupableDBOptions.setBackupRateLimiter(backupRateLimiter);
145         assertThat(backupableDBOptions.backupRateLimiter())
146             .isEqualTo(backupRateLimiter);
147       }
148     }
149   }
150 
151   @Test
restoreRateLimit()152   public void restoreRateLimit() {
153     try (final BackupableDBOptions backupableDBOptions =
154              new BackupableDBOptions(ARBITRARY_PATH)) {
155       final long value = Math.abs(rand.nextLong());
156       backupableDBOptions.setRestoreRateLimit(value);
157       assertThat(backupableDBOptions.restoreRateLimit()).
158           isEqualTo(value);
159       // negative will be mapped to 0
160       backupableDBOptions.setRestoreRateLimit(-1);
161       assertThat(backupableDBOptions.restoreRateLimit()).
162           isEqualTo(0);
163     }
164   }
165 
166   @Test
restoreRateLimiter()167   public void restoreRateLimiter() {
168     try (final BackupableDBOptions backupableDBOptions =
169              new BackupableDBOptions(ARBITRARY_PATH)) {
170       assertThat(backupableDBOptions.backupEnv()).
171           isNull();
172 
173       try(final RateLimiter restoreRateLimiter =
174               new RateLimiter(911)) {
175         backupableDBOptions.setRestoreRateLimiter(restoreRateLimiter);
176         assertThat(backupableDBOptions.restoreRateLimiter())
177             .isEqualTo(restoreRateLimiter);
178       }
179     }
180   }
181 
182   @Test
shareFilesWithChecksum()183   public void shareFilesWithChecksum() {
184     try (final BackupableDBOptions backupableDBOptions =
185              new BackupableDBOptions(ARBITRARY_PATH)) {
186       boolean value = rand.nextBoolean();
187       backupableDBOptions.setShareFilesWithChecksum(value);
188       assertThat(backupableDBOptions.shareFilesWithChecksum()).
189           isEqualTo(value);
190     }
191   }
192 
193   @Test
maxBackgroundOperations()194   public void maxBackgroundOperations() {
195     try (final BackupableDBOptions backupableDBOptions =
196              new BackupableDBOptions(ARBITRARY_PATH)) {
197       final int value = rand.nextInt();
198       backupableDBOptions.setMaxBackgroundOperations(value);
199       assertThat(backupableDBOptions.maxBackgroundOperations()).
200           isEqualTo(value);
201     }
202   }
203 
204   @Test
callbackTriggerIntervalSize()205   public void callbackTriggerIntervalSize() {
206     try (final BackupableDBOptions backupableDBOptions =
207              new BackupableDBOptions(ARBITRARY_PATH)) {
208       final long value = rand.nextLong();
209       backupableDBOptions.setCallbackTriggerIntervalSize(value);
210       assertThat(backupableDBOptions.callbackTriggerIntervalSize()).
211           isEqualTo(value);
212     }
213   }
214 
215   @Test
failBackupDirIsNull()216   public void failBackupDirIsNull() {
217     exception.expect(IllegalArgumentException.class);
218     try (final BackupableDBOptions opts = new BackupableDBOptions(null)) {
219       //no-op
220     }
221   }
222 
223   @Test
failBackupDirIfDisposed()224   public void failBackupDirIfDisposed() {
225     try (final BackupableDBOptions options =
226              setupUninitializedBackupableDBOptions(exception)) {
227       options.backupDir();
228     }
229   }
230 
231   @Test
failSetShareTableFilesIfDisposed()232   public void failSetShareTableFilesIfDisposed() {
233     try (final BackupableDBOptions options =
234              setupUninitializedBackupableDBOptions(exception)) {
235       options.setShareTableFiles(true);
236     }
237   }
238 
239   @Test
failShareTableFilesIfDisposed()240   public void failShareTableFilesIfDisposed() {
241     try (BackupableDBOptions options =
242              setupUninitializedBackupableDBOptions(exception)) {
243       options.shareTableFiles();
244     }
245   }
246 
247   @Test
failSetSyncIfDisposed()248   public void failSetSyncIfDisposed() {
249     try (final BackupableDBOptions options =
250              setupUninitializedBackupableDBOptions(exception)) {
251       options.setSync(true);
252     }
253   }
254 
255   @Test
failSyncIfDisposed()256   public void failSyncIfDisposed() {
257     try (final BackupableDBOptions options =
258              setupUninitializedBackupableDBOptions(exception)) {
259       options.sync();
260     }
261   }
262 
263   @Test
failSetDestroyOldDataIfDisposed()264   public void failSetDestroyOldDataIfDisposed() {
265     try (final BackupableDBOptions options =
266              setupUninitializedBackupableDBOptions(exception)) {
267       options.setDestroyOldData(true);
268     }
269   }
270 
271   @Test
failDestroyOldDataIfDisposed()272   public void failDestroyOldDataIfDisposed() {
273     try (final BackupableDBOptions options =
274              setupUninitializedBackupableDBOptions(exception)) {
275       options.destroyOldData();
276     }
277   }
278 
279   @Test
failSetBackupLogFilesIfDisposed()280   public void failSetBackupLogFilesIfDisposed() {
281     try (final BackupableDBOptions options =
282              setupUninitializedBackupableDBOptions(exception)) {
283       options.setBackupLogFiles(true);
284     }
285   }
286 
287   @Test
failBackupLogFilesIfDisposed()288   public void failBackupLogFilesIfDisposed() {
289     try (final BackupableDBOptions options =
290              setupUninitializedBackupableDBOptions(exception)) {
291       options.backupLogFiles();
292     }
293   }
294 
295   @Test
failSetBackupRateLimitIfDisposed()296   public void failSetBackupRateLimitIfDisposed() {
297     try (final BackupableDBOptions options =
298              setupUninitializedBackupableDBOptions(exception)) {
299       options.setBackupRateLimit(1);
300     }
301   }
302 
303   @Test
failBackupRateLimitIfDisposed()304   public void failBackupRateLimitIfDisposed() {
305     try (final BackupableDBOptions options =
306              setupUninitializedBackupableDBOptions(exception)) {
307       options.backupRateLimit();
308     }
309   }
310 
311   @Test
failSetRestoreRateLimitIfDisposed()312   public void failSetRestoreRateLimitIfDisposed() {
313     try (final BackupableDBOptions options =
314              setupUninitializedBackupableDBOptions(exception)) {
315       options.setRestoreRateLimit(1);
316     }
317   }
318 
319   @Test
failRestoreRateLimitIfDisposed()320   public void failRestoreRateLimitIfDisposed() {
321     try (final BackupableDBOptions options =
322              setupUninitializedBackupableDBOptions(exception)) {
323       options.restoreRateLimit();
324     }
325   }
326 
327   @Test
failSetShareFilesWithChecksumIfDisposed()328   public void failSetShareFilesWithChecksumIfDisposed() {
329     try (final BackupableDBOptions options =
330              setupUninitializedBackupableDBOptions(exception)) {
331       options.setShareFilesWithChecksum(true);
332     }
333   }
334 
335   @Test
failShareFilesWithChecksumIfDisposed()336   public void failShareFilesWithChecksumIfDisposed() {
337     try (final BackupableDBOptions options =
338              setupUninitializedBackupableDBOptions(exception)) {
339       options.shareFilesWithChecksum();
340     }
341   }
342 
setupUninitializedBackupableDBOptions( ExpectedException exception)343   private BackupableDBOptions setupUninitializedBackupableDBOptions(
344       ExpectedException exception) {
345     final BackupableDBOptions backupableDBOptions =
346         new BackupableDBOptions(ARBITRARY_PATH);
347     backupableDBOptions.close();
348     exception.expect(AssertionError.class);
349     return backupableDBOptions;
350   }
351 }
352