diff options
Diffstat (limited to 'src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java')
-rw-r--r-- | src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java | 419 |
1 files changed, 5 insertions, 414 deletions
diff --git a/src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java b/src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java index b78d7ff..95f4d6c 100644 --- a/src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java +++ b/src/test/java/com/healthmarketscience/jackcess/DatabaseTest.java @@ -16,19 +16,11 @@ limitations under the License. package com.healthmarketscience.jackcess; -import java.io.DataInputStream; import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.lang.reflect.Field; import java.math.BigDecimal; import java.nio.ByteBuffer; -import java.nio.channels.FileChannel; import java.sql.Types; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -48,21 +40,17 @@ import java.util.TreeSet; import java.util.UUID; import static com.healthmarketscience.jackcess.Database.*; -import com.healthmarketscience.jackcess.complex.ComplexValueForeignKey; -import com.healthmarketscience.jackcess.impl.ByteUtil; import com.healthmarketscience.jackcess.impl.ColumnImpl; import com.healthmarketscience.jackcess.impl.DatabaseImpl; -import com.healthmarketscience.jackcess.impl.IndexData; -import com.healthmarketscience.jackcess.impl.IndexImpl; import com.healthmarketscience.jackcess.impl.JetFormat; import static com.healthmarketscience.jackcess.impl.JetFormatTest.*; import com.healthmarketscience.jackcess.impl.RowIdImpl; import com.healthmarketscience.jackcess.impl.RowImpl; import com.healthmarketscience.jackcess.impl.TableImpl; import com.healthmarketscience.jackcess.util.LinkResolver; -import com.healthmarketscience.jackcess.util.MemFileChannel; import com.healthmarketscience.jackcess.util.RowFilterTest; import junit.framework.TestCase; +import static com.healthmarketscience.jackcess.TestUtil.*; /** @@ -70,114 +58,10 @@ import junit.framework.TestCase; */ public class DatabaseTest extends TestCase { - - public static final TimeZone TEST_TZ = - TimeZone.getTimeZone("America/New_York"); - - private static final ThreadLocal<Boolean> _autoSync = - new ThreadLocal<Boolean>(); - - public DatabaseTest(String name) throws Exception { super(name); } - static void setTestAutoSync(boolean autoSync) { - _autoSync.set(autoSync); - } - - static void clearTestAutoSync() { - _autoSync.remove(); - } - - static boolean getTestAutoSync() { - Boolean autoSync = _autoSync.get(); - return ((autoSync != null) ? autoSync : Database.DEFAULT_AUTO_SYNC); - } - - public static Database open(FileFormat fileFormat, File file) - throws Exception - { - return open(fileFormat, file, false); - } - - private static Database open(FileFormat fileFormat, File file, - boolean inMem) - throws Exception - { - FileChannel channel = (inMem ? MemFileChannel.newChannel(file, "r") - : null); - final Database db = new DatabaseBuilder(file).setReadOnly(true) - .setAutoSync(getTestAutoSync()).setChannel(channel).open(); - assertEquals("Wrong JetFormat.", - DatabaseImpl.getFileFormatDetails(fileFormat).getFormat(), - ((DatabaseImpl)db).getFormat()); - assertEquals("Wrong FileFormat.", fileFormat, db.getFileFormat()); - return db; - } - - public static Database open(TestDB testDB) throws Exception { - return open(testDB.getExpectedFileFormat(), testDB.getFile()); - } - - public static Database openMem(TestDB testDB) throws Exception { - return open(testDB.getExpectedFileFormat(), testDB.getFile(), true); - } - - public static Database create(FileFormat fileFormat) throws Exception { - return create(fileFormat, false); - } - - public static Database create(FileFormat fileFormat, boolean keep) - throws Exception - { - return create(fileFormat, keep, false); - } - - public static Database createMem(FileFormat fileFormat) throws Exception { - return create(fileFormat, false, true); - } - - private static Database create(FileFormat fileFormat, boolean keep, - boolean inMem) - throws Exception - { - FileChannel channel = (inMem ? MemFileChannel.newChannel() : null); - return new DatabaseBuilder(createTempFile(keep)).setFileFormat(fileFormat) - .setAutoSync(getTestAutoSync()).setChannel(channel).create(); - } - - - public static Database openCopy(TestDB testDB) throws Exception { - return openCopy(testDB, false); - } - - public static Database openCopy(TestDB testDB, boolean keep) - throws Exception - { - return openCopy(testDB.getExpectedFileFormat(), testDB.getFile(), keep); - } - - public static Database openCopy(FileFormat fileFormat, File file) - throws Exception - { - return openCopy(fileFormat, file, false); - } - - public static Database openCopy(FileFormat fileFormat, File file, - boolean keep) - throws Exception - { - File tmp = createTempFile(keep); - copyFile(file, tmp); - Database db = new DatabaseBuilder(tmp).setAutoSync(getTestAutoSync()).open(); - assertEquals("Wrong JetFormat.", - DatabaseImpl.getFileFormatDetails(fileFormat).getFormat(), - ((DatabaseImpl)db).getFormat()); - assertEquals("Wrong FileFormat.", fileFormat, db.getFileFormat()); - return db; - } - public void testInvalidTableDefs() throws Exception { for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) { @@ -266,8 +150,9 @@ public class DatabaseTest extends TestCase } } - static void checkColumn(List<? extends Column> columns, int columnNumber, - String name, DataType dataType) + private static void checkColumn( + List<? extends Column> columns, int columnNumber, String name, + DataType dataType) throws Exception { Column column = columns.get(columnNumber); @@ -297,46 +182,6 @@ public class DatabaseTest extends TestCase } } - static void checkTestDBTable1RowABCDEFG(final TestDB testDB, final Table table, final Row row) - throws IOException { - assertEquals("testDB: " + testDB + "; table: " + table, "abcdefg", row.get("A")); - assertEquals("hijklmnop", row.get("B")); - assertEquals(new Byte((byte) 2), row.get("C")); - assertEquals(new Short((short) 222), row.get("D")); - assertEquals(new Integer(333333333), row.get("E")); - assertEquals(new Double(444.555d), row.get("F")); - final Calendar cal = Calendar.getInstance(); - cal.setTime(row.getDate("G")); - assertEquals(Calendar.SEPTEMBER, cal.get(Calendar.MONTH)); - assertEquals(21, cal.get(Calendar.DAY_OF_MONTH)); - assertEquals(1974, cal.get(Calendar.YEAR)); - assertEquals(0, cal.get(Calendar.HOUR_OF_DAY)); - assertEquals(0, cal.get(Calendar.MINUTE)); - assertEquals(0, cal.get(Calendar.SECOND)); - assertEquals(0, cal.get(Calendar.MILLISECOND)); - assertEquals(Boolean.TRUE, row.get("I")); - } - - static void checkTestDBTable1RowA(final TestDB testDB, final Table table, final Row row) - throws IOException { - assertEquals("testDB: " + testDB + "; table: " + table, "a", row.get("A")); - assertEquals("b", row.get("B")); - assertEquals(new Byte((byte) 0), row.get("C")); - assertEquals(new Short((short) 0), row.get("D")); - assertEquals(new Integer(0), row.get("E")); - assertEquals(new Double(0d), row.get("F")); - final Calendar cal = Calendar.getInstance(); - cal.setTime(row.getDate("G")); - assertEquals(Calendar.DECEMBER, cal.get(Calendar.MONTH)); - assertEquals(12, cal.get(Calendar.DAY_OF_MONTH)); - assertEquals(1981, cal.get(Calendar.YEAR)); - assertEquals(0, cal.get(Calendar.HOUR_OF_DAY)); - assertEquals(0, cal.get(Calendar.MINUTE)); - assertEquals(0, cal.get(Calendar.SECOND)); - assertEquals(0, cal.get(Calendar.MILLISECOND)); - assertEquals(Boolean.FALSE, row.get("I")); - } - public void testCreate() throws Exception { for (final FileFormat fileFormat : SUPPORTED_FILEFORMATS) { Database db = create(fileFormat); @@ -1580,7 +1425,7 @@ public class DatabaseTest extends TestCase db.close(); } - private void checkRawValue(String expected, Object val) + private static void checkRawValue(String expected, Object val) { if(expected != null) { assertTrue(ColumnImpl.isRawData(val)); @@ -1590,259 +1435,5 @@ public class DatabaseTest extends TestCase } } - static Object[] createTestRow(String col1Val) { - return new Object[] {col1Val, "R", "McCune", 1234, (byte) 0xad, 555.66d, - 777.88f, (short) 999, new Date()}; - } - - static Object[] createTestRow() { - return createTestRow("Tim"); - } - - static Map<String,Object> createTestRowMap(String col1Val) { - return createExpectedRow("A", col1Val, "B", "R", "C", "McCune", - "D", 1234, "E", (byte) 0xad, "F", 555.66d, - "G", 777.88f, "H", (short) 999, "I", new Date()); - } - - static void createTestTable(Database db) throws Exception { - new TableBuilder("test") - .addColumn(new ColumnBuilder("A", DataType.TEXT)) - .addColumn(new ColumnBuilder("B", DataType.TEXT)) - .addColumn(new ColumnBuilder("C", DataType.TEXT)) - .addColumn(new ColumnBuilder("D", DataType.LONG)) - .addColumn(new ColumnBuilder("E", DataType.BYTE)) - .addColumn(new ColumnBuilder("F", DataType.DOUBLE)) - .addColumn(new ColumnBuilder("G", DataType.FLOAT)) - .addColumn(new ColumnBuilder("H", DataType.INT)) - .addColumn(new ColumnBuilder("I", DataType.SHORT_DATE_TIME)) - .toTable(db); - } - - public static String createString(int len) { - return createString(len, 'a'); - } - - static String createNonAsciiString(int len) { - return createString(len, '\u0CC0'); - } - - private static String createString(int len, char firstChar) { - StringBuilder builder = new StringBuilder(len); - for(int i = 0; i < len; ++i) { - builder.append((char)(firstChar + (i % 26))); - } - return builder.toString(); - } - - static void assertRowCount(int expectedRowCount, Table table) - throws Exception - { - assertEquals(expectedRowCount, countRows(table)); - assertEquals(expectedRowCount, table.getRowCount()); - } - - public static int countRows(Table table) throws Exception { - int rtn = 0; - for(Map<String, Object> row : CursorBuilder.createCursor(table)) { - rtn++; - } - return rtn; - } - - public static void assertTable( - List<? extends Map<String, Object>> expectedTable, - Table table) - throws IOException - { - assertCursor(expectedTable, CursorBuilder.createCursor(table)); - } - - public static void assertCursor( - List<? extends Map<String, Object>> expectedTable, - Cursor cursor) - { - List<Map<String, Object>> foundTable = - new ArrayList<Map<String, Object>>(); - for(Map<String, Object> row : cursor) { - foundTable.add(row); - } - assertEquals(expectedTable.size(), foundTable.size()); - for(int i = 0; i < expectedTable.size(); ++i) { - assertEquals(expectedTable.get(i), foundTable.get(i)); - } - } - - public static RowImpl createExpectedRow(Object... rowElements) { - RowImpl row = new RowImpl((RowIdImpl)null); - for(int i = 0; i < rowElements.length; i += 2) { - row.put((String)rowElements[i], - rowElements[i + 1]); - } - return row; - } - - @SuppressWarnings("unchecked") - public static List<Row> createExpectedTable(Row... rows) { - return Arrays.<Row>asList(rows); - } - - static void dumpDatabase(Database mdb) throws Exception { - dumpDatabase(mdb, false); - } - - static void dumpDatabase(Database mdb, boolean systemTables) - throws Exception - { - dumpDatabase(mdb, systemTables, new PrintWriter(System.out, true)); - } - - static void dumpTable(Table table) throws Exception { - dumpTable(table, new PrintWriter(System.out, true)); - } - - static void dumpDatabase(Database mdb, boolean systemTables, - PrintWriter writer) throws Exception - { - writer.println("DATABASE:"); - for(Table table : mdb) { - dumpTable(table, writer); - } - if(systemTables) { - for(String sysTableName : mdb.getSystemTableNames()) { - dumpTable(mdb.getSystemTable(sysTableName), writer); - } - } - } - - static void dumpTable(Table table, PrintWriter writer) throws Exception { - // make sure all indexes are read - for(Index index : table.getIndexes()) { - ((IndexImpl)index).initialize(); - } - - writer.println("TABLE: " + table.getName()); - List<String> colNames = new ArrayList<String>(); - for(Column col : table.getColumns()) { - colNames.add(col.getName()); - } - writer.println("COLUMNS: " + colNames); - for(Map<String, Object> row : CursorBuilder.createCursor(table)) { - writer.println(massageRow(row)); - } - } - - private static Map<String,Object> massageRow(Map<String, Object> row) - throws IOException - { - for(Map.Entry<String, Object> entry : row.entrySet()) { - Object v = entry.getValue(); - if(v instanceof byte[]) { - // make byte[] printable - byte[] bv = (byte[])v; - entry.setValue(ByteUtil.toHexString(ByteBuffer.wrap(bv), bv.length)); - } else if(v instanceof ComplexValueForeignKey) { - // deref complex values - String str = "ComplexValue(" + v + ")" + - ((ComplexValueForeignKey)v).getValues(); - entry.setValue(str); - } - } - - return row; - } - - static void dumpIndex(Index index) throws Exception { - dumpIndex(index, new PrintWriter(System.out, true)); - } - - static void dumpIndex(Index index, PrintWriter writer) throws Exception { - writer.println("INDEX: " + index); - IndexData.EntryCursor ec = ((IndexImpl)index).cursor(); - IndexData.Entry lastE = ec.getLastEntry(); - IndexData.Entry e = null; - while((e = ec.getNextEntry()) != lastE) { - writer.println(e); - } - } - - static void assertSameDate(Date expected, Date found) - { - if(expected == found) { - return; - } - if((expected == null) || (found == null)) { - throw new AssertionError("Expected " + expected + ", found " + found); - } - long expTime = expected.getTime(); - long foundTime = found.getTime(); - // there are some rounding issues due to dates being stored as doubles, - // but it results in a 1 millisecond difference, so i'm not going to worry - // about it - if((expTime != foundTime) && (Math.abs(expTime - foundTime) > 1)) { - throw new AssertionError("Expected " + expTime + " (" + expected + - "), found " + foundTime + " (" + found + ")"); - } - } - - static void copyFile(File srcFile, File dstFile) - throws IOException - { - // FIXME should really be using commons io FileUtils here, but don't want - // to add dep for one simple test method - byte[] buf = new byte[1024]; - OutputStream ostream = new FileOutputStream(dstFile); - InputStream istream = new FileInputStream(srcFile); - try { - int numBytes = 0; - while((numBytes = istream.read(buf)) >= 0) { - ostream.write(buf, 0, numBytes); - } - } finally { - ostream.close(); - } - } - - static File createTempFile(boolean keep) throws Exception { - File tmp = File.createTempFile("databaseTest", ".mdb"); - if(keep) { - System.out.println("Created " + tmp); - } else { - tmp.deleteOnExit(); - } - return tmp; - } - - public static void clearTableCache(Database db) throws Exception - { - Field f = db.getClass().getDeclaredField("_tableCache"); - f.setAccessible(true); - Object val = f.get(db); - f = val.getClass().getDeclaredField("_tables"); - f.setAccessible(true); - val = f.get(val); - ((Map<?,?>)val).clear(); - } - - public static byte[] toByteArray(File file) - throws IOException - { - return toByteArray(new FileInputStream(file), file.length()); - } - - public static byte[] toByteArray(InputStream in, long length) - throws IOException - { - // FIXME should really be using commons io IOUtils here, but don't want - // to add dep for one simple test method - try { - DataInputStream din = new DataInputStream(in); - byte[] bytes = new byte[(int)length]; - din.readFully(bytes); - return bytes; - } finally { - in.close(); - } - } } |