package ch.rgw.tools;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import ch.rgw.io.Settings;
import ch.rgw.io.SqlSettings;
import junit.framework.Assert;
public class Test_SqlSettings {
private static JdbcLink mainLink;
@BeforeClass
public static void beforeClass(){
mainLink = getJdbcLink(true);
}
@AfterClass
public static void afterClass(){
mainLink.disconnect();
}
@After
public void after(){
JdbcLink link = getJdbcLink(false);
link.exec("DELETE FROM CONFIG WHERE 1=1;");
link.exec("DELETE FROM USERCONFIG WHERE 1=1;");
link.disconnect();
}
@Test
public void testConstructors(){
JdbcLink link = getJdbcLink(false);
new SqlSettings(link, "CONFIG");
new SqlSettings(link, "USERCONFIG", "Param", "Value", "UserID='1'");
link.disconnect();
}
@Test
public void testSetString(){
JdbcLink link = getJdbcLink(false);
SqlSettings globalSettings = new SqlSettings(link, "CONFIG");
// returns false on first set
assertFalse(globalSettings.set("key1", "value"));
globalSettings.flush();
// returns true if already set
assertTrue(globalSettings.set("key1", "value1"));
globalSettings.flush();
link.disconnect();
link = getJdbcLink(false);
SqlSettings userSettings =
new SqlSettings(link, "USERCONFIG", "Param", "Value", "UserID='1'");
// returns false on first set
assertFalse(userSettings.set("key1", "value"));
userSettings.flush();
// returns true if already set
assertTrue(userSettings.set("key1", "value1"));
userSettings.flush();
link.disconnect();
}
@Test
public void testSetBoolean(){
JdbcLink link = getJdbcLink(false);
SqlSettings globalSettings = new SqlSettings(link, "CONFIG");
// returns false on first set
globalSettings.set("key1", true);
globalSettings.flush();
// returns true if already set
globalSettings.set("key1", false);
globalSettings.flush();
link.disconnect();
link = getJdbcLink(false);
SqlSettings userSettings =
new SqlSettings(link, "USERCONFIG", "Param", "Value", "UserID='1'");
// returns false on first set
userSettings.set("key1", true);
userSettings.flush();
// returns true if already set
userSettings.set("key1", false);
userSettings.flush();
link.disconnect();
}
@Test
public void testSetInt(){
JdbcLink link = getJdbcLink(false);
SqlSettings globalSettings = new SqlSettings(link, "CONFIG");
// returns false on first set
globalSettings.set("key1", 1);
globalSettings.flush();
// returns true if already set
globalSettings.set("key1", 2);
globalSettings.flush();
link.disconnect();
link = getJdbcLink(false);
SqlSettings userSettings =
new SqlSettings(link, "USERCONFIG", "Param", "Value", "UserID='1'");
// returns false on first set
userSettings.set("key1", 1);
userSettings.flush();
// returns true if already set
userSettings.set("key1", 2);
userSettings.flush();
link.disconnect();
}
@Test
public void testGetString(){
JdbcLink link = getJdbcLink(false);
Settings globalSettings = new SqlSettings(link, "CONFIG");
globalSettings.set("key1", "value1");
globalSettings.set("key2", "\\\\server\\order\\file");
globalSettings.flush();
link.disconnect();
link = getJdbcLink(false);
globalSettings = new SqlSettings(link, "CONFIG");
assertEquals("value1", globalSettings.get("key1", ""));
assertEquals("\\\\server\\order\\file", globalSettings.get("key2", ""));
SqlSettings userSettings =
new SqlSettings(link, "USERCONFIG", "Param", "Value", "UserID='1'");
userSettings.set("key1", "value1");
userSettings.set("key2", "\\\\server\\order\\file");
userSettings.flush();
link.disconnect();
link = getJdbcLink(false);
userSettings = new SqlSettings(link, "USERCONFIG", "Param", "Value", "UserID='1'");
assertEquals("value1", userSettings.get("key1", ""));
assertEquals("\\\\server\\order\\file", userSettings.get("key2", ""));
link.disconnect();
}
@Test
public void testGetBoolean(){
JdbcLink link = getJdbcLink(false);
Settings globalSettings = new SqlSettings(link, "CONFIG");
globalSettings.set("key1", true);
globalSettings.set("key2", false);
globalSettings.flush();
link.disconnect();
link = getJdbcLink(false);
globalSettings = new SqlSettings(link, "CONFIG");
assertEquals(true, globalSettings.get("key1", false));
assertEquals(false, globalSettings.get("key2", true));
SqlSettings userSettings =
new SqlSettings(link, "USERCONFIG", "Param", "Value", "UserID='1'");
userSettings.set("key1", true);
userSettings.set("key2", false);
userSettings.flush();
link.disconnect();
link = getJdbcLink(false);
userSettings = new SqlSettings(link, "USERCONFIG", "Param", "Value", "UserID='1'");
assertEquals(true, userSettings.get("key1", false));
assertEquals(false, userSettings.get("key2", true));
link.disconnect();
}
@Test
public void testGetInt(){
JdbcLink link = getJdbcLink(false);
Settings globalSettings = new SqlSettings(link, "CONFIG");
globalSettings.set("key1", 1);
globalSettings.set("key2", 2);
globalSettings.flush();
link.disconnect();
link = getJdbcLink(false);
globalSettings = new SqlSettings(link, "CONFIG");
assertEquals(1, globalSettings.get("key1", -1));
assertEquals(2, globalSettings.get("key2", -1));
SqlSettings userSettings =
new SqlSettings(link, "USERCONFIG", "Param", "Value", "UserID='1'");
userSettings.set("key1", 1);
userSettings.set("key2", 2);
userSettings.flush();
link.disconnect();
link = getJdbcLink(false);
userSettings = new SqlSettings(link, "USERCONFIG", "Param", "Value", "UserID='1'");
assertEquals(1, userSettings.get("key1", -1));
assertEquals(2, userSettings.get("key2", -1));
link.disconnect();
}
@Test
public void testConcurrentChange(){
JdbcLink link1 = getJdbcLink(false);
SqlSettings globalSettings1 = new SqlSettings(link1, "CONFIG");
globalSettings1.set("key1", "value1");
globalSettings1.flush();
JdbcLink link2 = getJdbcLink(false);
SqlSettings globalSettings2 = new SqlSettings(link2, "CONFIG");
// read value from 2
assertEquals("value1", globalSettings2.get("key1", null));
// change on 2 and flush
globalSettings2.set("key1", "value2");
globalSettings2.flush();
// read value from 1
assertEquals("value1", globalSettings1.get("key1", null));
// write something else on 1 and flush
globalSettings1.set("key2", "value1");
globalSettings1.flush();
// flush and disconnect
globalSettings2.flush();
link1.disconnect();
link2.disconnect();
// test what was persisted
JdbcLink link = getJdbcLink(false);
SqlSettings globalSettings = new SqlSettings(link, "CONFIG");
assertEquals("value2", globalSettings.get("key1", null));
assertEquals("value1", globalSettings.get("key2", null));
link.disconnect();
}
@Test
public void testPrimaryKeys() throws SQLException{
JdbcLink link = getJdbcLink(false);
// create 2 keys
SqlSettings userSettings = new SqlSettings(link, "USERCONFIG", "Param", "Value", "UserID='1'");
userSettings.set("key1", 1);
userSettings.set("key2", 2);
userSettings.flush();
ResultSet res = link.getStatement().query("SELECT COUNT(*) FROM USERCONFIG WHERE UserID=1");
res.next();
Assert.assertEquals(2, res.getInt(1)); // size is 2
// update to key 1
userSettings.set("key1", 1);
userSettings.flush();
res = link.getStatement().query("SELECT COUNT(*) FROM USERCONFIG WHERE UserID=1");
res.next();
// size is same
Assert.assertEquals(2, res.getInt(1));
try
{
link.getStatement().exec("INSERT INTO USERCONFIG (USERID, PARAM, VALUE) VALUES ('1', 'key1', 'test')");
Assert.fail("primary key violation -exeception should happend");
}
catch(JdbcLinkException e)
{
// ignore
}
res = link.getStatement().query("SELECT COUNT(*) FROM USERCONFIG WHERE UserID=1");
res.next();
Assert.assertEquals(2, res.getInt(1));
link.disconnect();
}
private static JdbcLink getJdbcLink(boolean create){
JdbcLink link = new JdbcLink("org.h2.Driver", "jdbc:h2:mem:test_settings_mem", "");
link.connect("", "");
if (create) {
// init config tables
link.exec(
"CREATE TABLE CONFIG(lastupdate BIGINT, param VARCHAR(80) primary key, wert TEXT);");
link.exec(
"CREATE TABLE USERCONFIG( lastupdate BIGINT, UserID VARCHAR(25), Param VARCHAR(80), Value TEXT);ALTER TABLE USERCONFIG ALTER COLUMN USERID SET NOT NULL;ALTER TABLE USERCONFIG ALTER COLUMN PARAM SET NOT NULL;ALTER TABLE USERCONFIG ADD PRIMARY KEY (USERID , PARAM);");
}
return link;
}
}