/*
* Copyright (C) 2006 Joe Walnes.
* Copyright (C) 2007, 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 17. June 2006 by Guilherme Silveira
*/
package com.thoughtworks.xstream.persistence;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import junit.framework.TestCase;
/**
* @author Guilherme Silveira
*/
public class FileStreamStrategyTest 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() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
assertEquals("guilherme.xml", strategy.getName("guilherme"));
}
public void testConcatenatesXmlExtensionWhileExtractingAKey() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
assertEquals("guilherme", strategy.extractKey("guilherme.xml"));
}
public void testEscapesNonAcceptableCharacterWhileExtractingAKey() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
assertEquals("../guilherme", strategy.extractKey("_2e__2e__2f_guilherme.xml"));
}
public void testEscapesNonAcceptableCharacterWhileGettingAFilename() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
assertEquals("_2e__2e__2f_guilherme.xml", strategy.getName("../guilherme"));
}
public void testEscapesUTF8NonAcceptableCharacterWhileGettingAFilename() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
assertEquals("_5377_guilherme.xml", strategy.getName("\u5377guilherme"));
}
public void testEscapesUTF8NonAcceptableCharacterWhileExtractingAKey() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
assertEquals("\u5377guilherme", strategy.extractKey("_5377_guilherme.xml"));
}
public void testEscapesUnderlineWhileGettingAFilename() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
assertEquals("__guilherme.xml", strategy.getName("_guilherme"));
}
public void testEscapesUnderlineWhileExtractingAKey() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
assertEquals("_guilherme", strategy.extractKey("__guilherme.xml"));
}
public void testEscapesNullKeyWhileGettingAFileName() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
assertEquals("_0_.xml", strategy.getName(null));
}
public void testEscapesNullKeyWhileExtractingKey() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
assertNull(strategy.extractKey("_0_.xml"));
}
public void testWritesASingleFile() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
File file = new File(baseDir, "guilherme.xml");
assertTrue(file.exists());
}
public void testWritesTwoFiles() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
strategy.put("silveira", "anotherCuteString");
assertTrue(new File(baseDir, "guilherme.xml").exists());
assertTrue(new File(baseDir, "silveira.xml").exists());
}
public void testRemovesAWrittenFile() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
assertTrue(new File(baseDir, "guilherme.xml").exists());
String aCuteString = (String)strategy.remove("guilherme");
assertEquals("aCuteString", aCuteString);
assertFalse(new File(baseDir, "guilherme.xml").exists());
}
public void testRemovesAnInvalidFile() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
String aCuteString = (String)strategy.remove("guilherme");
assertNull(aCuteString);
}
public void testHasZeroLength() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
assertEquals(0, strategy.size());
}
public void testHasOneItem() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
assertEquals(1, strategy.size());
}
public void testHasTwoItems() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
strategy.put("silveira", "anotherCuteString");
assertEquals(2, strategy.size());
}
public void testIsNotEmpty() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
assertEquals("Map should not be empty", 1, strategy.size());
}
public void testDoesNotContainKey() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
assertFalse(strategy.containsKey("guilherme"));
}
public void testContainsKey() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
assertTrue(strategy.containsKey("guilherme"));
}
public void testGetsAFile() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
assertTrue(new File(baseDir, "guilherme.xml").exists());
String aCuteString = (String)strategy.get("guilherme");
assertEquals("aCuteString", aCuteString);
}
public void testGetsAnInvalidFile() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
String aCuteString = (String)strategy.get("guilherme");
assertNull(aCuteString);
}
public void testRewritesASingleFile() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
File file = new File(baseDir, "guilherme.xml");
assertTrue(file.exists());
strategy.put("guilherme", "anotherCuteString");
assertEquals("anotherCuteString", strategy.get("guilherme"));
}
public void testIsEmpty() {
FileStreamStrategy strategy = new FileStreamStrategy(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();
FileStreamStrategy strategy = new FileStreamStrategy(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() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
strategy.put("silveira", "anotherCuteString");
FileStreamStrategy built = new FileStreamStrategy(baseDir);
for (Iterator iter = strategy.iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry)iter.next();
assertTrue(built.containsKey(entry.getKey()));
}
}
public void testRemovesAnItemThroughIteration() {
FileStreamStrategy strategy = new FileStreamStrategy(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() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
strategy.put("guilherme", "anotherCuteString");
assertEquals("anotherCuteString", strategy.get("guilherme"));
}
public void testPutReturnsTheOldValueWhenRewritingAFile() {
FileStreamStrategy strategy = new FileStreamStrategy(baseDir);
strategy.put("guilherme", "aCuteString");
assertEquals("aCuteString", strategy.put("guilherme", "anotherCuteString"));
}
}