/*
* Copyright (C) 2008 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
* Created on 21. November 2008 by Joerg Schaible
*/
package com.thoughtworks.xstream.persistence;
import com.thoughtworks.xstream.XStream;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import junit.framework.TestCase;
/**
* @author Jörg Schaible
* @author Guilherme Silveira
*/
public class FilePersistenceStrategyTest extends TestCase {
private final File baseDir = new File("target/tmp");
protected void setUp() throws Exception {
super.setUp();
if (baseDir.exists()) {
clear(baseDir);
}
baseDir.mkdirs();
}
protected void tearDown() throws Exception {
super.tearDown();
clear(baseDir);
}
private void clear(File dir) {
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++ ) {
if (files[i].isFile()) {
boolean deleted = files[i].delete();
if (!deleted) {
throw new RuntimeException(
"Unable to continue testing: unable to remove file "
+ files[i].getAbsolutePath());
}
}
}
dir.delete();
}
public void testConcatenatesXmlExtensionWhileGettingAFilename() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertEquals("string@guilherme.xml", strategy.getName("guilherme"));
}
public void testConcatenatesXmlExtensionWhileExtractingAKey() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertEquals("guilherme", strategy.extractKey("string@guilherme.xml"));
}
public void testEscapesNonAcceptableCharacterWhileExtractingAKey() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertEquals("../guilherme", strategy.extractKey("string@..%2Fguilherme.xml"));
}
public void testEscapesNonAcceptableCharacterWhileGettingAFilename() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertEquals("string@..%2Fguilherme.xml", strategy.getName("../guilherme"));
}
public void testEscapesUTF8NonAcceptableCharacterWhileGettingAFilename() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertEquals("string@\u5377guilherme.xml", strategy.getName("\u5377guilherme"));
}
public void testEscapesUTF8NonAcceptableCharacterWhileExtractingAKey() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertEquals("\u5377guilherme", strategy.extractKey("string@\u5377guilherme.xml"));
}
public void testEscapesPercentageWhileGettingAFilename() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertEquals("string@%25guilherme.xml", strategy.getName("%guilherme"));
}
public void testEscapesPercentageWhileExtractingAKey() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertEquals("%guilherme", strategy.extractKey("string@%25guilherme.xml"));
}
public void testEscapesNullKeyWhileGettingAFileName() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertEquals("null@null.xml", strategy.getName(null));
}
public void testRestoresTypeOfKey() throws MalformedURLException {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertEquals(new URL("http://xstream.codehaus.org"), strategy
.extractKey("url@http%3A%2F%2Fxstream.codehaus.org.xml"));
}
public void testEscapesNullKeyWhileExtractingKey() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertNull(strategy.extractKey("null@null.xml"));
}
public void testWritesASingleFile() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
File file = new File(baseDir, "string@guilherme.xml");
assertTrue(file.isFile());
}
public void testWritesTwoFiles() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
strategy.put("silveira", "anotherCuteString");
assertTrue(new File(baseDir, "string@guilherme.xml").isFile());
assertTrue(new File(baseDir, "string@silveira.xml").isFile());
}
public void testRemovesAWrittenFile() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
assertTrue(new File(baseDir, "string@guilherme.xml").isFile());
String aCuteString = (String)strategy.remove("guilherme");
assertEquals("aCuteString", aCuteString);
assertFalse(new File(baseDir, "string@guilherme.xml").exists());
}
public void testRemovesAnInvalidFile() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
String aCuteString = (String)strategy.remove("guilherme");
assertNull(aCuteString);
}
public void testHasZeroLength() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertEquals(0, strategy.size());
}
public void testHasOneItem() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
assertEquals(1, strategy.size());
}
public void testHasTwoItems() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
strategy.put("silveira", "anotherCuteString");
assertEquals(2, strategy.size());
}
public void testIsNotEmpty() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
assertEquals("Map should not be empty", 1, strategy.size());
}
public void testDoesNotContainKey() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertFalse(strategy.containsKey("guilherme"));
}
public void testContainsKey() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
assertTrue(strategy.containsKey("guilherme"));
}
public void testGetsAFile() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
assertTrue(new File(baseDir, "string@guilherme.xml").isFile());
String aCuteString = (String)strategy.get("guilherme");
assertEquals("aCuteString", aCuteString);
}
public void testGetsAnInvalidFile() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
String aCuteString = (String)strategy.get("guilherme");
assertNull(aCuteString);
}
public void testRewritesASingleFile() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
File file = new File(baseDir, "string@guilherme.xml");
assertTrue(file.isFile());
strategy.put("guilherme", "anotherCuteString");
assertEquals("anotherCuteString", strategy.get("guilherme"));
}
public void testIsEmpty() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
assertEquals("Map should be empty", 0, strategy.size());
}
public void testEntrySetContainsAllItems() {
Map original = new HashMap();
original.put("guilherme", "aCuteString");
original.put("silveira", "anotherCuteString");
Set originalSet = original.entrySet();
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
strategy.put("silveira", "anotherCuteString");
for (Iterator iter = original.keySet().iterator(); iter.hasNext();) {
assertTrue(strategy.containsKey(iter.next()));
}
}
// actually an acceptance test?
public void testIteratesOverEntryAndChecksItsKeyWithAnotherInstance() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
strategy.put("silveira", "anotherCuteString");
FilePersistenceStrategy built = new FilePersistenceStrategy(baseDir);
for (Iterator iter = strategy.iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry)iter.next();
assertTrue(built.containsKey(entry.getKey()));
}
}
public void testRemovesAnItemThroughIteration() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
strategy.put("silveira", "anotherCuteString");
for (Iterator iter = strategy.iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry)iter.next();
if (entry.getKey().equals("guilherme")) {
iter.remove();
}
}
assertFalse(strategy.containsKey("guilherme"));
}
public void testRewritesAFile() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
strategy.put("guilherme", "anotherCuteString");
assertEquals("anotherCuteString", strategy.get("guilherme"));
}
public void testPutReturnsTheOldValueWhenRewritingAFile() {
FilePersistenceStrategy strategy = new FilePersistenceStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
assertEquals("aCuteString", strategy.put("guilherme", "anotherCuteString"));
}
}