/*
* 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.ivy.plugins.repository.vfs;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import org.apache.ivy.util.FileUtil;
import junit.framework.TestCase;
/**
* Testing Testing was the single biggest hurdle I faced. I have tried to provide a complete test
* suite that covers all protocols and which can be easily extended. It does differ - somewhat - in
* structure from the resolver/repository test suites. Setting up smb, ftp, sftp will undoubtedly be
* your biggest headache (it was mine). Here are a few notes about the setup: - the VFS test suite
* uses the build/test/repositories area - when setting samba, sftp, etc. the corresponding user
* needs both read and write privileges. - the tests assume that the user and password is the same
* for all services. - a limited amount of configuration is available by setting the following
* properties in the ivy.properties file: * vfs.host * vfs.username * vfs.password * vfs.samba_share
* Running the test requires that commons-io and ant.jar are on the classpath. Also, I would
* recommend that at some time the tests be converted from straight junit to something which betters
* supports functional testing. Although somewhat crude I am using jsystem
* (http://jsystemtest.sourceforge.net/) in other projects and am finding it a much better solution
* than straight junit. Stephen Nesbitt
*/
public class VfsRepositoryTest extends TestCase {
private VfsRepository repo = null;
private VfsTestHelper helper = null;
private File scratchDir = null;
public VfsRepositoryTest(String arg0) throws Exception {
super(arg0);
}
protected void setUp() throws Exception {
super.setUp();
helper = new VfsTestHelper();
repo = new VfsRepository();
scratchDir = new File(FileUtil.concat(VfsTestHelper.TEST_REPO_DIR,
VfsTestHelper.SCRATCH_DIR));
scratchDir.mkdir();
}
protected void tearDown() throws Exception {
super.tearDown();
repo = null;
if (scratchDir.exists()) {
FileUtil.forceDelete(scratchDir);
}
}
/**
* Basic validation of happy path put - valid VFS URI and no conflict with existing file
*
* @throws Exception
*/
public void testPutValid() throws Exception {
String testResource = VfsTestHelper.TEST_IVY_XML;
String srcFile = FileUtil.concat(VfsTestHelper.TEST_REPO_DIR, testResource);
String destResource = VfsTestHelper.SCRATCH_DIR + "/" + testResource;
String destFile = FileUtil.concat(VfsTestHelper.TEST_REPO_DIR, destResource);
Iterator vfsURIs = helper.createVFSUriSet(destResource).iterator();
while (vfsURIs.hasNext()) {
VfsURI vfsURI = (VfsURI) vfsURIs.next();
if (scratchDir.exists()) {
FileUtil.forceDelete(scratchDir);
}
try {
repo.put(new File(srcFile), vfsURI.toString(), false);
if (!new File(srcFile).exists()) {
fail("Put didn't happen. Src VfsURI: " + vfsURI.toString()
+ ".\nExpected file: " + destFile);
}
} catch (IOException e) {
fail("Caught unexpected IOException on Vfs URI: " + vfsURI.toString() + "\n"
+ e.getLocalizedMessage());
}
}
}
/**
* Validate that we can overwrite an existing file
*
* @throws Exception
*/
public void testPutOverwriteTrue() throws Exception {
String testResource = VfsTestHelper.TEST_IVY_XML;
String srcFile = FileUtil.concat(VfsTestHelper.TEST_REPO_DIR, testResource);
String destResource = VfsTestHelper.SCRATCH_DIR + "/" + testResource;
File destFile = new File(FileUtil.concat(VfsTestHelper.TEST_REPO_DIR, destResource));
Iterator vfsURIs = helper.createVFSUriSet(destResource).iterator();
while (vfsURIs.hasNext()) {
VfsURI vfsURI = (VfsURI) vfsURIs.next();
// remove existing scratch dir and populate it with an empty file
// that we can overwrite. We do this so that we can test file sizes.
// seeded file has length 0, while put file will have a length > 0
if (scratchDir.exists()) {
FileUtil.forceDelete(scratchDir);
}
destFile.getParentFile().mkdirs();
destFile.createNewFile();
try {
repo.put(new File(srcFile), vfsURI.toString(), true);
if (!new File(srcFile).exists()) {
fail("Put didn't happen. Src VfsURI: " + vfsURI.toString()
+ ".\nExpected file: " + destFile);
}
if (destFile.length() == 0) {
fail("Zero file size indicates file not overwritten");
}
} catch (IOException e) {
fail("Caught unexpected IOException on Vfs URI: " + vfsURI.toString() + "\n"
+ e.getLocalizedMessage());
}
}
}
/**
* Validate that we put will respect a request not to overwrite an existing file
*
* @throws Exception
*/
public void testPutOverwriteFalse() throws Exception {
String testResource = VfsTestHelper.TEST_IVY_XML;
String srcFile = FileUtil.concat(VfsTestHelper.TEST_REPO_DIR, testResource);
String destResource = VfsTestHelper.SCRATCH_DIR + "/" + testResource;
File destFile = new File(FileUtil.concat(VfsTestHelper.TEST_REPO_DIR, destResource));
destFile.getParentFile().mkdirs();
destFile.createNewFile();
Iterator vfsURIs = helper.createVFSUriSet(destResource).iterator();
while (vfsURIs.hasNext()) {
VfsURI vfsURI = (VfsURI) vfsURIs.next();
try {
repo.put(new File(srcFile), vfsURI.toString(), false);
fail("Did not throw expected IOException from attempted overwrite of existing file");
} catch (IOException e) {
}
}
}
/**
* Test the retrieval of an artifact from the repository creating a new artifact
*
* @throws Exception
*/
public void testGetNoExisting() throws Exception {
String testResource = VfsTestHelper.TEST_IVY_XML;
String testFile = FileUtil.concat(scratchDir.getAbsolutePath(), testResource);
Iterator vfsURIs = helper.createVFSUriSet(testResource).iterator();
while (vfsURIs.hasNext()) {
VfsURI vfsURI = (VfsURI) vfsURIs.next();
if (scratchDir.exists()) {
FileUtil.forceDelete(scratchDir);
}
try {
repo.get(vfsURI.toString(), new File(testFile));
if (!new File(testFile).exists()) {
fail("Expected file: " + testFile + "not found. Failed vfsURI: "
+ vfsURI.toString());
}
} catch (IOException e) {
fail("Caught unexpected IOException on Vfs URI: " + vfsURI.toString() + "\n"
+ e.getLocalizedMessage());
}
}
}
/**
* Test the retrieval of an artifact from the repository overwriting an existing artifact
*
* @throws Exception
*/
public void testGetOverwriteExisting() throws Exception {
String testResource = VfsTestHelper.TEST_IVY_XML;
File testFile = new File(FileUtil.concat(scratchDir.getAbsolutePath(), testResource));
Iterator vfsURIs = helper.createVFSUriSet(testResource).iterator();
while (vfsURIs.hasNext()) {
VfsURI vfsURI = (VfsURI) vfsURIs.next();
// setup - remove existing scratch area and populate with a file to override
if (scratchDir.exists()) {
FileUtil.forceDelete(scratchDir);
}
testFile.getParentFile().mkdirs();
testFile.createNewFile();
try {
repo.get(vfsURI.toString(), testFile);
if (!testFile.exists()) {
fail("Expected file: " + testFile + "not found. Failed vfsURI: "
+ vfsURI.toString());
}
if (testFile.length() == 0) {
fail("Zero file size indicates file not overwritten");
}
} catch (IOException e) {
fail("Caught unexpected IOException on Vfs URI: " + vfsURI.toString() + "\n"
+ e.getLocalizedMessage());
}
}
}
/**
* Validate that we get a non null Resource instance when passed a well-formed VfsURI pointing
* to an existing file
*/
public void testGetResourceValidExist() throws Exception {
String testResource = VfsTestHelper.TEST_IVY_XML;
Iterator vfsURIs = helper.createVFSUriSet(testResource).iterator();
while (vfsURIs.hasNext()) {
VfsURI vfsURI = (VfsURI) vfsURIs.next();
try {
assertNotNull(repo.getResource(vfsURI.toString()));
} catch (IOException e) {
fail("Unexpected IOError on fetch of valid resource");
e.printStackTrace();
}
}
}
/**
* Validate that we get a non null Resource instance when passed a well-formed VfsURI pointing
* to a non-existent file.
*/
public void testGetResourceValidNoExist() throws Exception {
String testResource = VfsTestHelper.SCRATCH_DIR + "/nosuchfile.jar";
Iterator vfsURIs = helper.createVFSUriSet(testResource).iterator();
while (vfsURIs.hasNext()) {
VfsURI vfsURI = (VfsURI) vfsURIs.next();
// make sure the declared resource does not exist
if (scratchDir.exists()) {
FileUtil.forceDelete(scratchDir);
}
try {
assertNotNull(repo.getResource(vfsURI.toString()));
} catch (IOException e) {
// this should not happen
fail("Unexpected IOException");
}
}
}
}