/*******************************************************************************
* Copyright (c) 2016 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.team.build.internal.hjplugin.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileNotFoundException;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.recipes.WithTimeout;
import org.mockito.Mockito;
import com.ibm.team.build.internal.hjplugin.Messages;
import com.ibm.team.build.internal.hjplugin.RTCBuildResultAction;
import com.ibm.team.build.internal.hjplugin.RTCBuildToolInstallation;
import com.ibm.team.build.internal.hjplugin.RTCChangeLogSet;
import com.ibm.team.build.internal.hjplugin.RTCJobProperties;
import com.ibm.team.build.internal.hjplugin.RTCFacadeFactory.RTCFacadeWrapper;
import com.ibm.team.build.internal.hjplugin.RTCLoginInfo;
import com.ibm.team.build.internal.hjplugin.RTCScm;
import com.ibm.team.build.internal.hjplugin.tests.utils.AbstractTestCase;
import com.ibm.team.build.internal.hjplugin.tests.utils.Utils;
import com.ibm.team.build.internal.hjplugin.util.Helper;
import hudson.FilePath;
import hudson.model.Cause;
import hudson.model.FreeStyleBuild;
import hudson.model.FreeStyleProject;
import hudson.model.Job;
import hudson.model.ParameterDefinition;
import hudson.model.ParametersAction;
import hudson.model.ParametersDefinitionProperty;
import hudson.model.Result;
import hudson.model.Run;
import hudson.model.StringParameterDefinition;
import hudson.model.StringParameterValue;
import hudson.model.queue.QueueTaskFuture;
import hudson.scm.PollingResult;
import hudson.scm.PollingResult.Change;
import hudson.util.Secret;
import hudson.util.StreamTaskListener;
/**
* Integration Tests for {@link Helper} class
*
*/
public class HelperIT extends AbstractTestCase {
private static final String BUILDTOOLKITNAME = "rtc-build-toolkit";
@Rule public JenkinsRule r = new JenkinsRule();
@Before
public void setup() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Utils.deleteTemporaryWorkspaces();
}
@After
public void tearDown() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Utils.deleteTemporaryWorkspaces();
}
/**
* Check whether RTCScm can accept build definition value from the a build parameter when running the build
* @throws Exception
*/
@WithTimeout(600)
@Test public void testBuildDefinitionWithParameterWithNoDefaultValueAndOverrideSuccess() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String componentName = getComponentUniqueName();
String buildDefinitionId = getBuildDefinitionUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildResultContributions",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // componentName
String.class}, // buildDefinitionId
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
componentName, buildDefinitionId);
try {
// Set the toolkit
RTCBuildToolInstallation install = new RTCBuildToolInstallation(BUILDTOOLKITNAME, Config.DEFAULT.getToolkit(), null);
r.jenkins.getDescriptorByType(RTCBuildToolInstallation.DescriptorImpl.class).setInstallations(install);
RTCScm rtcScm1 = new RTCScm(true, BUILDTOOLKITNAME, Config.DEFAULT.getServerURI(), Config.DEFAULT.getTimeout(), Config.DEFAULT.getUserID(),
Secret.fromString(Config.DEFAULT.getPassword()), Config.DEFAULT.getPasswordFile(), null,
new RTCScm.BuildType("buildDefinition", "${myBuildDefinition}", null, null, null), false);
String[] result = verifyBuildDefinitionWithParameter(r, rtcScm1, buildDefinitionId,
null, componentName,
new ParametersAction(new StringParameterValue("myBuildDefinition", buildDefinitionId)),
new ParametersAction(new StringParameterValue("buildResultUUID", "")));
setupArtifacts.put("buildResultItemId1", result[0]);
} finally {
testingFacade.invoke(
"tearDown",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
Map.class}, // setupArtifacts
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), setupArtifacts);
}
}
/**
* With no default value and no override, build fails
* @throws Exception
*/
@WithTimeout(600)
@Test public void testBuildDefinitionWithParameterWithNoDefaultValueAndNoOverrideFail() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String componentName = getComponentUniqueName();
String buildDefinitionId = getBuildDefinitionUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildResultContributions",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // componentName
String.class}, // buildDefinitionId
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
componentName, buildDefinitionId);
try {
// Set the toolkit
RTCBuildToolInstallation install = new RTCBuildToolInstallation(BUILDTOOLKITNAME, defaultC.getToolkit(), null);
r.jenkins.getDescriptorByType(RTCBuildToolInstallation.DescriptorImpl.class).setInstallations(install);
RTCScm rtcScm = new RTCScm(true, BUILDTOOLKITNAME, defaultC.getServerURI(), defaultC.getTimeout(), defaultC.getUserID(), Secret.fromString(defaultC.getPassword()),
defaultC.getPasswordFile(), null, new RTCScm.BuildType("buildDefinition", "${myBuildDefinition}", null, null, null), false);
// Setup
FreeStyleProject prj = r.createFreeStyleProject();
prj.setScm(rtcScm);
// Test
QueueTaskFuture<FreeStyleBuild> future = prj.scheduleBuild2(0, (Cause) null,
Arrays.asList(new ParametersAction[] {new ParametersAction(new StringParameterValue("buildResultUUID", ""))}));
while(!future.isDone());
FreeStyleBuild build = future.get();
// Verify the build status
assertNotNull(build);
assertTrue(build.getLog(100).toString(), build.getResult().isBetterOrEqualTo(Result.FAILURE));
assertNotNull("Expected checkout failure message", getMatch(build.getLogFile(), ".*RTC : checkout failure:.*"));
} finally {
testingFacade.invoke(
"tearDown",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
Map.class}, // setupArtifacts
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), setupArtifacts);
}
}
/**
* If you don't provide a value for the parameter while running the build, it takes the default value
* of the parameter and succeeds
* @throws Exception
*/
@WithTimeout(600)
@Test public void testBuildDefinitionParameterWithDefaultValueAndNoOverrideSuccess() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String componentName = getComponentUniqueName();
String buildDefinitionId = getBuildDefinitionUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildResultContributions",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // componentName
String.class}, // buildDefinitionId
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
componentName, buildDefinitionId);
try {
// Set the toolkit
RTCBuildToolInstallation install = new RTCBuildToolInstallation(BUILDTOOLKITNAME, defaultC.getToolkit(), null);
r.jenkins.getDescriptorByType(RTCBuildToolInstallation.DescriptorImpl.class).setInstallations(install);
RTCScm rtcScm1 = new RTCScm(true, BUILDTOOLKITNAME, defaultC.getServerURI(), defaultC.getTimeout(), defaultC.getUserID(), Secret.fromString(defaultC.getPassword()),
defaultC.getPasswordFile(), null, new RTCScm.BuildType("buildDefinition", "${myBuildDefinition}", null, null, null), false);
String[] result = verifyBuildDefinitionWithParameter(r, rtcScm1, buildDefinitionId,
new ParameterDefinition[] {new StringParameterDefinition("myBuildDefinition", buildDefinitionId),
new StringParameterDefinition("buildResultUUID", "")},
componentName,null);
setupArtifacts.put("buildResultItemId1", result[0]);
} finally {
testingFacade.invoke(
"tearDown",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // passwortestBuildDefinitionParameterWithDefaultValueAndNoOverrideSuccessd,
int.class, // timeout,
Map.class}, // setupArtifacts
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), setupArtifacts);
}
}
/**
* If you override with a proper value, build succeeds even if the default value is invalid
* @throws Exception
*/
@WithTimeout(600)
@Test public void testBuildDefinitionParameterWithInvalidDefaultValueAndOverrideSuccess() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String componentName = getComponentUniqueName();
String buildDefinitionId = getBuildDefinitionUniqueName();
String invalidBuildDefinitionId = "InvalidBuildDefinitionId";
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildResultContributions",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // componentName
String.class}, // buildDefinitionId
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
componentName, buildDefinitionId);
try {
// Set the toolkit
RTCBuildToolInstallation install = new RTCBuildToolInstallation(BUILDTOOLKITNAME, defaultC.getToolkit(), null);
r.jenkins.getDescriptorByType(RTCBuildToolInstallation.DescriptorImpl.class).setInstallations(install);
RTCScm rtcScm1 = new RTCScm(true, BUILDTOOLKITNAME, defaultC.getServerURI(), defaultC.getTimeout(), defaultC.getUserID(), Secret.fromString(defaultC.getPassword()),
defaultC.getPasswordFile(), null, new RTCScm.BuildType("buildDefinition", "${myBuildDefinition}", null, null, null), false);
String[] result = verifyBuildDefinitionWithParameter(r, rtcScm1, buildDefinitionId,
new ParameterDefinition[] {new StringParameterDefinition("myBuildDefinition", invalidBuildDefinitionId)},
componentName, new ParametersAction(new StringParameterValue("myBuildDefinition", buildDefinitionId)),
new ParametersAction(new StringParameterValue("buildResultUUID", "")));
setupArtifacts.put("buildResultItemId1", result[0]);
} finally {
testingFacade.invoke(
"tearDown",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // passwortestBuildDefinitionParameterWithDefaultValueAndNoOverrideSuccessd,
int.class, // timeout,
Map.class}, // setupArtifacts
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), setupArtifacts);
}
}
/**
* If you don't provide a value for the parameter while running the build, it take the default value.
* If that default value is invalid, then build fails
* @throws Exception
*/
@WithTimeout(600)
@Test public void testBuildDefinitionParameterWithInvalidDefaultValueAndNoOverrideFail() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String componentName = getComponentUniqueName();
String buildDefinitionId = getBuildDefinitionUniqueName();
String invalidBuildDefinitionId = "InvalidBuildDefinitionId";
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildResultContributions",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // componentName
String.class}, // buildDefinitionId
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
componentName, buildDefinitionId);
try {
// Set the toolkit
RTCBuildToolInstallation install = new RTCBuildToolInstallation(BUILDTOOLKITNAME, defaultC.getToolkit(), null);
r.jenkins.getDescriptorByType(RTCBuildToolInstallation.DescriptorImpl.class).setInstallations(install);
RTCScm rtcScm = new RTCScm(true, BUILDTOOLKITNAME, defaultC.getServerURI(), defaultC.getTimeout(), defaultC.getUserID(), Secret.fromString(defaultC.getPassword()),
defaultC.getPasswordFile(), null, new RTCScm.BuildType("buildDefinition", "${myBuildDefinition}", null, null, null), false);
// Setup
FreeStyleProject prj = r.createFreeStyleProject();
prj.addProperty(new ParametersDefinitionProperty(Arrays.asList(new ParameterDefinition[] {
new StringParameterDefinition("myBuildDefinition", invalidBuildDefinitionId),
new StringParameterDefinition("buildResultUUID", "")})));
prj.setScm(rtcScm);
// Test
QueueTaskFuture<FreeStyleBuild> future = prj.scheduleBuild2(0, (Cause) null, Arrays.asList(new ParametersAction[] {}));
while(!future.isDone());
FreeStyleBuild build = future.get();
// Verify the build status
assertNotNull(build);
assertTrue(build.getLog(100).toString(), build.getResult().isBetterOrEqualTo(Result.FAILURE));
// If there is any error during polling, it can be seen in the log file
assertNotNull("Expected checkout failure message", getMatch(build.getLogFile(), ".*RTC : checkout failure:.*"));
} finally {
testingFacade.invoke(
"tearDown",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // passwortestBuildDefinitionParameterWithDefaultValueAndNoOverrideSuccessd,
int.class, // timeout,
Map.class}, // setupArtifacts
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), setupArtifacts);
}
}
/**
*
* @throws Exception
*/
@WithTimeout(600)
@Test public void testBuildDefinitionPollingWithParameterWithDefaultValueSuccess() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String componentName = getComponentUniqueName();
String buildDefinitionId = getBuildDefinitionUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildResultContributions",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // componentName
String.class}, // buildDefinitionId
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
componentName, buildDefinitionId);
try {
// Set the toolkit
RTCBuildToolInstallation install = new RTCBuildToolInstallation(BUILDTOOLKITNAME, defaultC.getToolkit(), null);
r.jenkins.getDescriptorByType(RTCBuildToolInstallation.DescriptorImpl.class).setInstallations(install);
RTCScm rtcScm = new RTCScm(true, BUILDTOOLKITNAME, defaultC.getServerURI(), defaultC.getTimeout(), defaultC.getUserID(), Secret.fromString(defaultC.getPassword()),
defaultC.getPasswordFile(), null, new RTCScm.BuildType("buildDefinition", "${myBuildDefinition}", null, null, null), false);
// Setup with rtcBuildDefinition parameter with a value
FreeStyleProject prj = r.createFreeStyleProject();
prj.addProperty(new ParametersDefinitionProperty(Arrays.asList(
new ParameterDefinition[] {new StringParameterDefinition("myBuildDefinition", buildDefinitionId),
new StringParameterDefinition("buildResultUUID", "")})));
prj.setScm(rtcScm);
// Test
QueueTaskFuture<FreeStyleBuild> future = prj.scheduleBuild2(0, (Cause)null);
while(!future.isDone());
FreeStyleBuild build = future.get();
// Verify the build status
assertNotNull(build);
assertTrue(build.getLog(100).toString(), build.getResult().isBetterOrEqualTo(Result.SUCCESS));
// Verify whether RTCScm ran successfully
List<RTCBuildResultAction> rtcActions = build.getActions(RTCBuildResultAction.class);
assertEquals(1, rtcActions.size());
RTCBuildResultAction action = rtcActions.get(0);
// Verify that RTCScm ran with the default build definition id
RTCChangeLogSet changelog = (RTCChangeLogSet) build.getChangeSet();
assertEquals(buildDefinitionId, changelog.getBuildDefinitionName());
// Verify build result getting created
assertNotNull(action.getBuildResultUUID());
setupArtifacts.put("buildResultItemId", action.getBuildResultUUID());
File pollingFile = Utils.getTemporaryFile();
PollingResult pollResult = prj.poll(new StreamTaskListener(pollingFile, Charset.forName("ASCII")));
// If there is any error during polling, it can be seen in the log file
assertNotNull("Expected message about checking incoming changes", getMatch(pollingFile, "Checking incoming changes for \"" + buildDefinitionId + "\""));
assertNotNull("Expecting No changes", getMatch(pollingFile, "RTC : No changes detected"));
assertEquals("Expecting No changes", Change.NONE, pollResult.change);
} finally {
testingFacade.invoke(
"tearDown",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
Map.class}, // setupArtifacts
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), setupArtifacts);
}
}
/**
*
* @throws Exception
*/
@WithTimeout(600)
@Test public void testBuildDefinitionPollingWithParameterAndNoDefaultValueFail() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String componentName = getComponentUniqueName();
String buildDefinitionId = getBuildDefinitionUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildResultContributions",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // componentName
String.class}, // buildDefinitionId
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
componentName, buildDefinitionId);
try {
// Set the toolkit
RTCBuildToolInstallation install = new RTCBuildToolInstallation(BUILDTOOLKITNAME, defaultC.getToolkit(), null);
r.jenkins.getDescriptorByType(RTCBuildToolInstallation.DescriptorImpl.class).setInstallations(install);
RTCScm rtcScm = new RTCScm(true, BUILDTOOLKITNAME, defaultC.getServerURI(), defaultC.getTimeout(), defaultC.getUserID(), Secret.fromString(defaultC.getPassword()),
defaultC.getPasswordFile(), null, new RTCScm.BuildType("buildDefinition", "${myBuildDefinition}", null, null, null), false);
// Setup
FreeStyleProject prj = r.createFreeStyleProject();
prj.setScm(rtcScm);
// Test
QueueTaskFuture<FreeStyleBuild> future = prj.scheduleBuild2(0, (Cause) null,
new ParametersAction(new StringParameterValue("myBuildDefinition", buildDefinitionId)),
new ParametersAction(new StringParameterValue("buildResultUUID", "")));
while(!future.isDone());
FreeStyleBuild build = future.get();
// Verify the build status
assertNotNull(build);
assertTrue(build.getLog(100).toString(), build.getResult().isBetterOrEqualTo(Result.SUCCESS));
// Verify whether RTCScm ran successfully
List<RTCBuildResultAction> rtcActions = build.getActions(RTCBuildResultAction.class);
assertEquals(1, rtcActions.size());
RTCBuildResultAction action = rtcActions.get(0);
// Verify build result getting created
assertNotNull(action.getBuildResultUUID());
setupArtifacts.put("buildResultItemId", action.getBuildResultUUID());
File pollingFile = Utils.getTemporaryFile();
PollingResult pollResult = prj.poll(new StreamTaskListener(pollingFile, Charset.forName("UTF-8")));
// If there is any error during polling, it can be seen in the log file
assertNotNull(getMatch(pollingFile, "FATAL: RTC : checking for changes failure: Unable to find a build definition with ID:.*myBuildDefinition.*"));
assertEquals(Change.NONE, pollResult.change);
} finally {
testingFacade.invoke(
"tearDown",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
Map.class}, // setupArtifacts
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), setupArtifacts);
}
}
@WithTimeout(600)
@Test public void testBuildSnapshot_PredefinedParameterNonNull_BuildSuccess() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String snapshotName = getSnapshotUniqueName();
String componentName = getComponentUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildSnapshot",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // snapshotName
String.class, // componentName
String.class}, // workspacePrefix
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
snapshotName, componentName, "HJP");
String snapshotUUID = setupArtifacts.get(Utils.ARTIFACT_BASELINESET_ITEM_ID);
try {
// Set the toolkit
RTCBuildToolInstallation install = new RTCBuildToolInstallation(BUILDTOOLKITNAME, defaultC.getToolkit(), null);
r.jenkins.getDescriptorByType(RTCBuildToolInstallation.DescriptorImpl.class).setInstallations(install);
RTCScm rtcScm = new RTCScm(true, BUILDTOOLKITNAME, defaultC.getServerURI(), defaultC.getTimeout(), defaultC.getUserID(), Secret.fromString(defaultC.getPassword()),
defaultC.getPasswordFile(), null, new RTCScm.BuildType("buildSnapshot", "", null, null, null), false);
// Setup
FreeStyleProject prj = r.createFreeStyleProject();
prj.addProperty(new ParametersDefinitionProperty(Arrays.asList(new ParameterDefinition[] {new StringParameterDefinition(RTCJobProperties.RTC_BUILD_SNAPSHOT, "")})));
prj.setScm(rtcScm);
// Test
QueueTaskFuture<FreeStyleBuild> future = prj.scheduleBuild2(0, (Cause) null,
new ParametersAction(new StringParameterValue(RTCJobProperties.RTC_BUILD_SNAPSHOT, snapshotName)),
new ParametersAction(new StringParameterValue("buildResultUUID", "")));
while(!future.isDone());
FreeStyleBuild build = future.get();
// Verify the build status
assertNotNull(build);
assertTrue(build.getLog(100).toString(), build.getResult().isBetterOrEqualTo(Result.SUCCESS));
// Get the build snapshot UUID from build result action
RTCBuildResultAction action = build.getAction(RTCBuildResultAction.class);
assertEquals(snapshotUUID, action.getBuildProperties().get(Utils.TEAM_SCM_SNAPSHOTUUID));
} finally {
testingFacade.invoke(
"tearDown",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
Map.class}, // setupArtifacts
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), setupArtifacts);
}
}
@WithTimeout(600)
@Test public void testBuildSnapshot_PredefinedParameterNonNullConfigValueAsParamInvalid_BuildSuccess() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String snapshotName = getSnapshotUniqueName();
String componentName = getComponentUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildSnapshot",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // snapshotName
String.class, // componentName
String.class}, // workspacePrefix
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
snapshotName, componentName, "HJP");
String snapshotUUID = setupArtifacts.get(Utils.ARTIFACT_BASELINESET_ITEM_ID);
try {
// Set the toolkit
RTCBuildToolInstallation install = new RTCBuildToolInstallation(BUILDTOOLKITNAME, defaultC.getToolkit(), null);
r.jenkins.getDescriptorByType(RTCBuildToolInstallation.DescriptorImpl.class).setInstallations(install);
RTCScm rtcScm = new RTCScm(true, BUILDTOOLKITNAME, defaultC.getServerURI(), defaultC.getTimeout(), defaultC.getUserID(), Secret.fromString(defaultC.getPassword()),
defaultC.getPasswordFile(), null, new RTCScm.BuildType("buildSnapshot", null, null, "${myBuildSnapshot}", null), false);
// Setup
FreeStyleProject prj = r.createFreeStyleProject();
prj.addProperty(new ParametersDefinitionProperty(Arrays.asList(new ParameterDefinition[] {new StringParameterDefinition(RTCJobProperties.RTC_BUILD_SNAPSHOT, snapshotName),
new StringParameterDefinition("myBuildSnapshot", "Dummy Snapshot")
})));
prj.setScm(rtcScm);
// Test
QueueTaskFuture<FreeStyleBuild> future = prj.scheduleBuild2(0, (Cause) null,
new ParametersAction(new StringParameterValue(RTCJobProperties.RTC_BUILD_SNAPSHOT, snapshotName)),
new ParametersAction(new StringParameterValue("myBuildSnapshot", "Dummy Snapshot")),
new ParametersAction(new StringParameterValue("buildResultUUID", "")));
while(!future.isDone());
FreeStyleBuild build = future.get();
// Verify the build status
assertNotNull(build);
assertTrue(build.getLog(100).toString(), build.getResult().isBetterOrEqualTo(Result.SUCCESS));
// Get the build snapshot UUID from build result action
RTCBuildResultAction action = build.getAction(RTCBuildResultAction.class);
assertEquals(snapshotUUID, action.getBuildProperties().get(Utils.TEAM_SCM_SNAPSHOTUUID));
} finally {
testingFacade.invoke(
"tearDown",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
Map.class}, // setupArtifacts
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), setupArtifacts);
}
}
@WithTimeout(600)
@Test public void testBuildSnapshot_ConfigValueAsParamNonNull_BuildSuccess() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
Config defaultC = Config.DEFAULT;
RTCLoginInfo loginInfo = defaultC.getLoginInfo();
String workspaceName = getRepositoryWorkspaceUniqueName();
String snapshotName = getSnapshotUniqueName();
String componentName = getComponentUniqueName();
RTCFacadeWrapper testingFacade = Utils.getTestingFacade();
@SuppressWarnings("unchecked")
Map<String, String> setupArtifacts = (Map<String, String>) testingFacade
.invoke("setupBuildSnapshot",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
String.class, // workspaceName,
String.class, // snapshotName
String.class, // componentName
String.class}, // workspacePrefix
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), workspaceName,
snapshotName, componentName, "HJP");
String snapshotUUID = setupArtifacts.get(Utils.ARTIFACT_BASELINESET_ITEM_ID);
try {
// Set the toolkit
RTCBuildToolInstallation install = new RTCBuildToolInstallation(BUILDTOOLKITNAME, defaultC.getToolkit(), null);
r.jenkins.getDescriptorByType(RTCBuildToolInstallation.DescriptorImpl.class).setInstallations(install);
RTCScm rtcScm = new RTCScm(true, BUILDTOOLKITNAME, defaultC.getServerURI(), defaultC.getTimeout(), defaultC.getUserID(), Secret.fromString(defaultC.getPassword()),
defaultC.getPasswordFile(), null, new RTCScm.BuildType("buildSnapshot", null, null, "${myBuildSnapshot}", null), false);
// Setup
FreeStyleProject prj = r.createFreeStyleProject();
prj.addProperty(new ParametersDefinitionProperty(Arrays.asList(new ParameterDefinition[] {new StringParameterDefinition("myBuildSnapshot", "Dummy Snapshot")})));
prj.setScm(rtcScm);
// Test
QueueTaskFuture<FreeStyleBuild> future = prj.scheduleBuild2(0, (Cause) null,
new ParametersAction(new StringParameterValue("myBuildSnapshot", snapshotName)),
new ParametersAction(new StringParameterValue("buildResultUUID", "")));
while(!future.isDone());
FreeStyleBuild build = future.get();
// Verify the build status
assertNotNull(build);
assertTrue(build.getLog(100).toString(), build.getResult().isBetterOrEqualTo(Result.SUCCESS));
// Get the build snapshot UUID from build result action
RTCBuildResultAction action = build.getAction(RTCBuildResultAction.class);
assertEquals(snapshotUUID, action.getBuildProperties().get(Utils.TEAM_SCM_SNAPSHOTUUID));
} finally {
testingFacade.invoke(
"tearDown",
new Class[] { String.class, // serverURL,
String.class, // userId,
String.class, // password,
int.class, // timeout,
Map.class}, // setupArtifacts
loginInfo.getServerUri(),
loginInfo.getUserId(),
loginInfo.getPassword(),
loginInfo.getTimeout(), setupArtifacts);
}
}
/**
* Test whether the getTemorary workspace comment method uses build number, job name and server name
*/
@Test public void testGetTemporaryWorkspaceComment() throws Exception {
if (!Config.DEFAULT.isConfigured()) {
return;
}
// Setup
FreeStyleProject prj = r.createFreeStyleProject("myfakeJob");
// Test
QueueTaskFuture<FreeStyleBuild> future = prj.scheduleBuild2(0);
while(!future.isDone());
FreeStyleBuild build = future.get();
// Test
String workspaceComment = Helper.getTemporaryWorkspaceComment(build);
// Behavior assertion
assertEquals(Messages.RTCScm_temporary_workspace_comment(
1,
"myfakeJob",
r.getURL()), workspaceComment);
}
private String[] verifyBuildDefinitionWithParameter(JenkinsRule r, RTCScm rtcScm, String buildDefinitionId,
ParameterDefinition[] parameterDefinitions, String componentName, ParametersAction... pActions) throws Exception {
String [] result = new String[2];
// Setup
FreeStyleProject prj = r.createFreeStyleProject();
if (parameterDefinitions != null) {
prj.addProperty(new ParametersDefinitionProperty(Arrays.asList(parameterDefinitions)));
}
prj.setScm(rtcScm);
if (pActions ==null) {
pActions = new ParametersAction[0];
}
// Test
QueueTaskFuture<FreeStyleBuild> future = prj.scheduleBuild2(0, (Cause) null,pActions);
while(!future.isDone());
FreeStyleBuild build = future.get();
// Verify whether RTCScm ran successfully
Utils.verifyRTCScmInBuild(build, true);
RTCBuildResultAction action = build.getActions(RTCBuildResultAction.class).get(0);
result[0] = action.getBuildResultUUID();
result[1] = action.getBuildProperties().get(Utils.TEAM_SCM_SNAPSHOTUUID);
// Verify that build ran with the same definition Id
RTCChangeLogSet changelog = (RTCChangeLogSet) build.getChangeSet();
assertEquals(buildDefinitionId, changelog.getBuildDefinitionName());
// Verify the file contents
FilePath w = build.getWorkspace();
File dir = new File(w.getRemote());
String[] children = dir.list();
assertEquals(dir.getAbsolutePath(), 3, children.length);
// Existence tests
assertTrue(new File(dir, ".jazz5").exists());
assertTrue(new File(dir, componentName).exists());
assertTrue(new File(dir, "newTree2").exists());
assertTrue(new File(dir, componentName + "/f/newTree").exists());
return result;
}
private String getMatch(File file, String pattern) throws FileNotFoundException {
Scanner scanner = null;
String match = null;
try {
scanner = new Scanner(file, "UTF-8");
scanner.useDelimiter(System.getProperty("line.separator"));
while(scanner.hasNext()) {
String token = scanner.next();
if (token.matches(pattern)) {
match = token;
break;
}
}
} finally {
if (scanner != null) {
scanner.close();
}
}
return match;
}
}