/* * 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"); } } } }