/*
*
* 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.file;
import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.resolve.ResolveData;
import org.apache.ivy.core.resolve.ResolvedModuleRevision;
import org.apache.ivy.core.settings.IvySettings;
import org.apache.ivy.plugins.resolver.ChainResolver;
import org.apache.ivy.plugins.resolver.FileSystemResolver;
import org.jfrog.wharf.ivy.AbstractDependencyResolverTest;
import org.jfrog.wharf.ivy.IvySettingsTestHolder;
import org.junit.Before;
import org.junit.Test;
import java.util.Date;
import java.util.GregorianCalendar;
import static org.junit.Assert.*;
/**
* Test the following scenario, 3 resolvers, 2 of them are {@link FileSystemResolver} and one of them is a {@link
* ChainResolver} which contains the file system resolvers, with 3 different {@link IvySettings}. Resolve a file from
* resolver A, and check that it has downloaded, then check it from resolver B and check that it is downloaded but they
* are different (downloaded once by each resolver), then test that when invoking the chain resolver, the files are
* <b>NOT</b> being re-downloaded.
*
* @author Tomer Cohen
*/
public class WharfCacheManagerMultipleResolverTest extends AbstractDependencyResolverTest {
private FileSystemResolver resolverA;
private FileSystemResolver resolverB;
private ChainResolver chainResolver;
private ResolveData resolveDataA;
private ResolveData resolveDataB;
@Before
public void setUp() throws Exception {
super.setUp();
IvySettingsTestHolder holder1 = createNewSettings();
resolverA = new FileSystemResolver();
resolverA.setRepositoryCacheManager(holder1.cacheManager);
resolverA.setName("testA");
resolverA.setSettings(holder1.settings);
resolverA.addIvyPattern(repoTestRoot.getAbsolutePath() + FS + REL_IVY_PATTERN);
resolverA.addArtifactPattern(repoTestRoot.getAbsolutePath() +
"/1/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]");
holder1.settings.addResolver(resolverA);
resolveDataA = holder1.data;
IvySettingsTestHolder holder2 = createNewSettings();
resolverB = new FileSystemResolver();
resolverB.setRepositoryCacheManager(holder2.cacheManager);
resolverB.setName("testB");
resolverA.setSettings(holder2.settings);
resolverB.addIvyPattern(repoTestRoot.getAbsolutePath() + FS + REL_IVY_PATTERN);
resolverB.addArtifactPattern(repoTestRoot.getAbsolutePath() +
"/1/[organisation]/[module]/[type]s/[artifact]-[revision].[ext]");
holder2.settings.addResolver(resolverB);
resolveDataB = holder2.data;
chainResolver = new ChainResolver();
chainResolver.add(resolverA);
// TODO: Check if this is possible???? Chaining from separate settings???
// chainResolver.add(resolverB);
chainResolver.setSettings(holder1.settings);
holder1.settings.addResolver(chainResolver);
}
@Test
public void downloadFromResolversAndGetFromCache() throws Exception {
// Resolve from first resolver.
ModuleRevisionId mrid = ModuleRevisionId.newInstance("org1", "mod1.1", "1.0");
ResolvedModuleRevision rmrA =
resolverA.getDependency(new DefaultDependencyDescriptor(mrid, false), resolveDataA);
assertNotNull(rmrA);
Date pubdate = new GregorianCalendar(2004, 10, 1, 11, 0, 0).getTime();
assertEquals(pubdate, rmrA.getPublicationDate());
// Resolve from the second resolver.
ResolvedModuleRevision rmrB =
resolverB.getDependency(new DefaultDependencyDescriptor(mrid, false), resolveDataB);
assertNotNull(rmrB);
// make sure that the resolvers from the rmr's aren't equal (hence redownloaded).
assertFalse(rmrA.getArtifactResolver().equals(rmrB.getArtifactResolver()));
assertNotSame(rmrA, rmrB);
ResolvedModuleRevision chainDep =
chainResolver.getDependency(new DefaultDependencyDescriptor(mrid, false), resolveDataA);
// make sure that the resolver of the chain is the one that did the resolution
assertEquals(chainDep.getArtifactResolver(), resolverA);
// make sure that the dependency resources name (URL) are equal, and thus taken from the cache.
assertEquals(chainDep, rmrA);
}
}