/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002, 2015 Oracle and/or its affiliates. All rights reserved.
*
*/
package com.sleepycat.db.test;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import com.sleepycat.db.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import com.sleepycat.db.test.TestUtils;
public class EncryptTest {
public static final String ENCRYPTTEST_DBNAME = "encrypttest.db";
@BeforeClass public static void ClassInit() {
TestUtils.loadConfig(null);
TestUtils.check_file_removed(TestUtils.getDBFileName(ENCRYPTTEST_DBNAME), true, true);
}
@AfterClass public static void ClassShutdown() {
TestUtils.check_file_removed(TestUtils.getDBFileName(ENCRYPTTEST_DBNAME), true, true);
}
@Before public void PerTestInit()
throws Exception {
TestUtils.check_file_removed(TestUtils.getDBFileName(ENCRYPTTEST_DBNAME), true, true);
}
@After() public void PerTestShutdown()
throws Exception {
TestUtils.check_file_removed(TestUtils.getDBFileName(ENCRYPTTEST_DBNAME), true, true);
}
/*
* Test case implementations.
* To disable a test mark it with @Ignore
* To set a timeout(ms) notate like: @Test(timeout=1000)
* To indicate an expected exception notate like: (expected=Exception)
*/
/*
* Test the basic db no env and encryption disabled.
*/
@Test public void test1()
throws DatabaseException, FileNotFoundException, UnsupportedEncodingException
{
DatabaseConfig dbConf = new DatabaseConfig();
dbConf.setType(DatabaseType.BTREE);
dbConf.setAllowCreate(true);
Database db = new Database(TestUtils.getDBFileName(ENCRYPTTEST_DBNAME), null, dbConf);
DatabaseEntry key = new DatabaseEntry("key".getBytes("UTF-8"));
DatabaseEntry data = new DatabaseEntry("data".getBytes("UTF-8"));
db.put(null, key, data);
db.close();
//try { Thread.sleep(10000); } catch(InterruptedException e) {}
if(!findData("key"))
fail("Did not find the un-encrypted value in the database file after close");
}
/*
* Test database with encryption, no env.
*/
@Test public void test2()
throws DatabaseException, FileNotFoundException, UnsupportedEncodingException
{
DatabaseConfig dbConf = new DatabaseConfig();
dbConf.setType(DatabaseType.BTREE);
dbConf.setAllowCreate(true);
dbConf.setEncrypted("password");
dbConf.setErrorStream(System.err);
Database db = new Database(TestUtils.getDBFileName(ENCRYPTTEST_DBNAME), null, dbConf);
DatabaseEntry key = new DatabaseEntry("key".getBytes("UTF-8"));
DatabaseEntry data = new DatabaseEntry("data".getBytes("UTF-8"));
db.put(null, key, data);
db.sync();
db.close();
if (findData("key"))
fail("Found the un-encrypted value in an encrypted database file after close");
}
private boolean findData(String toFind)
{
boolean found = false;
try {
String dbname = TestUtils.getDBFileName(ENCRYPTTEST_DBNAME);
File f = new File(dbname);
if (!f.exists() || f.isDirectory()) {
TestUtils.ERR("Could not find database file: " + dbname + " to look for encrypted string.");
return false;
}
FileInputStream fin = new FileInputStream(f);
byte[] buf = new byte[(int)f.length()];
fin.read(buf, 0, (int)f.length());
fin.close();
TestUtils.DEBUGOUT(1, "EncryptTest findData file length: " + buf.length);
byte firstbyte = (toFind.getBytes("UTF-8"))[0];
// buf can contain non-ascii characters, so no easy string search
for (int i = 0; i < buf.length - toFind.length(); i++)
{
if (buf[i] == firstbyte)
{
if(toFind.compareTo(new String(buf, i, toFind.length())) == 0)
{
found = true;
break;
}
}
}
} catch(Exception e) {
}
return found;
}
}