提交 09722a98 编写于 作者: J Jesse Glick

Converting BootFailureTest from Groovy to Java.

上级 54374fc2
package hudson.util package hudson.util;
import hudson.WebAppMain import hudson.WebAppMain;
import hudson.model.Hudson import hudson.model.Hudson;
import hudson.model.listeners.ItemListener import hudson.model.listeners.ItemListener;
import jenkins.model.Jenkins import static hudson.util.BootFailureTest.makeBootFail;
import org.junit.After import java.io.File;
import org.junit.Rule import java.io.IOException;
import org.junit.Test import java.util.ArrayList;
import org.junit.rules.TemporaryFolder import java.util.Arrays;
import org.jvnet.hudson.test.HudsonHomeLoader import java.util.List;
import org.jvnet.hudson.test.JenkinsRule import javax.servlet.ServletContext;
import org.jvnet.hudson.test.TestEnvironment import javax.servlet.ServletContextEvent;
import org.jvnet.hudson.test.TestExtension import jenkins.model.Jenkins;
import org.kohsuke.stapler.WebApp import org.apache.commons.io.FileUtils;
import org.junit.After;
import javax.servlet.ServletContextEvent import static org.junit.Assert.*;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.jvnet.hudson.test.HudsonHomeLoader;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.TestEnvironment;
import org.jvnet.hudson.test.TestExtension;
import org.kohsuke.stapler.WebApp;
/** /**
* *
* *
* @author Kohsuke Kawaguchi * @author Kohsuke Kawaguchi
*/ */
class BootFailureTest { public class BootFailureTest {
@Rule @Rule
public TemporaryFolder tmpDir = new TemporaryFolder(); public TemporaryFolder tmpDir = new TemporaryFolder();
static boolean makeBootFail = true; static boolean makeBootFail = true;
@Rule static class CustomRule extends JenkinsRule {
public JenkinsRule j = new JenkinsRule() {
@Override @Override
void before() throws Throwable { public void before() throws Throwable {
env = new TestEnvironment(testDescription); env = new TestEnvironment(testDescription);
env.pin(); env.pin();
// don't let Jenkins start automatically // don't let Jenkins start automatically
...@@ -38,78 +45,93 @@ class BootFailureTest { ...@@ -38,78 +45,93 @@ class BootFailureTest {
@Override @Override
public Hudson newHudson() throws Exception { public Hudson newHudson() throws Exception {
def ws = createWebServer() ServletContext ws = createWebServer();
def wa = new WebAppMain() { WebAppMain wa = new WebAppMain() {
@Override @Override
WebAppMain.FileAndDescription getHomeDir(ServletContextEvent event) { public WebAppMain.FileAndDescription getHomeDir(ServletContextEvent event) {
return new WebAppMain.FileAndDescription(homeLoader.allocate(),"test"); try {
return new WebAppMain.FileAndDescription(homeLoader.allocate(), "test");
} catch (Exception x) {
throw new AssertionError(x);
}
} }
} };
wa.contextInitialized(new ServletContextEvent(ws)); wa.contextInitialized(new ServletContextEvent(ws));
wa.joinInit(); wa.joinInit();
def a = WebApp.get(ws).app; Object a = WebApp.get(ws).getApp();
if (a instanceof Jenkins) if (a instanceof Hudson) {
return a; return (Hudson) a;
}
return null; // didn't boot return null; // didn't boot
} }
} }
@Rule
public CustomRule j = new CustomRule();
@After @After
public void tearDown() { public void tearDown() {
Jenkins.getInstance()?.cleanUp() Jenkins j = Jenkins.getInstance();
if (j != null) {
j.cleanUp();
}
} }
public static class SeriousError extends Error {} public static class SeriousError extends Error {}
@TestExtension() @TestExtension("runBootFailureScript")
public static class InduceBootFailure extends ItemListener { public static class InduceBootFailure extends ItemListener {
@Override @Override
void onLoaded() { public void onLoaded() {
if (makeBootFail) if (makeBootFail)
throw new SeriousError(); throw new SeriousError();
} }
} }
@Test @Test
void runBootFailureScript() { public void runBootFailureScript() throws Exception {
final def home = tmpDir.newFolder() final File home = tmpDir.newFolder();
j.with({ -> home} as HudsonHomeLoader) j.with(new HudsonHomeLoader() {
@Override
public File allocate() throws Exception {
return home;
}
});
// creates a script // creates a script
new File(home,"boot-failure.groovy").text = "hudson.util.BootFailureTest.problem = exception"; FileUtils.write(new File(home, "boot-failure.groovy"), "hudson.util.BootFailureTest.problem = exception");
def d = new File(home, "boot-failure.groovy.d") File d = new File(home, "boot-failure.groovy.d");
d.mkdirs(); d.mkdirs();
new File(d,"1.groovy").text = "hudson.util.BootFailureTest.runRecord << '1'"; FileUtils.write(new File(d, "1.groovy"), "hudson.util.BootFailureTest.runRecord << '1'");
new File(d,"2.groovy").text = "hudson.util.BootFailureTest.runRecord << '2'"; FileUtils.write(new File(d, "2.groovy"), "hudson.util.BootFailureTest.runRecord << '2'");
// first failed boot // first failed boot
makeBootFail = true; makeBootFail = true;
assert j.newHudson()==null; assertNull(j.newHudson());
assert bootFailures(home)==1; assertEquals(1, bootFailures(home));
// second failed boot // second failed boot
problem = null; problem = null;
runRecord = []; runRecord = new ArrayList<String>();
assert j.newHudson()==null; assertNull(j.newHudson());
assert bootFailures(home)==2; assertEquals(2, bootFailures(home));
assert runRecord==["1","2"] assertEquals(Arrays.asList("1", "2"), runRecord);
// make sure the script has actually run // make sure the script has actually run
assert problem.cause instanceof SeriousError assertEquals(SeriousError.class, problem.getCause().getClass());
// if it boots well, the failure record should be gone // if it boots well, the failure record should be gone
makeBootFail = false; makeBootFail = false;
assert j.newHudson()!=null; assertNotNull(j.newHudson());
assert !BootFailure.getBootFailureFile(home).exists() assertFalse(BootFailure.getBootFailureFile(home).exists());
} }
private static int bootFailures(File home) { private static int bootFailures(File home) throws IOException {
return BootFailure.getBootFailureFile(home).readLines().size() return FileUtils.readLines(BootFailure.getBootFailureFile(home)).size();
} }
// to be set by the script // to be set by the script
public static Exception problem; public static Exception problem;
public static def runRecord = []; public static List<String> runRecord = new ArrayList<String>();
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册