package jenkins.install; import jenkins.model.Jenkins; import net.sf.json.JSONArray; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; import hudson.Main; import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import static org.junit.Assert.*; /** * @author Kohsuke Kawaguchi */ public class UpgradeWizardTest { @Rule public final JenkinsRule j = new JenkinsRule(); private JSONArray platformPluginUpdates; private void rmStateFile() { File f = SetupWizard.getUpdateStateFile(); if(f != null && f.exists()) { f.delete(); } } private void setSetupWizard(SetupWizard wiz) throws Exception { Field f = Jenkins.class.getDeclaredField("setupWizard"); f.setAccessible(true); f.set(Jenkins.getInstance(), wiz); } @Before public void setSetupWizard() throws Exception { rmStateFile(); platformPluginUpdates = JSONArray.fromObject("[{name:'test-plugin',since:'2.1'}]"); setSetupWizard(new SetupWizard() { @Override public JSONArray getPlatformPluginUpdates() { return platformPluginUpdates; } }); // Disable the unit test flag. Main.isUnitTest = false; } @After public void restoreSetupWizard() throws Exception { rmStateFile(); setSetupWizard(new SetupWizard()); // Disable the unit test flag. Main.isUnitTest = true; } @Test public void snooze() throws Exception { j.executeOnServer(new Callable<Void>() { @Override public Void call() throws Exception { writeVersion("1.5"); UpgradeWizard uw = getInstance(); assertTrue(uw.isDue()); uw.doSnooze(); assertFalse(uw.isDue()); return null; } }); } /** * If not upgraded, the upgrade should cause some side effect. */ @Test public void upgrade() throws Exception { j.executeOnServer(new Callable<Void>() { @Override public Void call() throws Exception { assertTrue(j.jenkins.getUpdateCenter().getJobs().size() == 0); writeVersion("1.5"); assertTrue(getInstance().isDue()); // can't really test this because UC metadata is empty // assertTrue(j.jenkins.getUpdateCenter().getJobs().size() > 0); return null; } }); } /** * If already upgraded, don't show anything */ @Test public void fullyUpgraded() throws Exception { j.executeOnServer(new Callable<Void>() { @Override public Void call() throws Exception { platformPluginUpdates = new JSONArray(); assertFalse(getInstance().isDue()); return null; } }); } @Test public void freshInstallation() throws Exception { j.executeOnServer(new Callable<Void>() { @Override public Void call() throws Exception { InstallState prior = j.jenkins.getInstallState(); try { UpgradeWizard uw = getInstance(); assertTrue(uw.isDue()); // there are platform plugin updates j.jenkins.getSetupWizard().completeSetup(); assertFalse(uw.isDue()); return null; } finally { j.jenkins.setInstallState(prior); } } }); } /** * Fresh instance of {@link UpgradeWizard} to test its behavior. */ private UpgradeWizard getInstance() throws Exception { try { UpgradeWizard uw = UpgradeWizard.get(); uw.initializeState(); return uw; } catch(Exception e) { e.printStackTrace(); throw e; } } /** * Write a version to the update file, update last modified to > 24h * @param s * @throws IOException */ private static void writeVersion(String s) throws IOException { File f = SetupWizard.getUpdateStateFile(); FileUtils.writeStringToFile(f, s); f.setLastModified(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1)); } }