blob: d79e4d9cc6ca118c5178e5f7d6b166252f8c620b [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
*
* 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.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import junit.framework.TestCase;
public class VfsResourceTest extends TestCase {
private VfsTestHelper helper = null;
public VfsResourceTest() {
super();
}
public VfsResourceTest(String arg0) {
super(arg0);
}
public void setUp() throws Exception {
helper = new VfsTestHelper();
}
public void tearDown() {
helper = null;
}
/**
* Validate VFSResource creation for a valid VFS URI pointing to an physically existing file
*/
public void testCreateResourceThatExists() throws Exception {
Iterator vfsURIs = helper.createVFSUriSet(VfsTestHelper.TEST_IVY_XML).iterator();
while (vfsURIs.hasNext()) {
VfsURI vfsURI = (VfsURI) vfsURIs.next();
String resId = vfsURI.toString();
VfsResource res = new VfsResource(resId, helper.fsManager);
if (res == null) {
fail("Unexpected null value on VFS URI: " + resId);
}
if (!res.exists()) {
fail("Resource does not exist and it should: " + resId);
}
// VFS apparently does some weird normalization so that resource id used to create
// the VFS resource is not necessarily identical to the id returned from the getName
// method <sigh>. We try to work around this by transforming things into java URIs.
if (!new URI(escapeUrl(resId)).equals(new URI(escapeUrl(res.getName())).normalize())) {
fail("Failed on getName. Expected: " + resId + ". Actual: " + res.getName());
}
if (res.getLastModified() == 0) {
fail("Expected non-null file modification date for URI: " + resId);
}
if (res.getContentLength() == 0) {
fail("Expected non-zero file length for URI: " + resId);
}
if (!res.physicallyExists()) {
fail("Physical existence check returned false for existing resource: " + resId);
}
}
}
/**
* Escape invalid URL characters (Copied from Wicket, just use StringUtils instead of Strings)
*
* @param queryString
* The orginal querystring
* @return url The querystring with invalid characters escaped
*/
private String escapeUrl(String queryString) {
queryString = StringUtils.replace(queryString, " ", "%20");
queryString = StringUtils.replace(queryString, "\"", "%22");
queryString = StringUtils.replace(queryString, "%", "%26");
queryString = StringUtils.replace(queryString, "=", "%3D");
queryString = StringUtils.replace(queryString, "/", "%2F");
queryString = StringUtils.replace(queryString, "+", "%2B");
queryString = StringUtils.replace(queryString, "&", "%26");
queryString = StringUtils.replace(queryString, "~", "%7E");
queryString = StringUtils.replace(queryString, "?", "%3F");
return queryString;
}
/**
* Validating that resource can be created for files which don't physically exists - e.g.
* resources that are going to created.
*/
public void testCreateResourceThatDoesntExist() throws Exception {
Iterator vfsURIs = helper.createVFSUriSet("zzyyxx.zzyyxx").iterator();
while (vfsURIs.hasNext()) {
VfsURI vfsURI = (VfsURI) vfsURIs.next();
String resId = vfsURI.toString();
VfsResource res = new VfsResource(resId, helper.fsManager);
if (res == null) {
fail("Unexpected null value on VFS URI: " + resId);
}
if (res.exists()) {
fail("Resource does not exist and it shouldn't: " + resId);
}
// VFS apparently does some weird normalization so that resource id used to create
// the VFS resource is not necessarily identical to the id returned from the getName
// method <sigh>. We try to work around this by transforming things into java URIs.
if (!new URI(escapeUrl(resId)).equals(new URI(escapeUrl(res.getName())).normalize())) {
fail("Failed on getName. Expected: " + resId + ". Actual: " + res.getName());
}
if (res.getLastModified() != 0) {
fail("Expected null file modification date for URI: " + resId + ": "
+ res.getLastModified());
}
if (res.getContentLength() != 0) {
fail("Expected non-zero file length for URI: " + resId);
}
if (res.physicallyExists()) {
fail("Physical existence check returned true for non-existent resource: " + resId);
}
}
}
/**
* Validate VFSResource creation when given a poorly formed VFS identifier
*/
public void testBadURI() throws Exception {
String vfsURI = "smb1:/goobeldygook";
VfsResource res = new VfsResource(vfsURI, helper.fsManager);
if (res == null) {
fail("Unexpected null value on VFS URI: " + vfsURI);
}
if (res.exists()) {
fail("Resource is marked as existing and it should not: " + vfsURI);
}
if (!res.getName().equals("smb1:/goobeldygook")) {
fail("Failed on getName. Expected: " + vfsURI + ". Actual: " + res.getName());
}
if (res.getLastModified() != 0) {
fail("Expected null file modification date for URI: " + vfsURI + ": "
+ res.getLastModified());
}
if (res.getContentLength() != 0) {
fail("Expected zero file length for URI: " + vfsURI);
}
if (res.physicallyExists()) {
fail("Physical existence check returned false for existing resource: " + vfsURI);
}
}
/**
* Validate getChildren when given a VFS URI for a directory
*/
public void testListFolderChildren() throws Exception {
final String testFolder = "2/mod10.1";
final List expectedFiles = Arrays.asList(new String[] {"ivy-1.0.xml", "ivy-1.1.xml",
"ivy-1.2.xml", "ivy-1.3.xml"});
Iterator baseVfsURIs = helper.createVFSUriSet(testFolder).iterator();
while (baseVfsURIs.hasNext()) {
VfsURI baseVfsURI = (VfsURI) baseVfsURIs.next();
List expected = new ArrayList();
for (int i = 0; i < expectedFiles.size(); i++) {
String resId = baseVfsURI.toString() + "/" + expectedFiles.get(i);
expected.add(resId);
}
List actual = new ArrayList();
VfsResource res = new VfsResource(baseVfsURI.toString(), helper.fsManager);
Iterator children = res.getChildren().iterator();
while (children.hasNext()) {
String resId = (String) children.next();
// remove entries ending in .svn
if (!resId.endsWith(".svn")) {
actual.add(resId);
}
}
Collections.sort(actual);
Collections.sort(expected);
if (!actual.equals(expected)) {
fail("\nExpected: " + expected.toString() + "\n.Actual: " + actual.toString());
}
}
}
/**
* Validate that we don't get any results when we query a VFSResource file object for its
* children
*/
public void testListFileChildren() throws Exception {
Iterator testSet = helper.createVFSUriSet(VfsTestHelper.TEST_IVY_XML).iterator();
while (testSet.hasNext()) {
VfsURI vfsURI = (VfsURI) testSet.next();
VfsResource res = new VfsResource(vfsURI.toString(), helper.fsManager);
List results = res.getChildren();
if (results.size() > 0) {
fail("getChildren query on file provided results when it shouldn't have");
}
}
}
/**
* Validate that we don't get any results if we ask an IMAGINARY VFSResource - a nonexistent
* file - for a list of its children
*/
public void testListImaginary() throws Exception {
Iterator testSet = helper.createVFSUriSet("idontexistzzxx").iterator();
while (testSet.hasNext()) {
VfsURI vfsURI = (VfsURI) testSet.next();
VfsResource res = new VfsResource(vfsURI.toString(), helper.fsManager);
List results = res.getChildren();
if (results.size() > 0) {
fail("getChildren query on file provided results when it shouldn't have");
}
}
}
}