package hudson.plugins.starteam;
import hudson.model.Cause;
import hudson.model.FreeStyleBuild;
import hudson.model.FreeStyleProject;
import hudson.model.Result;
import hudson.model.StreamBuildListener;
import hudson.model.TaskListener;
import hudson.model.User;
import hudson.scm.ChangeLogParser;
import hudson.scm.ChangeLogSet;
import hudson.scm.SCMDescriptor;
import hudson.scm.ChangeLogSet.Entry;
import hudson.slaves.DumbSlave;
import java.nio.charset.Charset;
import java.util.Set;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.jvnet.hudson.test.Bug;
import org.jvnet.hudson.test.HudsonTestCase;
/**
* StarTeam SCM plugin for Hudson.
*
* @author jan_ruzicka
*/
public class StarTeamSCMTest extends HudsonTestCase {
private static final int LOG_LIMIT = 1000;
StarTeamSCM t;
String hostName = System.getProperty("test.starteam.hostname", "127.0.0.1");
int port = Integer.parseInt(System.getProperty("test.starteam.hostport", "1")) ;
String projectName = System.getProperty("test.starteam.projectname", "");
String viewName = System.getProperty("test.starteam.viewname", "");
String folderName = System.getProperty("test.starteam.foldername", "");
String userName = System.getProperty("test.starteam.username", "");
String password = System.getProperty("test.starteam.password", "");
String labelName = System.getProperty("test.starteam.labelname", "hudsonTestLabel");
String promotionName = System.getProperty("test.starteam.promotionname", "hudsonPromotionState");
String changeDate = System.getProperty("test.starteam.changedate", "2010/7/14");
String testFile = System.getProperty("test.starteam.testfile", "");
@Before
public void setUp() throws Exception {
super.setUp();
t = new StarTeamSCM(hostName, port, projectName, viewName, folderName, userName, password, null, false) ;
}
/**
* The constructor.
*/
@Test
public void testConstructorStarTeamSCM()
{
boolean promotionState = false;
StarTeamSCM t = new StarTeamSCM(hostName, port, projectName, viewName, folderName, userName, password, labelName, promotionState) ;
assertEquals(hostName,t.getHostname());
assertEquals(port,t.getPort());
assertEquals(projectName,t.getProjectname());
assertEquals(viewName,t.getViewname());
assertEquals(folderName,t.getFoldername());
assertEquals(userName,t.getUsername());
assertEquals(password,t.getPassword());
assertEquals(labelName,t.getLabelname());
assertEquals(promotionState,t.isPromotionstate());
}
/**
* Makes sure that checking out on the slave will work.
*/
@Bug(7967)
@Test
public void testRemoteCheckOut() throws Exception {
DumbSlave s = createSlave();
FreeStyleProject p = createFreeStyleProject();
p.setAssignedLabel(s.getSelfLabel());
boolean promotionState = false;
p.setScm(new StarTeamSCM(hostName, port, projectName, viewName, folderName, userName, password, labelName, promotionState));
FreeStyleBuild b = assertBuildStatusSuccess(p.scheduleBuild2(0, new Cause.UserCause()).get());
assertTrue(b.getWorkspace().child(testFile).exists()); // use a file that is in the root directory of your project
b = assertBuildStatusSuccess(p.scheduleBuild2(0).get());
}
/**
* Makes sure that the configuration survives the round-trip.
*/
@Bug(6881)
@Test
public void testConfigRoundtrip() throws Exception {
boolean promotionState = false;
FreeStyleProject project = createFreeStyleProject();
StarTeamSCM scm = new StarTeamSCM(hostName, port, projectName, viewName, folderName, userName, password, labelName, promotionState) ;
project.setScm(scm);
// config roundtrip
submit(new WebClient().getPage(project,"configure").getFormByName("config"));
// verify that the data is intact
assertEqualBeans(scm, project.getScm(),
"hostname,port,projectname,viewname,foldername,username,password,labelname,promotionstate");
promotionState = true;
scm = new StarTeamSCM(hostName, port, projectName, viewName, folderName, userName, password, promotionName, promotionState) ;
project.setScm(scm);
// config roundtrip
submit(new WebClient().getPage(project,"configure").getFormByName("config"));
// verify that the data is intact
assertEqualBeans(scm, project.getScm(),
"hostname,port,projectname,viewname,foldername,username,password,labelname,promotionstate");
}
/**
* Makes sure that the configuration survives the round-trip.
*/
@Test
public void testCheckout() throws Exception {
// prepare with base label
boolean promotionState = false;
FreeStyleProject project = createFreeStyleProject();
StarTeamSCM scm = new StarTeamSCM(hostName, port, projectName, viewName, folderName, userName, password, labelName, promotionState) ;
project.setScm(scm);
// config roundtrip
submit(new WebClient().getPage(project,"configure").getFormByName("config"));
FreeStyleBuild build = project.scheduleBuild2(0, new Cause.UserCause()).get();
System.out.println(build.getLog(LOG_LIMIT));
assertBuildStatus(Result.SUCCESS,build);
FreeStyleBuild lastBuild =project.getLastBuild();
Set<User> commiters = lastBuild.getCulprits();
Assert.assertNotNull(commiters);
Assert.assertFalse(commiters.isEmpty());
ChangeLogSet<? extends Entry> changes = lastBuild.getChangeSet();
Assert.assertFalse(changes.isEmptySet());
// try build again - it should not show any changes
build = project.scheduleBuild2(0, new Cause.UserCause()).get();
System.out.println(build.getLog(LOG_LIMIT));
assertBuildStatus(Result.SUCCESS,build);
lastBuild =project.getLastBuild();
commiters = lastBuild.getCulprits();
Assert.assertNotNull(commiters);
Assert.assertTrue("There should be no changes", commiters.isEmpty());
changes = lastBuild.getChangeSet();
Assert.assertTrue("There should be no changes", changes.isEmptySet());
// move to previous label
scm = new StarTeamSCM(hostName, port, projectName, viewName, folderName, userName, password, labelName+"Before", promotionState) ;
project.setScm(scm);
submit(new WebClient().getPage(project,"configure").getFormByName("config"));
build = project.scheduleBuild2(0, new Cause.UserCause()).get();
System.out.println(build.getLog(LOG_LIMIT));
assertBuildStatus(Result.SUCCESS,build);
lastBuild =project.getLastBuild();
commiters = lastBuild.getCulprits();
Assert.assertNotNull(commiters);
Assert.assertFalse(commiters.isEmpty());
// move to next label
scm = new StarTeamSCM(hostName, port, projectName, viewName, folderName, userName, password, labelName+"After", promotionState) ;
project.setScm(scm);
submit(new WebClient().getPage(project,"configure").getFormByName("config"));
build = project.scheduleBuild2(0, new Cause.UserCause()).get();
System.out.println(build.getLog(LOG_LIMIT));
assertBuildStatus(Result.SUCCESS,build);
lastBuild =project.getLastBuild();
commiters = lastBuild.getCulprits();
Assert.assertNotNull(commiters);
Assert.assertFalse(commiters.isEmpty());
}
/*
* (non-Javadoc)
*
* @see hudson.scm.SCM#createChangeLogParser()
*/
@Test
public void testCreateChangeLogParser() {
ChangeLogParser p = new StarTeamChangeLogParser();
assertNotNull(p);
}
/*
* (non-Javadoc)
*
* @see hudson.scm.SCM#getDescriptor()
*/
@Test
public void testGetDescriptor() {
SCMDescriptor<StarTeamSCM> d=t.getDescriptor();
assertNotNull(d);
assertSame(StarTeamSCM.DESCRIPTOR,d);
}
/*
* (non-Javadoc)
*
* @see hudson.scm.SCM#pollChanges(hudson.model.AbstractProject,
* hudson.Launcher, hudson.FilePath, hudson.model.TaskListener)
*/
@Test
public void testPollChanges() throws Exception {
FreeStyleProject project = createFreeStyleProject();
project.setScm(t);
final TaskListener listener = new StreamBuildListener (System.out,Charset.forName("UTF-8"));
FreeStyleBuild build = project.scheduleBuild2(0, new Cause.UserCause()).get();
System.out.println(build.getLog(LOG_LIMIT));
assertBuildStatus(Result.SUCCESS,build);
FreeStyleBuild lastBuild = project.getLastBuild();
assertNotNull(lastBuild);
// polling right after a build should not find any changes.
boolean result = project.pollSCMChanges(listener);
assertFalse(result);
}
/*
* Get the hostname this SCM is using.
*
* @see hudson.plugins.starteam.StarTeamSCM#getHostname()
*/
@Test
public void testGetHostname() {
assertEquals(hostName,t.getHostname());
}
/*
* Get the port number this SCM is using.
*
* @see hudson.plugins.starteam.StarTeamSCM#getPort()
*/
@Test
public void testGetPort() {
assertEquals(port,t.getPort());
}
/*
* Get the project name this SCM is connected to.
*
* @see hudson.plugins.starteam.StarTeamSCM#getProjectname()
*/
@Test
public void testGetProjectname() {
assertEquals(projectName, t.getProjectname());
}
/*
* Get the view name in the project this SCM uses.
*
* @see hudson.plugins.starteam.StarTeamSCM#getViewname()
*/
@Test
public void testGetViewname() {
assertEquals(viewName,t.getViewname());
}
/*
* Get the root folder name of our monitored workspace.
*
* @see hudson.plugins.starteam.StarTeamSCM#getFoldername()
*/
@Test
public void testGetFoldername() {
assertEquals(folderName,t.getFoldername());
}
/*
* Get the username used to connect to starteam.
*
* @see hudson.plugins.starteam.StarTeamSCM#getUsername()
*/
@Test
public void testGetUsername() {
assertEquals(userName,t.getUsername());
}
/*
* Get the password used to connect to starteam.
*
* @see hudson.plugins.starteam.StarTeamSCM#getPassword()
*/
@Test
public void testGetPassword() {
assertEquals(password,t.getPassword());
}
}