package ch.dueni.prefs;
import java.io.File;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import java.util.prefs.PreferencesFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import ch.dueni.prefs.servlet.AppMap;
import ch.dueni.prefs.servlet.SessionMap;
import static org.junit.Assert.*;
public class PrefsTest {
@BeforeClass
public static void init() {
System.setProperty(PreferencesFactory.class.getName(), XmlFilePreferencesFactory.class.getName());
}
@Before
public void setup() {
PreferencesContext prefsCtx = new PreferencesContext();
prefsCtx.setAppScope(new AppMap(new TestServletContext()));
prefsCtx.setUserScope(new SessionMap(new TestHttpSession()));
prefsCtx.setUserName("A123456");
File target = new File("target/prefs-test");
prefsCtx.setStorePath(target.getAbsolutePath());
PreferencesContext.setCurrentInstance(prefsCtx);
}
@After
public void tearDown() {
PreferencesContext.cleanup();
}
@Test
public void testSaveBackingStoreWithNoChanges() {
PreferencesContext ctx = PreferencesContext.getCurrentInstance();
ctx.saveToBackingStore();
ctx.saveToBackingStore();
}
@Test
public void storeAndRetrieveUserPrefs() throws Exception {
Preferences myNode = Preferences.userRoot().node("userPath").node("myNode");
myNode.put("1st", "1st");
myNode.put("2nd", "2nd");
myNode.putInt("1stNum", 1);
Preferences subNode = myNode.node("subNode");
subNode.putBoolean("defined", true);
myNode.flush();
PreferencesContext.getCurrentInstance().saveToBackingStore();
myNode = null;
subNode = null;
assertNull(myNode);
assertNull(subNode);
myNode = Preferences.userRoot().node("userPath").node("myNode");
assertNotNull(myNode);
assertEquals("1st", myNode.get("1st", null));
assertEquals("2nd", myNode.get("2nd", null));
assertEquals(1, myNode.getInt("1stNum", -1));
subNode = myNode.node("subNode");
assertNotNull(subNode);
assertTrue(subNode.getBoolean("defined", false));
}
@Test
public void storeAndRetrieveSystemPrefs() throws Exception {
Preferences myNode = Preferences.systemRoot().node("systemPath").node("myNode");
myNode.put("1st", "1st");
myNode.put("2nd", "2nd");
myNode.putInt("1stNum", 1);
Preferences subNode = myNode.node("subNode");
subNode.putBoolean("defined", true);
myNode.flush();
PreferencesContext.getCurrentInstance().saveToBackingStore();
myNode = null;
subNode = null;
assertNull(myNode);
assertNull(subNode);
myNode = Preferences.systemRoot().node("systemPath").node("myNode");
assertNotNull(myNode);
assertEquals("1st", myNode.get("1st", null));
assertEquals("2nd", myNode.get("2nd", null));
assertEquals(1, myNode.getInt("1stNum", -1));
subNode = myNode.node("subNode");
assertNotNull(subNode);
assertTrue(subNode.getBoolean("defined", false));
}
@Test
public void storeAndRetrieveUserPrefsNoBackingStore() throws Exception {
PreferencesContext ctx = PreferencesContext.getCurrentInstance();
ctx.setUserName("A111111");
Preferences myNode = Preferences.userRoot().node("userPath").node("myNode");
myNode.put("1st", "1st");
Preferences subNode = myNode.node("subNode");
subNode.putBoolean("defined", true);
myNode.flush();
ctx.saveToBackingStore();
myNode = null;
subNode = null;
assertNull(myNode);
assertNull(subNode);
// now make backing store unavailable for read
ctx.setReadable(false);
Preferences.userRoot().sync(); // force reload of userRoot
Preferences userRoot = Preferences.userRoot();
try {
userRoot.nodeExists("userPath");
} catch (BackingStoreException bse) {
// as expected
ctx.setReadable(true);
}
// now load should work
userRoot.sync();
userRoot = Preferences.userRoot();
userRoot.nodeExists("userPath");
myNode = userRoot.node("userPath").node("myNode");
assertNotNull(myNode);
assertEquals("1st", myNode.get("1st", null));
subNode = myNode.node("subNode");
assertNotNull(subNode);
assertTrue(subNode.getBoolean("defined", false));
ctx.setWritable(false);
try {
userRoot.flush();
ctx.saveToBackingStore();
} catch (BackingStoreException bse) {
// as expected
} catch (Exception e) {
fail("unexpected exception: " + e.getMessage());
}
}
@Test
public void addRemoveAddNodeTest() throws Exception {
Preferences userRoot = Preferences.userRoot();
Preferences node = userRoot.node("newNode");
assertTrue(userRoot.nodeExists("newNode"));
node.removeNode();
assertFalse(userRoot.nodeExists("newNode"));
// test removed flag
assertFalse(node.nodeExists(""));
node = userRoot.node("newNode");
assertNotNull(node);
assertTrue(userRoot.nodeExists("newNode"));
// test removed flag
assertTrue(node.nodeExists(""));
userRoot.sync();
}
}