/* * * Copyright (C) 2010 JFrog Ltd. * * Licensed 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.jfrog.wharf.ivy; import org.apache.ivy.core.module.descriptor.Artifact; import org.apache.ivy.core.module.descriptor.DefaultArtifact; import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor; import org.apache.ivy.core.module.id.ModuleRevisionId; import org.apache.ivy.core.report.DownloadReport; import org.apache.ivy.core.report.DownloadStatus; import org.apache.ivy.core.resolve.*; import org.apache.ivy.plugins.resolver.DependencyResolver; import org.apache.ivy.util.FileUtil; import org.apache.tools.ant.util.FileUtils; import org.jfrog.wharf.ivy.handler.WharfUrlHandler; import org.jfrog.wharf.ivy.resolver.FileSystemWharfResolver; import org.jfrog.wharf.ivy.resolver.IBiblioWharfResolver; import org.junit.After; import org.junit.Assert; import org.junit.Before; import java.io.File; import java.text.ParseException; import java.util.*; import static org.junit.Assert.*; public class AbstractDependencyResolverTest { protected static boolean useNio = true; public static final String SRC_TEST_REPOSITORIES = "src/test/repositories"; protected static final String FS = System.getProperty("file.separator"); protected static final String DEFAULT_IVY_PATTERN = "[organisation]/[module]/ivys/ivy-[revision].xml"; protected static final String REL_IVY_PATTERN = "1" + FS + DEFAULT_IVY_PATTERN; protected static final String DEFAULT_ARTIFACT_PATTERN = "[organisation]/[module]/[type]s/[artifact]-[revision].[type]"; protected IvySettingsTestHolder defaultSettings; List<IvySettingsTestHolder> testHolders; protected IBiblioWharfResolver createIBiblioResolver(String name, String root) { IBiblioWharfResolver resolver = new IBiblioWharfResolver(); resolver.setName(name); resolver.setRoot(root); resolver.setM2compatible(true); resolver.setSettings(defaultSettings.settings); defaultSettings.settings.addResolver(resolver); defaultSettings.settings.setDefaultResolver(name); return resolver; } protected void downloadNoDescriptor(ModuleRevisionId mrid, DependencyResolver resolver, int nbDownload) throws ParseException { DownloadReport dr = resolver.download(new Artifact[]{new DefaultArtifact(mrid, null, mrid.getModuleId().getName(), "jar", "jar")}, getDownloadOptions()); assertEquals(nbDownload, dr.getArtifactsReports(DownloadStatus.SUCCESSFUL).length); } protected void downloadSources(ModuleRevisionId mrid, DependencyResolver resolver, int nbDownload) throws ParseException { HashMap attributes = new HashMap(); attributes.put("m:classifier", "sources"); DefaultArtifact defaultArtifact = new DefaultArtifact(mrid, null, mrid.getModuleId().getName(), "jar", "jar", attributes); DownloadReport dr = resolver.download(new Artifact[]{defaultArtifact}, getDownloadOptions()); assertEquals(nbDownload, dr.getArtifactsReports(DownloadStatus.SUCCESSFUL).length); } protected void downloadAndCheck(ModuleRevisionId mrid, DependencyResolver resolver, int min, int max) throws ParseException { ResolvedModuleRevision rmr; rmr = resolver.getDependency(new DefaultDependencyDescriptor(mrid, false), defaultSettings.data); assertNotNull(rmr); DownloadReport dr = resolver.download(rmr.getDescriptor().getAllArtifacts(), getDownloadOptions()); int nbDownload = dr.getArtifactsReports(DownloadStatus.SUCCESSFUL).length; assertTrue("The number of downloads " + nbDownload + " should be at least " + min, nbDownload >= min); assertTrue("The number of downloads " + nbDownload + " should be at most " + max, nbDownload <= max); } protected void downloadAndCheck(ModuleRevisionId mrid, DependencyResolver resolver, int nbDownload) throws ParseException { downloadAndCheck(mrid, resolver, nbDownload, nbDownload); } protected FileSystemWharfResolver createFileSystemResolver(String resolverName, String repoName) { return createFileSystemResolver(resolverName, repoName, DEFAULT_IVY_PATTERN, DEFAULT_ARTIFACT_PATTERN); } protected FileSystemWharfResolver createFileSystemResolver(String resolverName, String repoName, String ivyPattern, String artifactPattern) { FileSystemWharfResolver resolver = new FileSystemWharfResolver(); resolver.setName(resolverName); resolver.setSettings(defaultSettings.settings); defaultSettings.settings.addResolver(resolver); StringBuilder builder = new StringBuilder(repoTestRoot.getAbsolutePath()); if (builder.charAt(builder.length() - 1) != '/') { builder.append('/'); } builder.append(repoName).append('/'); String rootPattern = builder.toString(); if (ivyPattern != null) { resolver.addIvyPattern(rootPattern + ivyPattern); } if (artifactPattern != null) { resolver.addArtifactPattern(rootPattern + artifactPattern); } return resolver; } protected File cacheFolder; protected File repoTestRoot; @Before public void setUp() throws Exception { // Initialize test fields testHolders = new ArrayList<IvySettingsTestHolder>(); WharfUrlHandler.tracer = null; // Find the baseDir based on where test repositories are located File baseDir = new File(".").getCanonicalFile(); repoTestRoot = new File(baseDir, SRC_TEST_REPOSITORIES); if (!repoTestRoot.exists()) { baseDir = new File(baseDir, "wharf-core"); repoTestRoot = new File(baseDir, SRC_TEST_REPOSITORIES); } assertTrue(repoTestRoot.exists()); // Create empty test cache folder cacheFolder = new File(baseDir, "build/test/cache"); deleteCacheFolder(cacheFolder); cacheFolder.mkdirs(); // Configure the ivy settings defaultSettings = new IvySettingsTestHolder(); defaultSettings.init(baseDir, cacheFolder); setupLastModified(); } protected IvySettingsTestHolder createNewSettings() { IvySettingsTestHolder holder = new IvySettingsTestHolder(); holder.init(defaultSettings.settings.getBaseDir(), cacheFolder); testHolders.add(holder); return holder; } public String getIvyPattern() { return repoTestRoot + FS + REL_IVY_PATTERN; } public static void deleteCacheFolder(File toDelete) { if (toDelete.exists()) { // First delete the symlinks then the filestore File[] files = toDelete.listFiles(); for (File file : files) { if (!"filestore".equals(file.getName())) { assertTrue("Could not delete " + file.getAbsolutePath(), deleteFile(file)); } } assertTrue("Could not delete " + toDelete.getAbsolutePath(), deleteFile(toDelete)); } } private static boolean deleteFolder(File del) { File[] files = del.listFiles(); if (files == null || files.length == 0) { return true; } for (File file : files) { if (!deleteFile(file)) { return false; } } return true; } private static boolean deleteFile(File del) { boolean result = true; if (del.isDirectory()) { result = deleteFolder(del); } else { // It may be a symlink delete and recheck FileUtils.getFileUtils().tryHardToDelete(del); result = !del.exists(); } if (!result) { Assert.fail("Could not delete " + del.getAbsolutePath()); } return result; } private void setupLastModified() { // change important last modified dates cause svn doesn't keep them long minute = 60 * 1000; long time = new GregorianCalendar().getTimeInMillis() - (4 * minute); new File(repoTestRoot, "1/org1/mod1.1/ivys/ivy-1.0.xml").setLastModified(time); time += minute; new File(repoTestRoot, "1/org1/mod1.1/ivys/ivy-1.0.1.xml").setLastModified(time); time += minute; new File(repoTestRoot, "1/org1/mod1.1/ivys/ivy-1.1.xml").setLastModified(time); time += minute; new File(repoTestRoot, "1/org1/mod1.1/ivys/ivy-2.0.xml").setLastModified(time); } @After() public void tearDown() throws Exception { // Close all for (IvySettingsTestHolder testHolder : testHolders) { testHolder.cacheManager.close(); } defaultSettings.cacheManager.close(); deleteCacheFolder(cacheFolder); } protected DownloadOptions getDownloadOptions() { return new DownloadOptions(); } protected Collection<File> getFilesInFileStore() { Collection<File> filestore = FileUtil.listAll(new File(cacheFolder, "filestore"), Collections.EMPTY_SET); Collection<File> filesInFileStore = new HashSet<File>(); for (File file : filestore) { if (file.isFile()) { filesInFileStore.add(file); } } return filesInFileStore; } }