|
From: <fd...@us...> - 2007-03-31 16:51:38
|
Revision: 3147
http://jnode.svn.sourceforge.net/jnode/?rev=3147&view=rev
Author: fduminy
Date: 2007-03-31 09:51:34 -0700 (Sat, 31 Mar 2007)
Log Message:
-----------
new version with some refactoring, more tests ...
- working disk type detection
- working read/write of headers only
- read/write of sectors still buggy
Added Paths:
-----------
trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/AllocationTableRW.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseDescriptorRW.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseDiskFactory.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentHeaderRW.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentIO.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentRW.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/test/BaseTest.java
trunk/distr/src/apps/org/jnode/apps/vmware/disk/test/TestCreation.java
Added: trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/AllocationTableRW.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/AllocationTableRW.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/AllocationTableRW.java 2007-03-31 16:51:34 UTC (rev 3147)
@@ -0,0 +1,95 @@
+package org.jnode.apps.vmware.disk.handler.sparse;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
+import java.nio.channels.FileChannel;
+
+import org.apache.log4j.Logger;
+import org.jnode.apps.vmware.disk.IOUtils;
+import org.jnode.apps.vmware.disk.handler.IOHandler;
+
+/**
+ * Wrote from the 'Virtual Disk Format 1.0' specifications (from VMWare)
+ *
+ * @author Fabien DUMINY (fduminy at jnode dot org)
+ *
+ */
+public class AllocationTableRW {
+ private static final Logger LOG = Logger.getLogger(SparseExtentRW.class);
+
+ public AllocationTable read(RandomAccessFile raf, SparseExtentHeader header)
+ throws IOException
+ {
+ long nbGrains = header.getCapacity() / header.getGrainSize();
+ int nbGrainTables = (int) (nbGrains / header.getNumGTEsPerGT());
+ LOG.debug("read: capacity="+header.getCapacity()+" grainSize="+header.getGrainSize()+
+ " NumGTEsPerGT="+header.getNumGTEsPerGT()+" => nbGrainTables="+nbGrainTables);
+
+ GrainDirectory grainDirectory = new GrainDirectory(readEntries(raf, nbGrainTables));
+ GrainTable[] grainTables = new GrainTable[nbGrainTables];
+ for(int i = 0 ; i < grainTables.length ; i++)
+ {
+ if(LOG.isDebugEnabled())
+ {
+ long pos = raf.getChannel().position();
+ if((pos % IOHandler.SECTOR_SIZE) != 0)
+ {
+ LOG.fatal("read: FATAL: pos not begin of a sector");
+ }
+
+ final long gtOffset = (pos / IOHandler.SECTOR_SIZE);
+ final long gde = grainDirectory.getEntry(i);
+ if(gde != gtOffset)
+ {
+ LOG.fatal("read: FATAL: grainTables["+i+"] (value:"+gtOffset+") doesn't match to GrainDirectoryEntry #"+i+ "(value:"+gde+")");
+ }
+
+ raf.getChannel().position(gde);
+ }
+
+ grainTables[i] = new GrainTable(readEntries(raf, header.getNumGTEsPerGT()));
+ }
+
+ return new AllocationTable(grainDirectory, grainTables);
+ }
+
+ public void write(FileChannel channel, AllocationTable table) throws IOException
+ {
+ write(channel, table.getGrainDirectory());
+ for(int gtNum = 0 ; gtNum < table.getNbGrainTables() ; gtNum++)
+ {
+ write(channel, table.getGrainTable(gtNum));
+ }
+ }
+
+ protected void write(FileChannel channel, EntryArray ea) throws IOException
+ {
+ ByteBuffer b = IOUtils.allocate(ea.getSize() * IOUtils.INT_SIZE);
+ IntBuffer ib = b.asIntBuffer();
+ for(int i = 0 ; i < ea.getSize() ; i++)
+ {
+ ib.put(ea.getEntry(i));
+ }
+ ib.rewind();
+ channel.write(b);
+ }
+
+ protected int[] readEntries(RandomAccessFile raf, int nbEntries) throws IOException
+ {
+ IntBuffer bb = IOUtils.getByteBuffer(raf, nbEntries * IOUtils.INT_SIZE).asIntBuffer();
+
+ int[] entries = new int[nbEntries];
+ for(int entryNumber = 0 ; entryNumber < nbEntries ; entryNumber++)
+ {
+ int entry = bb.get();
+ if(entry > 0)
+ {
+ LOG.debug("readEntries: entry["+entryNumber+"]="+entry);
+ }
+ entries[entryNumber] = entry;
+ }
+ return entries;
+ }
+}
Added: trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseDescriptorRW.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseDescriptorRW.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseDescriptorRW.java 2007-03-31 16:51:34 UTC (rev 3147)
@@ -0,0 +1,50 @@
+/**
+ *
+ */
+package org.jnode.apps.vmware.disk.handler.sparse;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+
+import org.apache.log4j.Logger;
+import org.jnode.apps.vmware.disk.ExtentDeclaration;
+import org.jnode.apps.vmware.disk.IOUtils;
+import org.jnode.apps.vmware.disk.descriptor.Descriptor;
+import org.jnode.apps.vmware.disk.descriptor.DescriptorRW;
+import org.jnode.apps.vmware.disk.extent.Extent;
+import org.jnode.apps.vmware.disk.handler.FileDescriptor;
+import org.jnode.apps.vmware.disk.handler.UnsupportedFormatException;
+
+/**
+ * Wrote from the 'Virtual Disk Format 1.0' specifications (from VMWare)
+ *
+ * @author Fabien DUMINY (fduminy at jnode dot org)
+ *
+ */
+final class SparseDescriptorRW extends DescriptorRW {
+ static final Logger LOG = Logger.getLogger(SparseDescriptorRW.class);
+
+ @Override
+ public SparseExtent createMainExtent(Descriptor desc, ExtentDeclaration extentDecl) throws IOException, UnsupportedFormatException
+ {
+ SparseExtentFactory factory = new SparseExtentFactory();
+
+ RandomAccessFile raf = new RandomAccessFile(extentDecl.getExtentFile(), "rw");
+ ByteBuffer bb = IOUtils.getByteBuffer(raf, 1024);
+
+ SparseExtentHeaderRW reader = new SparseExtentHeaderRW();
+ SparseExtentHeader header = reader.read(bb);
+ SparseFileDescriptor sfd = new SparseFileDescriptor(desc, raf, factory, header);
+ return createExtent(sfd, extentDecl);
+ }
+
+ @Override
+ public SparseExtent createExtent(FileDescriptor fileDescriptor,
+ ExtentDeclaration extentDecl)
+ throws IOException, UnsupportedFormatException
+ {
+ SparseFileDescriptor sfd = (SparseFileDescriptor) fileDescriptor;
+ return new SparseExtentRW().read(sfd.getRandomAccessFile().getChannel(), sfd, extentDecl);
+ }
+}
\ No newline at end of file
Added: trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseDiskFactory.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseDiskFactory.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseDiskFactory.java 2007-03-31 16:51:34 UTC (rev 3147)
@@ -0,0 +1,20 @@
+package org.jnode.apps.vmware.disk.handler.sparse;
+
+import java.io.File;
+
+import org.jnode.apps.vmware.disk.tools.DiskFactory;
+
+/**
+ * Wrote from the 'Virtual Disk Format 1.0' specifications (from VMWare)
+ *
+ * @author Fabien DUMINY (fduminy at jnode dot org)
+ *
+ */
+public class SparseDiskFactory extends DiskFactory
+{
+ @Override
+ protected boolean createDiskImpl(File mainFile, long size)
+ {
+ return true;
+ }
+}
Added: trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentHeaderRW.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentHeaderRW.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentHeaderRW.java 2007-03-31 16:51:34 UTC (rev 3147)
@@ -0,0 +1,178 @@
+package org.jnode.apps.vmware.disk.handler.sparse;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channel;
+import java.nio.channels.FileChannel;
+
+import org.apache.log4j.Logger;
+import org.jnode.apps.vmware.disk.IOUtils;
+import org.jnode.apps.vmware.disk.handler.UnsupportedFormatException;
+
+/**
+ * Wrote from the 'Virtual Disk Format 1.0' specifications (from VMWare)
+ *
+ * @author Fabien DUMINY (fduminy at jnode dot org)
+ *
+ */
+public class SparseExtentHeaderRW
+{
+ static final Logger LOG = Logger.getLogger(SparseExtentHeaderRW.class);
+
+ private static final byte singleEndLineChar = '\n';
+ private static final byte nonEndLineChar = ' ';
+ private static final byte doubleEndLineChar1 = '\r';
+ private static final byte doubleEndLineChar2 = '\n';
+
+ private static final int PAD_SIZE = 435;
+ private static final int MAGIC_NUMBER = 0x564d444b;
+ private static final int VERSION = 1;
+
+ private static final byte TRUE = (byte)1;
+ private static final byte FALSE = (byte)0;
+
+ private static final int numGTEsPerGT = 512;
+
+ public SparseExtentHeader read(ByteBuffer bb)
+ throws IOException, UnsupportedFormatException
+ {
+ //TODO optimise the size
+ //ByteBuffer bb = IOUtils.getByteBuffer(raf, 1024);
+
+ SparseExtentHeader header = new SparseExtentHeader();
+
+ int magicNum = bb.getInt();
+ LOG.debug("magicNum="+Long.toHexString(magicNum));
+ if(magicNum != MAGIC_NUMBER)
+ {
+ throw new UnsupportedFormatException("not the magic number");
+ }
+
+ int version = bb.getInt();
+ if(version != VERSION)
+ {
+ throw new IOException("bad version number (found:" + version + ")");
+ }
+
+ int flags = bb.getInt();
+ header.setValidNewLineDetectionTest((flags & 0x01) == 0x01); // bit 0
+ header.setRedundantGrainTableWillBeUsed((flags & 0x02) == 0x02); // bit 1
+
+ header.setCapacity(bb.getLong());
+ header.setGrainSize(bb.getLong());
+ header.setDescriptorOffset(bb.getLong());
+ header.setDescriptorSize(bb.getLong());
+
+ LOG.debug("read: offset(NumGTEsPerGT)="+bb.position());
+ int nb = bb.getInt();
+ if(nb != numGTEsPerGT)
+ {
+ throw new IOException("bad number of entries per grain table (found:" + nb + ")");
+ }
+ header.setNumGTEsPerGT(nb);
+
+ header.setRgdOffset(bb.getLong());
+
+ LOG.debug("read: offset(GdOffset)="+bb.position());
+ header.setGdOffset(bb.getLong());
+ header.setOverHead(bb.getLong());
+ header.setUncleanShutdown(bb.get() == TRUE);
+
+ LOG.debug("read: offset(singleEndLineChar)="+bb.position());
+ byte b = bb.get();
+ if(b != singleEndLineChar)
+ {
+ throw new IOException("file corrupted after a FTP (singleEndLineChar="+b+")");
+ }
+ b = bb.get();
+ if(b != nonEndLineChar)
+ {
+ throw new IOException("file corrupted after a FTP (nonEndLineChar="+b+")");
+ }
+ b = bb.get();
+ if(b != doubleEndLineChar1)
+ {
+ throw new IOException("file corrupted after a FTP (doubleEndLineChar1="+b+")");
+ }
+ b = bb.get();
+ if(b != doubleEndLineChar2)
+ {
+ throw new IOException("file corrupted after a FTP (doubleEndLineChar2="+b+")");
+ }
+
+ if(bb.remaining() < PAD_SIZE)
+ {
+ throw new UnsupportedFormatException("bad pad size (size="+bb.remaining()+")");
+ }
+
+ // additional/computed attributes
+ header.setGrainTableCoverage(header.getNumGTEsPerGT() * header.getGrainSize());
+
+ if(header.getGrainSize() <= 8)
+ {
+ throw new IOException("grainSize must be greater than 8 (actual:"+header.getGrainSize()+")");
+ }
+ if(!IOUtils.isPowerOf2(header.getGrainSize()))
+ {
+ throw new IOException("grainSize must be a power of 2 (actual:"+header.getGrainSize()+")");
+ }
+
+//TODO: according to the spec the following test shouldn't fail but **it is actually failing**
+// if((header.getCapacity() % header.getGrainSize()) != 0)
+// {
+// throw new IOException("capacity must be a multiple of grainSize (actual grainSize:"+header.getGrainSize()+", actual capacity="+header.getCapacity()+")");
+// }
+
+ LOG.debug("header="+header);
+
+ return header;
+ }
+
+ public void write(FileChannel channel, SparseExtentHeader header) throws IOException {
+ ByteBuffer bb = IOUtils.allocate(1024);
+ bb.putInt(MAGIC_NUMBER);
+ bb.putInt(VERSION);
+
+ int flags = 0;
+ if(header.isValidNewLineDetectionTest())
+ {
+ flags &= 0x01; // bit 0
+ }
+ if(header.isRedundantGrainTableWillBeUsed())
+ {
+ flags &= 0x02; // bit 1
+ }
+ bb.putInt(flags);
+
+ bb.putLong(header.getCapacity());
+ bb.putLong(header.getGrainSize());
+ bb.putLong(header.getDescriptorOffset());
+ bb.putLong(header.getDescriptorSize());
+
+ LOG.debug("write: offset(NumGTEsPerGT)="+bb.position());
+ bb.putInt(header.getNumGTEsPerGT());
+ bb.putLong(header.getRgdOffset());
+
+ LOG.debug("write: offset(GdOffset)="+bb.position());
+ bb.putLong(header.getGdOffset());
+ bb.putLong(header.getOverHead());
+ bb.put(header.isUncleanShutdown() ? TRUE : FALSE);
+
+ LOG.debug("write: offset(singleEndLineChar)="+bb.position());
+ bb.put(singleEndLineChar);
+ bb.put(nonEndLineChar);
+ bb.put(doubleEndLineChar1);
+ bb.put(doubleEndLineChar2);
+
+ for(int i = 0 ; i < PAD_SIZE ; i++)
+ {
+ bb.put((byte) 0);
+ }
+
+ bb.limit(bb.position());
+ bb.rewind();
+ LOG.debug("write: buffer="+bb);
+
+ channel.write(bb);
+ }
+}
\ No newline at end of file
Added: trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentIO.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentIO.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentIO.java 2007-03-31 16:51:34 UTC (rev 3147)
@@ -0,0 +1,75 @@
+package org.jnode.apps.vmware.disk.handler.sparse;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+
+import org.apache.log4j.Logger;
+import org.jnode.apps.vmware.disk.extent.Extent;
+import org.jnode.apps.vmware.disk.handler.ExtentIO;
+import org.jnode.apps.vmware.disk.handler.IOHandler;
+
+/**
+ * Wrote from the 'Virtual Disk Format 1.0' specifications (from VMWare)
+ *
+ * @author Fabien DUMINY (fduminy at jnode dot org)
+ *
+ */
+public class SparseExtentIO extends ExtentIO {
+ private static final Logger LOG = Logger.getLogger(SparseExtentIO.class);
+
+ public SparseExtentIO(RandomAccessFile raf, Extent extent) {
+ super(raf, extent);
+ }
+
+ @Override
+ public void read(long sector, ByteBuffer dst) throws IOException {
+ SparseExtent spe = (SparseExtent) extent;
+
+ int oldLimit = dst.limit();
+ dst.limit((int) (dst.position() + IOHandler.SECTOR_SIZE));
+
+ int offset = spe.getOffset(sector, false, raf); // false: don't allocate
+ if(offset < 0)
+ {
+ // grain not yet allocated
+ // this is the vmware disk behavior : we don't allocate new grains on read
+ // we put zeros in the buffer
+ for(int i = 0 ; i < IOHandler.SECTOR_SIZE; i++)
+ {
+ dst.put((byte) 0);
+ }
+ }
+ else
+ {
+ LOG.debug("read: sector="+sector+" offset="+offset+" size="+dst.remaining());
+ channel.position(offset);
+ int read = channel.read(dst);
+ LOG.debug("read: nbRead="+read);
+ }
+
+ dst.limit(oldLimit);
+ }
+
+ @Override
+ public void write(long sector, ByteBuffer src) throws IOException
+ {
+ SparseExtent spe = (SparseExtent) extent;
+
+ // true: allocate if necessary
+ int offset = spe.getOffset(sector, true, raf);
+
+ LOG.debug("write: sector="+sector+" offset="+offset+" size="+src.remaining());
+ channel.position(offset);
+ channel.write(src);
+ }
+
+ @Override
+ public void flush() throws IOException {
+ SparseExtent spe = (SparseExtent) extent;
+
+ new SparseExtentRW().write(channel, spe);
+
+ super.flush();
+ }
+}
Added: trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentRW.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentRW.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/handler/sparse/SparseExtentRW.java 2007-03-31 16:51:34 UTC (rev 3147)
@@ -0,0 +1,61 @@
+package org.jnode.apps.vmware.disk.handler.sparse;
+
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.channels.FileChannel;
+
+import org.apache.log4j.Logger;
+import org.jnode.apps.vmware.disk.ExtentDeclaration;
+import org.jnode.apps.vmware.disk.IOUtils;
+import org.jnode.apps.vmware.disk.descriptor.Descriptor;
+
+/**
+ * Wrote from the 'Virtual Disk Format 1.0' specifications (from VMWare)
+ *
+ * @author Fabien DUMINY (fduminy at jnode dot org)
+ *
+ */
+public class SparseExtentRW {
+ private static final Logger LOG = Logger.getLogger(SparseExtentRW.class);
+
+ private static final AllocationTableRW ALLOC_TABLE_RW = new AllocationTableRW();
+ private static final SparseExtentHeaderRW SPARSE_EXT_HEADER_RW = new SparseExtentHeaderRW();
+
+ public void write(FileChannel channel, SparseExtent extent) throws IOException {
+ channel.position(0L);
+ SPARSE_EXT_HEADER_RW.write(channel, extent.getHeader());
+
+ IOUtils.positionSector(channel, extent.getHeader().getRgdOffset());
+ LOG.debug("write: position(redundantAllocTable)="+channel.position());
+ ALLOC_TABLE_RW.write(channel, extent.getRedundantAllocationTable());
+
+ IOUtils.positionSector(channel, extent.getHeader().getGdOffset());
+ LOG.debug("write: position(allocTable)="+channel.position());
+ ALLOC_TABLE_RW.write(channel, extent.getAllocationTable());
+
+ LOG.debug("write: position="+channel.position());
+ }
+
+ public SparseExtent read(FileChannel channel,
+ SparseFileDescriptor fileDescriptor, ExtentDeclaration extentDecl)
+ throws IOException
+ {
+ LOG.debug("fileDescriptor="+fileDescriptor);
+ Descriptor descriptor = fileDescriptor.getDescriptor();
+
+ RandomAccessFile raf = fileDescriptor.getRandomAccessFile();
+ SparseExtentHeader header = fileDescriptor.getHeader();
+
+ IOUtils.positionSector(raf.getChannel(), header.getRgdOffset());
+ LOG.debug("read: position(redundantAllocTable)="+channel.position());
+ AllocationTable redundantAllocationTable = ALLOC_TABLE_RW.read(raf, header);
+
+ IOUtils.positionSector(raf.getChannel(), header.getGdOffset());
+ LOG.debug("read: position(allocTable)="+channel.position());
+ AllocationTable allocationTable = ALLOC_TABLE_RW.read(raf, header);
+
+ return new SparseExtent(descriptor, extentDecl,
+ header, redundantAllocationTable,
+ allocationTable);
+ }
+}
Added: trunk/distr/src/apps/org/jnode/apps/vmware/disk/test/BaseTest.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/test/BaseTest.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/test/BaseTest.java 2007-03-31 16:51:34 UTC (rev 3147)
@@ -0,0 +1,44 @@
+package org.jnode.apps.vmware.disk.test;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.jnode.apps.vmware.disk.IOUtils;
+import org.jnode.apps.vmware.disk.tools.DiskCopier;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ * Wrote from the 'Virtual Disk Format 1.0' specifications (from VMWare)
+ *
+ * @author Fabien DUMINY (fduminy at jnode dot org)
+ *
+ */
+abstract public class BaseTest {
+
+ protected final File originalDiskFile;
+ protected final boolean copyDisk;
+ protected File diskFile;
+
+ public BaseTest(File diskFile, boolean copyDisk) {
+ this.originalDiskFile = diskFile;
+ this.copyDisk = copyDisk;
+ }
+
+ @Before
+ public void setUp() throws IOException {
+ this.diskFile = copyDisk ? DiskCopier.copyDisk(originalDiskFile, Utils.createTempDir()) : originalDiskFile;
+ }
+
+ @After
+ public void tearDown() throws IOException {
+ Utils.clearTempDir(true);
+ Utils.DO_CLEAR = true;
+ }
+
+ @Override
+ public String toString() {
+ return diskFile.getName();
+ }
+
+}
\ No newline at end of file
Added: trunk/distr/src/apps/org/jnode/apps/vmware/disk/test/TestCreation.java
===================================================================
--- trunk/distr/src/apps/org/jnode/apps/vmware/disk/test/TestCreation.java (rev 0)
+++ trunk/distr/src/apps/org/jnode/apps/vmware/disk/test/TestCreation.java 2007-03-31 16:51:34 UTC (rev 3147)
@@ -0,0 +1,31 @@
+package org.jnode.apps.vmware.disk.test;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.log4j.Logger;
+import org.jnode.apps.vmware.disk.IOUtils;
+import org.junit.Test;
+
+
+/**
+ * Wrote from the 'Virtual Disk Format 1.0' specifications (from VMWare)
+ *
+ * @author Fabien DUMINY (fduminy at jnode dot org)
+ *
+ */
+public class TestCreation extends BaseTest
+{
+ private static final Logger LOG = Logger.getLogger(TestCreation.class);
+
+ public TestCreation() throws IOException
+ {
+ super(Utils.createTempFile("create"), false);
+ }
+
+ @Test
+ public void createSparseDisk() throws Exception
+ {
+
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|