blob: c90815cf7c9551e33deacf95e7d8807831c9eb18 [file]
/*
*
* Derby - Class org.apache.derbyTesting.junit.SupportFilesSetup
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the License.
*/
package org.apache.derbyTesting.junit;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import junit.extensions.TestSetup;
import junit.framework.Test;
import org.apache.derbyTesting.functionTests.util.PrivilegedFileOpsForTests;
/**
* A decorator that copies test resources from the classpath
* into the file system at setUp time. Resources are named
* relative to org/apache/derbyTesting/, e.g. the name
* passed into the constructor should be something like
* funtionTests/test/lang/mytest.sql
* <BR>
* Read only resources are placed into ${user.dir}/extin/name
* Read-write resources are placed into ${user.dir}/extinout/name
* write only output files can be created in ${user.dir}/extout
*
* These locations map to entries in the test policy file that
* have restricted permissions granted.
*
* All the three folders are created even if no files are
* copied into them.
*
* In each case the name of a file is the base name of the resource,
* no package structure is retained.
*
* A test may access such a resource using either files or URLs.
* The static utility methods must be used to obtain the location
* of any resource. In the future this decorator may create sub-folders
* to ensure that tests run in paralled do not interfere with each other.
*
* tearDown removes the three folders and their contents.
*
*/
public class SupportFilesSetup extends TestSetup {
public static final String EXTIN = "extin";
public static final String EXTINOUT = "extinout";
public static final String EXTOUT = "extout";
private String[] readOnly;
private String[] readWrite;
private String[] readOnlyTargetFileNames;
private String[] readWriteTargetFileNames;
/**
* Create all the folders but don't copy any resources.
*/
public SupportFilesSetup(Test test)
{
this(test, (String[]) null, (String[]) null);
}
/**
* Create all the folders and copy a set of resources into
* the read only folder.
*/
public SupportFilesSetup(Test test, String[] readOnly)
{
this(test, readOnly, (String[]) null, (String[]) null, (String[]) null);
}
/**
* Create all the folders, copy a set of resources into
* the read only folder and copy a set of resources into
* the read write folder.
*/
public SupportFilesSetup(Test test, String[] readOnly, String[] readWrite)
{
this(test, readOnly, readWrite, (String[]) null, (String[]) null);
}
/**
* Create all the folders, copy a set of resources into
* the read only folder and copy a set of resources into
* the read write folder. If specified, use the specific target file
* supplied by the caller.
*/
public SupportFilesSetup
(Test test, String[] readOnly, String[] readWrite, String[] readOnlyTargetFileNames, String[] readWriteTargetFileNames)
{
super(test);
this.readOnly = readOnly;
this.readWrite = readWrite;
this.readOnlyTargetFileNames = readOnlyTargetFileNames;
this.readWriteTargetFileNames = readWriteTargetFileNames;
}
protected void setUp() throws PrivilegedActionException, IOException
{
privCopyFiles(EXTIN, readOnly, readOnlyTargetFileNames);
privCopyFiles(EXTINOUT, readWrite, readWriteTargetFileNames);
privCopyFiles(EXTOUT, (String[]) null, (String[]) null);
}
protected void tearDown()
{
DropDatabaseSetup.removeDirectory(EXTIN);
DropDatabaseSetup.removeDirectory(EXTINOUT);
DropDatabaseSetup.removeDirectory(EXTOUT);
}
public static void privCopyFiles(final String dirName, final String[] resources, final String[] targetNames)
throws PrivilegedActionException
{
AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
public Void run() throws IOException, PrivilegedActionException {
copyFiles(dirName, resources, targetNames);
return null;
}
});
}
private static void copyFiles(String dirName, String[] resources, String[] targetNames)
throws PrivilegedActionException, IOException
{
File dir = new File(dirName);
dir.mkdir();
if (resources == null)
return;
for (int i = 0; i < resources.length; i++)
{
String name =
"org/apache/derbyTesting/".concat(resources[i]);
String baseName;
if ( targetNames == null )
{
// by default, just the same file name as the source file
baseName = name.substring(name.lastIndexOf('/') + 1);
}
else
{
// we let the caller override the target file name
baseName = targetNames[ i ];
}
URL url = BaseTestCase.getTestResource(name);
assertNotNull(name, url);
InputStream in = BaseTestCase.openTestResource(url);
File copy = new File(dir, baseName);
copy.delete();
OutputStream out = new FileOutputStream(copy);
byte[] buf = new byte[32*1024];
for (;;) {
int read = in.read(buf);
if (read == -1)
break;
out.write(buf, 0, read);
}
in.close();
out.flush();
out.close();
}
}
/**
* Obtain the URL to the local copy of a read-only resource.
* @param name Base name for the resouce.
*/
public static URL getReadOnlyURL(String name) throws MalformedURLException
{
return getURL(getReadOnly(name));
}
/**
* Obtain the URL to the local copy of a read-write resource.
* @param name Base name for the resouce.
*/
public static URL getReadWriteURL(String name) throws MalformedURLException
{
return getURL(getReadWrite(name));
}
/**
* Obtain the URL to the local copy of a write-only resource.
* @param name Base name for the resouce.
*/
public static URL getWriteOnlyURL(String name) throws MalformedURLException
{
return getURL(getWriteOnly(name));
}
/**
* Obtain a File for the local copy of a read-only resource.
* @param name Base name for the resouce.
*/
public static File getReadOnly(String name)
{
return getFile(EXTIN, name);
}
/**
* Get the full name of the file.
* @param name Base name for the resource.
*/
public static String getReadOnlyFileName(final String name)
{
return AccessController.doPrivileged(
new PrivilegedAction<String>() {
public String run() {
return getReadOnly(name).getAbsolutePath();
}
});
}
/**
* Get the full name of the file.
* @param name short name of file
* @return absolute path of file in EXTINOUT
*/
public static String getReadWriteFileName(final String name)
{
return AccessController.doPrivileged(
new PrivilegedAction<String>() {
public String run() {
return getReadWrite(name).getAbsolutePath();
}
});
}
/**
* Obtain a File for the local copy of a read-write resource.
* @param name Base name for the resource.
*/
public static File getReadWrite(String name)
{
return getFile(EXTINOUT, name);
}
/**
* Obtain a File for the local copy of a write-only resource.
* @param name Base name for the resouce.
*/
public static File getWriteOnly(String name)
{
return getFile(EXTOUT, name);
}
private static File getFile(String dirName, String name)
{
File dir = new File(dirName);
return new File(dir, name);
}
private static URL getURL(final File file) throws MalformedURLException
{
try {
return AccessController.doPrivileged(
new PrivilegedExceptionAction<URL>() {
public URL run() throws MalformedURLException {
return file.toURI().toURL();
}
});
} catch (PrivilegedActionException e) {
throw (MalformedURLException) e.getException();
}
}
public static void deleteFile(final String fileName)
{
deleteFile( new File(fileName) );
}
public static void deleteFile(final File file )
{
if (PrivilegedFileOpsForTests.exists(file)) {
assertTrue(PrivilegedFileOpsForTests.delete(file));
}
}
}