blob: 273d273550a8c2f2a0a3873874bed1850db0f299 [file] [log] [blame]
/*
* 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
*
* https://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 org.apache.ivy.util.FileUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
/**
* 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:
* <ul>
* <li>the VFS test suite uses the build/test/repositories area;
* when setting samba, sftp, etc. the corresponding user needs both read and write privileges.</li>
* <li>the tests assume that the user and password is the same for all services.</li>
* <li>a limited amount of configuration is available by setting the following properties in the
* <code>ivy.properties</code> file:</li>
* </ul>
* <pre>
* vfs.host
* vfs.username
* vfs.password
* vfs.samba_share
* </pre>
* Running the test requires that commons-io and ant jars are on the classpath. Also, I would
* recommend that at some time the tests be converted from straight junit to something which better
* 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.
* <p>Stephen Nesbitt</p>
*/
public class VfsRepositoryTest {
private VfsRepository repo = null;
private VfsTestHelper helper = null;
private File scratchDir = null;
@Before
public void setUp() throws Exception {
helper = new VfsTestHelper();
repo = new VfsRepository();
scratchDir = new File(FileUtil.concat(VfsTestHelper.TEST_REPO_DIR,
VfsTestHelper.SCRATCH_DIR));
scratchDir.mkdir();
}
@After
public void 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 if something goes wrong
*/
@Test
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);
for (VfsURI vfsURI : helper.createVFSUriSet(destResource)) {
if (scratchDir.exists()) {
FileUtil.forceDelete(scratchDir);
}
repo.put(new File(srcFile), vfsURI.toString(), false);
assertTrue("Put didn't happen. Src VfsURI: " + vfsURI.toString()
+ ".\nExpected file: " + destFile, new File(srcFile).exists());
}
}
/**
* Validate that we can overwrite an existing file
*
* @throws Exception if something goes wrong
*/
@Test
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));
for (VfsURI vfsURI : helper.createVFSUriSet(destResource)) {
// 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();
repo.put(new File(srcFile), vfsURI.toString(), true);
assertTrue("Put didn't happen. Src VfsURI: " + vfsURI.toString()
+ ".\nExpected file: " + destFile, new File(srcFile).exists());
assertNotEquals("Zero file size indicates file not overwritten", 0,
destFile.length());
}
}
/**
* Validate that we put will respect a request not to overwrite an existing file
*
* @throws Exception if something goes wrong
*/
@Test(expected = IOException.class)
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();
for (VfsURI vfsURI : helper.createVFSUriSet(destResource)) {
repo.put(new File(srcFile), vfsURI.toString(), false);
}
}
/**
* Test the retrieval of an artifact from the repository creating a new artifact
*
* @throws Exception if something goes wrong
*/
@Test
public void testGetNoExisting() throws Exception {
String testResource = VfsTestHelper.TEST_IVY_XML;
String testFile = FileUtil.concat(scratchDir.getAbsolutePath(), testResource);
for (VfsURI vfsURI : helper.createVFSUriSet(testResource)) {
if (scratchDir.exists()) {
FileUtil.forceDelete(scratchDir);
}
repo.get(vfsURI.toString(), new File(testFile));
assertTrue("Expected file: " + testFile + "not found. Failed vfsURI: "
+ vfsURI.toString(), new File(testFile).exists());
}
}
/**
* Test the retrieval of an artifact from the repository overwriting an existing artifact
*
* @throws Exception if something goes wrong
*/
@Test
public void testGetOverwriteExisting() throws Exception {
String testResource = VfsTestHelper.TEST_IVY_XML;
File testFile = new File(FileUtil.concat(scratchDir.getAbsolutePath(), testResource));
for (VfsURI vfsURI : helper.createVFSUriSet(testResource)) {
// setup - remove existing scratch area and populate with a file to override
if (scratchDir.exists()) {
FileUtil.forceDelete(scratchDir);
}
testFile.getParentFile().mkdirs();
testFile.createNewFile();
repo.get(vfsURI.toString(), testFile);
assertTrue("Expected file: " + testFile + "not found. Failed vfsURI: "
+ vfsURI.toString(), testFile.exists());
assertNotEquals("Zero file size indicates file not overwritten", 0,
testFile.length());
}
}
/**
* Validate that we get a non null Resource instance when passed a well-formed VfsURI pointing
* to an existing file
*
* @throws Exception if something goes wrong
*/
@Test
public void testGetResourceValidExist() throws Exception {
String testResource = VfsTestHelper.TEST_IVY_XML;
for (VfsURI vfsURI : helper.createVFSUriSet(testResource)) {
assertNotNull(repo.getResource(vfsURI.toString()));
}
}
/**
* Validate that we get a non null Resource instance when passed a well-formed VfsURI pointing
* to a non-existent file.
*
* @throws Exception if something goes wrong
*/
@Test
public void testGetResourceValidNoExist() throws Exception {
String testResource = VfsTestHelper.SCRATCH_DIR + "/nosuchfile.jar";
for (VfsURI vfsURI : helper.createVFSUriSet(testResource)) {
// make sure the declared resource does not exist
if (scratchDir.exists()) {
FileUtil.forceDelete(scratchDir);
}
assertNotNull(repo.getResource(vfsURI.toString()));
}
}
}