blob: a2b9d72e44860064d68b37f86ea3b09d6b48ece0 [file] [log] [blame]
package de.ids_mannheim.korap.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.commons.dbcp2.BasicDataSource;
import org.flywaydb.core.Flyway;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.SingleConnectionDataSource;
import de.ids_mannheim.korap.authentication.KustvaktAuthenticationManager;
import de.ids_mannheim.korap.exceptions.EmptyResultException;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.handlers.JDBCClient;
import de.ids_mannheim.korap.handlers.ResourceDao;
import de.ids_mannheim.korap.interfaces.EncryptionIface;
import de.ids_mannheim.korap.interfaces.EntityHandlerIface;
import de.ids_mannheim.korap.interfaces.db.PersistenceClient;
import de.ids_mannheim.korap.resources.KustvaktResource;
import de.ids_mannheim.korap.user.User;
import de.ids_mannheim.korap.utils.TimeUtils;
/**
* creates a test user that can be used to access protected functions
*
* @author hanl
* @date 16/10/2015
*/
public class TestHelper {
private static Logger jlog = LoggerFactory.getLogger(TestHelper.class);
private static final Map<String, Object> data = new HashMap<>();
static {
data.put(Attributes.ID, 3); // 2);
data.put(Attributes.USERNAME, "testUser1"); // bodmer funktioniert noch nicht
data.put(Attributes.PASSWORD, "testPass2015");
data.put(Attributes.FIRSTNAME, "test");
data.put(Attributes.LASTNAME, "user");
data.put(Attributes.EMAIL, "test@ids-mannheim.de");
data.put(Attributes.ADDRESS, "Mannheim");
data.put(Attributes.DEFAULT_LEMMA_FOUNDRY, "test_l");
data.put(Attributes.DEFAULT_POS_FOUNDRY, "test_p");
data.put(Attributes.DEFAULT_CONST_FOUNDRY, "test_const");
}
private ContextHolder beansHolder;
public static TestHelper newInstance (ApplicationContext ctx)
throws Exception {
TestHelper b = new TestHelper();
b.beansHolder = new ContextHolder(ctx) {};
return b;
}
public <T> T getBean (Class<T> type) {
return this.beansHolder.getBean(type);
}
public ContextHolder getContext () {
return this.beansHolder;
}
public <T> T getBean (String name) {
return (T) this.beansHolder.getBean(name);
}
public TestHelper setupAccount () throws KustvaktException {
KustvaktBaseDaoInterface dao = getBean(ContextHolder.KUSTVAKT_USERDB);
KustvaktAuthenticationManager manager = getBean(ContextHolder.KUSTVAKT_AUTHENTICATION_MANAGER);
// manager.createUserAccount(KustvaktConfiguration.KUSTVAKT_USER, false);
try {
User user = getUser();
jlog.debug("found user, skipping setup ...");
if (!user.getUsername().equals(data.get(Attributes.USERNAME))){
return this;
}
}
catch (RuntimeException e) {
// do nothing and continue
}
Map m = getUserCredentials();
assertNotNull("userdatabase handler must not be null", dao);
try {
manager.createUserAccount(m, false);
}
catch (KustvaktException e) {
throw new RuntimeException(e);
/*// do nothing
jlog.error("Error: {}", e.string());
assertNotNull("Test user could not be set up", null);*/
}
assertNotEquals(0, dao.size());
return this;
}
// EM
@Deprecated
// public TestHelper setupSimpleAccount (String username, String password) {
// KustvaktBaseDaoInterface dao = getBean(ContextHolder.KUSTVAKT_USERDB);
// EntityHandlerIface edao = (EntityHandlerIface) dao;
// try {
// edao.getAccount(username);
// }
// catch (EmptyResultException e) {
// // do nothing
// }
// catch (KustvaktException ex) {
// assertNull("Test user could not be set up", true);
// }
//
// Map m = new HashMap<>();
// m.put(Attributes.USERNAME, username);
//
// try {
// String hash = ((EncryptionIface) getBean(ContextHolder.KUSTVAKT_ENCRYPTION))
// .secureHash(password);
// m.put(Attributes.PASSWORD, hash);
// }
// catch (NoSuchAlgorithmException | UnsupportedEncodingException
// | KustvaktException e) {
// // do nohting
// assertNotNull("Exception thrown", null);
// }
// assertNotNull("userdatabase handler must not be null", dao);
//
// try {
//
// int i = edao.createAccount(User.UserFactory.toKorAPUser(m));
// assert BeansFactory.getKustvaktContext().getUserDBHandler()
// .getAccount((String) data.get(Attributes.USERNAME)) != null;
// assertEquals(1, i);
// }
// catch (KustvaktException e) {
// // do nothing
// assertNull("Test user could not be set up", true);
// }
// return this;
// }
public User getUser () {
try {
return ((EntityHandlerIface) getBean(ContextHolder.KUSTVAKT_USERDB))
.getAccount((String) data.get(Attributes.USERNAME));
}
catch (KustvaktException e) {
// do nothing
}
throw new RuntimeException("User could not be retrieved!");
}
public TestHelper dropUser (String ... usernames) throws KustvaktException {
if (usernames == null || usernames.length == 0) {
KustvaktBaseDaoInterface dao = getBean(ContextHolder.KUSTVAKT_USERDB);
dao.truncate();
}
for (String name : Arrays.asList(usernames)) {
if (remove(name))
break;
}
return this;
}
private boolean remove (String username) throws KustvaktException {
EntityHandlerIface dao = getBean(ContextHolder.KUSTVAKT_USERDB);
User us = dao.getAccount(username);
dao.deleteAccount(us.getId());
return true;
}
public TestHelper truncateAll () {
String sql = "SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES";
final Set<String> queries = new HashSet<>();
PersistenceClient cl = getBean(ContextHolder.KUSTVAKT_POLICIES);
NamedParameterJdbcTemplate source = (NamedParameterJdbcTemplate) cl
.getSource();
source.query(sql, new RowCallbackHandler() {
@Override
public void processRow (ResultSet rs) throws SQLException {
queries.add(rs.getString(1));
}
});
System.out.println(queries);
for (String query : queries)
source.update(query, new HashMap<String, Object>());
return this;
}
public static Map<String, Object> getUserCredentials () {
return new HashMap<>(data);
}
public int setupResource (KustvaktResource resource)
throws KustvaktException {
ResourceDao dao = new ResourceDao(
(PersistenceClient) getBean(ContextHolder.KUSTVAKT_DB));
return dao.storeResource(resource, getUser());
}
public KustvaktResource getResource (String name) throws KustvaktException {
ResourceDao dao = new ResourceDao(
(PersistenceClient) getBean(ContextHolder.KUSTVAKT_DB));
KustvaktResource res = dao.findbyId(name, getUser());
if (res == null)
throw new RuntimeException("resource with name " + name
+ " not found ...");
return res;
}
public TestHelper dropResource (String ... names) throws KustvaktException {
ResourceDao dao = new ResourceDao(
(PersistenceClient) getBean(ContextHolder.KUSTVAKT_DB));
if (names == null || names.length == 0)
dao.truncate();
for (String name : names)
dao.deleteResource(name, null);
return this;
}
public void close () {
BeansFactory.closeApplication();
}
private TestHelper () {
}
// EM: use Spring XML config
@Deprecated
private static PersistenceClient mysql_db () throws IOException {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/kustvakt_test");
dataSource.setUsername("mhanl");
dataSource.setPassword("password");
JDBCClient client = new JDBCClient(dataSource);
client.setDatabase("mariadb");
Flyway fl = new Flyway();
fl.setDataSource(dataSource);
fl.setLocations("db.mysql");
fl.migrate();
return client;
}
// EM: use Spring XML config
@Deprecated
protected static PersistenceClient sqlite_db (boolean memory)
throws InterruptedException {
SingleConnectionDataSource dataSource = new SingleConnectionDataSource();
dataSource.setDriverClassName("org.sqlite.JDBC");
DateTime t = TimeUtils.getNow();
//String name = testclass != null ? testclass.getSimpleName() + "_" : "";
if (memory)
dataSource.setUrl("jdbc:sqlite::memory:");
else {
File tmp = new File("tmp");
if (!tmp.exists())
tmp.mkdirs();
dataSource.setUrl("jdbc:sqlite:tmp/sqlite_" + t.getMillis()
+ ".sqlite");
}
dataSource.setSuppressClose(true);
Flyway fl = new Flyway();
fl.setDataSource(dataSource);
fl.setLocations("db.sqlite");
fl.migrate();
JDBCClient client = new JDBCClient(dataSource);
client.setDatabase("sqlite");
return client;
}
// EM: use Spring XML config
@Deprecated
public static PersistenceClient sqlite_db_norm (boolean memory) {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.sqlite.JDBC");
dataSource.setMaxTotal(1);
dataSource.setInitialSize(1);
dataSource.setMaxIdle(1);
dataSource.addConnectionProperty("lazy-init", "true");
DateTime t = TimeUtils.getNow();
if (memory)
dataSource.setUrl("jdbc:sqlite::memory:");
else {
File tmp = new File("tmp");
if (!tmp.exists())
tmp.mkdirs();
dataSource.setUrl("jdbc:sqlite:tmp/sqlite_" + t.toString());
}
Flyway fl = new Flyway();
fl.setDataSource(dataSource);
fl.setLocations("db.sqlite");
fl.migrate();
JDBCClient client = new JDBCClient(dataSource);
client.setDatabase("sqlite");
return client;
}
// EM: use Spring XML config
@Deprecated
public static PersistenceClient h2_emb () throws SQLException {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:h2:mem:");
dataSource.getConnection().nativeSQL("SET MODE MySQL;");
dataSource.getConnection().commit();
dataSource.setUsername("sa");
dataSource.setPassword("");
dataSource.setDriverClassName("org.h2.Driver");
Flyway fl = new Flyway();
fl.setDataSource(dataSource);
fl.setLocations("db.mysql");
fl.migrate();
JDBCClient client = new JDBCClient(dataSource);
client.setDatabase("h2");
return client;
}
}