Author: bleny Date: 2010-06-04 20:15:37 +0200 (Fri, 04 Jun 2010) New Revision: 62 Url: http://nuiton.org/repositories/revision/diswork/62 Log: implementation kademlia, tests, demo, fabriques de configs, remaniement des tests Added: trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/storage/KademliaDisworkMap.java trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/AbstractDisworkFileSystemTest.java trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemKademliaTest.java trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/AbstractDisworkMapTest.java trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/InMemoryDisworkMapTest.java trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/KademliaDisworkMapTest.java Removed: trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemTest.java trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/Util.java trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/InMemoryMapTest.java Modified: trunk/diswork-fs/pom.xml trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/Demo.java trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/DisworkFileSystem.java trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/DisworkFileSystemConfig.java trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/peerunit/DisworkFileSystemTest.java trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/storage/Storage.java trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemInMemoryTest.java trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemPastryTest.java trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/PastryDisworkMapTest.java trunk/pom.xml Modified: trunk/diswork-fs/pom.xml =================================================================== --- trunk/diswork-fs/pom.xml 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/diswork-fs/pom.xml 2010-06-04 18:15:37 UTC (rev 62) @@ -37,6 +37,11 @@ <groupId>fr.inria.peerunit</groupId> <artifactId>PeerUnit</artifactId> </dependency> + <dependency> + <groupId>org.planx.xmlstore</groupId> + <artifactId>xmlstore</artifactId> + </dependency> + <!-- test --> <dependency> Modified: trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/Demo.java =================================================================== --- trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/Demo.java 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/Demo.java 2010-06-04 18:15:37 UTC (rev 62) @@ -53,7 +53,6 @@ if (waitingForJob == null) { - // taking a random job Random random = new Random(); waitingForJob = "/todo/job-" + random.nextInt(); @@ -87,6 +86,8 @@ log.info("result is " + result + "(expected : " + expectedResult + ")"); + System.out.println("result is " + result + "(expected : " + expectedResult + ")"); + fileSystem.delete(resultPath); fileSystem.delete(waitingForJob); @@ -126,6 +127,9 @@ List<String> todos = fileSystem.readDirectory("/todo"); + System.out.println("todos " + todos.size() + " jobs"); + + if (todos.isEmpty()) { log.info("nothing to do"); } else { @@ -195,7 +199,7 @@ if (args.length == 2) { - DisworkFileSystemConfig config = new DisworkFileSystemConfig(); + DisworkFileSystemConfig config = DisworkFileSystemConfig.newKademliaDisworkConfig(); config.setOption("diswork.fs.use_port", args[1]); @@ -213,7 +217,7 @@ } else if (args.length == 4) { - DisworkFileSystemConfig config = new DisworkFileSystemConfig(); + DisworkFileSystemConfig config = DisworkFileSystemConfig.newKademliaDisworkConfig(); config.setOption("diswork.fs.use_port", args[1]); config.setOption("diswork.fs.bootstrap.ip", args[2]); @@ -221,11 +225,11 @@ fileSystem = new DisworkFileSystem(config); - if ("producer".equals(args[2])) { + if ("producer".equals(args[0])) { Thread t = new Thread(new Producer()); log.info("starting a producer"); t.start(); - } else if ("consumer".equals(args[2])) { + } else if ("consumer".equals(args[0])) { Thread t = new Thread(new Consumer()); log.info("starting a consumer"); t.start(); Modified: trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/DisworkFileSystem.java =================================================================== --- trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/DisworkFileSystem.java 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/DisworkFileSystem.java 2010-06-04 18:15:37 UTC (rev 62) @@ -34,6 +34,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.disworkfs.storage.DisworkMap; import org.nuiton.disworkfs.storage.EntryUtil; import org.nuiton.disworkfs.storage.Storage; @@ -657,5 +658,9 @@ public void close() throws IOException { storage.close(); } + + protected void setMap(DisworkMap map) { + storage.setMap(map); + } } Modified: trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/DisworkFileSystemConfig.java =================================================================== --- trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/DisworkFileSystemConfig.java 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/DisworkFileSystemConfig.java 2010-06-04 18:15:37 UTC (rev 62) @@ -24,6 +24,11 @@ */ package org.nuiton.disworkfs; +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import java.net.UnknownHostException; + import org.nuiton.util.ApplicationConfig; /** @@ -37,34 +42,153 @@ * (by default, 10 MiB) * </dd> * </dl> + * + * + * This class provides utilities to write tests easily. + * + * You can get multiples diswork configs ready to use. All the instances uses + * a new port and the local IP. + * <pre> + * c = newDisworkConfig(); // create a config for a bootstrap node + * c2 = newDisworkConfig(c.getUsedPort()) // creates a config for a node that + * // will bootstrap by joining the + * // first node + * c3 = newDisworkConfig(c.getUsedPort()) + * </pre> + * */ public class DisworkFileSystemConfig extends ApplicationConfig { + protected static Integer port = 19000; + + /** + * returns a new port, returned value change at each call. + * @return + */ + public static Integer getPort() { + port += 1; + return port; + } + + /** + * returns the IP on the local machine. Trying to get an public IP or a LAN + * IP or the loopback IP if there is no other interface + * @return + * @throws UnknownHostException + */ + public static String getIp() throws UnknownHostException { + InetAddress result = InetAddress.getLocalHost(); + if (result.isLoopbackAddress()) { + try { + Socket temp = new Socket("microsoft.com", 80); + result = temp.getLocalAddress(); + temp.close(); + } catch (IOException e) { + // TODO 20100602 bleny do something ? + } + } + return result.getHostAddress(); + } + public DisworkFileSystemConfig() { setDefaultOption("diswork.fs.blocks_size", "10485760"); // 10 MiB - setDefaultOption("diswork.fs.use_in_memory_map", "false"); + + setDefaultOption("diswork.fs.map_type", "inmemory"); setDefaultOption("diswork.fs.use_port", "9001"); - setDefaultOption("diswork.fs.bootstrap.ip", "192.168.99.119"); + /* + setDefaultOption("diswork.fs.bootstrap.ip", "192.168.99.119"); setDefaultOption("diswork.fs.bootstrap.port", "9001"); + */ } public int getBlockSize() { return getOptionAsInt("diswork.fs.blocks_size"); } + @Deprecated public boolean useInMemoryMap() { - return getOptionAsBoolean("diswork.fs.use_in_memory_map"); + return "inmemory".equals(getOption("diswork.fs.map_type")); } public Integer getUsedPort() { return getOptionAsInt("diswork.fs.use_port"); } + public void setUsedPort(Integer port) { + setOption("diswork.fs.use_port", port.toString()); + } + public String getBootstrapIp() { return getOption("diswork.fs.bootstrap.ip"); } + public void setBootstrapIp(String ip) { + setOption("diswork.fs.bootstrap.ip", ip); + } + public Integer getBootstrapPort() { return getOptionAsInt("diswork.fs.bootstrap.port"); } + + public void setBootstrapPort(Integer port) { + setOption("diswork.fs.bootstrap.port", port.toString()); + } + + public String getMapType() { + return getOption("diswork.fs.map_type"); + } + + /** + * returns a @link {@link DisworkFileSystemConfig} ready to be use as a + * config for a single-node instance of DisworkFS + * @return + * @throws UnknownHostException + */ + public static DisworkFileSystemConfig newPastryDisworkConfig() + throws UnknownHostException { + return newPastryDisworkConfig(null); + } + + /** + * returns a @link {@link DisworkFileSystemConfig} ready to be use as a + * config for a multiple-node instance of DisworkFS on a same machine. + * @param bootstrapPort the port on the same machine where another node can + * be found to bootstrap + * @return a complete config + * @throws UnknownHostException + */ + public static DisworkFileSystemConfig newPastryDisworkConfig(Integer bootstrapPort) + throws UnknownHostException { + DisworkFileSystemConfig result = new DisworkFileSystemConfig(); + String port = getPort().toString(); + String ip = getIp(); + result.setOption("diswork.fs.map_type", "pastry"); + result.setOption("diswork.fs.use_port", port); + result.setOption("diswork.fs.bootstrap.ip", ip); + if (bootstrapPort == null) { + result.setOption("diswork.fs.bootstrap.port", port); + } else { + result.setOption("diswork.fs.bootstrap.port", bootstrapPort.toString()); + } + return result; + } + + public static DisworkFileSystemConfig newKademliaDisworkConfig() + throws UnknownHostException { + return newKademliaDisworkConfig(null); + } + + public static DisworkFileSystemConfig newKademliaDisworkConfig(Integer bootstrapPort) + throws UnknownHostException { + DisworkFileSystemConfig result = new DisworkFileSystemConfig(); + String port = getPort().toString(); + String ip = getIp(); + result.setOption("diswork.fs.map_type", "kademlia"); + result.setOption("diswork.fs.use_port", port); + if (bootstrapPort != null) { + result.setOption("diswork.fs.bootstrap.port", bootstrapPort.toString()); + result.setOption("diswork.fs.bootstrap.ip", ip); + } + return result; + } } Modified: trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/peerunit/DisworkFileSystemTest.java =================================================================== --- trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/peerunit/DisworkFileSystemTest.java 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/peerunit/DisworkFileSystemTest.java 2010-06-04 18:15:37 UTC (rev 62) @@ -34,6 +34,8 @@ import java.util.Arrays; import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.nuiton.disworkfs.DisworkFileSystem; import org.nuiton.disworkfs.DisworkFileSystemConfig; @@ -42,28 +44,53 @@ public class DisworkFileSystemTest extends TestCaseImpl { - protected Integer port = 9001; + private static final Log log = + LogFactory.getLog(DisworkFileSystemTest.class); + // protected Integer port = 31000; + protected DisworkFileSystem fileSystem; protected byte[] bytes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; @TestStep(range="0",timeout=1000000, order = 0) public void testConnect() throws Exception { - Integer myPort = port + getId(); - DisworkFileSystemConfig config = new DisworkFileSystemConfig(); - config.setOption("diswork.fs.use_port", myPort.toString()); + DisworkFileSystemConfig config = + DisworkFileSystemConfig.newKademliaDisworkConfig(); + config.setUsedPort(31000); fileSystem = new DisworkFileSystem(config); + + config.printConfig(); + + log.info("i bootstrap : " + DisworkFileSystemConfig.getIp() + ":" + 31000); + put(0, DisworkFileSystemConfig.getIp()); + put(1, 31000); + } @TestStep(range="1",timeout=1000000, order = 1) public void testConnect1() throws Exception { - Integer myPort = port + getId(); - DisworkFileSystemConfig config = new DisworkFileSystemConfig(); - config.setOption("diswork.fs.use_port", myPort.toString()); + // Integer myPort = port + getId(); + Integer myPort = 31001; + DisworkFileSystemConfig config = + DisworkFileSystemConfig.newKademliaDisworkConfig(); + config.setUsedPort(myPort); + + // get bootstrap info + + String bootstrapIp = (String) get(0); + Integer bootstrapPort = (Integer) get(1); + + config.setBootstrapIp("127.0.0.1"); + config.setBootstrapPort(bootstrapPort); + + config.printConfig(); + + log.info("bootstrap is " + bootstrapIp + ":" + bootstrapPort); + fileSystem = new DisworkFileSystem(config); } - /* + @TestStep(range="0",timeout=1000000, order = 2) public void testWrite() throws Exception { InputStream source = new ByteArrayInputStream(bytes); @@ -76,34 +103,28 @@ try { InputStream source = fileSystem.read("/myfile"); byte[] readResult = IOUtils.toByteArray(source); - source.close(); + // source.close(); boolean arraysContentEquals = Arrays.equals(bytes, readResult); + + System.out.println("arraysContentEquals = " + arraysContentEquals); assertTrue(arraysContentEquals); } catch (FileNotFoundException e) { + System.out.println("file not found"); fail(); } } - */ + @TestStep(range="1",timeout=1000000, order = 4) public void testCreateDir() throws Exception { fileSystem.createDirectory("/mydir"); - fileSystem.createDirectory("/myseconddir"); } - @TestStep(range="0-1",timeout=1000000, order = 5) - public void fake() throws Exception { - - } - - /* - @TestStep(range="0-1",timeout=1000000, order = 5) + @TestStep(range="0",timeout=1000000, order = 5) public void testCreateDir2() throws Exception { assertTrue(fileSystem.exists("/mydir")); - assertTrue(fileSystem.exists("/myseconddir")); } - */ - /* - @TestStep(range="1",timeout=1000000, order = 6) + + @TestStep(range="0",timeout=1000000, order = 6) public void testCreateSubDir() throws Exception { fileSystem.createDirectory("/mydir/mysubdir"); } @@ -113,5 +134,5 @@ assertTrue(fileSystem.exists("/mydir/mysubdir")); assertEquals(1, fileSystem.readDirectory("/mydir").size()); } - */ + } Added: trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/storage/KademliaDisworkMap.java =================================================================== --- trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/storage/KademliaDisworkMap.java (rev 0) +++ trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/storage/KademliaDisworkMap.java 2010-06-04 18:15:37 UTC (rev 62) @@ -0,0 +1,185 @@ +package org.nuiton.disworkfs.storage; + +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigInteger; +import java.net.InetSocketAddress; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.disworkfs.DisworkFileSystemConfig; +import org.planx.xmlstore.routing.Identifier; +import org.planx.xmlstore.routing.Kademlia; +import org.planx.xmlstore.routing.RoutingException; + +public class KademliaDisworkMap implements DisworkMap { + + private static final Log log = LogFactory.getLog(KademliaDisworkMap.class); + + protected Kademlia kad; + + public KademliaDisworkMap(DisworkFileSystemConfig config) throws IOException { + kad = new Kademlia(Identifier.randomIdentifier(), config.getUsedPort()); + + if (config.getBootstrapIp() != null) { + InetSocketAddress bootstrap = new InetSocketAddress( + config.getBootstrapIp(), + config.getBootstrapPort()); + kad.connect(bootstrap); + } + + //Identifier.IDSIZE = 1024; + log.info("using " + Identifier.IDSIZE + " bytes for identifiers"); + } + + protected static Identifier stringToIdentifier(String s) { + UUID uuid = UUID.nameUUIDFromBytes(EntryUtil.stringToBytes(s)); + s = uuid.toString(); + + + + /* + byte[] bytes = EntryUtil.stringToBytes(s); + Identifier id = null; + try { + id = new Identifier(bytes); + } catch (java.lang.IndexOutOfBoundsException e) { + log.error("generated id is out of bound : Identifier.IDSIZE " + + " is too small"); + } + */ + + InputStream in = IOUtils.toInputStream(s); + DataInput dataInput = new DataInputStream(in); + Identifier id = null; + try { + id = new Identifier(dataInput); + } catch (IOException e) { + log.error("unable to create key from string " + s); + } + + + log.info("key for string " + s + " is " + id); + return id; + } + + @Override + public void close() throws IOException { + kad.close(); + } + + @Override + public boolean containsKey(Object key) { + Identifier id = stringToIdentifier((String) key); + Boolean result = null; + try { + result = kad.contains(id); + } catch (Exception e) { + // FIXME 20100604 bleny bad exception management + log.error("Kademlia exception caught", e); + throw new RuntimeException(e); + } + return result; + } + + @Override + public byte[] get(Object key) { + Identifier id = stringToIdentifier((String) key); + byte[] result = null; + try { + result = (byte[]) kad.get(id); + } catch (Exception e) { + // FIXME 20100604 bleny bad exception management + log.error("Kademlia exception caught", e); + throw new RuntimeException(e); + } + return result; + } + + @Override + public byte[] put(String key, byte[] value) { + byte[] previousValue = null; + try { + previousValue = get(key); + + Identifier id = stringToIdentifier((String) key); + kad.put(id, value); + } catch (Exception e) { + // FIXME 20100604 bleny bad exception management + log.error("Kademlia exception caught", e); + throw new RuntimeException(e); + } + return previousValue; + } + + @Override + public byte[] remove(Object key) { + byte[] previousValue = null; + try { + previousValue = get(key); + + Identifier id = stringToIdentifier((String) key); + kad.remove(id); + } catch (Exception e) { + // FIXME 20100604 bleny bad exception management + log.error("Kademlia exception caught", e); + throw new RuntimeException(e); + } + return previousValue; + } + + @Override + @Deprecated + public Collection<byte[]> values() { + throw new UnsupportedOperationException("not yet implemented"); + } + + @Override + @Deprecated + public void clear() { + throw new UnsupportedOperationException("not yet implemented"); + } + + @Override + @Deprecated + public boolean containsValue(Object arg0) { + throw new UnsupportedOperationException("not yet implemented"); + } + + @Override + @Deprecated + public Set<java.util.Map.Entry<String, byte[]>> entrySet() { + throw new UnsupportedOperationException("not yet implemented"); + } + + @Override + @Deprecated + public int size() { + throw new UnsupportedOperationException("not yet implemented"); + } + + @Override + @Deprecated + public void putAll(Map<? extends String, ? extends byte[]> arg0) { + throw new UnsupportedOperationException("not yet implemented"); + } + + @Override + @Deprecated + public Set<String> keySet() { + throw new UnsupportedOperationException("not yet implemented"); + } + + @Override + @Deprecated + public boolean isEmpty() { + throw new UnsupportedOperationException("not yet implemented"); + } +} Modified: trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/storage/Storage.java =================================================================== --- trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/storage/Storage.java 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/diswork-fs/src/main/java/org/nuiton/disworkfs/storage/Storage.java 2010-06-04 18:15:37 UTC (rev 62) @@ -147,24 +147,46 @@ protected DisworkFileSystemConfig disworkConfig; - public Storage(DisworkFileSystemConfig disworkConfig) throws IOException { + public Storage(DisworkFileSystemConfig disworkConfig, DisworkMap map) + throws IOException { + this.disworkConfig = disworkConfig; - - // instantiating a map according to config directives - if (disworkConfig.useInMemoryMap()) { - log.info("using in-memory map"); - map = new InMemoryDisworkMap(); + + if (map == null) { + // instantiating a map according to config directives + String mapType = disworkConfig.getOption("diswork.fs.map_type"); + + if (mapType == null) { + log.info("no map type specified"); + this.map = null; + } else { + if ("inmemory".equals(mapType)) { + log.info("using in-memory map"); + this.map = new InMemoryDisworkMap(); + } else if ("pastry".equals(mapType)) { + log.info("using Pastry map"); + this.map = new PastryDisworkMap(disworkConfig); + } else if ("kademlia".equals(mapType)) { + log.info("using Kademlia map"); + this.map = new KademliaDisworkMap(disworkConfig); + } + } } else { - log.info("using Pastry map"); - map = new PastryDisworkMap(disworkConfig); + this.map = map; } + // creating root directory, if needed - if (! map.containsKey(EntryUtil.ROOT_DIRECTORY)) { + if (! this.map.containsKey(EntryUtil.ROOT_DIRECTORY)) { + log.info("creating root directory"); putDirectory(EntryUtil.ROOT_DIRECTORY, EntryUtil.EMPTY_DIRECTORY_CONTENT); } } + + public Storage(DisworkFileSystemConfig disworkConfig) throws IOException { + this(disworkConfig, null); + } /** * @return the content (entries) of the root directory @@ -430,5 +452,9 @@ Long lockAge = currentDate - currentLockTime; return lockAge > LOCK_VALID_TIME; } + + public void setMap(DisworkMap map) { + this.map = map; + } } \ No newline at end of file Copied: trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/AbstractDisworkFileSystemTest.java (from rev 60, trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemTest.java) =================================================================== --- trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/AbstractDisworkFileSystemTest.java (rev 0) +++ trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/AbstractDisworkFileSystemTest.java 2010-06-04 18:15:37 UTC (rev 62) @@ -0,0 +1,346 @@ +package org.nuiton.disworkfs; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.ConcurrentModificationException; +import java.util.List; +import java.util.Random; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.nuiton.util.FileUtil; + + +public abstract class AbstractDisworkFileSystemTest { + + /** + * a place to store files for the test it's a subdirectory of the OS temp + * dir e.g. under linux /tmp/disworkfs/tests/ + */ + static protected String tempDirectoryPath = + System.getProperty("java.io.tmpdir", ".") // temp directory + + "/disworkfs/tests"; + + /** + * We will create a file at this path for test purpose + */ + static protected String randomFilePath = tempDirectoryPath + "/randomfile"; + + /** + * The file will have this fixed size + */ + static protected int randomFileSize = 9999; + + static protected DisworkFileSystem fileSystem; + + /** + * This setUp creates in a temp directory a file of size + * {@link randomFileSize} (fulfilling it with random bytes) + * This file can be found at {@link #randomFilePath} + * At the end of the method {@link #fileSystem} is ready to be used + * @throws Exception + */ + @Before + public void setUp() throws Exception { + // create a temp directory for our test + File tempDirectory = new File(tempDirectoryPath); + tempDirectory.mkdir(); + + // creating random data for the file + Random random = new Random(); + byte[] randomBytes = new byte[randomFileSize]; + random.nextBytes(randomBytes); + + // dumping random data into the file + File randomFile = new File(randomFilePath); + FileUtils.writeByteArrayToFile(randomFile, randomBytes); + + } + + @After + public void tearDown() throws Exception { + // cleaning + FileUtil.deleteRecursively(tempDirectoryPath); + } + + /** + * writing a file at root directory should not raise any exception + * @throws Exception + */ + @Test + public void testWrite() throws Exception { + fileSystem.write("/", "my_file", new FileInputStream(randomFilePath)); + } + + /** + * First, write a file then test if exists return true. + * @throws Exception + */ + @Test + public void testExists() throws Exception { + fileSystem.write("/", "my_file", new FileInputStream(randomFilePath)); + assertTrue(fileSystem.exists("/my_file")); + assertFalse(fileSystem.exists("/my_other_file")); + } + + /** + * try to read a file that as never been created nor written + */ + @Test(expected = FileNotFoundException.class) + public void testFailAtRead() throws Exception { + fileSystem.read("/not_existing_file"); + } + + /** + * tests {@link org.nuiton.disworkfs.storage.Storage#SplitBlocksInputStream} + * by storing a "-1" byte, can be buggy due to the use of read() + * @throws IOException + */ + @Test + public void testSplit() throws IOException { + + byte[] bytes = new byte[1]; + bytes[0] = -0x1; + + InputStream source; + + source = new ByteArrayInputStream(bytes); + fileSystem.write("/", "my_file", source); + + source.close(); + + + source = new ByteArrayInputStream(bytes); + InputStream readResult = fileSystem.read("/my_file"); + + int read = 0; + byte[] b = new byte[1]; + + read = readResult.read(b); + + assertEquals(1, read); + assertArrayEquals(bytes, b); + + } + + /** + * writing a file at the root directory and reading it. + * finally, compare original source and read result + * byte-to-byte: contents should be equals + * @throws Exception + */ + @Test + public void testWriteRead() throws Exception { + + InputStream source = new FileInputStream(randomFilePath); + + fileSystem.write("/", "my_file", source); + + source.close(); + + InputStream readResult; + + // now, the checks. We read the original file and the result of + // a read() and then compare it byte-to-byte + + source = new FileInputStream(randomFilePath); + readResult = fileSystem.read("/my_file"); + + assertEquals(randomFileSize, source.available()); + assertEquals(randomFileSize, readResult.available()); + + byte[] sourceAsBytes = IOUtils.toByteArray(source); + byte[] readResultAsBytes = IOUtils.toByteArray(readResult); + + assertArrayEquals(sourceAsBytes, readResultAsBytes); + + source.close(); + readResult.close(); + + } + + /** + * this use case should raise an exception because my_folder + * doesn't exists + */ + @Test(expected = IOException.class) + public void testFailAtWrite() throws Exception { + fileSystem.write("/my_folder", "my_file", + new FileInputStream(randomFilePath)); + } + + /** + * this use case should raise an exception because writing to a file + * that already exists + */ + @Test(expected = IOException.class) + public void testFailAtDoubleWrite() throws Exception { + InputStream source = new FileInputStream(randomFilePath); + fileSystem.write("/my_file", source); + source.close(); + + source = new FileInputStream(randomFilePath); + try { + fileSystem.write("/my_file", source); + } finally { + source.close(); + } + } + + /** + * This test uses mkdir to create dirs and sub-dirs + * @throws Exception + */ + @Test + public void testCreateDirectory() throws Exception { + fileSystem.createDirectory("/my_folder"); + assertTrue(fileSystem.exists("/my_folder")); + fileSystem.createDirectory("/my_folder/my_sub_folder"); + assertTrue(fileSystem.exists("/my_folder/my_sub_folder")); + } + + /** + * Create some folders with mkdir and write files in those directories + * @throws Exception + */ + @Test + public void testWriteInFolder() throws Exception { + fileSystem.createDirectory("/my_folder"); + fileSystem.write("/my_folder", "my_file", + new FileInputStream(randomFilePath)); + fileSystem.createDirectory("/my_folder/my_sub_folder"); + fileSystem.write("/my_folder/my_sub_folder", "my_file", + new FileInputStream(randomFilePath)); + assertTrue(fileSystem.exists("/my_folder/my_sub_folder/my_file")); + } + + /** + * create a symbolic link to a file. This test show that we can read the + * file using the link + * @throws Exception + */ + @Test + public void testLinking() throws Exception { + fileSystem.createDirectory("/my_folder"); + fileSystem.write("/my_folder", "my_file", + new FileInputStream(randomFilePath)); + fileSystem.createSymbolicLink("/my_link", "/my_folder/my_file"); + + InputStream source = new FileInputStream(randomFilePath); + InputStream readResult = fileSystem.read("/my_link"); + + boolean actualContentEquality = + IOUtils.contentEquals(source, readResult); + source.close(); + readResult.close(); + + assertTrue(actualContentEquality); + } + + /** + * Trying to create a link to a wrong target, this sould raise an exception + * @throws Exception + */ + @Test(expected = IOException.class) + public void testFailAtLinking() throws Exception { + fileSystem.createSymbolicLink("/my_link", "/wrong_target_path"); + } + + /** + * Trying to remove files and directories + * @throws Exception + */ + @Test + public void testRemove() throws Exception { + fileSystem.createDirectory("/my_folder"); + fileSystem.write("/my_folder", "my_file", + new FileInputStream(randomFilePath)); + fileSystem.delete("/my_folder/my_file"); + assertTrue(fileSystem.exists("/my_folder")); + assertFalse(fileSystem.exists("/my_folder/my_file")); + fileSystem.delete("/my_folder"); + assertFalse(fileSystem.exists("/my_folder")); + } + + /** + * By trying to remove a non-empty directory, this test should raise an + * exception + * @throws Exception + */ + @Test(expected = IOException.class) + public void testFailAtRemove() throws Exception { + fileSystem.createDirectory("/my_folder"); + fileSystem.write("/my_folder", "my_file", + new FileInputStream(randomFilePath)); + + // trying to remove a non-empty directory should raise an exception + fileSystem.delete("/my_folder"); + } + + /** + * This tests uses ls + */ + @Test + public void testListDirectory() throws Exception { + fileSystem.createDirectory("/my_folder"); + fileSystem.createDirectory("/my_folder/my_sub_dir"); + fileSystem.write("/my_folder", "my_file", + new FileInputStream(randomFilePath)); + fileSystem.createSymbolicLink("/my_folder/my_link", "my_file"); + + List<String> lsResult = fileSystem.readDirectory("/my_folder"); + + // checking that result contains all the required data + assertTrue(lsResult.contains("my_sub_dir")); + assertTrue(lsResult.contains("my_file")); + assertTrue(lsResult.contains("my_link")); + + // ... and only those + assertEquals(3, lsResult.size()); + + lsResult = fileSystem.readDirectory("/"); + assertEquals(1, lsResult.size()); + } + + @Test + public void testConcurrency() throws Exception { + fileSystem.createDirectory("/mydir"); + try { + fileSystem.createDirectory("/myseconddir"); + } catch (ConcurrentModificationException e) { + fail(); + } + } + + @Test + public void testLinks() throws Exception { + fileSystem.createDirectory("/dir"); + fileSystem.createDirectory("/dir/subdir"); + fileSystem.createDirectory("/otherdir"); + + fileSystem.createSymbolicLink("/link", "dir/subdir"); + fileSystem.createSymbolicLink("/link/subsubdirlink", "/otherdir"); + List<String> readResult = fileSystem.readDirectory("/dir/subdir"); + assertEquals(1, readResult.size()); + assertTrue(readResult.contains("subsubdirlink")); + + fileSystem.createDirectory("/link/subsubdirlink/finaldir"); + readResult = fileSystem.readDirectory("/otherdir"); + assertEquals(1, readResult.size()); + assertTrue(readResult.contains("finaldir")); + + } +} Modified: trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemInMemoryTest.java =================================================================== --- trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemInMemoryTest.java 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemInMemoryTest.java 2010-06-04 18:15:37 UTC (rev 62) @@ -2,17 +2,17 @@ import org.junit.Before; -public class DisworkFileSystemInMemoryTest extends DisworkFileSystemTest { +public class DisworkFileSystemInMemoryTest extends AbstractDisworkFileSystemTest { /** - * this code executed after {@link DisworkFileSystemTest#setUp()} + * this code executed after {@link AbstractDisworkFileSystemTest#setUp()} * @throws Exception */ @Before public void setUpFileSystem() throws Exception { // finally, initiate the fileSystem DisworkFileSystemConfig disworkConfig = new DisworkFileSystemConfig(); - disworkConfig.setOption("diswork.fs.use_in_memory_map", "true"); + disworkConfig.setOption("diswork.fs.map_type", "inmemory"); fileSystem = new DisworkFileSystem(disworkConfig); } Added: trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemKademliaTest.java =================================================================== --- trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemKademliaTest.java (rev 0) +++ trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemKademliaTest.java 2010-06-04 18:15:37 UTC (rev 62) @@ -0,0 +1,80 @@ +package org.nuiton.disworkfs; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.io.ByteArrayInputStream; +import java.util.ConcurrentModificationException; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Before; +import org.junit.Test; + +public class DisworkFileSystemKademliaTest extends AbstractDisworkFileSystemTest { + + protected Integer bootstrapPort; + + /** + * this code executed after {@link AbstractDisworkFileSystemTest#setUp()} + * @throws Exception + */ + @Before + public void setUpFileSystem() throws Exception { + // finally, initiate the fileSystem + DisworkFileSystemConfig disworkConfig1 = + DisworkFileSystemConfig.newKademliaDisworkConfig(); + bootstrapPort = disworkConfig1.getUsedPort(); + fileSystem = new DisworkFileSystem(disworkConfig1); + } + + + @Test + public void testMultipleNodes1() throws Exception { + DisworkFileSystemConfig disworkConfig = + DisworkFileSystemConfig.newKademliaDisworkConfig(bootstrapPort); + DisworkFileSystem fileSystem2 = new DisworkFileSystem(disworkConfig); + + assertTrue(fileSystem.exists("/")); + assertTrue(fileSystem2.exists("/")); + } + + @Test + public void testMultipleNodes2() throws Exception { + DisworkFileSystemConfig disworkConfig = + DisworkFileSystemConfig.newKademliaDisworkConfig(bootstrapPort); + DisworkFileSystem fileSystem2 = new DisworkFileSystem(disworkConfig); + + byte[] bytes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + + fileSystem.write("/my_file", new ByteArrayInputStream(bytes)); + + assertTrue(fileSystem.exists("/my_file")); + assertTrue(fileSystem2.exists("/my_file")); + + assertEquals(1, fileSystem2.readDirectory("/").size()); + + byte[] getResult = IOUtils.toByteArray(fileSystem2.read("/my_file")); + + assertArrayEquals(bytes, getResult); + + } + + @Test + public void testMultipleNodes3() throws Exception { + + fileSystem.createDirectory("/mydir"); + try { + fileSystem.createDirectory("/myseconddir"); + } catch (ConcurrentModificationException e) { + fail(); + } + + } + + +} Modified: trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemPastryTest.java =================================================================== --- trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemPastryTest.java 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemPastryTest.java 2010-06-04 18:15:37 UTC (rev 62) @@ -15,18 +15,18 @@ import org.junit.Before; import org.junit.Test; -public class DisworkFileSystemPastryTest extends DisworkFileSystemTest { +public class DisworkFileSystemPastryTest extends AbstractDisworkFileSystemTest { protected Integer bootstrapPort; /** - * this code executed after {@link DisworkFileSystemTest#setUp()} + * this code executed after {@link AbstractDisworkFileSystemTest#setUp()} * @throws Exception */ @Before public void setUpFileSystem() throws Exception { // finally, initiate the fileSystem - DisworkFileSystemConfig disworkConfig1 = Util.newDisworkConfig(); + DisworkFileSystemConfig disworkConfig1 = DisworkFileSystemConfig.newPastryDisworkConfig(); bootstrapPort = disworkConfig1.getUsedPort(); fileSystem = new DisworkFileSystem(disworkConfig1); @@ -35,7 +35,7 @@ /* @Test public void testMultipleNodes1() throws Exception { - DisworkFileSystemConfig disworkConfig = Util.newDisworkConfig(bootstrapPort); + DisworkFileSystemConfig disworkConfig = DisworkFileSystemConfig.newPastryDisworkConfig(bootstrapPort); DisworkFileSystem fileSystem2 = new DisworkFileSystem(disworkConfig); assertTrue(fileSystem.exists("/")); @@ -44,7 +44,7 @@ @Test public void testMultipleNodes2() throws Exception { - DisworkFileSystemConfig disworkConfig = Util.newDisworkConfig(bootstrapPort); + DisworkFileSystemConfig disworkConfig = DisworkFileSystemConfig.newPastryDisworkConfig(bootstrapPort); DisworkFileSystem fileSystem2 = new DisworkFileSystem(disworkConfig); byte[] bytes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; @@ -61,7 +61,7 @@ assertArrayEquals(bytes, getResult); } - + /* @Test public void testMultipleNodes3() throws Exception { Deleted: trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemTest.java =================================================================== --- trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemTest.java 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/DisworkFileSystemTest.java 2010-06-04 18:15:37 UTC (rev 62) @@ -1,346 +0,0 @@ -package org.nuiton.disworkfs; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.ConcurrentModificationException; -import java.util.List; -import java.util.Random; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.nuiton.util.FileUtil; - - -public abstract class DisworkFileSystemTest { - - /** - * a place to store files for the test it's a subdirectory of the OS temp - * dir e.g. under linux /tmp/disworkfs/tests/ - */ - static protected String tempDirectoryPath = - System.getProperty("java.io.tmpdir", ".") // temp directory - + "/disworkfs/tests"; - - /** - * We will create a file at this path for test purpose - */ - static protected String randomFilePath = tempDirectoryPath + "/randomfile"; - - /** - * The file will have this fixed size - */ - static protected int randomFileSize = 9999; - - static protected DisworkFileSystem fileSystem; - - /** - * This setUp creates in a temp directory a file of size - * {@link randomFileSize} (fulfilling it with random bytes) - * This file can be found at {@link #randomFilePath} - * At the end of the method {@link #fileSystem} is ready to be used - * @throws Exception - */ - @Before - public void setUp() throws Exception { - // create a temp directory for our test - File tempDirectory = new File(tempDirectoryPath); - tempDirectory.mkdir(); - - // creating random data for the file - Random random = new Random(); - byte[] randomBytes = new byte[randomFileSize]; - random.nextBytes(randomBytes); - - // dumping random data into the file - File randomFile = new File(randomFilePath); - FileUtils.writeByteArrayToFile(randomFile, randomBytes); - - } - - @After - public void tearDown() throws Exception { - // cleaning - FileUtil.deleteRecursively(tempDirectoryPath); - } - - /** - * writing a file at root directory should not raise any exception - * @throws Exception - */ - @Test - public void testWrite() throws Exception { - fileSystem.write("/", "my_file", new FileInputStream(randomFilePath)); - } - - /** - * First, write a file then test if exists return true. - * @throws Exception - */ - @Test - public void testExists() throws Exception { - fileSystem.write("/", "my_file", new FileInputStream(randomFilePath)); - assertTrue(fileSystem.exists("/my_file")); - assertFalse(fileSystem.exists("/my_other_file")); - } - - /** - * try to read a file that as never been created nor written - */ - @Test(expected = FileNotFoundException.class) - public void testFailAtRead() throws Exception { - fileSystem.read("/not_existing_file"); - } - - /** - * tests {@link org.nuiton.disworkfs.storage.Storage#SplitBlocksInputStream} - * by storing a "-1" byte, can be buggy due to the use of read() - * @throws IOException - */ - @Test - public void testSplit() throws IOException { - - byte[] bytes = new byte[1]; - bytes[0] = -0x1; - - InputStream source; - - source = new ByteArrayInputStream(bytes); - fileSystem.write("/", "my_file", source); - - source.close(); - - - source = new ByteArrayInputStream(bytes); - InputStream readResult = fileSystem.read("/my_file"); - - int read = 0; - byte[] b = new byte[1]; - - read = readResult.read(b); - - assertEquals(1, read); - assertArrayEquals(bytes, b); - - } - - /** - * writing a file at the root directory and reading it. - * finally, compare original source and read result - * byte-to-byte: contents should be equals - * @throws Exception - */ - @Test - public void testWriteRead() throws Exception { - - InputStream source = new FileInputStream(randomFilePath); - - fileSystem.write("/", "my_file", source); - - source.close(); - - InputStream readResult; - - // now, the checks. We read the original file and the result of - // a read() and then compare it byte-to-byte - - source = new FileInputStream(randomFilePath); - readResult = fileSystem.read("/my_file"); - - assertEquals(randomFileSize, source.available()); - assertEquals(randomFileSize, readResult.available()); - - byte[] sourceAsBytes = IOUtils.toByteArray(source); - byte[] readResultAsBytes = IOUtils.toByteArray(readResult); - - assertArrayEquals(sourceAsBytes, readResultAsBytes); - - source.close(); - readResult.close(); - - } - - /** - * this use case should raise an exception because my_folder - * doesn't exists - */ - @Test(expected = IOException.class) - public void testFailAtWrite() throws Exception { - fileSystem.write("/my_folder", "my_file", - new FileInputStream(randomFilePath)); - } - - /** - * this use case should raise an exception because writing to a file - * that already exists - */ - @Test(expected = IOException.class) - public void testFailAtDoubleWrite() throws Exception { - InputStream source = new FileInputStream(randomFilePath); - fileSystem.write("/my_file", source); - source.close(); - - source = new FileInputStream(randomFilePath); - try { - fileSystem.write("/my_file", source); - } finally { - source.close(); - } - } - - /** - * This test uses mkdir to create dirs and sub-dirs - * @throws Exception - */ - @Test - public void testCreateDirectory() throws Exception { - fileSystem.createDirectory("/my_folder"); - assertTrue(fileSystem.exists("/my_folder")); - fileSystem.createDirectory("/my_folder/my_sub_folder"); - assertTrue(fileSystem.exists("/my_folder/my_sub_folder")); - } - - /** - * Create some folders with mkdir and write files in those directories - * @throws Exception - */ - @Test - public void testWriteInFolder() throws Exception { - fileSystem.createDirectory("/my_folder"); - fileSystem.write("/my_folder", "my_file", - new FileInputStream(randomFilePath)); - fileSystem.createDirectory("/my_folder/my_sub_folder"); - fileSystem.write("/my_folder/my_sub_folder", "my_file", - new FileInputStream(randomFilePath)); - assertTrue(fileSystem.exists("/my_folder/my_sub_folder/my_file")); - } - - /** - * create a symbolic link to a file. This test show that we can read the - * file using the link - * @throws Exception - */ - @Test - public void testLinking() throws Exception { - fileSystem.createDirectory("/my_folder"); - fileSystem.write("/my_folder", "my_file", - new FileInputStream(randomFilePath)); - fileSystem.createSymbolicLink("/my_link", "/my_folder/my_file"); - - InputStream source = new FileInputStream(randomFilePath); - InputStream readResult = fileSystem.read("/my_link"); - - boolean actualContentEquality = - IOUtils.contentEquals(source, readResult); - source.close(); - readResult.close(); - - assertTrue(actualContentEquality); - } - - /** - * Trying to create a link to a wrong target, this sould raise an exception - * @throws Exception - */ - @Test(expected = IOException.class) - public void testFailAtLinking() throws Exception { - fileSystem.createSymbolicLink("/my_link", "/wrong_target_path"); - } - - /** - * Trying to remove files and directories - * @throws Exception - */ - @Test - public void testRemove() throws Exception { - fileSystem.createDirectory("/my_folder"); - fileSystem.write("/my_folder", "my_file", - new FileInputStream(randomFilePath)); - fileSystem.delete("/my_folder/my_file"); - assertTrue(fileSystem.exists("/my_folder")); - assertFalse(fileSystem.exists("/my_folder/my_file")); - fileSystem.delete("/my_folder"); - assertFalse(fileSystem.exists("/my_folder")); - } - - /** - * By trying to remove a non-empty directory, this test should raise an - * exception - * @throws Exception - */ - @Test(expected = IOException.class) - public void testFailAtRemove() throws Exception { - fileSystem.createDirectory("/my_folder"); - fileSystem.write("/my_folder", "my_file", - new FileInputStream(randomFilePath)); - - // trying to remove a non-empty directory should raise an exception - fileSystem.delete("/my_folder"); - } - - /** - * This tests uses ls - */ - @Test - public void testListDirectory() throws Exception { - fileSystem.createDirectory("/my_folder"); - fileSystem.createDirectory("/my_folder/my_sub_dir"); - fileSystem.write("/my_folder", "my_file", - new FileInputStream(randomFilePath)); - fileSystem.createSymbolicLink("/my_folder/my_link", "my_file"); - - List<String> lsResult = fileSystem.readDirectory("/my_folder"); - - // checking that result contains all the required data - assertTrue(lsResult.contains("my_sub_dir")); - assertTrue(lsResult.contains("my_file")); - assertTrue(lsResult.contains("my_link")); - - // ... and only those - assertEquals(3, lsResult.size()); - - lsResult = fileSystem.readDirectory("/"); - assertEquals(1, lsResult.size()); - } - - @Test - public void testConcurrency() throws Exception { - fileSystem.createDirectory("/mydir"); - try { - fileSystem.createDirectory("/myseconddir"); - } catch (ConcurrentModificationException e) { - fail(); - } - } - - @Test - public void testLinks() throws Exception { - fileSystem.createDirectory("/dir"); - fileSystem.createDirectory("/dir/subdir"); - fileSystem.createDirectory("/otherdir"); - - fileSystem.createSymbolicLink("/link", "dir/subdir"); - fileSystem.createSymbolicLink("/link/subsubdirlink", "/otherdir"); - List<String> readResult = fileSystem.readDirectory("/dir/subdir"); - assertEquals(1, readResult.size()); - assertTrue(readResult.contains("subsubdirlink")); - - fileSystem.createDirectory("/link/subsubdirlink/finaldir"); - readResult = fileSystem.readDirectory("/otherdir"); - assertEquals(1, readResult.size()); - assertTrue(readResult.contains("finaldir")); - - } -} Deleted: trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/Util.java =================================================================== --- trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/Util.java 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/Util.java 2010-06-04 18:15:37 UTC (rev 62) @@ -1,89 +0,0 @@ -package org.nuiton.disworkfs; - -import java.io.IOException; -import java.net.InetAddress; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * This class provides utilities to write tests easily. - * - * You can get multiples diswork configs ready to use. All the instances uses - * a new port and the local IP. - * <pre> - * c = newDisworkConfig(); // create a config for a bootstrap node - * c2 = newDisworkConfig(c.getUsedPort()) // creates a config for a node that - * // will bootstrap by joining the - * // first node - * c3 = newDisworkConfig(c.getUsedPort()) - * </pre> - * - */ -public class Util { - - protected static Integer port = 19000; - - /** - * returns a new port, returned value change at each call. - * @return - */ - public static Integer getPort() { - port += 1; - return port; - } - - /** - * returns the IP on the local machine. Trying to get an public IP or a LAN - * IP or the loopback IP if there is no other interface - * @return - * @throws UnknownHostException - */ - public static InetAddress getIp() throws UnknownHostException { - InetAddress result = InetAddress.getLocalHost(); - if (result.isLoopbackAddress()) { - try { - Socket temp = new Socket("microsoft.com", 80); - result = temp.getLocalAddress(); - temp.close(); - } catch (IOException e) { - // TODO 20100602 bleny do something ? - } - } - return result; - } - - /** - * returns a @link {@link DisworkFileSystemConfig} ready to be use as a - * config for a single-node instance of DisworkFS - * @return - * @throws UnknownHostException - */ - public static DisworkFileSystemConfig newDisworkConfig() - throws UnknownHostException { - return newDisworkConfig(null); - } - - /** - * returns a @link {@link DisworkFileSystemConfig} ready to be use as a - * config for a multiple-node instance of DisworkFS on a same machine. - * @param bootstrapPort the port on the same machine where another node can - * be found to bootstrap - * @return a complete config - * @throws UnknownHostException - */ - public static DisworkFileSystemConfig newDisworkConfig(Integer bootstrapPort) - throws UnknownHostException { - DisworkFileSystemConfig result = new DisworkFileSystemConfig(); - String port = Util.getPort().toString(); - String ip = getIp().getHostAddress(); - result.setOption("diswork.fs.use_in_memory_map", "false"); - result.setOption("diswork.fs.use_port", port); - result.setOption("diswork.fs.bootstrap.ip", ip); - if (bootstrapPort == null) { - result.setOption("diswork.fs.bootstrap.port", port); - } else { - result.setOption("diswork.fs.bootstrap.port", bootstrapPort.toString()); - } - return result; - } -} \ No newline at end of file Added: trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/AbstractDisworkMapTest.java =================================================================== --- trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/AbstractDisworkMapTest.java (rev 0) +++ trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/AbstractDisworkMapTest.java 2010-06-04 18:15:37 UTC (rev 62) @@ -0,0 +1,106 @@ +package org.nuiton.disworkfs.storage; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.nuiton.disworkfs.DisworkFileSystemConfig; + +public abstract class AbstractDisworkMapTest { + + private final Log log = LogFactory.getLog(AbstractDisworkMapTest.class); + + + protected DisworkMap map1; + protected DisworkMap map2; + + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + /* + if (map1 != null) + map1.close(); + if (map2 != null) + map2.close(); + */ + } + + /** + * this test show that the InMemoryMap put implies a copy of the data. + * After the put, the original value is modified. A final check shows + * there is no side effect + */ + @Test + public void testPut() { + byte[] expected = {0x1, 0x2}; + map1.put("key", expected); + expected[0] = 0xf; + byte[] actual = map1.get("key"); + assertFalse(Arrays.equals(expected, actual)); + } + + + @Test + public void test() throws Exception { + DisworkFileSystemConfig config = DisworkFileSystemConfig.newKademliaDisworkConfig(); + + map1 = new KademliaDisworkMap(config); + + byte[] newBytes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + + map1.put("test", newBytes); + + byte[] getResult = map1.get("test"); + assertArrayEquals(newBytes, getResult); + } + + @Test + public void test2nodes() throws Exception { + DisworkFileSystemConfig config1 = DisworkFileSystemConfig.newKademliaDisworkConfig(); + map1 = new KademliaDisworkMap(config1); + + DisworkFileSystemConfig config2 = DisworkFileSystemConfig.newKademliaDisworkConfig(config1.getUsedPort()); + map2 = new KademliaDisworkMap(config2); + + byte[] newBytes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + + log.info("trying put test"); + map1.put("test", newBytes); + + log.info("trying contains test"); + assertTrue(map2.containsKey("test")); + log.info("trying contains unknownkey"); + assertFalse(map2.containsKey("unknownkey")); + + log.info("trying get test"); + byte[] getResult = map2.get("test"); + + assertArrayEquals(newBytes, getResult); + + log.info("trying remove test"); + byte[] removeResult = map2.remove("test"); + assertArrayEquals(newBytes, removeResult); + + log.info("trying put test"); + map1.put("test", new byte[0]); + + log.info("trying put test"); + map2.put("test", new byte[1]); + + log.info("trying remove unknow"); + map2.remove("unknow"); + + } + +} Copied: trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/InMemoryDisworkMapTest.java (from rev 60, trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/InMemoryMapTest.java) =================================================================== --- trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/InMemoryDisworkMapTest.java (rev 0) +++ trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/InMemoryDisworkMapTest.java 2010-06-04 18:15:37 UTC (rev 62) @@ -0,0 +1,14 @@ +package org.nuiton.disworkfs.storage; + +import org.junit.Before; + + +public class InMemoryDisworkMapTest extends AbstractDisworkMapTest { + + @Before + public void setUp() throws Exception { + map1 = new InMemoryDisworkMap(); + map2 = map1; + } + +} Deleted: trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/InMemoryMapTest.java =================================================================== --- trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/InMemoryMapTest.java 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/InMemoryMapTest.java 2010-06-04 18:15:37 UTC (rev 62) @@ -1,27 +0,0 @@ -package org.nuiton.disworkfs.storage; - -import static org.junit.Assert.assertFalse; - -import java.util.Arrays; - -import org.junit.Test; -import org.nuiton.disworkfs.storage.InMemoryDisworkMap; - -public class InMemoryMapTest { - - /** - * this test show that the InMemoryMap put implies a copy of the data. - * After the put, the original value is modified. A final check shows - * there is no side effect - */ - @Test - public void testPut() { - InMemoryDisworkMap map = new InMemoryDisworkMap(); - byte[] expected = {0x1, 0x2}; - map.put("key", expected); - expected[0] = 0xf; - byte[] actual = map.get("key"); - assertFalse(Arrays.equals(expected, actual)); - } - -} Added: trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/KademliaDisworkMapTest.java =================================================================== --- trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/KademliaDisworkMapTest.java (rev 0) +++ trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/KademliaDisworkMapTest.java 2010-06-04 18:15:37 UTC (rev 62) @@ -0,0 +1,31 @@ +package org.nuiton.disworkfs.storage; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + +import java.io.IOException; + +import org.junit.Before; +import org.junit.Test; +import org.nuiton.disworkfs.DisworkFileSystemConfig; + +public class KademliaDisworkMapTest extends AbstractDisworkMapTest { + + @Before + public void setUp() throws Exception { + DisworkFileSystemConfig config1 = DisworkFileSystemConfig.newKademliaDisworkConfig(); + map1 = new KademliaDisworkMap(config1); + + DisworkFileSystemConfig config2 = DisworkFileSystemConfig.newKademliaDisworkConfig(config1.getUsedPort()); + map2 = new KademliaDisworkMap(config2); + } + + @Test + public void testStringToIndentifier() { + assertNotNull(KademliaDisworkMap.stringToIdentifier("/")); + assertNotNull(KademliaDisworkMap.stringToIdentifier( + "/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir" + /* + "/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir" + + "/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir/dir"*/)); + } +} Modified: trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/PastryDisworkMapTest.java =================================================================== --- trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/PastryDisworkMapTest.java 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/diswork-fs/src/test/java/org/nuiton/disworkfs/storage/PastryDisworkMapTest.java 2010-06-04 18:15:37 UTC (rev 62) @@ -1,98 +1,17 @@ package org.nuiton.disworkfs.storage; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import org.junit.After; import org.junit.Before; -import org.junit.Test; import org.nuiton.disworkfs.DisworkFileSystemConfig; -import org.nuiton.disworkfs.Util; -public class PastryDisworkMapTest { - - protected static PastryDisworkMap map1; - protected static PastryDisworkMap map2; +public class PastryDisworkMapTest extends AbstractDisworkMapTest { - protected static byte[] bytes; - @Before public void setUp() throws Exception { - } - - @After - public void tearDown() throws Exception { - /* - if (map1 != null) - map1.close(); - if (map2 != null) - map2.close(); - */ - } - - @Test - public void test() throws Exception { - DisworkFileSystemConfig config = Util.newDisworkConfig(); - - map1 = new PastryDisworkMap(config); - - byte[] newBytes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - bytes = newBytes; - - map1.put("test", newBytes); - - byte[] getResult = map1.get("test"); - assertArrayEquals(newBytes, getResult); - } - - @Test - public void test2nodes() throws Exception { - DisworkFileSystemConfig config1 = Util.newDisworkConfig(); + DisworkFileSystemConfig config1 = DisworkFileSystemConfig.newPastryDisworkConfig(); map1 = new PastryDisworkMap(config1); - DisworkFileSystemConfig config2 = Util.newDisworkConfig(config1.getUsedPort()); + DisworkFileSystemConfig config2 = DisworkFileSystemConfig.newPastryDisworkConfig(config1.getUsedPort()); map2 = new PastryDisworkMap(config2); - - byte[] newBytes = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - bytes = newBytes; - - map1.put("test", newBytes); - - assertTrue(map2.containsKey("test")); - assertFalse(map2.containsKey("unknownkey")); - - byte[] getResult = map2.get("test"); - - assertArrayEquals(newBytes, getResult); - - byte[] removeResult = map2.remove("test"); - assertArrayEquals(newBytes, removeResult); - - map1.put("test", newBytes); - map2.put("test", newBytes); - - map2.remove("unknow"); - } - @Test - public void testClose() throws Exception { - /* - DisworkFileSystemConfig config1 = new DisworkFileSystemConfig(); - map1 = new PastryDisworkMap(config1); - */ - /* - try { - map2 = new PastryDisworkMap(config1); - } catch (IllegalStateException e) { - assertEquals("Cannot bind to /192.168.99.119:9001", e.getMessage()); - } - */ - - // map1.close(); - // map2 = new PastryDisworkMap(config1); - } - } Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2010-06-03 16:25:47 UTC (rev 61) +++ trunk/pom.xml 2010-06-04 18:15:37 UTC (rev 62) @@ -78,6 +78,11 @@ <artifactId>pastry</artifactId> <version>2.1</version> </dependency> + <dependency> + <groupId>org.planx.xmlstore</groupId> + <artifactId>xmlstore</artifactId> + <version>0.4.12</version> + </dependency> <!-- test --> <dependency>