/* * 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.core.publish; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.util.Arrays; import org.apache.ivy.core.event.EventManager; import org.apache.ivy.core.module.descriptor.Artifact; import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor; import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor; import org.apache.ivy.core.module.id.ModuleRevisionId; import org.apache.ivy.core.resolve.ResolveData; import org.apache.ivy.core.resolve.ResolveEngine; import org.apache.ivy.core.resolve.ResolveOptions; import org.apache.ivy.core.resolve.ResolvedModuleRevision; import org.apache.ivy.core.settings.IvySettings; import org.apache.ivy.core.sort.SortEngine; import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorWriter; import org.apache.ivy.plugins.resolver.FileSystemResolver; import org.apache.ivy.util.FileUtil; import junit.framework.TestCase; public class PublishEngineTest extends TestCase { protected void setUp() throws Exception { System.setProperty("ivy.cache.dir", new File("build/test/publish/cache").getAbsolutePath()); FileUtil.forceDelete(new File("build/test/publish")); } protected void tearDown() throws Exception { FileUtil.forceDelete(new File("build/test/publish")); } public void testAtomicity() throws Exception { IvySettings settings = new IvySettings(); final PublishEngine engine = new PublishEngine(settings, new EventManager()); final int[] counter = new int[] {0}; final DefaultModuleDescriptor md = DefaultModuleDescriptor .newDefaultInstance(ModuleRevisionId.parse("#A;1.0")); final FileSystemResolver resolver = new FileSystemResolver() { public void publish(Artifact artifact, File src, boolean overwrite) throws IOException { super.publish(artifact, src, overwrite); synchronized (PublishEngineTest.this) { counter[0]++; } sleepSilently(50); synchronized (PublishEngineTest.this) { counter[0]++; } } }; resolver.setName("test"); resolver.setSettings(settings); String publishRepoDir = new File("build/test/publish/repo").getAbsolutePath(); resolver.addIvyPattern(publishRepoDir + "/[module]/[revision]/[artifact].[ext]"); resolver.addArtifactPattern(publishRepoDir + "/[module]/[revision]/[artifact].[ext]"); FileUtil.copy(new File("test/repositories/1/org1/mod1.1/jars/mod1.1-1.0.jar"), new File( "build/test/publish/module/A.jar"), null); XmlModuleDescriptorWriter.write(md, new File("build/test/publish/module/ivy.xml")); resolveAndAssertNotFound(settings, resolver, "#A;latest.integration", "before publishing"); // run publish asynchronously new Thread() { public void run() { try { engine.publish(md, Arrays .asList(new String[] {"build/test/publish/module/[artifact].[ext]"}), resolver, new PublishOptions() .setSrcIvyPattern("build/test/publish/module/[artifact].[ext]")); synchronized (PublishEngineTest.this) { counter[0]++; } } catch (IOException e) { throw new RuntimeException(e); } } }.start(); while (true) { sleepSilently(5); synchronized (this) { if (counter[0] == 5) { break; } else if (counter[0] < 4) { resolveAndAssertNotFound(settings, resolver, "#A;latest.integration", "after " + (counter[0] / 2) + " artifacts published"); } } } resolveAndAssertFound(settings, resolver, "#A;1.0"); } private void resolveAndAssertNotFound(IvySettings settings, FileSystemResolver resolver, String module, String context) throws ParseException { ResolvedModuleRevision rmr = resolveModule(settings, resolver, module); assertNull("module found " + context + ". module=" + rmr, rmr); } private void resolveAndAssertFound(IvySettings settings, FileSystemResolver resolver, String module) throws ParseException { ResolvedModuleRevision rmr = resolveModule(settings, resolver, module); assertNotNull(rmr); assertEquals(module, rmr.getId().toString()); } private ResolvedModuleRevision resolveModule(IvySettings settings, FileSystemResolver resolver, String module) throws ParseException { return resolver.getDependency( new DefaultDependencyDescriptor(ModuleRevisionId.parse(module), false), new ResolveData(new ResolveEngine(settings, new EventManager(), new SortEngine(settings)), new ResolveOptions())); } private void sleepSilently(int timeout) { try { Thread.sleep(timeout); } catch (InterruptedException e) { } } }