Skip to content
Permalink
Browse files

Merge pull request #73 from jglick/IDEA-is-broken-JENKINS-45245

[JENKINS-45245] Work around failure of IDEA to add jenkins-war.war to the test CP
  • Loading branch information
jglick committed Sep 20, 2017
2 parents 2a12efb + 509c27f commit b45ae9bb02999e82d14dd16f95c1b8fd2b277343
Showing with 29 additions and 9 deletions.
  1. +29 −9 src/main/java/org/jvnet/hudson/test/WarExploder.java
@@ -23,13 +23,15 @@
*/
package org.jvnet.hudson.test;

import hudson.remoting.Which;
import hudson.FilePath;

import hudson.remoting.Which;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import jenkins.model.Jenkins;

/**
* Ensures that <tt>jenkins.war</tt> is exploded.
@@ -42,6 +44,8 @@
*/
public final class WarExploder {

private static final Logger LOGGER = Logger.getLogger(WarExploder.class.getName());

public static File getExplodedDir() throws Exception {
// rethrow an exception every time someone tries to do this, so that when explode()
// fails, you can see the cause no matter which test case you look at.
@@ -74,18 +78,31 @@ private static File explode() throws Exception {
if(new File(d,".jenkins").exists()) {
File dir = new File(d,"war/target/jenkins");
if(dir.exists()) {
System.out.println("Using jenkins.war resources from "+dir);
LOGGER.log(Level.INFO, "Using jenkins.war resources from {0}", dir);
return dir;
}
}
}

// locate jenkins.war
File war;
URL winstone = WarExploder.class.getResource("/winstone.jar");
if(winstone==null)
// impossible, since the test harness pulls in jenkins.war
throw new AssertionError("jenkins.war is not in the classpath. If you are running this from the core workspace, run 'mvn install' to create the war image in war/target/jenkins. If running from a plugin, try using `mvn clean test` (cf. JENKINS-45245).");
File war = Which.jarFile(Class.forName("executable.Executable"));
if (winstone != null) {
war = Which.jarFile(Class.forName("executable.Executable"));
} else {
// JENKINS-45245: work around incorrect test classpath in IDEA. Note that this will not correctly handle timestamped snapshots; in that case use `mvn test`.
File core = Which.jarFile(Jenkins.class); // will fail with IllegalArgumentException if have neither jenkins-war.war nor jenkins-core.jar in ${java.class.path}
String version = core.getParentFile().getName();
if (core.getName().equals("jenkins-core-" + version + ".jar") && core.getParentFile().getParentFile().getName().equals("jenkins-core")) {
war = new File(new File(new File(core.getParentFile().getParentFile().getParentFile(), "jenkins-war"), version), "jenkins-war-" + version + ".war");
if (!war.isFile()) {
throw new AssertionError(war + " does not yet exist. Prime your development environment by running `mvn validate`.");
}
LOGGER.log(Level.FINE, "{0} is the continuation of the classpath by other means", war);
} else {
throw new AssertionError(core + " is not in the expected location, and jenkins-war-*.war was not in " + System.getProperty("java.class.path"));
}
}

// TODO this assumes that the CWD of the Maven process is the plugin ${basedir}, which may not be the case
File buildDirectory = new File(System.getProperty("buildDirectory", "target"));
@@ -97,7 +114,7 @@ private static File explode() throws Exception {
File timestamp = new File(explodeDir,".timestamp");

if(!timestamp.exists() || (timestamp.lastModified()!=war.lastModified())) {
System.out.println("Exploding " + war + " into " + explodeDir);
LOGGER.log(Level.INFO, "Exploding {0} into {1}", new Object[] {war, explodeDir});
new FileOutputStream(explodeDir + ".exploding").close();
new FilePath(explodeDir).deleteRecursive();
new FilePath(war).unzip(new FilePath(explodeDir));
@@ -107,9 +124,12 @@ private static File explode() throws Exception {
timestamp.setLastModified(war.lastModified());
new File(explodeDir + ".exploding").delete();
} else {
System.out.println("Picking up existing exploded jenkins.war at "+explodeDir.getAbsolutePath());
LOGGER.log(Level.INFO, "Picking up existing exploded jenkins.war at {0}", explodeDir.getAbsolutePath());
}

return explodeDir;
}

private WarExploder() {}

}

0 comments on commit b45ae9b

Please sign in to comment.
You can’t perform that action at this time.