package org.jenkinsci.plugins.openshift;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import hudson.AbortException;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.BuildListener;
import hudson.model.AbstractBuild;
import hudson.model.Computer;
import java.io.File;
import java.io.IOException;
import java.util.List;
import jenkins.model.Jenkins.MasterComputer;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
import com.openshift.client.IApplication;
/**
* @author <a href="mailto:hoffmann@apache.org">Juergen Hoffmann</a>.
* Date: 21-Dez-2014
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({AbstractBuild.class, Computer.class})
public class DeploymentPackageTest {
@Mock
private AbstractBuild build;
@Mock
private Launcher launcher;
@Mock
private BuildListener listener;
@Mock
private IApplication app;
private Repository repository;
private String serverName = "broker.example.com";
private String appName = "junit-testapp";
private String cartridges = "jbosseap-6";
private String domain = "test";
private String gearProfile = "small";
private String deploymentPackage = "";
private String environmentVariables = "";
private Boolean autoScale = false;
private String dotOpenshiftDirectory = "";
@Before
public void setup() throws IOException {
// Define a Test Directory
File localPath = File.createTempFile("TestGitRepository", "");
// prepare a new folder
if(localPath.exists()) localPath.delete();
// create the repository
repository = FileRepositoryBuilder.create(new File(localPath, ".git"));
repository.create();
// Setup Mocks
when(build.getWorkspace()).thenReturn(new FilePath(new File(getClass().getResource("/").getPath())));
when(listener.getLogger()).thenReturn(System.out);
when(app.getName()).thenReturn("testapp");
when(app.getGitUrl()).thenReturn(repository.getDirectory().getAbsolutePath());
mockStatic(Computer.class);
PowerMockito.when(Computer.currentComputer()).thenReturn(mock(MasterComputer.class));
}
@Test
public void deployNonExistingFile() throws Exception {
deploymentPackage = "non-existing-directory/deployment.war";
OpenShiftV2Client.DeploymentType deploymentType = OpenShiftV2Client.DeploymentType.GIT;
DeployApplication deployer = new DeployApplication(serverName, appName, cartridges, domain, gearProfile, deploymentPackage, environmentVariables, autoScale, deploymentType, dotOpenshiftDirectory);
List<String> deployments = null;
try {
deployments = Whitebox.invokeMethod(deployer, "findDeployments", build, listener);
} catch (AbortException e) {
// expected
}
verify(listener, times(1)).error("[OPENSHIFT] Directory '" + getClass().getResource("/").getPath() + "non-existing-directory/deployment.war' doesn't exist. No deployments found!");
assertNull("The build should NOT have been performed", deployments);
}
@Test
public void deployFromDirectory() throws Exception {
deploymentPackage = "deployment";
OpenShiftV2Client.DeploymentType deploymentType = OpenShiftV2Client.DeploymentType.GIT;
DeployApplication deployer = new DeployApplication(serverName, appName, cartridges, domain, gearProfile, deploymentPackage, environmentVariables, autoScale, deploymentType, dotOpenshiftDirectory);
List<String> deployments = null;
try {
deployments = Whitebox.invokeMethod(deployer, "findDeployments", build, listener);
} catch (AbortException e) {
// expected
}
//Evaluate Results
assertNotNull("The list of deployments should not be null", deployments);
assertTrue("The List of deployments should contain app.war", deployments.contains(getClass().getResource("/deployment/app.war").getPath()));
}
@Test
public void deploySingleDeploymentUnit() throws Exception {
deploymentPackage = "deployment/app.war";
OpenShiftV2Client.DeploymentType deploymentType = OpenShiftV2Client.DeploymentType.GIT;
DeployApplication deployer = new DeployApplication(serverName, appName, cartridges, domain, gearProfile, deploymentPackage, environmentVariables, autoScale, deploymentType, dotOpenshiftDirectory);
List<String> deployments = null;
try {
deployments = Whitebox.invokeMethod(deployer, "findDeployments", build, listener);
} catch (AbortException e) {
// expected
}
// Verify Results
assertNotNull("The list of deployments should contain app.war", deployments);
assertEquals("One deployment should be in the list", 1, deployments.size());
assertTrue("Deployments list should contain app.war", deployments.get(0).endsWith(deploymentPackage));
}
@Test
public void testOpenshiftDirectory() throws Exception {
deploymentPackage = "deployment/app.war";
dotOpenshiftDirectory = this.getClass().getResource("/").getPath() + File.separator + "openshift";
OpenShiftV2Client.DeploymentType deploymentType = OpenShiftV2Client.DeploymentType.GIT;
DeployApplication deployer = new DeployApplication(serverName, appName, cartridges, domain, gearProfile, deploymentPackage, environmentVariables, autoScale, deploymentType, dotOpenshiftDirectory);
List<String> deployments = null;
try {
deployments = Whitebox.invokeMethod(deployer, "findDeployments", build, listener);
} catch (AbortException e) {
// expected
}
Whitebox.invokeMethod(deployer, "doGitDeploy", deployments, app, build, listener);
//verify
assertTrue(
"Repository must contain the JPDA marker file .openshift/markers/enable_jpda",
TestUtils.gitRepoContainsFile(repository, ".openshift/markers/enable_jpda")
);
assertTrue(
"Repository must contain the java7 marker file .openshift/markers/java7",
TestUtils.gitRepoContainsFile(repository, ".openshift/markers/java7")
);
}
@Test
public void testNoOpenshiftDirectory() throws Exception {
deploymentPackage = "deployment/app.war";
dotOpenshiftDirectory = "";
OpenShiftV2Client.DeploymentType deploymentType = OpenShiftV2Client.DeploymentType.GIT;
DeployApplication deployer = new DeployApplication(serverName, appName, cartridges, domain, gearProfile, deploymentPackage, environmentVariables, autoScale, deploymentType, dotOpenshiftDirectory);
List<String> deployments = null;
try {
deployments = Whitebox.invokeMethod(deployer, "findDeployments", build, listener);
} catch (AbortException e) {
// expected
}
Whitebox.invokeMethod(deployer, "doGitDeploy", deployments, app, build, listener);
//verify
assertFalse(
"Repository must not contain the JPDA marker file .openshift/markers/enable_jpda",
TestUtils.gitRepoContainsFile(repository, ".openshift/markers/enable_jpda")
);
assertFalse(
"Repository must not contain the java7 marker file .openshift/markers/java7",
TestUtils.gitRepoContainsFile(repository, ".openshift/markers/java7")
);
}
@Test
public void testNullOpenshiftDirectory() throws Exception {
deploymentPackage = "deployment/app.war";
dotOpenshiftDirectory = "";
OpenShiftV2Client.DeploymentType deploymentType = OpenShiftV2Client.DeploymentType.GIT;
DeployApplication deployer = new DeployApplication(serverName, appName, cartridges, domain, gearProfile, deploymentPackage, environmentVariables, autoScale, deploymentType, dotOpenshiftDirectory);
List<String> deployments = null;
try {
deployments = Whitebox.invokeMethod(deployer, "findDeployments", build, listener);
} catch (AbortException e) {
// expected
}
Whitebox.invokeMethod(deployer, "doGitDeploy", deployments, app, build, listener);
//verify
assertFalse(
"Repository must not contain the JPDA marker file .openshift/markers/enable_jpda",
TestUtils.gitRepoContainsFile(repository, ".openshift/markers/enable_jpda")
);
assertFalse(
"Repository must not contain the java7 marker file .openshift/markers/java7",
TestUtils.gitRepoContainsFile(repository, ".openshift/markers/java7")
);
}
@Test(expected = IllegalArgumentException.class)
public void testIllegalArgumentException() throws Exception {
deploymentPackage = "deployment/app.war";
dotOpenshiftDirectory = "openshift";
GitClient client = new GitClient(app);
client.deploy(null, null, null, "", dotOpenshiftDirectory);
}
@Test
public void deployAbsolutePathToDeploymentUnit() throws Exception {
deploymentPackage = ClassLoader.getSystemResource("deployment/app.tar.gz").getFile();
OpenShiftV2Client.DeploymentType deploymentType = OpenShiftV2Client.DeploymentType.BINARY;
DeployApplication deployer = new DeployApplication(serverName, appName, cartridges, domain, gearProfile, deploymentPackage, environmentVariables, autoScale, deploymentType, dotOpenshiftDirectory);
List<String> deployments = null;
try {
deployments = Whitebox.invokeMethod(deployer, "findDeployments", build, listener);
} catch (AbortException e) {
// NOOP
}
// Verify Results
assertNotNull("The list of deployments should contain app.war", deployments);
assertEquals("One deployment should be in the list", 1, deployments.size());
assertEquals(deploymentPackage, deployments.get(0));
}
}