Skip to content

Commit 10bd532

Browse files
committed
test(db): add doClose() test to verify dbSource closes despite writeOptions failure
1 parent 22dd4a1 commit 10bd532

1 file changed

Lines changed: 38 additions & 0 deletions

File tree

framework/src/test/java/org/tron/core/db/TronDatabaseTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
package org.tron.core.db;
22

3+
import static org.mockito.Mockito.doThrow;
4+
import static org.mockito.Mockito.mock;
5+
import static org.mockito.Mockito.spy;
6+
import static org.mockito.Mockito.verify;
7+
38
import com.google.protobuf.InvalidProtocolBufferException;
49
import java.io.IOException;
10+
import java.lang.reflect.Field;
511
import org.junit.AfterClass;
612
import org.junit.Assert;
713
import org.junit.BeforeClass;
@@ -12,7 +18,9 @@
1218
import org.junit.rules.TemporaryFolder;
1319
import org.rocksdb.RocksDB;
1420
import org.tron.common.TestConstants;
21+
import org.tron.common.storage.WriteOptionsWrapper;
1522
import org.tron.core.config.args.Args;
23+
import org.tron.core.db.common.DbSourceInter;
1624
import org.tron.core.exception.BadItemException;
1725
import org.tron.core.exception.ItemNotFoundException;
1826

@@ -99,4 +107,34 @@ public void TestGetFromRoot() throws
99107
Assert.assertEquals(db.getFromRoot("test".getBytes()),
100108
"test");
101109
}
110+
111+
@Test
112+
public void testDoCloseDbSourceCalledWhenWriteOptionsThrows() throws Exception {
113+
TronDatabase<String> db = new TronDatabase<String>("test-do-close") {
114+
@Override public void put(byte[] key, String item) {}
115+
@Override public void delete(byte[] key) {}
116+
@Override public String get(byte[] key) { return null; }
117+
@Override public boolean has(byte[] key) { return false; }
118+
};
119+
120+
Field writeOptionsField = TronDatabase.class.getDeclaredField("writeOptions");
121+
writeOptionsField.setAccessible(true);
122+
WriteOptionsWrapper spyWriteOptions = spy((WriteOptionsWrapper) writeOptionsField.get(db));
123+
doThrow(new RuntimeException("simulated writeOptions failure")).when(spyWriteOptions).close();
124+
writeOptionsField.set(db, spyWriteOptions);
125+
126+
Field dbSourceField = TronDatabase.class.getDeclaredField("dbSource");
127+
dbSourceField.setAccessible(true);
128+
DbSourceInter<byte[]> originalDbSource = (DbSourceInter<byte[]>) dbSourceField.get(db);
129+
DbSourceInter<byte[]> mockDbSource = mock(DbSourceInter.class);
130+
dbSourceField.set(db, mockDbSource);
131+
132+
try {
133+
db.doClose();
134+
verify(spyWriteOptions).close();
135+
verify(mockDbSource).closeDB();
136+
} finally {
137+
originalDbSource.closeDB();
138+
}
139+
}
102140
}

0 commit comments

Comments
 (0)