|
1 | 1 | package org.tron.core.db; |
2 | 2 |
|
| 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 | + |
3 | 8 | import com.google.protobuf.InvalidProtocolBufferException; |
4 | 9 | import java.io.IOException; |
| 10 | +import java.lang.reflect.Field; |
5 | 11 | import org.junit.AfterClass; |
6 | 12 | import org.junit.Assert; |
7 | 13 | import org.junit.BeforeClass; |
|
12 | 18 | import org.junit.rules.TemporaryFolder; |
13 | 19 | import org.rocksdb.RocksDB; |
14 | 20 | import org.tron.common.TestConstants; |
| 21 | +import org.tron.common.storage.WriteOptionsWrapper; |
15 | 22 | import org.tron.core.config.args.Args; |
| 23 | +import org.tron.core.db.common.DbSourceInter; |
16 | 24 | import org.tron.core.exception.BadItemException; |
17 | 25 | import org.tron.core.exception.ItemNotFoundException; |
18 | 26 |
|
@@ -99,4 +107,34 @@ public void TestGetFromRoot() throws |
99 | 107 | Assert.assertEquals(db.getFromRoot("test".getBytes()), |
100 | 108 | "test"); |
101 | 109 | } |
| 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 | + } |
102 | 140 | } |
0 commit comments