mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 10:19:23 +02:00
497 lines
12 KiB
Java
497 lines
12 KiB
Java
/* ###
|
|
* IP: GHIDRA
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package db;
|
|
|
|
import static org.junit.Assert.*;
|
|
|
|
import org.junit.*;
|
|
|
|
import generic.test.AbstractGenericTest;
|
|
|
|
public class TableConcurrencyTest extends AbstractGenericTest {
|
|
|
|
private static final int BUFFER_SIZE = 256;
|
|
private static final int CACHE_SIZE = 4 * 1024 * 1024;
|
|
|
|
private DBHandle dbh;
|
|
private long txId;
|
|
private Table table1;
|
|
private Table table2;
|
|
private Schema schema1;
|
|
private Schema schema2;
|
|
|
|
/**
|
|
* Constructor for DBTest1.
|
|
* @param arg0
|
|
*/
|
|
public TableConcurrencyTest() {
|
|
super();
|
|
}
|
|
|
|
@Before
|
|
public void setUp() throws Exception {
|
|
|
|
dbh = new DBHandle(BUFFER_SIZE, CACHE_SIZE);
|
|
txId = dbh.startTransaction();
|
|
table1 =
|
|
DBTestUtils.createLongKeyTable(dbh, "TABLE1", DBTestUtils.SINGLE_LONG, false, false);
|
|
table2 = DBTestUtils.createBinaryKeyTable(dbh, "TABLE2", DBTestUtils.SINGLE_LONG, false);
|
|
schema1 = table1.getSchema();
|
|
schema2 = table2.getSchema();
|
|
for (byte i = 0; i < 100; i++) {
|
|
|
|
DBRecord rec = schema1.createRecord(i);
|
|
rec.setLongValue(0, i);
|
|
table1.putRecord(rec);
|
|
|
|
rec = schema2.createRecord(getField(i));
|
|
rec.setLongValue(0, i);
|
|
table2.putRecord(rec);
|
|
}
|
|
}
|
|
|
|
@After
|
|
public void tearDown() throws Exception {
|
|
if (dbh != null) {
|
|
dbh.endTransaction(txId, true);
|
|
dbh.close();
|
|
}
|
|
|
|
}
|
|
|
|
private BinaryField getField(byte i) {
|
|
return new BinaryField(new byte[] { i });
|
|
}
|
|
|
|
// Test using Table.longKeyIterator()
|
|
@Test
|
|
public void testLongKeyIteratorA() {
|
|
try {
|
|
DBLongIterator iter = table1.longKeyIterator();
|
|
|
|
table1.deleteRecord(0);// iterator not yet used
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(1, iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
table1.deleteRecord(2);// iterator already primed
|
|
assertEquals(2, iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(3, iter.next());
|
|
|
|
table1.deleteRecord(4);// iterator not yet primed
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(5, iter.next());
|
|
|
|
iter.delete();
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(6, iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
|
|
}
|
|
catch (Exception e) {
|
|
Assert.fail(e.toString());
|
|
}
|
|
}
|
|
|
|
// Test using Table.longKeyIterator(long)
|
|
@Test
|
|
public void testLongKeyIteratorB() {
|
|
try {
|
|
DBLongIterator iter = table1.longKeyIterator(10);
|
|
|
|
table1.deleteRecord(10);// iterator not yet used
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(11, iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
table1.deleteRecord(12);// iterator already primed
|
|
assertEquals(12, iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(13, iter.next());
|
|
|
|
table1.deleteRecord(14);// iterator not yet primed
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(15, iter.next());
|
|
|
|
iter.delete();
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(16, iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
|
|
}
|
|
catch (Exception e) {
|
|
Assert.fail(e.toString());
|
|
}
|
|
}
|
|
|
|
// Test using Table.longKeyIterator(long) reverse
|
|
@Test
|
|
public void testLongKeyIteratorBReverse() {
|
|
try {
|
|
DBLongIterator iter = table1.longKeyIterator(10);
|
|
|
|
table1.deleteRecord(10);// iterator not yet used
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
assertEquals(9, iter.previous());
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
table1.deleteRecord(8);// iterator already primed
|
|
assertEquals(8, iter.previous());
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
assertEquals(7, iter.previous());
|
|
|
|
table1.deleteRecord(6);// iterator not yet primed
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
assertEquals(5, iter.previous());
|
|
|
|
iter.delete();
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
assertEquals(4, iter.previous());
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
|
|
}
|
|
catch (Exception e) {
|
|
Assert.fail(e.toString());
|
|
}
|
|
}
|
|
|
|
// Test using Table.longKeyIterator(long,long,long)
|
|
@Test
|
|
public void testLongKeyIteratorC() {
|
|
try {
|
|
DBLongIterator iter = table1.longKeyIterator(10, 15, 10);
|
|
|
|
table1.deleteRecord(10);// iterator not yet used
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(11, iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
table1.deleteRecord(12);// iterator already primed
|
|
assertEquals(12, iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(13, iter.next());
|
|
|
|
table1.deleteRecord(14);// iterator not yet primed
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(15, iter.next());
|
|
|
|
iter.delete();
|
|
|
|
assertTrue(!iter.hasNext());
|
|
|
|
}
|
|
catch (Exception e) {
|
|
Assert.fail(e.toString());
|
|
}
|
|
}
|
|
|
|
// Test using Table.iterator(long)
|
|
@Test
|
|
public void testLongKeyRecordIterator() {
|
|
try {
|
|
RecordIterator iter = table1.iterator(10);
|
|
|
|
table1.deleteRecord(10);// iterator already primed
|
|
|
|
assertTrue(iter.hasNext());
|
|
DBRecord rec = iter.next();
|
|
assertEquals(10, rec.getKey());
|
|
|
|
assertTrue(iter.hasNext());
|
|
rec = iter.next();
|
|
assertEquals(11, rec.getKey());
|
|
|
|
assertTrue(iter.hasNext());
|
|
table1.deleteRecord(12);// iterator already primed
|
|
rec = iter.next();
|
|
assertEquals(12, rec.getKey());
|
|
|
|
assertTrue(iter.hasNext());
|
|
rec = iter.next();
|
|
assertEquals(13, rec.getKey());
|
|
|
|
table1.deleteRecord(14);// iterator not yet primed
|
|
|
|
assertTrue(iter.hasNext());
|
|
rec = iter.next();
|
|
assertEquals(15, rec.getKey());
|
|
|
|
iter.delete();
|
|
|
|
assertTrue(iter.hasNext());
|
|
rec = iter.next();
|
|
assertEquals(16, rec.getKey());
|
|
|
|
assertTrue(iter.hasNext());
|
|
|
|
}
|
|
catch (Exception e) {
|
|
Assert.fail(e.toString());
|
|
}
|
|
}
|
|
|
|
// Test using Table.iterator(long,long,long)
|
|
@Test
|
|
public void testLongKeyRecordIteratorReverse() {
|
|
try {
|
|
RecordIterator iter = table1.iterator(2, 20, 10);
|
|
|
|
table1.deleteRecord(10);// iterator already primed
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
DBRecord rec = iter.previous();
|
|
assertEquals(10, rec.getKey());
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
rec = iter.previous();
|
|
assertEquals(9, rec.getKey());
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
table1.deleteRecord(8);// iterator already primed
|
|
rec = iter.previous();
|
|
assertEquals(8, rec.getKey());
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
rec = iter.previous();
|
|
assertEquals(7, rec.getKey());
|
|
|
|
table1.deleteRecord(6);// iterator not yet primed
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
rec = iter.previous();
|
|
assertEquals(5, rec.getKey());
|
|
|
|
iter.delete();
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
rec = iter.previous();
|
|
assertEquals(4, rec.getKey());
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
|
|
}
|
|
catch (Exception e) {
|
|
Assert.fail(e.toString());
|
|
}
|
|
}
|
|
|
|
// Test using Table.fieldKeyIterator()
|
|
@Test
|
|
public void testVarKeyIteratorA() {
|
|
try {
|
|
DBFieldIterator iter = table2.fieldKeyIterator();
|
|
|
|
table2.deleteRecord(getField((byte) 0));// iterator not yet used
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(getField((byte) 1), iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
table2.deleteRecord(getField((byte) 2));// iterator already primed
|
|
assertEquals(getField((byte) 2), iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(getField((byte) 3), iter.next());
|
|
|
|
table2.deleteRecord(getField((byte) 4));// iterator not yet primed
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(getField((byte) 5), iter.next());
|
|
|
|
iter.delete();
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(getField((byte) 6), iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
|
|
}
|
|
catch (Exception e) {
|
|
Assert.fail(e.toString());
|
|
}
|
|
}
|
|
|
|
// Test using Table.fieldKeyIterator(Field)
|
|
@Test
|
|
public void testVarKeyIteratorB() {
|
|
try {
|
|
DBFieldIterator iter = table2.fieldKeyIterator(getField((byte) 10));
|
|
|
|
table2.deleteRecord(getField((byte) 10));// iterator not yet used
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(getField((byte) 11), iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
table2.deleteRecord(getField((byte) 12));// iterator already primed
|
|
assertEquals(getField((byte) 12), iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(getField((byte) 13), iter.next());
|
|
|
|
table2.deleteRecord(getField((byte) 14));// iterator not yet primed
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(getField((byte) 15), iter.next());
|
|
|
|
iter.delete();
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(getField((byte) 16), iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
|
|
}
|
|
catch (Exception e) {
|
|
Assert.fail(e.toString());
|
|
}
|
|
}
|
|
|
|
// Test using Table.fieldKeyIterator(Field) reverse
|
|
@Test
|
|
public void testVarKeyIteratorBReverse() {
|
|
try {
|
|
DBFieldIterator iter = table2.fieldKeyIterator(getField((byte) 10));
|
|
|
|
table2.deleteRecord(getField((byte) 10));// iterator not yet used
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
assertEquals(getField((byte) 9), iter.previous());
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
table2.deleteRecord(getField((byte) 12));// iterator already primed
|
|
assertEquals(getField((byte) 8), iter.previous());
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
assertEquals(getField((byte) 7), iter.previous());
|
|
|
|
table2.deleteRecord(getField((byte) 6));// iterator not yet primed
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
assertEquals(getField((byte) 5), iter.previous());
|
|
|
|
iter.delete();
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
assertEquals(getField((byte) 4), iter.previous());
|
|
|
|
assertTrue(iter.hasPrevious());
|
|
|
|
}
|
|
catch (Exception e) {
|
|
Assert.fail(e.toString());
|
|
}
|
|
}
|
|
|
|
// Test using Table.fieldKeyIterator(Field,Field,Field)
|
|
@Test
|
|
public void testVarKeyIteratorC() {
|
|
try {
|
|
DBFieldIterator iter = table2.fieldKeyIterator(getField((byte) 10), getField((byte) 15),
|
|
getField((byte) 10));
|
|
|
|
table2.deleteRecord(getField((byte) 10));// iterator not yet used
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(getField((byte) 11), iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
table2.deleteRecord(getField((byte) 12));// iterator already primed
|
|
assertEquals(getField((byte) 12), iter.next());
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(getField((byte) 13), iter.next());
|
|
|
|
table2.deleteRecord(getField((byte) 14));// iterator not yet primed
|
|
|
|
assertTrue(iter.hasNext());
|
|
assertEquals(getField((byte) 15), iter.next());
|
|
|
|
iter.delete();
|
|
|
|
assertTrue(!iter.hasNext());
|
|
|
|
}
|
|
catch (Exception e) {
|
|
Assert.fail(e.toString());
|
|
}
|
|
}
|
|
|
|
// Test using Table.iterator(Field)
|
|
@Test
|
|
public void testVarKeyRecordIterator() {
|
|
try {
|
|
RecordIterator iter = table2.iterator(getField((byte) 10));
|
|
|
|
table2.deleteRecord(getField((byte) 10));// iterator already primed
|
|
|
|
assertTrue(iter.hasNext());
|
|
DBRecord rec = iter.next();
|
|
assertEquals(getField((byte) 10), rec.getKeyField());
|
|
|
|
assertTrue(iter.hasNext());
|
|
rec = iter.next();
|
|
assertEquals(getField((byte) 11), rec.getKeyField());
|
|
|
|
assertTrue(iter.hasNext());
|
|
table2.deleteRecord(getField((byte) 12));// iterator already primed
|
|
rec = iter.next();
|
|
assertEquals(getField((byte) 12), rec.getKeyField());
|
|
|
|
assertTrue(iter.hasNext());
|
|
rec = iter.next();
|
|
assertEquals(getField((byte) 13), rec.getKeyField());
|
|
|
|
table2.deleteRecord(getField((byte) 14));// iterator not yet primed
|
|
|
|
assertTrue(iter.hasNext());
|
|
rec = iter.next();
|
|
assertEquals(getField((byte) 15), rec.getKeyField());
|
|
|
|
iter.delete();
|
|
|
|
assertTrue(iter.hasNext());
|
|
rec = iter.next();
|
|
assertEquals(getField((byte) 16), rec.getKeyField());
|
|
|
|
assertTrue(iter.hasNext());
|
|
|
|
}
|
|
catch (Exception e) {
|
|
Assert.fail(e.toString());
|
|
}
|
|
}
|
|
|
|
}
|