package de.dal33t.powerfolder.test.folder.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import de.dal33t.powerfolder.disk.dao.FileInfoDAO;
import de.dal33t.powerfolder.disk.dao.FileInfoDAOSQLImpl;
import de.dal33t.powerfolder.disk.dao.FileInfoSQLConverter;
import de.dal33t.powerfolder.light.FileInfo;
import de.dal33t.powerfolder.util.StreamUtils;
import de.dal33t.powerfolder.util.logging.LoggingManager;
import de.dal33t.powerfolder.util.test.TestHelper;
public class FileInfoDAOH2DBTest extends FileInfoDAOTestCase {
private Connection con;
private String createTableSQL;
private FileInfoDAO dao;
@Override
protected void setUp() throws Exception {
super.setUp();
TestHelper.cleanTestDir();
Class.forName("org.h2.Driver");
con = DriverManager.getConnection("jdbc:h2:" + TestHelper.getTestDir()
+ "/db_raw", "sa", "");
dao = new FileInfoDAOSQLImpl(getController(), "jdbc:h2:"
+ TestHelper.getTestDir() + "/db", "sa", "", null);
byte[] content = StreamUtils.readIntoByteArray(Thread.currentThread()
.getContextClassLoader().getResourceAsStream(
"sql/create_folder_table.sql"));
createTableSQL = new String(content, "UTF-8").replace("%TABLE_NAME%",
"FileInfo");
}
@Override
protected void tearDown() throws Exception {
con.close();
dao.stop();
super.tearDown();
}
public void testIndexFileInfo() {
testIndexFileInfo(dao);
}
public void testFindNewestVersion() {
testFindNewestVersion(dao);
}
public void testFindAll() {
LoggingManager.setConsoleLogging(Level.SEVERE);
testFindAll(dao, 5000);
}
public void testCreateTable() throws SQLException {
Statement s = con.createStatement();
s.execute(createTableSQL);
s.close();
s = con.createStatement();
assertTrue(s.execute("SELECT * FROM FileInfo"));
assertFalse(s.getResultSet().next());
assertFalse(s.getResultSet().next());
s.close();
}
public void testInsert() throws SQLException {
testCreateTable();
PreparedStatement ps = con
.prepareStatement(FileInfoDAOSQLImpl.SQL_INSERT);
int i = 1;
ps.setString(i++, "DOMAIN");
ps.setString(i++, "TestFile.txt");
ps.setString(i++, "TestFile.txt".toLowerCase());
ps.setBoolean(i++, false);
ps.setLong(i++, 1337);
ps.setString(i++, "[XIDSNNID]");
ps.setLong(i++, 1238604350944L);
ps.setLong(i++, 2);
ps.setBoolean(i++, Boolean.FALSE);
ps.setString(i++, "[FOLDER_ID]");
assertFalse(ps.execute());
ps.close();
}
public void testSelect() throws SQLException {
testInsert();
// All
PreparedStatement ps = con.prepareStatement("SELECT * FROM FileInfo");
assertTrue(ps.execute());
ResultSet rs = ps.getResultSet();
assertTrue(rs.next());
assertEquals("TestFile.txt", rs.getString("fileName"));
assertEquals("testfile.txt", rs.getString("fileNameLower"));
assertEquals(1337, rs.getLong("size"));
assertEquals("[XIDSNNID]", rs.getString("modifiedByNodeId"));
assertEquals(new Date(1238604350944L), new Date(rs
.getLong("lastModifiedDate")));
assertEquals(2, rs.getLong("version"));
assertEquals(Boolean.FALSE.booleanValue(), rs.getBoolean("deleted"));
assertEquals("[FOLDER_ID]", rs.getString("folderId"));
ps.close();
// Single file match
ps = con.prepareStatement("SELECT * FROM FileInfo WHERE fileName=?");
ps.setString(1, "TestFile.txt");
assertTrue(ps.execute());
rs = ps.getResultSet();
assertTrue(rs.next());
assertEquals("TestFile.txt", rs.getString("fileName"));
assertEquals(1337, rs.getLong("size"));
assertEquals("[XIDSNNID]", rs.getString("modifiedByNodeId"));
assertEquals(new Date(1238604350944L), new Date(rs
.getLong("lastModifiedDate")));
assertEquals(2, rs.getLong("version"));
assertEquals(Boolean.FALSE.booleanValue(), rs.getBoolean("deleted"));
assertEquals("[FOLDER_ID]", rs.getString("folderId"));
ps.close();
ps = con.prepareStatement("SELECT * FROM FileInfo WHERE fileName=?");
ps.setString(1, "testfile.txt");
assertTrue(ps.execute());
rs = ps.getResultSet();
assertFalse(rs.next());
ps.close();
// Single file match by lower case filename
ps = con
.prepareStatement("SELECT * FROM FileInfo WHERE fileNameLower=?");
ps.setString(1, "testfile.txt");
assertTrue(ps.execute());
rs = ps.getResultSet();
assertTrue(rs.next());
assertEquals("TestFile.txt", rs.getString("fileName"));
assertEquals(1337, rs.getLong("size"));
assertEquals("[XIDSNNID]", rs.getString("modifiedByNodeId"));
assertEquals(new Date(1238604350944L), new Date(rs
.getLong("lastModifiedDate")));
assertEquals(2, rs.getLong("version"));
assertEquals(Boolean.FALSE.booleanValue(), rs.getBoolean("deleted"));
assertEquals("[FOLDER_ID]", rs.getString("folderId"));
ps.close();
}
public void testStoreFileInfo() throws SQLException {
testCreateTable();
int nFiles = 30000;
Map<String, FileInfo> fInfos = new HashMap<String, FileInfo>();
PreparedStatement ps = con
.prepareStatement(FileInfoDAOSQLImpl.SQL_INSERT);
for (int i = 0; i < nFiles; i++) {
FileInfo fInfo = createRandomFileInfo(i, "Random");
ps.setString(1, "DOMAIN");
FileInfoSQLConverter.set(fInfo, ps);
fInfos.put(fInfo.getRelativeName(), fInfo);
assertFalse(ps.execute());
}
ps.close();
ps = con.prepareStatement("SELECT COUNT(*) FROM FileInfo");
assertTrue(ps.execute());
ResultSet rs = ps.getResultSet();
assertTrue(rs.next());
assertEquals(nFiles, rs.getInt(1));
ps.close();
ps = con.prepareStatement("SELECT * FROM FileInfo");
assertTrue(ps.execute());
rs = ps.getResultSet();
while (rs.next()) {
String fileName = rs.getString("fileName");
assertTrue(fileName.startsWith("subdir1/SUBDIR2/"));
assertTrue(rs.getString("fileNameLower").startsWith(
"subdir1/subdir2/"));
FileInfo expected = fInfos.get(fileName);
FileInfo actual = FileInfoSQLConverter.get(null, rs);
assertEquals(expected, actual);
}
ps.close();
}
}