You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ad...@apache.org on 2002/11/21 05:25:58 UTC

cvs commit: jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test AbstractProviderTestConfig.java ProviderReadTests.java ProviderTestConfig.java ProviderTestSuite.java AbstractFileSystemTestCase.java AbstractReadOnlyFileSystemTestCase.java AbstractWritableFileSystemTestCase.java FileSystemManagerFactoryTestCase.java

adammurdoch    2002/11/20 20:25:58

  Modified:    vfs/src/test/org/apache/commons AbstractVfsTestCase.java
               vfs/src/test/org/apache/commons/vfs/provider/ftp/test
                        FtpFileSystemTestCase.java
               vfs/src/test/org/apache/commons/vfs/provider/jar/test
                        JarFileSystemTestCase.java
                        NestedJarFileSystemTestCase.java
               vfs/src/test/org/apache/commons/vfs/provider/local/test
                        LocalFileSystemTestCase.java
               vfs/src/test/org/apache/commons/vfs/provider/smb/test
                        SmbFileSystemTestCase.java
               vfs/src/test/org/apache/commons/vfs/provider/temp/test
                        TemporaryFileProiderTestCase.java
               vfs/src/test/org/apache/commons/vfs/provider/zip/test
                        NestedZipFileSystemTestCase.java
                        ZipFileSystemTestCase.java
               vfs/src/test/org/apache/commons/vfs/test
                        AbstractFileSystemTestCase.java
                        AbstractReadOnlyFileSystemTestCase.java
                        AbstractWritableFileSystemTestCase.java
                        FileSystemManagerFactoryTestCase.java
  Added:       vfs/src/test/org/apache/commons/vfs/provider/local/test
                        FileNameTestCase.java
               vfs/src/test/org/apache/commons/vfs/test
                        AbstractProviderTestConfig.java
                        ProviderReadTests.java ProviderTestConfig.java
                        ProviderTestSuite.java
  Log:
  Reorganised tests, so that provider test cases are assembled dynamically
  based on the provider's capabilities.  This replaces using test case inheritance
  to statically assemble test cases, which was getting unwieldy as more combinations
  of capabilities were added.
  
  Revision  Changes    Path
  1.9       +33 -35    jakarta-commons-sandbox/vfs/src/test/org/apache/commons/AbstractVfsTestCase.java
  
  Index: AbstractVfsTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/AbstractVfsTestCase.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- AbstractVfsTestCase.java	23 Oct 2002 11:59:38 -0000	1.8
  +++ AbstractVfsTestCase.java	21 Nov 2002 04:25:57 -0000	1.9
  @@ -72,14 +72,7 @@
   public abstract class AbstractVfsTestCase
       extends TestCase
   {
  -    private final File baseDir;
  -
  -    public AbstractVfsTestCase( final String name )
  -    {
  -        super( name );
  -        final String baseDirProp = System.getProperty( "test.basedir" );
  -        baseDir = getCanonicalFile( new File( baseDirProp ) );
  -    }
  +    private static File baseDir;
   
       /**
        * Returns the name of the package containing a class.
  @@ -87,16 +80,16 @@
        * @return The . delimited package name, or an empty string if the class
        *         is in the default package.
        */
  -    protected static String getPackageName( final Class clazz )
  +    public static String getPackageName( final Class clazz )
       {
           final Package pkg = clazz.getPackage();
  -        if( null != pkg )
  +        if ( null != pkg )
           {
               return pkg.getName();
           }
   
           final String name = clazz.getName();
  -        if( -1 == name.lastIndexOf( "." ) )
  +        if ( -1 == name.lastIndexOf( "." ) )
           {
               return "";
           }
  @@ -111,7 +104,7 @@
        *
        * @param name path of the resource, relative to this test's base directory.
        */
  -    protected File getTestResource( final String name )
  +    public static File getTestResource( final String name )
       {
           return getTestResource( name, true );
       }
  @@ -121,11 +114,11 @@
        *
        * @param name path of the resource, relative to this test's base directory.
        */
  -    protected File getTestResource( final String name, final boolean mustExist )
  +    public static File getTestResource( final String name, final boolean mustExist )
       {
  -        File file = new File( baseDir, name );
  +        File file = new File( getTestDirectory(), name );
           file = getCanonicalFile( file );
  -        if( mustExist )
  +        if ( mustExist )
           {
               assertTrue( "Test file \"" + file + "\" does not exist.", file.exists() );
           }
  @@ -140,8 +133,13 @@
       /**
        * Locates the base directory for this test.
        */
  -    protected File getTestDirectory()
  +    public static File getTestDirectory()
       {
  +        if ( baseDir == null )
  +        {
  +            final String baseDirProp = System.getProperty( "test.basedir" );
  +            baseDir = getCanonicalFile( new File( baseDirProp ) );
  +        }
           return baseDir;
       }
   
  @@ -150,9 +148,9 @@
        *
        * @param name path of the directory, relative to this test's base directory.
        */
  -    protected File getTestDirectory( final String name )
  +    public static File getTestDirectory( final String name )
       {
  -        File file = new File( baseDir, name );
  +        File file = new File( getTestDirectory(), name );
           file = getCanonicalFile( file );
           assertTrue( "Test directory \"" + file + "\" does not exist or is not a directory.",
                       file.isDirectory() || file.mkdirs() );
  @@ -162,13 +160,13 @@
       /**
        * Makes a file canonical
        */
  -    private File getCanonicalFile( final File file )
  +    public static File getCanonicalFile( final File file )
       {
           try
           {
               return file.getCanonicalFile();
           }
  -        catch( IOException e )
  +        catch ( IOException e )
           {
               return file.getAbsoluteFile();
           }
  @@ -180,14 +178,14 @@
        * @param messages The messages, in order.  A null entry in this array
        *                 indicates that the message should be ignored.
        */
  -    protected void assertSameMessage( final String[] messages, final Throwable throwable )
  +    public static void assertSameMessage( final String[] messages, final Throwable throwable )
       {
           Throwable current = throwable;
  -        for( int i = 0; i < messages.length; i++ )
  +        for ( int i = 0; i < messages.length; i++ )
           {
               String message = messages[ i ];
               assertNotNull( current );
  -            if( message != null )
  +            if ( message != null )
               {
                   assertEquals( message, current.getMessage() );
               }
  @@ -200,7 +198,7 @@
       /**
        * Returns the cause of an exception.
        */
  -    private Throwable getCause( Throwable throwable )
  +    public static Throwable getCause( Throwable throwable )
       {
           try
           {
  @@ -216,8 +214,8 @@
       /**
        * Asserts that an exception contains the expected message.
        */
  -    protected void assertSameMessage( final String code,
  -                                      final Throwable throwable )
  +    public static void assertSameMessage( final String code,
  +                                          final Throwable throwable )
       {
           assertSameMessage( code, new Object[ 0 ], throwable );
       }
  @@ -225,9 +223,9 @@
       /**
        * Asserts that an exception contains the expected message.
        */
  -    protected void assertSameMessage( final String code,
  -                                      final Object[] params,
  -                                      final Throwable throwable )
  +    public static void assertSameMessage( final String code,
  +                                          final Object[] params,
  +                                          final Throwable throwable )
       {
           if ( throwable instanceof FileSystemException )
           {
  @@ -251,11 +249,11 @@
       /**
        * Asserts that an exception contains the expected message.
        */
  -    protected void assertSameMessage( final String code,
  -                                      final Object param,
  -                                      final Throwable throwable )
  +    public static void assertSameMessage( final String code,
  +                                          final Object param,
  +                                          final Throwable throwable )
       {
  -        assertSameMessage( code, new Object[] { param }, throwable );
  +        assertSameMessage( code, new Object[]{param}, throwable );
       }
   
       /**
  @@ -264,11 +262,11 @@
        */
       public static boolean equals( final Object o1, final Object o2 )
       {
  -        if( o1 == null && o2 == null )
  +        if ( o1 == null && o2 == null )
           {
               return true;
           }
  -        if( o1 == null || o2 == null )
  +        if ( o1 == null || o2 == null )
           {
               return false;
           }
  
  
  
  1.4       +36 -11    jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/ftp/test/FtpFileSystemTestCase.java
  
  Index: FtpFileSystemTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/ftp/test/FtpFileSystemTestCase.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FtpFileSystemTestCase.java	23 Oct 2002 11:59:39 -0000	1.3
  +++ FtpFileSystemTestCase.java	21 Nov 2002 04:25:57 -0000	1.4
  @@ -55,9 +55,14 @@
    */
   package org.apache.commons.vfs.provider.ftp.test;
   
  +import junit.framework.Test;
  +import org.apache.commons.vfs.test.AbstractProviderTestConfig;
  +import org.apache.commons.vfs.test.ProviderTestConfig;
  +import org.apache.commons.vfs.test.ProviderTestSuite;
   import org.apache.commons.vfs.FileObject;
  +import org.apache.commons.vfs.FileSystemManager;
  +import org.apache.commons.vfs.impl.DefaultFileSystemManager;
   import org.apache.commons.vfs.provider.ftp.FtpFileSystemProvider;
  -import org.apache.commons.vfs.test.AbstractWritableFileSystemTestCase;
   
   /**
    * Tests for FTP file systems.
  @@ -65,29 +70,49 @@
    * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
    */
   public class FtpFileSystemTestCase
  -    extends AbstractWritableFileSystemTestCase
  +    extends AbstractProviderTestConfig
  +    implements ProviderTestConfig
   {
  -    public FtpFileSystemTestCase( String name )
  +    /**
  +     * Creates the test suite for the ftp file system.
  +     */
  +    public static Test suite() throws Exception
  +    {
  +        return new ProviderTestSuite( new FtpFileSystemTestCase() );
  +    }
  +
  +    /**
  +     * Prepares the file system manager.
  +     */
  +    public void prepare( final DefaultFileSystemManager manager ) throws Exception
       {
  -        super( name );
  +        manager.addProvider( "ftp", new FtpFileSystemProvider() );
       }
   
       /**
  -     * Returns the URI for the base folder.
  +     * Returns the base folder for read tests.
        */
  -    protected FileObject getBaseFolder() throws Exception
  +    public FileObject getReadTestFolder( final FileSystemManager manager ) throws Exception
       {
           final String uri = System.getProperty( "test.ftp.uri" ) + "/read-tests";
  -        getManager().addProvider( "ftp", new FtpFileSystemProvider() );
  -        return getManager().resolveFile( uri );
  +        return manager.resolveFile( uri );
  +    }
  +
  +    /**
  +     * Returns true if the write tests should be run for this provider.
  +     */
  +    public boolean runWriteTests()
  +    {
  +        return true;
       }
   
       /**
  -     * Returns the URI for the area to do tests in.
  +     * Returns the base folder for write tests.  Should return null to
  +     * skip the write tests.
        */
  -    protected FileObject getWriteFolder() throws Exception
  +    public FileObject getWriteTestFolder( final FileSystemManager manager ) throws Exception
       {
           final String uri = System.getProperty( "test.ftp.uri" ) + "/write-tests";
  -        return getManager().resolveFile( uri );
  +        return manager.resolveFile( uri );
       }
   }
  
  
  
  1.4       +28 -10    jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/jar/test/JarFileSystemTestCase.java
  
  Index: JarFileSystemTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/jar/test/JarFileSystemTestCase.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- JarFileSystemTestCase.java	23 Oct 2002 11:59:39 -0000	1.3
  +++ JarFileSystemTestCase.java	21 Nov 2002 04:25:57 -0000	1.4
  @@ -56,9 +56,15 @@
   package org.apache.commons.vfs.provider.jar.test;
   
   import java.io.File;
  +import org.apache.commons.AbstractVfsTestCase;
  +import org.apache.commons.vfs.test.ProviderTestConfig;
  +import org.apache.commons.vfs.test.ProviderTestSuite;
  +import org.apache.commons.vfs.test.AbstractProviderTestConfig;
   import org.apache.commons.vfs.FileObject;
  +import org.apache.commons.vfs.FileSystemManager;
  +import org.apache.commons.vfs.impl.DefaultFileSystemManager;
   import org.apache.commons.vfs.provider.jar.JarFileSystemProvider;
  -import org.apache.commons.vfs.test.AbstractReadOnlyFileSystemTestCase;
  +import junit.framework.Test;
   
   /**
    * Tests for the Jar file system.
  @@ -66,22 +72,34 @@
    * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
    */
   public class JarFileSystemTestCase
  -    extends AbstractReadOnlyFileSystemTestCase
  +    extends AbstractProviderTestConfig
  +    implements ProviderTestConfig
   {
  -    public JarFileSystemTestCase( String name )
  +    /**
  +     * Creates the test suite for the jar file system.
  +     */
  +    public static Test suite() throws Exception
  +    {
  +        return new ProviderTestSuite( new JarFileSystemTestCase() );
  +    }
  +
  +    /**
  +     * Prepares the file system manager.
  +     */
  +    public void prepare( final DefaultFileSystemManager manager )
  +        throws Exception
       {
  -        super( name );
  +        manager.addProvider( "jar", new JarFileSystemProvider() );
       }
   
       /**
  -     * Returns the URI for the base folder.
  +     * Returns the base folder for read tests.
        */
  -    protected FileObject getBaseFolder() throws Exception
  +    public FileObject getReadTestFolder( final FileSystemManager manager ) throws Exception
       {
  -        File jarFile = getTestResource( "test.jar" );
  -        String uri = "jar:" + jarFile.getAbsolutePath() + "!basedir";
  -        getManager().addProvider( "jar", new JarFileSystemProvider() );
  -        return getManager().resolveFile( uri );
  +        final File jarFile = AbstractVfsTestCase.getTestResource( "test.jar" );
  +        final String uri = "jar:" + jarFile.getAbsolutePath() + "!basedir";
  +        return manager.resolveFile( uri );
       }
   
       /**
  
  
  
  1.4       +33 -24    jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/jar/test/NestedJarFileSystemTestCase.java
  
  Index: NestedJarFileSystemTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/jar/test/NestedJarFileSystemTestCase.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- NestedJarFileSystemTestCase.java	23 Oct 2002 11:59:39 -0000	1.3
  +++ NestedJarFileSystemTestCase.java	21 Nov 2002 04:25:57 -0000	1.4
  @@ -56,12 +56,15 @@
   package org.apache.commons.vfs.provider.jar.test;
   
   import java.io.File;
  -import java.net.URL;
  -import java.net.URLConnection;
  +import junit.framework.Test;
  +import org.apache.commons.AbstractVfsTestCase;
   import org.apache.commons.vfs.FileObject;
  -import org.apache.commons.vfs.impl.VFSClassLoader;
  +import org.apache.commons.vfs.FileSystemManager;
  +import org.apache.commons.vfs.impl.DefaultFileSystemManager;
   import org.apache.commons.vfs.provider.jar.JarFileSystemProvider;
  -import org.apache.commons.vfs.test.AbstractReadOnlyFileSystemTestCase;
  +import org.apache.commons.vfs.test.AbstractProviderTestConfig;
  +import org.apache.commons.vfs.test.ProviderTestConfig;
  +import org.apache.commons.vfs.test.ProviderTestSuite;
   
   /**
    * Tests for the Zip file system.
  @@ -69,34 +72,38 @@
    * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
    */
   public class NestedJarFileSystemTestCase
  -        extends AbstractReadOnlyFileSystemTestCase
  +    extends AbstractProviderTestConfig
  +    implements ProviderTestConfig
   {
  -    public NestedJarFileSystemTestCase( String name )
  +    /**
  +     * Creates the test suite for nested jar files.
  +     */
  +    public static Test suite() throws Exception
       {
  -        super( name );
  +        return new ProviderTestSuite( new NestedJarFileSystemTestCase() );
       }
   
  -    protected FileObject topFolder;
  -
  -    protected FileObject getTopFolder() throws Exception
  +    /**
  +     * Prepares the file system manager.  This implementation does nothing.
  +     */
  +    public void prepare( final DefaultFileSystemManager manager )
  +        throws Exception
       {
  -        getManager().addProvider( "jar", new JarFileSystemProvider() );
  -
  -        File jarFile = getTestResource( "nested.jar" );
  -        String uri = "jar:" + jarFile.getAbsolutePath() + "!/";
  -        return getManager().resolveFile( uri );
  +        manager.addProvider( "jar", new JarFileSystemProvider() );
       }
   
       /**
  -     * Returns the URI for the base folder.
  +     * Returns the base folder for read tests.
        */
  -    protected FileObject getBaseFolder() throws Exception
  +    public FileObject getReadTestFolder( final FileSystemManager manager ) throws Exception
       {
  -        topFolder = getTopFolder();
  -        final FileObject jarFile = topFolder.resolveFile( "test.jar" );
  +        // Locate the Jar file
  +        final File outerFile = AbstractVfsTestCase.getTestResource( "nested.jar" );
  +        final String uri = "jar:" + outerFile.getAbsolutePath() + "!/test.jar";
  +        final FileObject jarFile = manager.resolveFile( uri );
  +
           // Now build the nested file system
  -        final FileObject nestedFS =
  -            getManager().createFileSystem( "jar", jarFile );
  +        final FileObject nestedFS = manager.createFileSystem( "jar", jarFile );
           return nestedFS.resolveFile( "/basedir" );
       }
   
  @@ -116,9 +123,10 @@
                  !pack.isSealed();
       }
   
  -
  +    /*
  +     * TODO - activate this
       public void testJarClassLoader() throws Exception
  -    { 
  +    {
           FileObject test = topFolder.resolveFile( "normal.jar" );
           final FileObject[] objects = { test };
           VFSClassLoader loader =
  @@ -126,7 +134,7 @@
   
           Class testClass = loader.loadClass( "code.ClassToLoad" );
           assertTrue( verifyNormalPackage( testClass.getPackage() ) );
  -        
  +
           Object testObject = testClass.newInstance();
           assertSame( "**PRIVATE**", testObject.toString() );
   
  @@ -135,6 +143,7 @@
           URLConnection urlCon = resource.openConnection();
           assertSameURLContent( getCharContent(), urlCon );
       }
  +    */
   
       /**
        * Verify the package loaded with class loader.
  
  
  
  1.7       +33 -23    jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/local/test/LocalFileSystemTestCase.java
  
  Index: LocalFileSystemTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/local/test/LocalFileSystemTestCase.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- LocalFileSystemTestCase.java	25 Oct 2002 11:11:51 -0000	1.6
  +++ LocalFileSystemTestCase.java	21 Nov 2002 04:25:58 -0000	1.7
  @@ -56,8 +56,14 @@
   package org.apache.commons.vfs.provider.local.test;
   
   import java.io.File;
  +import junit.framework.Test;
  +import org.apache.commons.AbstractVfsTestCase;
  +import org.apache.commons.vfs.test.ProviderTestConfig;
  +import org.apache.commons.vfs.test.ProviderTestSuite;
  +import org.apache.commons.vfs.test.AbstractProviderTestConfig;
   import org.apache.commons.vfs.FileObject;
  -import org.apache.commons.vfs.test.AbstractWritableFileSystemTestCase;
  +import org.apache.commons.vfs.FileSystemManager;
  +import org.apache.commons.vfs.impl.DefaultFileSystemManager;
   
   /**
    * Tests for the local file system.
  @@ -65,46 +71,50 @@
    * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
    */
   public class LocalFileSystemTestCase
  -    extends AbstractWritableFileSystemTestCase
  +    extends AbstractProviderTestConfig
  +    implements ProviderTestConfig
   {
  -    public LocalFileSystemTestCase( String name )
  +    /**
  +     * Creates the test suite for the local file system.
  +     */
  +    public static Test suite() throws Exception
       {
  -        super( name );
  +        return new ProviderTestSuite( new LocalFileSystemTestCase() );
       }
   
       /**
  -     * Returns the URI for the base folder.
  +     * Prepares the file system manager.
        */
  -    protected FileObject getBaseFolder() throws Exception
  +    public void prepare( final DefaultFileSystemManager manager ) throws Exception
       {
  -        final File testDir = getTestDirectory( "basedir" );
  +    }
  +
  +    /**
  +     * Returns the base folder for read tests.
  +     */
  +    public FileObject getReadTestFolder( final FileSystemManager manager ) throws Exception
  +    {
  +        final File testDir = AbstractVfsTestCase.getTestDirectory( "basedir" );
           final File emptyDir = new File( testDir, "emptydir" );
           emptyDir.mkdirs();
  -        return getManager().toFileObject( testDir );
  +        return manager.toFileObject( testDir );
       }
   
       /**
  -     * Returns the URI for the area to do tests in.
  +     * Returns true if the write tests should be run for this provider.
        */
  -    protected FileObject getWriteFolder() throws Exception
  +    public boolean runWriteTests()
       {
  -        final File testDir = getTestDirectory( "write-tests" );
  -        return getManager().toFileObject( testDir );
  +        return true;
       }
   
       /**
  -     * Tests resolution of an absolute file name.
  +     * Returns the base folder for write tests.  Should return null to
  +     * skip the write tests.
        */
  -    public void testAbsoluteFileName() throws Exception
  +    public FileObject getWriteTestFolder( final FileSystemManager manager ) throws Exception
       {
  -        // Locate file by absolute file name
  -        String fileName = new File( "testdir" ).getAbsolutePath();
  -        FileObject absFile = getManager().resolveFile( fileName );
  -
  -        // Locate file by URI
  -        String uri = "file://" + fileName.replace( File.separatorChar, '/' );
  -        FileObject uriFile = getManager().resolveFile( uri );
  -
  -        assertSame( "file object", absFile, uriFile );
  +        final File testDir = AbstractVfsTestCase.getTestDirectory( "write-tests" );
  +        return manager.toFileObject( testDir );
       }
   }
  
  
  
  1.1                  jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/local/test/FileNameTestCase.java
  
  Index: FileNameTestCase.java
  ===================================================================
  /* ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  package org.apache.commons.vfs.provider.local.test;
  
  import java.io.File;
  import org.apache.commons.vfs.FileObject;
  import org.apache.commons.vfs.test.AbstractFileSystemTestCase;
  
  /**
   * Additional naming tests for local file system.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/11/21 04:25:58 $
   */
  public class FileNameTestCase
      extends AbstractFileSystemTestCase
  {
      /**
       * Tests resolution of an absolute file name.
       */
      public void testAbsoluteFileName() throws Exception
      {
          // Locate file by absolute file name
          String fileName = new File( "testdir" ).getAbsolutePath();
          FileObject absFile = getManager().resolveFile( fileName );
  
          // Locate file by URI
          String uri = "file://" + fileName.replace( File.separatorChar, '/' );
          FileObject uriFile = getManager().resolveFile( uri );
  
          assertSame( "file object", absFile, uriFile );
      }
  }
  
  
  
  1.4       +36 -11    jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/smb/test/SmbFileSystemTestCase.java
  
  Index: SmbFileSystemTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/smb/test/SmbFileSystemTestCase.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SmbFileSystemTestCase.java	23 Oct 2002 11:59:39 -0000	1.3
  +++ SmbFileSystemTestCase.java	21 Nov 2002 04:25:58 -0000	1.4
  @@ -55,38 +55,63 @@
    */
   package org.apache.commons.vfs.provider.smb.test;
   
  +import org.apache.commons.vfs.test.AbstractProviderTestConfig;
  +import org.apache.commons.vfs.test.ProviderTestConfig;
  +import org.apache.commons.vfs.test.ProviderTestSuite;
   import org.apache.commons.vfs.FileObject;
  +import org.apache.commons.vfs.FileSystemManager;
  +import org.apache.commons.vfs.impl.DefaultFileSystemManager;
   import org.apache.commons.vfs.provider.smb.SmbFileSystemProvider;
  -import org.apache.commons.vfs.test.AbstractWritableFileSystemTestCase;
  +import junit.framework.Test;
   
   /**
    * Tests for the SMB file system.
    *
    * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
    */
  -public class SmbFileSystemTestCase extends AbstractWritableFileSystemTestCase
  +public class SmbFileSystemTestCase
  +    extends AbstractProviderTestConfig
  +    implements ProviderTestConfig
   {
  -    public SmbFileSystemTestCase( String name )
  +    public static Test suite() throws Exception
       {
  -        super( name );
  +        return new ProviderTestSuite( new SmbFileSystemTestCase() );
       }
   
       /**
  -     * Returns the URI for the base folder.
  +     * Prepares the file system manager.  This implementation does nothing.
        */
  -    protected FileObject getBaseFolder() throws Exception
  +    public void prepare( final DefaultFileSystemManager manager )
  +        throws Exception
  +    {
  +        manager.addProvider( "smb", new SmbFileSystemProvider() );
  +    }
  +
  +    /**
  +     * Returns the base folder for read tests.
  +     */
  +    public FileObject getReadTestFolder( final FileSystemManager manager ) throws Exception
       {
           final String uri = System.getProperty( "test.smb.uri" ) + "/read-tests";
  -        getManager().addProvider( "smb", new SmbFileSystemProvider() );
  -        return getManager().resolveFile( uri );
  +        return manager.resolveFile( uri );
  +    }
  +
  +    /**
  +     * Returns true if the write tests should be run for this provider.
  +     */
  +    public boolean runWriteTests()
  +    {
  +        return true;
       }
   
       /**
  -     * Returns the URI for the area to do tests in.
  +     * Returns the base folder for write tests.  This implementation returns
  +     * null.
        */
  -    protected FileObject getWriteFolder() throws Exception
  +    public FileObject getWriteTestFolder( final FileSystemManager manager )
  +        throws Exception
       {
           final String uri = System.getProperty( "test.smb.uri" ) + "/write-tests";
  -        return getManager().resolveFile( uri );
  +        return manager.resolveFile( uri );
       }
   }
  
  
  
  1.2       +43 -15    jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/temp/test/TemporaryFileProiderTestCase.java
  
  Index: TemporaryFileProiderTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/temp/test/TemporaryFileProiderTestCase.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TemporaryFileProiderTestCase.java	25 Oct 2002 11:11:51 -0000	1.1
  +++ TemporaryFileProiderTestCase.java	21 Nov 2002 04:25:58 -0000	1.2
  @@ -55,10 +55,16 @@
    */
   package org.apache.commons.vfs.provider.temp.test;
   
  -import org.apache.commons.vfs.test.AbstractWritableFileSystemTestCase;
  +import java.io.File;
  +import junit.framework.Test;
  +import org.apache.commons.vfs.test.AbstractProviderTestConfig;
  +import org.apache.commons.AbstractVfsTestCase;
  +import org.apache.commons.vfs.test.ProviderTestConfig;
  +import org.apache.commons.vfs.test.ProviderTestSuite;
   import org.apache.commons.vfs.FileObject;
  +import org.apache.commons.vfs.FileSystemManager;
  +import org.apache.commons.vfs.impl.DefaultFileSystemManager;
   import org.apache.commons.vfs.provider.temp.TemporaryFileProvider;
  -import java.io.File;
   
   /**
    * Test cases for the tmp: file provider.
  @@ -67,29 +73,51 @@
    * @version $Revision$ $Date$
    */
   public class TemporaryFileProiderTestCase
  -    extends AbstractWritableFileSystemTestCase
  +    extends AbstractProviderTestConfig
  +    implements ProviderTestConfig
   {
  -    public TemporaryFileProiderTestCase( String name )
  +    /**
  +     * Creates the test suite for the tmp file system.
  +     */
  +    public static Test suite() throws Exception
  +    {
  +        return new ProviderTestSuite( new TemporaryFileProiderTestCase() );
  +    }
  +
  +    /**
  +     * Prepares the file system manager.  This implementation does nothing.
  +     */
  +    public void prepare( final DefaultFileSystemManager manager )
  +        throws Exception
  +    {
  +        final File baseDir = AbstractVfsTestCase.getTestDirectory();
  +        manager.addProvider( "tmp-read", new TemporaryFileProvider( baseDir ) );
  +        manager.addProvider( "tmp-write", new TemporaryFileProvider() );
  +    }
  +
  +    /**
  +     * Returns the base folder for read tests.
  +     */
  +    public FileObject getReadTestFolder( final FileSystemManager manager ) throws Exception
       {
  -        super( name );
  +        return manager.resolveFile( "tmp-read:/basedir" );
       }
   
       /**
  -     * Returns the base folder to run the tests against.
  +     * Returns true if the write tests should be run for this provider.
        */
  -    protected FileObject getBaseFolder() throws Exception
  +    public boolean runWriteTests()
       {
  -        final File baseDir = getTestDirectory();
  -        getManager().addProvider( "tmp-read", new TemporaryFileProvider( baseDir ) );
  -        return getManager().resolveFile( "tmp-read:/basedir" );
  +        return true;
       }
   
       /**
  -     * Returns the URI for the area to do tests in.
  +     * Returns the base folder for write tests.  This implementation returns
  +     * null.
        */
  -    protected FileObject getWriteFolder() throws Exception
  +    public FileObject getWriteTestFolder( final FileSystemManager manager )
  +        throws Exception
       {
  -        getManager().addProvider( "tmp", new TemporaryFileProvider() );
  -        return getManager().resolveFile( "tmp:/write-tests" );
  +        return manager.resolveFile( "tmp-write:/write-tests" );
       }
   }
  
  
  
  1.4       +27 -10    jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/zip/test/NestedZipFileSystemTestCase.java
  
  Index: NestedZipFileSystemTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/zip/test/NestedZipFileSystemTestCase.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- NestedZipFileSystemTestCase.java	23 Oct 2002 11:59:39 -0000	1.3
  +++ NestedZipFileSystemTestCase.java	21 Nov 2002 04:25:58 -0000	1.4
  @@ -55,9 +55,15 @@
    */
   package org.apache.commons.vfs.provider.zip.test;
   
  +import junit.framework.Test;
  +import org.apache.commons.AbstractVfsTestCase;
   import org.apache.commons.vfs.FileObject;
  +import org.apache.commons.vfs.FileSystemManager;
  +import org.apache.commons.vfs.impl.DefaultFileSystemManager;
   import org.apache.commons.vfs.provider.zip.ZipFileSystemProvider;
  -import org.apache.commons.vfs.test.AbstractReadOnlyFileSystemTestCase;
  +import org.apache.commons.vfs.test.AbstractProviderTestConfig;
  +import org.apache.commons.vfs.test.ProviderTestConfig;
  +import org.apache.commons.vfs.test.ProviderTestSuite;
   
   /**
    * Tests for the Zip file system, using a zip file nested inside another zip file.
  @@ -65,27 +71,38 @@
    * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
    */
   public class NestedZipFileSystemTestCase
  -    extends AbstractReadOnlyFileSystemTestCase
  +    extends AbstractProviderTestConfig
  +    implements ProviderTestConfig
   {
  -    public NestedZipFileSystemTestCase( String name )
  +    /**
  +     * Creates the test suite for nested zip files.
  +     */
  +    public static Test suite() throws Exception
       {
  -        super( name );
  +        return new ProviderTestSuite( new NestedZipFileSystemTestCase() );
       }
   
       /**
  -     * Returns the URI for the base folder.
  +     * Prepares the file system manager.  This implementation does nothing.
        */
  -    protected FileObject getBaseFolder() throws Exception
  +    public void prepare( final DefaultFileSystemManager manager )
  +        throws Exception
       {
  -        getManager().addProvider( "zip", new ZipFileSystemProvider() );
  +        manager.addProvider( "zip", new ZipFileSystemProvider() );
  +    }
   
  +    /**
  +     * Returns the base folder for read tests.
  +     */
  +    public FileObject getReadTestFolder( FileSystemManager manager ) throws Exception
  +    {
           // Locate the base Zip file
  -        final String zipFilePath = getTestResource( "nested.zip" ).getAbsolutePath();
  +        final String zipFilePath = AbstractVfsTestCase.getTestResource( "nested.zip" ).getAbsolutePath();
           String uri = "zip:" + zipFilePath + "!/test.zip";
  -        final FileObject zipFile = getManager().resolveFile( uri );
  +        final FileObject zipFile = manager.resolveFile( uri );
   
           // Now build the nested file system
  -        final FileObject nestedFS = getManager().createFileSystem( "zip", zipFile );
  +        final FileObject nestedFS = manager.createFileSystem( "zip", zipFile );
           return nestedFS.resolveFile( "/basedir" );
       }
   }
  
  
  
  1.4       +28 -10    jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/zip/test/ZipFileSystemTestCase.java
  
  Index: ZipFileSystemTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/provider/zip/test/ZipFileSystemTestCase.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- ZipFileSystemTestCase.java	23 Oct 2002 11:59:39 -0000	1.3
  +++ ZipFileSystemTestCase.java	21 Nov 2002 04:25:58 -0000	1.4
  @@ -56,30 +56,48 @@
   package org.apache.commons.vfs.provider.zip.test;
   
   import java.io.File;
  +import junit.framework.Test;
  +import org.apache.commons.AbstractVfsTestCase;
  +import org.apache.commons.vfs.test.ProviderTestConfig;
  +import org.apache.commons.vfs.test.ProviderTestSuite;
  +import org.apache.commons.vfs.test.AbstractProviderTestConfig;
   import org.apache.commons.vfs.FileObject;
  +import org.apache.commons.vfs.FileSystemManager;
  +import org.apache.commons.vfs.impl.DefaultFileSystemManager;
   import org.apache.commons.vfs.provider.zip.ZipFileSystemProvider;
  -import org.apache.commons.vfs.test.AbstractReadOnlyFileSystemTestCase;
   
   /**
    * Tests for the Zip file system.
    *
    * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
    */
  -public class ZipFileSystemTestCase extends AbstractReadOnlyFileSystemTestCase
  +public class ZipFileSystemTestCase
  +    extends AbstractProviderTestConfig
  +    implements ProviderTestConfig
   {
  -    public ZipFileSystemTestCase( String name )
  +    /**
  +     * Creates the test suite for the zip file system.
  +     */
  +    public static Test suite() throws Exception
  +    {
  +        return new ProviderTestSuite( new ZipFileSystemTestCase() );
  +    }
  +
  +    /**
  +     * Prepares the file system manager.
  +     */
  +    public void prepare( final DefaultFileSystemManager manager ) throws Exception
       {
  -        super( name );
  +        manager.addProvider( "zip", new ZipFileSystemProvider() );
       }
   
       /**
  -     * Returns the URI for the base folder.
  +     * Returns the base folder for read tests.
        */
  -    protected FileObject getBaseFolder() throws Exception
  +    public FileObject getReadTestFolder( final FileSystemManager manager ) throws Exception
       {
  -        File zipFile = getTestResource( "test.zip" );
  -        String uri = "zip:" + zipFile.getAbsolutePath() + "!basedir";
  -        getManager().addProvider( "zip", new ZipFileSystemProvider() );
  -        return getManager().resolveFile( uri );
  +        final File zipFile = AbstractVfsTestCase.getTestResource( "test.zip" );
  +        final String uri = "zip:" + zipFile.getAbsolutePath() + "!basedir";
  +        return manager.resolveFile( uri );
       }
   }
  
  
  
  1.19      +26 -981   jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test/AbstractFileSystemTestCase.java
  
  Index: AbstractFileSystemTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test/AbstractFileSystemTestCase.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- AbstractFileSystemTestCase.java	20 Nov 2002 23:57:13 -0000	1.18
  +++ AbstractFileSystemTestCase.java	21 Nov 2002 04:25:58 -0000	1.19
  @@ -55,27 +55,12 @@
    */
   package org.apache.commons.vfs.test;
   
  -import java.io.ByteArrayOutputStream;
  -import java.io.IOException;
  -import java.io.InputStream;
   import java.io.File;
  -import java.net.URL;
  -import java.net.URLConnection;
  -import java.util.ArrayList;
  -import java.util.Arrays;
  -import java.util.List;
   import org.apache.commons.AbstractVfsTestCase;
  -import org.apache.commons.vfs.FileContent;
  -import org.apache.commons.vfs.FileName;
   import org.apache.commons.vfs.FileObject;
  -import org.apache.commons.vfs.FileSystem;
  -import org.apache.commons.vfs.FileSystemException;
  -import org.apache.commons.vfs.FileType;
  -import org.apache.commons.vfs.NameScope;
   import org.apache.commons.vfs.impl.DefaultFileReplicator;
   import org.apache.commons.vfs.impl.DefaultFileSystemManager;
   import org.apache.commons.vfs.impl.PrivilegedFileReplicator;
  -import org.apache.commons.vfs.impl.VFSClassLoader;
   import org.apache.commons.vfs.provider.local.DefaultLocalFileSystemProvider;
   
   /**
  @@ -88,27 +73,19 @@
    * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
    * @version $Revision$ $Date$
    */
  -public abstract class AbstractFileSystemTestCase
  +public class AbstractFileSystemTestCase
       extends AbstractVfsTestCase
   {
  -    private FileObject baseFolder;
  +    private FileObject readFolder;
  +    private FileObject writeFolder;
       private DefaultFileSystemManager manager;
  -
  -    // Contents of "file1.txt"
  -    private String charContent;
  +    private ProviderTestConfig providerConfig;
       private File tempDir;
   
  -    public AbstractFileSystemTestCase( String name )
  -    {
  -        super( name );
  -    }
  -
  -    /**
  -     * Returns the expected contents of "file1.txt".
  -     */
  -    protected String getCharContent()
  +    /** Sets the provider test config, if any. */
  +    public void setConfig( final ProviderTestConfig providerConfig )
       {
  -        return charContent;
  +        this.providerConfig = providerConfig;
       }
   
       /**
  @@ -120,59 +97,22 @@
       }
   
       /**
  -     * Returns the name of the package containing a class.
  -     *
  -     * @return The . delimited package name, or an empty string if the class
  -     *         is in the default package.
  +     * Returns the read test folder.
        */
  -    protected static String getPackageName( final Class clazz )
  +    protected FileObject getReadFolder()
       {
  -        final Package pkg = clazz.getPackage();
  -        if( null != pkg )
  -        {
  -            return pkg.getName();
  -        }
  -
  -        final String name = clazz.getName();
  -        if( -1 == name.lastIndexOf( "." ) )
  -        {
  -            return "";
  -        }
  -        else
  -        {
  -            return name.substring( 0, name.lastIndexOf( "." ) );
  -        }
  +        return readFolder;
       }
   
       /**
  -     * Builds the expected folder structure.
  +     * Returns the write test folder.
        */
  -    private FileInfo buildExpectedStructure()
  +    protected FileObject getWriteFolder()
       {
  -        // Build the expected structure
  -        final FileInfo base = new FileInfo( baseFolder.getName().getBaseName(), FileType.FOLDER );
  -        base.addChild( "file1.txt", FileType.FILE );
  -        base.addChild( "empty.txt", FileType.FILE );
  -        base.addChild( "emptydir", FileType.FOLDER );
  -
  -        final FileInfo dir = new FileInfo( "dir1", FileType.FOLDER );
  -        base.addChild( dir );
  -        dir.addChild( "file1.txt", FileType.FILE );
  -        dir.addChild( "file2.txt", FileType.FILE );
  -        dir.addChild( "file3.txt", FileType.FILE );
  -
  -        final FileInfo code = new FileInfo( "code", FileType.FOLDER );
  -        base.addChild( code );
  -        code.addChild( "ClassToLoad.class", FileType.FILE );
  -        return base;
  +        return writeFolder;
       }
   
       /**
  -     * Returns the base folder to run the tests against.
  -     */
  -    protected abstract FileObject getBaseFolder() throws Exception;
  -
  -    /**
        * Sets up the test
        */
       protected void setUp() throws Exception
  @@ -186,16 +126,22 @@
           manager.setReplicator( new PrivilegedFileReplicator( replicator ) );
           manager.setTemporaryFileStore( replicator );
   
  -        manager.init();
  +        if ( providerConfig != null )
  +        {
  +            providerConfig.prepare( manager );
  +        }
   
  -        // Locate the base folder
  -        baseFolder = getBaseFolder();
  +        manager.init();
   
  -        // Make some assumptions absout the name
  -        assertTrue( !baseFolder.getName().getPath().equals( "/" ) );
  +        if ( providerConfig != null )
  +        {
  +            // Locate the base folder
  +            readFolder = providerConfig.getReadTestFolder( manager );
  +            writeFolder = providerConfig.getWriteTestFolder( manager );
   
  -        // Build the expected content of "file1.txt"
  -        charContent = "This is a test file.";
  +            // Make some assumptions absout the name
  +            assertTrue( !readFolder.getName().getPath().equals( "/" ) );
  +        }
       }
   
       /**
  @@ -207,906 +153,5 @@
   
           // Make sure temp directory is empty or gone
           assertTrue( ( ! tempDir.exists() ) || ( tempDir.isDirectory() && tempDir.list().length == 0 ) );
  -    }
  -
  -    /**
  -     * Tests resolution of absolute URI.
  -     */
  -    public void testAbsoluteURI() throws Exception
  -    {
  -        // Try fetching base folder again by its URI
  -        final String uri = baseFolder.getName().getURI();
  -        final FileObject file = manager.resolveFile( uri );
  -
  -        assertSame( "file object", baseFolder, file );
  -    }
  -
  -    /**
  -     * Tests resolution of relative file names via the FS manager
  -     */
  -    public void testRelativeURI() throws Exception
  -    {
  -        // Build base dir
  -        manager.setBaseFile( baseFolder );
  -
  -        // Locate the base dir
  -        FileObject file = manager.resolveFile( "." );
  -        assertSame( "file object", baseFolder, file );
  -
  -        // Locate a child
  -        file = manager.resolveFile( "some-child" );
  -        assertSame( "file object", baseFolder, file.getParent() );
  -
  -        // Locate a descendent
  -        file = manager.resolveFile( "some-folder/some-file" );
  -        assertSame( "file object", baseFolder, file.getParent().getParent() );
  -
  -        // Locate parent
  -        file = manager.resolveFile( ".." );
  -        assertSame( "file object", baseFolder.getParent(), file );
  -    }
  -
  -    /**
  -     * Tests encoding of relative URI.
  -     */
  -    public void testRelativeUriEncoding() throws Exception
  -    {
  -        // Build base dir
  -        manager.setBaseFile( baseFolder );
  -        final String path = baseFolder.getName().getPath();
  -
  -        // Encode "some file"
  -        FileObject file = manager.resolveFile( "%73%6f%6d%65%20%66%69%6c%65" );
  -        assertEquals( path + "/some file", file.getName().getPath() );
  -
  -        // Encode "."
  -        file = manager.resolveFile( "%2e" );
  -        assertEquals( path, file.getName().getPath() );
  -
  -        // Encode '%'
  -        file = manager.resolveFile( "a%25" );
  -        assertEquals( path + "/a%", file.getName().getPath() );
  -
  -        // Encode /
  -        file = manager.resolveFile( "dir%2fchild" );
  -        assertEquals( path + "/dir/child", file.getName().getPath() );
  -
  -        // Encode \
  -        file = manager.resolveFile( "dir%5cchild" );
  -        assertEquals( path + "/dir/child", file.getName().getPath() );
  -
  -        // Use "%" literal
  -        try
  -        {
  -            manager.resolveFile( "%" );
  -            fail();
  -        }
  -        catch( FileSystemException e )
  -        {
  -        }
  -
  -        // Not enough digits in encoded char
  -        try
  -        {
  -            manager.resolveFile( "%5" );
  -            fail();
  -        }
  -        catch( FileSystemException e )
  -        {
  -        }
  -
  -        // Invalid digit in encoded char
  -        try
  -        {
  -            manager.resolveFile( "%q" );
  -            fail();
  -        }
  -        catch( FileSystemException e )
  -        {
  -        }
  -    }
  -
  -    /**
  -     * Tests the root file name.
  -     */
  -    public void testRootFileName() throws Exception
  -    {
  -        // Locate the root file
  -        final FileName rootName = baseFolder.getFileSystem().getRoot().getName();
  -
  -        // Test that the root path is "/"
  -        assertEquals( "root path", "/", rootName.getPath() );
  -
  -        // Test that the root basname is ""
  -        assertEquals( "root base name", "", rootName.getBaseName() );
  -
  -        // Test that the root name has no parent
  -        assertNull( "root parent", rootName.getParent() );
  -    }
  -
  -    /**
  -     * Tests child file names.
  -     */
  -    public void testChildName() throws Exception
  -    {
  -        final FileName baseName = baseFolder.getName();
  -        final String basePath = baseName.getPath();
  -        final FileName name = baseName.resolveName( "some-child", NameScope.CHILD );
  -
  -        // Test path is absolute
  -        assertTrue( "is absolute", basePath.startsWith( "/" ) );
  -
  -        // Test base name
  -        assertEquals( "base name", "some-child", name.getBaseName() );
  -
  -        // Test absolute path
  -        assertEquals( "absolute path", basePath + "/some-child", name.getPath() );
  -
  -        // Test parent path
  -        assertEquals( "parent absolute path", basePath, name.getParent().getPath() );
  -
  -        // Try using a compound name to find a child
  -        assertBadName( name, "a/b", NameScope.CHILD );
  -
  -        // Check other invalid names
  -        checkDescendentNames( name, NameScope.CHILD );
  -    }
  -
  -    /**
  -     * Name resolution tests that are common for CHILD or DESCENDENT scope.
  -     */
  -    private void checkDescendentNames( final FileName name,
  -                                       final NameScope scope )
  -        throws Exception
  -    {
  -        // Make some assumptions about the name
  -        assertTrue( !name.getPath().equals( "/" ) );
  -        assertTrue( !name.getPath().endsWith( "/a" ) );
  -        assertTrue( !name.getPath().endsWith( "/a/b" ) );
  -
  -        // Test names with the same prefix
  -        String path = name.getPath() + "/a";
  -        assertSameName( path, name, path, scope );
  -        assertSameName( path, name, "../" + name.getBaseName() + "/a", scope );
  -
  -        // Test an empty name
  -        assertBadName( name, "", scope );
  -
  -        // Test . name
  -        assertBadName( name, ".", scope );
  -        assertBadName( name, "./", scope );
  -
  -        // Test ancestor names
  -        assertBadName( name, "..", scope );
  -        assertBadName( name, "../a", scope );
  -        assertBadName( name, "../" + name.getBaseName() + "a", scope );
  -        assertBadName( name, "a/..", scope );
  -
  -        // Test absolute names
  -        assertBadName( name, "/", scope );
  -        assertBadName( name, "/a", scope );
  -        assertBadName( name, "/a/b", scope );
  -        assertBadName( name, name.getPath(), scope );
  -        assertBadName( name, name.getPath() + "a", scope );
  -    }
  -
  -    /**
  -     * Checks that a relative name resolves to the expected absolute path.
  -     * Tests both forward and back slashes.
  -     */
  -    private void assertSameName( final String expectedPath,
  -                                 final FileName baseName,
  -                                 final String relName,
  -                                 final NameScope scope )
  -        throws Exception
  -    {
  -        // Try the supplied name
  -        FileName name = baseName.resolveName( relName, scope );
  -        assertEquals( expectedPath, name.getPath() );
  -
  -        // Replace the separators
  -        relName.replace( '\\', '/' );
  -        name = baseName.resolveName( relName, scope );
  -        assertEquals( expectedPath, name.getPath() );
  -
  -        // And again
  -        relName.replace( '/', '\\' );
  -        name = baseName.resolveName( relName, scope );
  -        assertEquals( expectedPath, name.getPath() );
  -    }
  -
  -    /**
  -     * Checks that a relative name resolves to the expected absolute path.
  -     * Tests both forward and back slashes.
  -     */
  -    private void assertSameName( String expectedPath,
  -                                 FileName baseName,
  -                                 String relName ) throws Exception
  -    {
  -        assertSameName( expectedPath, baseName, relName, NameScope.FILE_SYSTEM );
  -    }
  -
  -    /**
  -     * Tests relative name resolution, relative to the base folder.
  -     */
  -    public void testNameResolution() throws Exception
  -    {
  -        final FileName baseName = baseFolder.getName();
  -        final String parentPath = baseName.getParent().getPath();
  -        final String path = baseName.getPath();
  -        final String childPath = path + "/some-child";
  -
  -        // Test empty relative path
  -        assertSameName( path, baseName, "" );
  -
  -        // Test . relative path
  -        assertSameName( path, baseName, "." );
  -
  -        // Test ./ relative path
  -        assertSameName( path, baseName, "./" );
  -
  -        // Test .// relative path
  -        assertSameName( path, baseName, ".//" );
  -
  -        // Test .///.///. relative path
  -        assertSameName( path, baseName, ".///.///." );
  -        assertSameName( path, baseName, "./\\/.\\//." );
  -
  -        // Test <elem>/.. relative path
  -        assertSameName( path, baseName, "a/.." );
  -
  -        // Test .. relative path
  -        assertSameName( parentPath, baseName, ".." );
  -
  -        // Test ../ relative path
  -        assertSameName( parentPath, baseName, "../" );
  -
  -        // Test ..//./ relative path
  -        assertSameName( parentPath, baseName, "..//./" );
  -        assertSameName( parentPath, baseName, "..//.\\" );
  -
  -        // Test <elem>/../.. relative path
  -        assertSameName( parentPath, baseName, "a/../.." );
  -
  -        // Test <elem> relative path
  -        assertSameName( childPath, baseName, "some-child" );
  -
  -        // Test ./<elem> relative path
  -        assertSameName( childPath, baseName, "./some-child" );
  -
  -        // Test ./<elem>/ relative path
  -        assertSameName( childPath, baseName, "./some-child/" );
  -
  -        // Test <elem>/././././ relative path
  -        assertSameName( childPath, baseName, "./some-child/././././" );
  -
  -        // Test <elem>/../<elem> relative path
  -        assertSameName( childPath, baseName, "a/../some-child" );
  -
  -        // Test <elem>/<elem>/../../<elem> relative path
  -        assertSameName( childPath, baseName, "a/b/../../some-child" );
  -    }
  -
  -    /**
  -     * Tests descendent name resolution.
  -     */
  -    public void testDescendentName()
  -        throws Exception
  -    {
  -        final FileName baseName = baseFolder.getName();
  -
  -        // Test direct child
  -        String path = baseName.getPath() + "/some-child";
  -        assertSameName( path, baseName, "some-child", NameScope.DESCENDENT );
  -
  -        // Test compound name
  -        path = path + "/grand-child";
  -        assertSameName( path, baseName, "some-child/grand-child", NameScope.DESCENDENT );
  -
  -        // Test relative names
  -        assertSameName( path, baseName, "./some-child/grand-child", NameScope.DESCENDENT );
  -        assertSameName( path, baseName, "./nada/../some-child/grand-child", NameScope.DESCENDENT );
  -        assertSameName( path, baseName, "some-child/./grand-child", NameScope.DESCENDENT );
  -
  -        // Test badly formed descendent names
  -        checkDescendentNames( baseName, NameScope.DESCENDENT );
  -    }
  -
  -    /**
  -     * Tests resolution of absolute names.
  -     */
  -    public void testAbsoluteNames() throws Exception
  -    {
  -        // Test against the base folder
  -        FileName name = baseFolder.getName();
  -        checkAbsoluteNames( name );
  -
  -        // Test against the root
  -        name = baseFolder.getFileSystem().getRoot().getName();
  -        checkAbsoluteNames( name );
  -
  -        // Test against some unknown file
  -        name = name.resolveName( "a/b/unknown" );
  -        checkAbsoluteNames( name );
  -    }
  -
  -    /**
  -     * Tests resolution of absolute names.
  -     */
  -    private void checkAbsoluteNames( final FileName name ) throws Exception
  -    {
  -        // Root
  -        assertSameName( "/", name, "/" );
  -        assertSameName( "/", name, "//" );
  -        assertSameName( "/", name, "/." );
  -        assertSameName( "/", name, "/some file/.." );
  -
  -        // Some absolute names
  -        assertSameName( "/a", name, "/a" );
  -        assertSameName( "/a", name, "/./a" );
  -        assertSameName( "/a", name, "/a/." );
  -        assertSameName( "/a/b", name, "/a/b" );
  -
  -        // Some bad names
  -        assertBadName( name, "/..", NameScope.FILE_SYSTEM );
  -        assertBadName( name, "/a/../..", NameScope.FILE_SYSTEM );
  -    }
  -
  -    /**
  -     * Asserts that a particular relative name is invalid for a particular
  -     * scope.
  -     */
  -    private void assertBadName( final FileName name,
  -                                final String relName,
  -                                final NameScope scope )
  -    {
  -        try
  -        {
  -            name.resolveName( relName, scope );
  -            fail( "expected failure" );
  -        }
  -        catch( FileSystemException e )
  -        {
  -            // TODO - should check error message
  -        }
  -    }
  -
  -    /**
  -     * Tests conversion from absolute to relative names.
  -     */
  -    public void testAbsoluteNameConvert() throws Exception
  -    {
  -        final FileName baseName = baseFolder.getName();
  -
  -        String path = "/test1/test2";
  -        FileName name = baseName.resolveName( path );
  -        assertEquals( path, name.getPath() );
  -
  -        // Try child and descendent names
  -        testRelName( name, "child" );
  -        testRelName( name, "child1/child2" );
  -
  -        // Try own name
  -        testRelName( name, "." );
  -
  -        // Try parent, and root
  -        testRelName( name, ".." );
  -        testRelName( name, "../.." );
  -
  -        // Try sibling and descendent of sibling
  -        testRelName( name, "../sibling" );
  -        testRelName( name, "../sibling/child" );
  -
  -        // Try siblings with similar names
  -        testRelName( name, "../test2_not" );
  -        testRelName( name, "../test2_not/child" );
  -        testRelName( name, "../test" );
  -        testRelName( name, "../test/child" );
  -
  -        // Try unrelated
  -        testRelName( name, "../../unrelated" );
  -        testRelName( name, "../../test" );
  -        testRelName( name, "../../test/child" );
  -
  -        // Test against root
  -        path = "/";
  -        name = baseName.resolveName( path );
  -        assertEquals( path, name.getPath() );
  -
  -        // Try child and descendent names (against root)
  -        testRelName( name, "child" );
  -        testRelName( name, "child1/child2" );
  -
  -        // Try own name (against root)
  -        testRelName( name, "." );
  -    }
  -
  -    /**
  -     * Checks that a file name converts to an expected relative path
  -     */
  -    private void testRelName( final FileName baseName,
  -                              final String relPath )
  -        throws Exception
  -    {
  -        final FileName expectedName = baseName.resolveName( relPath );
  -
  -        // Convert to relative path, and check
  -        final String actualRelPath = baseName.getRelativeName( expectedName );
  -        assertEquals( relPath, actualRelPath );
  -    }
  -
  -    /**
  -     * Walks the base folder structure, asserting it contains exactly the
  -     * expected files and folders.
  -     */
  -    public void testStructure() throws Exception
  -    {
  -        final FileInfo baseInfo = buildExpectedStructure();
  -        assertSameStructure( baseFolder, baseInfo );
  -    }
  -
  -    /**
  -     * Walks a folder structure, asserting it contains exactly the
  -     * expected files and folders.
  -     */
  -    protected void assertSameStructure( final FileObject folder,
  -                                        final FileInfo expected )
  -        throws Exception
  -    {
  -        // Setup the structure
  -        final List queueExpected = new ArrayList();
  -        queueExpected.add( expected );
  -
  -        final List queueActual = new ArrayList();
  -        queueActual.add( folder );
  -
  -        while( queueActual.size() > 0 )
  -        {
  -            final FileObject file = (FileObject)queueActual.remove( 0 );
  -            final FileInfo info = (FileInfo)queueExpected.remove( 0 );
  -
  -            // Check the type is correct
  -            assertSame( file.getType(), info.type );
  -
  -            if( info.type == FileType.FILE )
  -            {
  -                continue;
  -            }
  -
  -            // Check children
  -            final FileObject[] children = file.getChildren();
  -
  -            // Make sure all children were found
  -            assertNotNull( children );
  -            assertEquals( "count children of \"" + file.getName() + "\"", info.children.size(), children.length );
  -
  -            // Recursively check each child
  -            for( int i = 0; i < children.length; i++ )
  -            {
  -                final FileObject child = children[ i ];
  -                final FileInfo childInfo = (FileInfo)info.children.get( child.getName().getBaseName() );
  -
  -                // Make sure the child is expected
  -                assertNotNull( childInfo );
  -
  -                // Add to the queue of files to check
  -                queueExpected.add( childInfo );
  -                queueActual.add( child );
  -            }
  -        }
  -    }
  -
  -    /**
  -     * Tests existence determination.
  -     */
  -    public void testExists() throws Exception
  -    {
  -        // Test a file
  -        FileObject file = baseFolder.resolveFile( "file1.txt" );
  -        assertTrue( "file exists", file.exists() );
  -
  -        // Test a folder
  -        file = baseFolder.resolveFile( "dir1" );
  -        assertTrue( "folder exists", file.exists() );
  -
  -        // Test an unknown file
  -        file = baseFolder.resolveFile( "unknown-child" );
  -        assertTrue( "unknown file does not exist", !file.exists() );
  -
  -        // Test an unknown file in an unknown folder
  -        file = baseFolder.resolveFile( "unknown-folder/unknown-child" );
  -        assertTrue( "unknown file does not exist", !file.exists() );
  -    }
  -
  -    /**
  -     * Tests type determination.
  -     */
  -    public void testType() throws Exception
  -    {
  -        // Test a file
  -        FileObject file = baseFolder.resolveFile( "file1.txt" );
  -        assertSame( FileType.FILE, file.getType() );
  -
  -        // Test a folder
  -        file = baseFolder.resolveFile( "dir1" );
  -        assertSame( FileType.FOLDER, file.getType() );
  -
  -        // Test an unknown file
  -        file = baseFolder.resolveFile( "unknown-child" );
  -        try
  -        {
  -            file.getType();
  -            fail();
  -        }
  -        catch( FileSystemException e )
  -        {
  -            assertSameMessage( "vfs.provider/get-type-no-exist.error", file, e );
  -        }
  -    }
  -
  -    /**
  -     * Tests parent identity
  -     */
  -    public void testParent() throws FileSystemException
  -    {
  -        // Test when both exist
  -        FileObject folder = baseFolder.resolveFile( "dir1" );
  -        FileObject child = folder.resolveFile( "file3.txt" );
  -        assertTrue( "folder exists", folder.exists() );
  -        assertTrue( "child exists", child.exists() );
  -        assertSame( folder, child.getParent() );
  -
  -        // Test when file does not exist
  -        child = folder.resolveFile( "unknown-file" );
  -        assertTrue( "folder exists", folder.exists() );
  -        assertTrue( "child does not exist", !child.exists() );
  -        assertSame( folder, child.getParent() );
  -
  -        // Test when neither exists
  -        folder = baseFolder.resolveFile( "unknown-folder" );
  -        child = folder.resolveFile( "unknown-file" );
  -        assertTrue( "folder does not exist", !folder.exists() );
  -        assertTrue( "child does not exist", !child.exists() );
  -        assertSame( folder, child.getParent() );
  -
  -        // Test the parent of the root of the file system
  -        // TODO - refactor out test cases for layered vs originating fs
  -        final FileSystem fileSystem = baseFolder.getFileSystem();
  -        FileObject root = fileSystem.getRoot();
  -        if ( fileSystem.getParentLayer() == null )
  -        {
  -            // No parent layer, so parent should be null
  -            assertNull( "root has null parent", root.getParent() );
  -        }
  -        else
  -        {
  -            // Parent should be parent of parent layer.
  -            assertSame( fileSystem.getParentLayer().getParent(), root.getParent() );
  -        }
  -    }
  -
  -    /**
  -     * Tests that children cannot be listed for non-folders.
  -     */
  -    public void testChildren() throws FileSystemException
  -    {
  -        // Check for file
  -        FileObject file = baseFolder.resolveFile( "file1.txt" );
  -        assertSame( FileType.FILE, file.getType() );
  -        try
  -        {
  -            file.getChildren();
  -            fail();
  -        }
  -        catch( FileSystemException e )
  -        {
  -            assertSameMessage( "vfs.provider/list-children-not-folder.error", file, e );
  -        }
  -
  -        // Should be able to get child by name
  -        file = file.resolveFile( "some-child" );
  -        assertNotNull( file );
  -
  -        // Check for unknown file
  -        file = baseFolder.resolveFile( "unknown-file" );
  -        assertTrue( !file.exists() );
  -        try
  -        {
  -            file.getChildren();
  -            fail();
  -        }
  -        catch( FileSystemException e )
  -        {
  -            assertSameMessage( "vfs.provider/list-children-no-exist.error", file, e );
  -        }
  -
  -        // Should be able to get child by name
  -        FileObject child = file.resolveFile( "some-child" );
  -        assertNotNull( child );
  -    }
  -
  -    /**
  -     * Tests VFSClassLoader.
  -     */
  -    public void testVFSClassLoader() throws Exception
  -    {
  -        final FileObject[] objects = { baseFolder };
  -        VFSClassLoader loader =
  -            new VFSClassLoader( objects, manager );
  -
  -        Class testClass = loader.loadClass( "code.ClassToLoad" );
  -        assertTrue( verifyPackage( testClass.getPackage() ) );
  -
  -        Object testObject = testClass.newInstance();
  -        assertSame( "**PRIVATE**", testObject.toString() );
  -
  -        URL resource = loader.getResource( "file1.txt" );
  -        assertNotNull( resource );
  -        URLConnection urlCon = resource.openConnection();
  -        assertSameURLContent( charContent, urlCon );
  -    }
  -
  -    /**
  -     * Verify the package loaded with class loader.
  -     * If the provider supports attributes override this method.
  -     */
  -    protected boolean verifyPackage( Package pack )
  -    {
  -        return "code".equals( pack.getName() ) &&
  -               pack.getImplementationTitle() == null &&
  -               pack.getImplementationVendor() == null &&
  -               pack.getImplementationVersion() == null &&
  -               pack.getSpecificationTitle() == null &&
  -               pack.getSpecificationVendor() == null &&
  -               pack.getSpecificationVersion() == null &&
  -               !pack.isSealed();
  -    }
  -
  -    /**
  -     * Tests url.
  -     */
  -    public void testURL() throws Exception
  -    {
  -        FileObject file = baseFolder.resolveFile( "some-dir/" );
  -        URL url = file.getURL();
  -
  -        assertEquals( file.getName().getURI(), url.toExternalForm() );
  -
  -        URL parentURL = new URL( url, ".." );
  -        assertEquals( baseFolder.getURL(), parentURL );
  -
  -        URL rootURL = new URL( url, "/" );
  -        assertEquals( file.getFileSystem().getRoot().getURL(), rootURL );
  -    }
  -
  -    /**
  -     * Tests content.
  -     */
  -    public void testURLContent() throws Exception
  -    {
  -        // Test non-empty file
  -        FileObject file = baseFolder.resolveFile( "file1.txt" );
  -        URLConnection urlCon = file.getURL().openConnection();
  -        assertSameURLContent( charContent, urlCon );
  -
  -        // Test empty file
  -        file = baseFolder.resolveFile( "empty.txt" );
  -        urlCon = file.getURL().openConnection();
  -        assertSameURLContent( "", urlCon );
  -    }
  -
  -    /**
  -     * Asserts that the content of a file is the same as expected. Checks the
  -     * length reported by getContentLength() is correct, then reads the content
  -     * as a byte stream and compares the result with the expected content.
  -     * Assumes files are encoded using UTF-8.
  -     */
  -    protected void assertSameURLContent( final String expected,
  -                                         final URLConnection connection )
  -        throws Exception
  -    {
  -        // Get file content as a binary stream
  -        final byte[] expectedBin = expected.getBytes( "utf-8" );
  -
  -        // Check lengths
  -        assertEquals( "same content length", expectedBin.length, connection.getContentLength() );
  -
  -        // Read content into byte array
  -        final InputStream instr = connection.getInputStream();
  -        final ByteArrayOutputStream outstr;
  -        try
  -        {
  -            outstr = new ByteArrayOutputStream();
  -            final byte[] buffer = new byte[ 256 ];
  -            int nread = 0;
  -            while( nread >= 0 )
  -            {
  -                outstr.write( buffer, 0, nread );
  -                nread = instr.read( buffer );
  -            }
  -        }
  -        finally
  -        {
  -            instr.close();
  -        }
  -
  -        // Compare
  -        assertTrue( "same binary content", Arrays.equals( expectedBin, outstr.toByteArray() ) );
  -    }
  -
  -    /**
  -     * Tests that folders and unknown files have no content.
  -     */
  -    public void testNoURLContent() throws Exception
  -    {
  -        // Try getting the content of a folder
  -        FileObject folder = baseFolder.resolveFile( "dir1" );
  -        try
  -        {
  -            folder.getURL().openConnection().getInputStream();
  -            fail();
  -        }
  -        catch( IOException e )
  -        {
  -            assertSameMessage( "vfs.provider/read-folder.error", folder, e );
  -        }
  -
  -        // Try getting the content of an unknown file
  -        FileObject unknownFile = baseFolder.resolveFile( "unknown-file" );
  -        URLConnection connection = unknownFile.getURL().openConnection();
  -        try
  -        {
  -            connection.getInputStream();
  -            fail();
  -        }
  -        catch( IOException e )
  -        {
  -            assertSameMessage( "vfs.provider/read-no-exist.error", unknownFile, e );
  -        }
  -        assertEquals( -1, connection.getContentLength() );
  -    }
  -
  -    /**
  -     * Tests content.
  -     */
  -    public void testContent() throws Exception
  -    {
  -        // Test non-empty file
  -        FileObject file = baseFolder.resolveFile( "file1.txt" );
  -        FileContent content = file.getContent();
  -        assertSameContent( charContent, content );
  -
  -        // Test empty file
  -        file = baseFolder.resolveFile( "empty.txt" );
  -        content = file.getContent();
  -        assertSameContent( "", content );
  -    }
  -
  -    /**
  -     * Asserts that the content of a file is the same as expected. Checks the
  -     * length reported by getSize() is correct, then reads the content as
  -     * a byte stream and compares the result with the expected content.
  -     * Assumes files are encoded using UTF-8.
  -     */
  -    protected void assertSameContent( final String expected,
  -                                      final FileContent content )
  -        throws Exception
  -    {
  -        // Get file content as a binary stream
  -        final byte[] expectedBin = expected.getBytes( "utf-8" );
  -
  -        // Check lengths
  -        assertEquals( "same content length", expectedBin.length, content.getSize() );
  -
  -        // Read content into byte array
  -        final InputStream instr = content.getInputStream();
  -        final ByteArrayOutputStream outstr;
  -        try
  -        {
  -            outstr = new ByteArrayOutputStream();
  -            final byte[] buffer = new byte[ 256 ];
  -            int nread = 0;
  -            while( nread >= 0 )
  -            {
  -                outstr.write( buffer, 0, nread );
  -                nread = instr.read( buffer );
  -            }
  -        }
  -        finally
  -        {
  -            instr.close();
  -        }
  -
  -        // Compare
  -        assertTrue( "same binary content", Arrays.equals( expectedBin, outstr.toByteArray() ) );
  -    }
  -
  -    /**
  -     * Tests that folders and unknown files have no content.
  -     */
  -    public void testNoContent() throws Exception
  -    {
  -        // Try getting the content of a folder
  -        FileObject folder = baseFolder.resolveFile( "dir1" );
  -        try
  -        {
  -            folder.getContent().getInputStream();
  -            fail();
  -        }
  -        catch( FileSystemException e )
  -        {
  -            assertSameMessage( "vfs.provider/read-folder.error", folder, e );
  -        }
  -
  -        // Try getting the content of an unknown file
  -        FileObject unknownFile = baseFolder.resolveFile( "unknown-file" );
  -        FileContent content = unknownFile.getContent();
  -        try
  -        {
  -            content.getInputStream();
  -            fail();
  -        }
  -        catch( FileSystemException e )
  -        {
  -            assertSameMessage( "vfs.provider/read-no-exist.error", unknownFile, e );
  -        }
  -        try
  -        {
  -            content.getSize();
  -            fail();
  -        }
  -        catch( FileSystemException e )
  -        {
  -            assertSameMessage( "vfs.provider/get-size-no-exist.error", unknownFile, e );
  -        }
  -    }
  -
  -    /**
  -     * Tests that content and file objects are usable after being closed.
  -     */
  -    public void testReuse() throws Exception
  -    {
  -        // Get the test file
  -        FileObject file = baseFolder.resolveFile( "file1.txt" );
  -        assertEquals( FileType.FILE, file.getType() );
  -
  -        // Get the file content
  -        FileContent content = file.getContent();
  -        assertSameContent( charContent, content );
  -
  -        // Read the content again
  -        content = file.getContent();
  -        assertSameContent( charContent, content );
  -
  -        // Close the content + file
  -        content.close();
  -        file.close();
  -
  -        // Read the content again
  -        content = file.getContent();
  -        assertSameContent( charContent, content );
  -    }
  -
  -    /**
  -     * Tests that findFiles() works.
  -     */
  -    public void testFindFiles() throws Exception
  -    {
  -        final FileInfo fileInfo = buildExpectedStructure();
  -        final VerifyingFileSelector selector = new VerifyingFileSelector( fileInfo );
  -
  -        // Find the files
  -        final FileObject[] actualFiles = baseFolder.findFiles( selector );
  -
  -        // Compare actual and expected list of files
  -        final List expectedFiles = selector.finish();
  -        assertEquals( expectedFiles.size(), actualFiles.length );
  -        final int count = expectedFiles.size();
  -        for ( int i = 0; i < count; i++ )
  -        {
  -            final FileObject expected = (FileObject)expectedFiles.get( i );
  -            final FileObject actual = actualFiles[ i ];
  -            assertEquals( expected, actual );
  -        }
       }
   }
  
  
  
  1.3       +0 -4      jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test/AbstractReadOnlyFileSystemTestCase.java
  
  Index: AbstractReadOnlyFileSystemTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test/AbstractReadOnlyFileSystemTestCase.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- AbstractReadOnlyFileSystemTestCase.java	23 Oct 2002 11:59:39 -0000	1.2
  +++ AbstractReadOnlyFileSystemTestCase.java	21 Nov 2002 04:25:58 -0000	1.3
  @@ -63,8 +63,4 @@
    */
   public abstract class AbstractReadOnlyFileSystemTestCase extends AbstractFileSystemTestCase
   {
  -    public AbstractReadOnlyFileSystemTestCase( String name )
  -    {
  -        super( name );
  -    }
   }
  
  
  
  1.5       +1 -11     jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test/AbstractWritableFileSystemTestCase.java
  
  Index: AbstractWritableFileSystemTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test/AbstractWritableFileSystemTestCase.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- AbstractWritableFileSystemTestCase.java	25 Oct 2002 03:59:10 -0000	1.4
  +++ AbstractWritableFileSystemTestCase.java	21 Nov 2002 04:25:58 -0000	1.5
  @@ -72,19 +72,9 @@
    *
    * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
    */
  -public abstract class AbstractWritableFileSystemTestCase
  +public class AbstractWritableFileSystemTestCase
       extends AbstractFileSystemTestCase
   {
  -    public AbstractWritableFileSystemTestCase( String name )
  -    {
  -        super( name );
  -    }
  -
  -    /**
  -     * Returns the URI for the area to do tests in.
  -     */
  -    protected abstract FileObject getWriteFolder() throws Exception;
  -
       /**
        * Sets up a scratch folder for the test to use.
        */
  
  
  
  1.5       +1 -6      jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test/FileSystemManagerFactoryTestCase.java
  
  Index: FileSystemManagerFactoryTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test/FileSystemManagerFactoryTestCase.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- FileSystemManagerFactoryTestCase.java	23 Oct 2002 13:12:15 -0000	1.4
  +++ FileSystemManagerFactoryTestCase.java	21 Nov 2002 04:25:58 -0000	1.5
  @@ -70,11 +70,6 @@
   public class FileSystemManagerFactoryTestCase
       extends AbstractVfsTestCase
   {
  -    public FileSystemManagerFactoryTestCase( String name )
  -    {
  -        super( name );
  -    }
  -
       /**
        * Sanity test.
        */
  
  
  
  1.1                  jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test/AbstractProviderTestConfig.java
  
  Index: AbstractProviderTestConfig.java
  ===================================================================
  /* ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  package org.apache.commons.vfs.test;
  
  import org.apache.commons.vfs.impl.DefaultFileSystemManager;
  import org.apache.commons.vfs.FileObject;
  import org.apache.commons.vfs.FileSystemManager;
  
  /**
   * A partial {@link org.apache.commons.vfs.test.ProviderTestConfig} implementation.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/11/21 04:25:58 $
   */
  public abstract class AbstractProviderTestConfig
      implements ProviderTestConfig
  {
      /**
       * Prepares the file system manager.  This implementation does nothing.
       */
      public void prepare( final DefaultFileSystemManager manager )
          throws Exception
      {
      }
  
      /**
       * Returns true if the write tests should be run for this provider.
       */
      public boolean runWriteTests()
      {
          return false;
      }
  
      /**
       * Returns the base folder for write tests.  This implementation returns
       * null.
       */
      public FileObject getWriteTestFolder( final FileSystemManager manager )
          throws Exception
      {
          return null;
      }
  }
  
  
  
  1.1                  jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test/ProviderReadTests.java
  
  Index: ProviderReadTests.java
  ===================================================================
  /* ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  package org.apache.commons.vfs.test;
  
  import org.apache.commons.vfs.FileObject;
  import org.apache.commons.vfs.FileSystemException;
  import org.apache.commons.vfs.FileName;
  import org.apache.commons.vfs.NameScope;
  import org.apache.commons.vfs.FileType;
  import org.apache.commons.vfs.FileSystem;
  import org.apache.commons.vfs.FileContent;
  import org.apache.commons.vfs.impl.VFSClassLoader;
  import java.util.List;
  import java.util.ArrayList;
  import java.util.Arrays;
  import java.net.URL;
  import java.net.URLConnection;
  import java.io.InputStream;
  import java.io.ByteArrayOutputStream;
  import java.io.IOException;
  
  /**
   * Read-only test cases for file providers.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/11/21 04:25:58 $
   */
  public class ProviderReadTests
      extends AbstractFileSystemTestCase
  {
      // Contents of "file1.txt"
      private String charContent = "This is a test file.";
  
      /**
       * Tests resolution of absolute URI.
       */
      public void testAbsoluteURI() throws Exception
      {
          // Try fetching base folder again by its URI
          final String uri = getReadFolder().getName().getURI();
          final FileObject file = getManager().resolveFile( uri );
  
          assertSame( "file object", getReadFolder(), file );
      }
  
      /**
       * Tests resolution of relative file names via the FS manager
       */
      public void testRelativeURI() throws Exception
      {
          // Build base dir
          getManager().setBaseFile( getReadFolder() );
  
          // Locate the base dir
          FileObject file = getManager().resolveFile( "." );
          assertSame( "file object", getReadFolder(), file );
  
          // Locate a child
          file = getManager().resolveFile( "some-child" );
          assertSame( "file object", getReadFolder(), file.getParent() );
  
          // Locate a descendent
          file = getManager().resolveFile( "some-folder/some-file" );
          assertSame( "file object", getReadFolder(), file.getParent().getParent() );
  
          // Locate parent
          file = getManager().resolveFile( ".." );
          assertSame( "file object", getReadFolder().getParent(), file );
      }
  
      /**
       * Tests encoding of relative URI.
       */
      public void testRelativeUriEncoding() throws Exception
      {
          // Build base dir
          getManager().setBaseFile( getReadFolder() );
          final String path = getReadFolder().getName().getPath();
  
          // Encode "some file"
          FileObject file = getManager().resolveFile( "%73%6f%6d%65%20%66%69%6c%65" );
          assertEquals( path + "/some file", file.getName().getPath() );
  
          // Encode "."
          file = getManager().resolveFile( "%2e" );
          assertEquals( path, file.getName().getPath() );
  
          // Encode '%'
          file = getManager().resolveFile( "a%25" );
          assertEquals( path + "/a%", file.getName().getPath() );
  
          // Encode /
          file = getManager().resolveFile( "dir%2fchild" );
          assertEquals( path + "/dir/child", file.getName().getPath() );
  
          // Encode \
          file = getManager().resolveFile( "dir%5cchild" );
          assertEquals( path + "/dir/child", file.getName().getPath() );
  
          // Use "%" literal
          try
          {
              getManager().resolveFile( "%" );
              fail();
          }
          catch ( FileSystemException e )
          {
          }
  
          // Not enough digits in encoded char
          try
          {
              getManager().resolveFile( "%5" );
              fail();
          }
          catch ( FileSystemException e )
          {
          }
  
          // Invalid digit in encoded char
          try
          {
              getManager().resolveFile( "%q" );
              fail();
          }
          catch ( FileSystemException e )
          {
          }
      }
  
      /**
       * Tests the root file name.
       */
      public void testRootFileName() throws Exception
      {
          // Locate the root file
          final FileName rootName = getReadFolder().getFileSystem().getRoot().getName();
  
          // Test that the root path is "/"
          assertEquals( "root path", "/", rootName.getPath() );
  
          // Test that the root basname is ""
          assertEquals( "root base name", "", rootName.getBaseName() );
  
          // Test that the root name has no parent
          assertNull( "root parent", rootName.getParent() );
      }
  
      /**
       * Tests child file names.
       */
      public void testChildName() throws Exception
      {
          final FileName baseName = getReadFolder().getName();
          final String basePath = baseName.getPath();
          final FileName name = baseName.resolveName( "some-child", NameScope.CHILD );
  
          // Test path is absolute
          assertTrue( "is absolute", basePath.startsWith( "/" ) );
  
          // Test base name
          assertEquals( "base name", "some-child", name.getBaseName() );
  
          // Test absolute path
          assertEquals( "absolute path", basePath + "/some-child", name.getPath() );
  
          // Test parent path
          assertEquals( "parent absolute path", basePath, name.getParent().getPath() );
  
          // Try using a compound name to find a child
          assertBadName( name, "a/b", NameScope.CHILD );
  
          // Check other invalid names
          checkDescendentNames( name, NameScope.CHILD );
      }
  
      /**
       * Name resolution tests that are common for CHILD or DESCENDENT scope.
       */
      private void checkDescendentNames( final FileName name,
                                         final NameScope scope )
          throws Exception
      {
          // Make some assumptions about the name
          assertTrue( !name.getPath().equals( "/" ) );
          assertTrue( !name.getPath().endsWith( "/a" ) );
          assertTrue( !name.getPath().endsWith( "/a/b" ) );
  
          // Test names with the same prefix
          String path = name.getPath() + "/a";
          assertSameName( path, name, path, scope );
          assertSameName( path, name, "../" + name.getBaseName() + "/a", scope );
  
          // Test an empty name
          assertBadName( name, "", scope );
  
          // Test . name
          assertBadName( name, ".", scope );
          assertBadName( name, "./", scope );
  
          // Test ancestor names
          assertBadName( name, "..", scope );
          assertBadName( name, "../a", scope );
          assertBadName( name, "../" + name.getBaseName() + "a", scope );
          assertBadName( name, "a/..", scope );
  
          // Test absolute names
          assertBadName( name, "/", scope );
          assertBadName( name, "/a", scope );
          assertBadName( name, "/a/b", scope );
          assertBadName( name, name.getPath(), scope );
          assertBadName( name, name.getPath() + "a", scope );
      }
  
      /**
       * Checks that a relative name resolves to the expected absolute path.
       * Tests both forward and back slashes.
       */
      private void assertSameName( final String expectedPath,
                                   final FileName baseName,
                                   final String relName,
                                   final NameScope scope )
          throws Exception
      {
          // Try the supplied name
          FileName name = baseName.resolveName( relName, scope );
          assertEquals( expectedPath, name.getPath() );
  
          // Replace the separators
          relName.replace( '\\', '/' );
          name = baseName.resolveName( relName, scope );
          assertEquals( expectedPath, name.getPath() );
  
          // And again
          relName.replace( '/', '\\' );
          name = baseName.resolveName( relName, scope );
          assertEquals( expectedPath, name.getPath() );
      }
  
      /**
       * Checks that a relative name resolves to the expected absolute path.
       * Tests both forward and back slashes.
       */
      private void assertSameName( String expectedPath,
                                   FileName baseName,
                                   String relName ) throws Exception
      {
          assertSameName( expectedPath, baseName, relName, NameScope.FILE_SYSTEM );
      }
  
      /**
       * Tests relative name resolution, relative to the base folder.
       */
      public void testNameResolution() throws Exception
      {
          final FileName baseName = getReadFolder().getName();
          final String parentPath = baseName.getParent().getPath();
          final String path = baseName.getPath();
          final String childPath = path + "/some-child";
  
          // Test empty relative path
          assertSameName( path, baseName, "" );
  
          // Test . relative path
          assertSameName( path, baseName, "." );
  
          // Test ./ relative path
          assertSameName( path, baseName, "./" );
  
          // Test .// relative path
          assertSameName( path, baseName, ".//" );
  
          // Test .///.///. relative path
          assertSameName( path, baseName, ".///.///." );
          assertSameName( path, baseName, "./\\/.\\//." );
  
          // Test <elem>/.. relative path
          assertSameName( path, baseName, "a/.." );
  
          // Test .. relative path
          assertSameName( parentPath, baseName, ".." );
  
          // Test ../ relative path
          assertSameName( parentPath, baseName, "../" );
  
          // Test ..//./ relative path
          assertSameName( parentPath, baseName, "..//./" );
          assertSameName( parentPath, baseName, "..//.\\" );
  
          // Test <elem>/../.. relative path
          assertSameName( parentPath, baseName, "a/../.." );
  
          // Test <elem> relative path
          assertSameName( childPath, baseName, "some-child" );
  
          // Test ./<elem> relative path
          assertSameName( childPath, baseName, "./some-child" );
  
          // Test ./<elem>/ relative path
          assertSameName( childPath, baseName, "./some-child/" );
  
          // Test <elem>/././././ relative path
          assertSameName( childPath, baseName, "./some-child/././././" );
  
          // Test <elem>/../<elem> relative path
          assertSameName( childPath, baseName, "a/../some-child" );
  
          // Test <elem>/<elem>/../../<elem> relative path
          assertSameName( childPath, baseName, "a/b/../../some-child" );
      }
  
      /**
       * Tests descendent name resolution.
       */
      public void testDescendentName()
          throws Exception
      {
          final FileName baseName = getReadFolder().getName();
  
          // Test direct child
          String path = baseName.getPath() + "/some-child";
          assertSameName( path, baseName, "some-child", NameScope.DESCENDENT );
  
          // Test compound name
          path = path + "/grand-child";
          assertSameName( path, baseName, "some-child/grand-child", NameScope.DESCENDENT );
  
          // Test relative names
          assertSameName( path, baseName, "./some-child/grand-child", NameScope.DESCENDENT );
          assertSameName( path, baseName, "./nada/../some-child/grand-child", NameScope.DESCENDENT );
          assertSameName( path, baseName, "some-child/./grand-child", NameScope.DESCENDENT );
  
          // Test badly formed descendent names
          checkDescendentNames( baseName, NameScope.DESCENDENT );
      }
  
      /**
       * Tests resolution of absolute names.
       */
      public void testAbsoluteNames() throws Exception
      {
          // Test against the base folder
          FileName name = getReadFolder().getName();
          checkAbsoluteNames( name );
  
          // Test against the root
          name = getReadFolder().getFileSystem().getRoot().getName();
          checkAbsoluteNames( name );
  
          // Test against some unknown file
          name = name.resolveName( "a/b/unknown" );
          checkAbsoluteNames( name );
      }
  
      /**
       * Tests resolution of absolute names.
       */
      private void checkAbsoluteNames( final FileName name ) throws Exception
      {
          // Root
          assertSameName( "/", name, "/" );
          assertSameName( "/", name, "//" );
          assertSameName( "/", name, "/." );
          assertSameName( "/", name, "/some file/.." );
  
          // Some absolute names
          assertSameName( "/a", name, "/a" );
          assertSameName( "/a", name, "/./a" );
          assertSameName( "/a", name, "/a/." );
          assertSameName( "/a/b", name, "/a/b" );
  
          // Some bad names
          assertBadName( name, "/..", NameScope.FILE_SYSTEM );
          assertBadName( name, "/a/../..", NameScope.FILE_SYSTEM );
      }
  
      /**
       * Asserts that a particular relative name is invalid for a particular
       * scope.
       */
      private void assertBadName( final FileName name,
                                  final String relName,
                                  final NameScope scope )
      {
          try
          {
              name.resolveName( relName, scope );
              fail( "expected failure" );
          }
          catch ( FileSystemException e )
          {
              // TODO - should check error message
          }
      }
  
      /**
       * Tests conversion from absolute to relative names.
       */
      public void testAbsoluteNameConvert() throws Exception
      {
          final FileName baseName = getReadFolder().getName();
  
          String path = "/test1/test2";
          FileName name = baseName.resolveName( path );
          assertEquals( path, name.getPath() );
  
          // Try child and descendent names
          testRelName( name, "child" );
          testRelName( name, "child1/child2" );
  
          // Try own name
          testRelName( name, "." );
  
          // Try parent, and root
          testRelName( name, ".." );
          testRelName( name, "../.." );
  
          // Try sibling and descendent of sibling
          testRelName( name, "../sibling" );
          testRelName( name, "../sibling/child" );
  
          // Try siblings with similar names
          testRelName( name, "../test2_not" );
          testRelName( name, "../test2_not/child" );
          testRelName( name, "../test" );
          testRelName( name, "../test/child" );
  
          // Try unrelated
          testRelName( name, "../../unrelated" );
          testRelName( name, "../../test" );
          testRelName( name, "../../test/child" );
  
          // Test against root
          path = "/";
          name = baseName.resolveName( path );
          assertEquals( path, name.getPath() );
  
          // Try child and descendent names (against root)
          testRelName( name, "child" );
          testRelName( name, "child1/child2" );
  
          // Try own name (against root)
          testRelName( name, "." );
      }
  
      /**
       * Checks that a file name converts to an expected relative path
       */
      private void testRelName( final FileName baseName,
                                final String relPath )
          throws Exception
      {
          final FileName expectedName = baseName.resolveName( relPath );
  
          // Convert to relative path, and check
          final String actualRelPath = baseName.getRelativeName( expectedName );
          assertEquals( relPath, actualRelPath );
      }
  
      /**
       * Walks the base folder structure, asserting it contains exactly the
       * expected files and folders.
       */
      public void testStructure() throws Exception
      {
          final FileInfo baseInfo = buildExpectedStructure();
          assertSameStructure( getReadFolder(), baseInfo );
      }
  
      /**
       * Builds the expected folder structure.
       */
      private FileInfo buildExpectedStructure()
      {
          // Build the expected structure
          final FileInfo base = new FileInfo( getReadFolder().getName().getBaseName(), FileType.FOLDER );
          base.addChild( "file1.txt", FileType.FILE );
          base.addChild( "empty.txt", FileType.FILE );
          base.addChild( "emptydir", FileType.FOLDER );
  
          final FileInfo dir = new FileInfo( "dir1", FileType.FOLDER );
          base.addChild( dir );
          dir.addChild( "file1.txt", FileType.FILE );
          dir.addChild( "file2.txt", FileType.FILE );
          dir.addChild( "file3.txt", FileType.FILE );
  
          final FileInfo code = new FileInfo( "code", FileType.FOLDER );
          base.addChild( code );
          code.addChild( "ClassToLoad.class", FileType.FILE );
          return base;
      }
  
      /**
       * Walks a folder structure, asserting it contains exactly the
       * expected files and folders.
       */
      protected void assertSameStructure( final FileObject folder,
                                          final FileInfo expected )
          throws Exception
      {
          // Setup the structure
          final List queueExpected = new ArrayList();
          queueExpected.add( expected );
  
          final List queueActual = new ArrayList();
          queueActual.add( folder );
  
          while ( queueActual.size() > 0 )
          {
              final FileObject file = (FileObject)queueActual.remove( 0 );
              final FileInfo info = (FileInfo)queueExpected.remove( 0 );
  
              // Check the type is correct
              assertSame( file.getType(), info.type );
  
              if ( info.type == FileType.FILE )
              {
                  continue;
              }
  
              // Check children
              final FileObject[] children = file.getChildren();
  
              // Make sure all children were found
              assertNotNull( children );
              assertEquals( "count children of \"" + file.getName() + "\"", info.children.size(), children.length );
  
              // Recursively check each child
              for ( int i = 0; i < children.length; i++ )
              {
                  final FileObject child = children[ i ];
                  final FileInfo childInfo = (FileInfo)info.children.get( child.getName().getBaseName() );
  
                  // Make sure the child is expected
                  assertNotNull( childInfo );
  
                  // Add to the queue of files to check
                  queueExpected.add( childInfo );
                  queueActual.add( child );
              }
          }
      }
  
      /**
       * Tests existence determination.
       */
      public void testExists() throws Exception
      {
          // Test a file
          FileObject file = getReadFolder().resolveFile( "file1.txt" );
          assertTrue( "file exists", file.exists() );
  
          // Test a folder
          file = getReadFolder().resolveFile( "dir1" );
          assertTrue( "folder exists", file.exists() );
  
          // Test an unknown file
          file = getReadFolder().resolveFile( "unknown-child" );
          assertTrue( "unknown file does not exist", !file.exists() );
  
          // Test an unknown file in an unknown folder
          file = getReadFolder().resolveFile( "unknown-folder/unknown-child" );
          assertTrue( "unknown file does not exist", !file.exists() );
      }
  
      /**
       * Tests type determination.
       */
      public void testType() throws Exception
      {
          // Test a file
          FileObject file = getReadFolder().resolveFile( "file1.txt" );
          assertSame( FileType.FILE, file.getType() );
  
          // Test a folder
          file = getReadFolder().resolveFile( "dir1" );
          assertSame( FileType.FOLDER, file.getType() );
  
          // Test an unknown file
          file = getReadFolder().resolveFile( "unknown-child" );
          try
          {
              file.getType();
              fail();
          }
          catch ( FileSystemException e )
          {
              assertSameMessage( "vfs.provider/get-type-no-exist.error", file, e );
          }
      }
  
      /**
       * Tests parent identity
       */
      public void testParent() throws FileSystemException
      {
          // Test when both exist
          FileObject folder = getReadFolder().resolveFile( "dir1" );
          FileObject child = folder.resolveFile( "file3.txt" );
          assertTrue( "folder exists", folder.exists() );
          assertTrue( "child exists", child.exists() );
          assertSame( folder, child.getParent() );
  
          // Test when file does not exist
          child = folder.resolveFile( "unknown-file" );
          assertTrue( "folder exists", folder.exists() );
          assertTrue( "child does not exist", !child.exists() );
          assertSame( folder, child.getParent() );
  
          // Test when neither exists
          folder = getReadFolder().resolveFile( "unknown-folder" );
          child = folder.resolveFile( "unknown-file" );
          assertTrue( "folder does not exist", !folder.exists() );
          assertTrue( "child does not exist", !child.exists() );
          assertSame( folder, child.getParent() );
  
          // Test the parent of the root of the file system
          // TODO - refactor out test cases for layered vs originating fs
          final FileSystem fileSystem = getReadFolder().getFileSystem();
          FileObject root = fileSystem.getRoot();
          if ( fileSystem.getParentLayer() == null )
          {
              // No parent layer, so parent should be null
              assertNull( "root has null parent", root.getParent() );
          }
          else
          {
              // Parent should be parent of parent layer.
              assertSame( fileSystem.getParentLayer().getParent(), root.getParent() );
          }
      }
  
      /**
       * Tests that children cannot be listed for non-folders.
       */
      public void testChildren() throws FileSystemException
      {
          // Check for file
          FileObject file = getReadFolder().resolveFile( "file1.txt" );
          assertSame( FileType.FILE, file.getType() );
          try
          {
              file.getChildren();
              fail();
          }
          catch ( FileSystemException e )
          {
              assertSameMessage( "vfs.provider/list-children-not-folder.error", file, e );
          }
  
          // Should be able to get child by name
          file = file.resolveFile( "some-child" );
          assertNotNull( file );
  
          // Check for unknown file
          file = getReadFolder().resolveFile( "unknown-file" );
          assertTrue( !file.exists() );
          try
          {
              file.getChildren();
              fail();
          }
          catch ( FileSystemException e )
          {
              assertSameMessage( "vfs.provider/list-children-no-exist.error", file, e );
          }
  
          // Should be able to get child by name
          FileObject child = file.resolveFile( "some-child" );
          assertNotNull( child );
      }
  
      /**
       * Tests VFSClassLoader.
       */
      public void testVFSClassLoader() throws Exception
      {
          final FileObject[] objects = {getReadFolder()};
          VFSClassLoader loader =
              new VFSClassLoader( objects, getManager() );
  
          Class testClass = loader.loadClass( "code.ClassToLoad" );
          assertTrue( verifyPackage( testClass.getPackage() ) );
  
          Object testObject = testClass.newInstance();
          assertSame( "**PRIVATE**", testObject.toString() );
  
          URL resource = loader.getResource( "file1.txt" );
          assertNotNull( resource );
          URLConnection urlCon = resource.openConnection();
          assertSameURLContent( charContent, urlCon );
      }
  
      /**
       * Verify the package loaded with class loader.
       * If the provider supports attributes override this method.
       */
      protected boolean verifyPackage( Package pack )
      {
          return "code".equals( pack.getName() ) &&
              pack.getImplementationTitle() == null &&
              pack.getImplementationVendor() == null &&
              pack.getImplementationVersion() == null &&
              pack.getSpecificationTitle() == null &&
              pack.getSpecificationVendor() == null &&
              pack.getSpecificationVersion() == null &&
              !pack.isSealed();
      }
  
      /**
       * Tests url.
       */
      public void testURL() throws Exception
      {
          FileObject file = getReadFolder().resolveFile( "some-dir/" );
          URL url = file.getURL();
  
          assertEquals( file.getName().getURI(), url.toExternalForm() );
  
          URL parentURL = new URL( url, ".." );
          assertEquals( getReadFolder().getURL(), parentURL );
  
          URL rootURL = new URL( url, "/" );
          assertEquals( file.getFileSystem().getRoot().getURL(), rootURL );
      }
  
      /**
       * Tests content.
       */
      public void testURLContent() throws Exception
      {
          // Test non-empty file
          FileObject file = getReadFolder().resolveFile( "file1.txt" );
          URLConnection urlCon = file.getURL().openConnection();
          assertSameURLContent( charContent, urlCon );
  
          // Test empty file
          file = getReadFolder().resolveFile( "empty.txt" );
          urlCon = file.getURL().openConnection();
          assertSameURLContent( "", urlCon );
      }
  
      /**
       * Asserts that the content of a file is the same as expected. Checks the
       * length reported by getContentLength() is correct, then reads the content
       * as a byte stream and compares the result with the expected content.
       * Assumes files are encoded using UTF-8.
       */
      protected void assertSameURLContent( final String expected,
                                           final URLConnection connection )
          throws Exception
      {
          // Get file content as a binary stream
          final byte[] expectedBin = expected.getBytes( "utf-8" );
  
          // Check lengths
          assertEquals( "same content length", expectedBin.length, connection.getContentLength() );
  
          // Read content into byte array
          final InputStream instr = connection.getInputStream();
          final ByteArrayOutputStream outstr;
          try
          {
              outstr = new ByteArrayOutputStream();
              final byte[] buffer = new byte[ 256 ];
              int nread = 0;
              while ( nread >= 0 )
              {
                  outstr.write( buffer, 0, nread );
                  nread = instr.read( buffer );
              }
          }
          finally
          {
              instr.close();
          }
  
          // Compare
          assertTrue( "same binary content", Arrays.equals( expectedBin, outstr.toByteArray() ) );
      }
  
      /**
       * Tests that folders and unknown files have no content.
       */
      public void testNoURLContent() throws Exception
      {
          // Try getting the content of a folder
          FileObject folder = getReadFolder().resolveFile( "dir1" );
          try
          {
              folder.getURL().openConnection().getInputStream();
              fail();
          }
          catch ( IOException e )
          {
              assertSameMessage( "vfs.provider/read-folder.error", folder, e );
          }
  
          // Try getting the content of an unknown file
          FileObject unknownFile = getReadFolder().resolveFile( "unknown-file" );
          URLConnection connection = unknownFile.getURL().openConnection();
          try
          {
              connection.getInputStream();
              fail();
          }
          catch ( IOException e )
          {
              assertSameMessage( "vfs.provider/read-no-exist.error", unknownFile, e );
          }
          assertEquals( -1, connection.getContentLength() );
      }
  
      /**
       * Tests content.
       */
      public void testContent() throws Exception
      {
          // Test non-empty file
          FileObject file = getReadFolder().resolveFile( "file1.txt" );
          FileContent content = file.getContent();
          assertSameContent( charContent, content );
  
          // Test empty file
          file = getReadFolder().resolveFile( "empty.txt" );
          content = file.getContent();
          assertSameContent( "", content );
      }
  
      /**
       * Asserts that the content of a file is the same as expected. Checks the
       * length reported by getSize() is correct, then reads the content as
       * a byte stream and compares the result with the expected content.
       * Assumes files are encoded using UTF-8.
       */
      protected void assertSameContent( final String expected,
                                        final FileContent content )
          throws Exception
      {
          // Get file content as a binary stream
          final byte[] expectedBin = expected.getBytes( "utf-8" );
  
          // Check lengths
          assertEquals( "same content length", expectedBin.length, content.getSize() );
  
          // Read content into byte array
          final InputStream instr = content.getInputStream();
          final ByteArrayOutputStream outstr;
          try
          {
              outstr = new ByteArrayOutputStream();
              final byte[] buffer = new byte[ 256 ];
              int nread = 0;
              while ( nread >= 0 )
              {
                  outstr.write( buffer, 0, nread );
                  nread = instr.read( buffer );
              }
          }
          finally
          {
              instr.close();
          }
  
          // Compare
          assertTrue( "same binary content", Arrays.equals( expectedBin, outstr.toByteArray() ) );
      }
  
      /**
       * Tests that folders and unknown files have no content.
       */
      public void testNoContent() throws Exception
      {
          // Try getting the content of a folder
          FileObject folder = getReadFolder().resolveFile( "dir1" );
          try
          {
              folder.getContent().getInputStream();
              fail();
          }
          catch ( FileSystemException e )
          {
              assertSameMessage( "vfs.provider/read-folder.error", folder, e );
          }
  
          // Try getting the content of an unknown file
          FileObject unknownFile = getReadFolder().resolveFile( "unknown-file" );
          FileContent content = unknownFile.getContent();
          try
          {
              content.getInputStream();
              fail();
          }
          catch ( FileSystemException e )
          {
              assertSameMessage( "vfs.provider/read-no-exist.error", unknownFile, e );
          }
          try
          {
              content.getSize();
              fail();
          }
          catch ( FileSystemException e )
          {
              assertSameMessage( "vfs.provider/get-size-no-exist.error", unknownFile, e );
          }
      }
  
      /**
       * Tests that content and file objects are usable after being closed.
       */
      public void testReuse() throws Exception
      {
          // Get the test file
          FileObject file = getReadFolder().resolveFile( "file1.txt" );
          assertEquals( FileType.FILE, file.getType() );
  
          // Get the file content
          FileContent content = file.getContent();
          assertSameContent( charContent, content );
  
          // Read the content again
          content = file.getContent();
          assertSameContent( charContent, content );
  
          // Close the content + file
          content.close();
          file.close();
  
          // Read the content again
          content = file.getContent();
          assertSameContent( charContent, content );
      }
  
      /**
       * Tests that findFiles() works.
       */
      public void testFindFiles() throws Exception
      {
          final FileInfo fileInfo = buildExpectedStructure();
          final VerifyingFileSelector selector = new VerifyingFileSelector( fileInfo );
  
          // Find the files
          final FileObject[] actualFiles = getReadFolder().findFiles( selector );
  
          // Compare actual and expected list of files
          final List expectedFiles = selector.finish();
          assertEquals( expectedFiles.size(), actualFiles.length );
          final int count = expectedFiles.size();
          for ( int i = 0; i < count; i++ )
          {
              final FileObject expected = (FileObject)expectedFiles.get( i );
              final FileObject actual = actualFiles[ i ];
              assertEquals( expected, actual );
          }
      }
  }
  
  
  
  1.1                  jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test/ProviderTestConfig.java
  
  Index: ProviderTestConfig.java
  ===================================================================
  /* ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  package org.apache.commons.vfs.test;
  
  import org.apache.commons.vfs.FileObject;
  import org.apache.commons.vfs.FileSystemManager;
  import org.apache.commons.vfs.impl.DefaultFileSystemManager;
  
  /**
   * Test configuration for a file system.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/11/21 04:25:58 $
   */
  public interface ProviderTestConfig
  {
      /**
       * Prepares the file system manager.
       */
      void prepare( DefaultFileSystemManager manager ) throws Exception;
  
      /**
       * Returns the base folder for read tests.
       */
      FileObject getReadTestFolder( FileSystemManager manager ) throws Exception;
  
      /**
       * Returns true if the write tests should be run for this provider.
       */
      boolean runWriteTests();
  
      /**
       * Returns the base folder for write tests.
       */
      FileObject getWriteTestFolder( FileSystemManager manager ) throws Exception;
  }
  
  
  
  1.1                  jakarta-commons-sandbox/vfs/src/test/org/apache/commons/vfs/test/ProviderTestSuite.java
  
  Index: ProviderTestSuite.java
  ===================================================================
  /* ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  package org.apache.commons.vfs.test;
  
  import java.lang.reflect.Method;
  import java.lang.reflect.Modifier;
  import junit.framework.TestSuite;
  
  /**
   * The suite of tests for a file system.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/11/21 04:25:58 $
   */
  public class ProviderTestSuite
      extends TestSuite
  {
      private final ProviderTestConfig providerConfig;
  
      /**
       * Adds the tests for a file system to this suite.
       */
      public ProviderTestSuite( final ProviderTestConfig fsConfig ) throws Exception
      {
          providerConfig = fsConfig;
          addTestClass( ProviderReadTests.class );
          if ( providerConfig.runWriteTests() )
          {
              addTestClass( AbstractWritableFileSystemTestCase.class );
          }
      }
  
      /**
       * Adds the tests from a class to this suite.  Looks for a no-args constructor
       * which it uses to create instances of the test class.  Adds an instance
       * for each public test method provided by the class.
       */
      private void addTestClass( final Class testClass ) throws Exception
      {
          // Locate the test methods
          final Method[] methods = testClass.getMethods();
          for ( int i = 0; i < methods.length; i++ )
          {
              final Method method = methods[ i ];
              if ( ! method.getName().startsWith( "test")
                  || Modifier.isStatic( method.getModifiers() ) )
              {
                  continue;
              }
  
              // Create instance
              final AbstractFileSystemTestCase testCase = (AbstractFileSystemTestCase)testClass.newInstance();
              testCase.setConfig( providerConfig );
              testCase.setName( method.getName() );
              addTest( testCase );
          }
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>