Skip to content

Commit fd4c0e7

Browse files
committed
add a test to show race condition is fixed
without the fix in this PR, the test fails almost always.
1 parent 4abe673 commit fd4c0e7

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed

src/test/java/org/jenkinsci/plugins/workflow/libs/LibraryAdderTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import hudson.FilePath;
2929
import hudson.model.Job;
3030
import hudson.model.Result;
31+
import hudson.model.queue.QueueTaskFuture;
3132
import hudson.plugins.git.BranchSpec;
3233
import hudson.plugins.git.GitSCM;
3334
import hudson.plugins.git.SubmoduleConfig;
@@ -36,6 +37,8 @@
3637
import hudson.slaves.WorkspaceList;
3738
import hudson.scm.SubversionSCM;
3839
import hudson.scm.ChangeLogSet;
40+
41+
import java.time.ZonedDateTime;
3942
import java.util.Collection;
4043
import java.util.Collections;
4144
import java.util.Iterator;
@@ -472,4 +475,41 @@ public void correctLibraryDirectoryUsedWhenResumingOldBuild() throws Exception {
472475
r.assertLogContains("called Foo", b);
473476
}
474477

478+
@Issue("JENKINS-66898")
479+
@Test
480+
public void parallelBuildsDontInterfereWithExpiredCache() throws Throwable {
481+
// Add a few files to the library so the deletion is not too fast
482+
// Before fixing JENKINS-66898 this test was failing almost always
483+
sampleRepo.init();
484+
sampleRepo.write("vars/foo.groovy", "def call() { echo 'foo' }");
485+
sampleRepo.write("vars/bar.groovy", "def call() { echo 'bar' }");
486+
sampleRepo.write("vars/foo2.groovy", "def call() { echo 'foo2' }");
487+
sampleRepo.write("vars/foo3.groovy", "def call() { echo 'foo3' }");
488+
sampleRepo.write("vars/foo4.groovy", "def call() { echo 'foo4' }");
489+
sampleRepo.git("add", "vars");
490+
sampleRepo.git("commit", "--message=init");
491+
LibraryConfiguration config = new LibraryConfiguration("library",
492+
new SCMSourceRetriever(new GitSCMSource(null, sampleRepo.toString(), "", "*", "", true)));
493+
config.setDefaultVersion("master");
494+
config.setImplicit(true);
495+
config.setCachingConfiguration(new LibraryCachingConfiguration(30, null));
496+
GlobalLibraries.get().getLibraries().add(config);
497+
WorkflowJob p1 = r.createProject(WorkflowJob.class);
498+
WorkflowJob p2 = r.createProject(WorkflowJob.class);
499+
p1.setDefinition(new CpsFlowDefinition("foo()", true));
500+
p2.setDefinition(new CpsFlowDefinition("foo()", true));
501+
WorkflowRun b1 = r.buildAndAssertSuccess(p1);
502+
LibrariesAction action = b1.getAction(LibrariesAction.class);
503+
LibraryRecord record = action.getLibraries().get(0);
504+
FilePath cache = LibraryCachingConfiguration.getGlobalLibrariesCacheDir().child(record.getDirectoryName());
505+
//Expire the cache
506+
long oldMillis = ZonedDateTime.now().minusMinutes(35).toInstant().toEpochMilli();
507+
cache.touch(oldMillis);
508+
QueueTaskFuture<WorkflowRun> f1 = p1.scheduleBuild2(0);
509+
QueueTaskFuture<WorkflowRun> f2 = p2.scheduleBuild2(0);
510+
WorkflowRun r1 = r.assertBuildStatus(Result.SUCCESS, f1);
511+
WorkflowRun r2 = r.assertBuildStatus(Result.SUCCESS, f2);
512+
r.assertLogContains("is due for a refresh after", r1);
513+
r.assertLogContains("Library library@master is cached. Copying from home.", r2);
514+
}
475515
}

0 commit comments

Comments
 (0)