/*
* The MIT License
*
* Copyright (c) 2004-2009, Tom Huybrechts
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package hudson.plugins.claim;
import org.jvnet.hudson.test.HudsonTestCase;
import org.jvnet.hudson.test.FailureBuilder;
import hudson.model.Project;
import hudson.model.Build;
import hudson.model.User;
import hudson.model.Hudson;
import hudson.security.FullControlOnceLoggedInAuthorizationStrategy;
import hudson.security.HudsonPrivateSecurityRealm;
import java.io.IOException;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlLink;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlTextArea;
import com.gargoylesoftware.htmlunit.html.HtmlCheckBoxInput;
public class ClaimTest extends HudsonTestCase {
private Build<?,?> build;
private Project<?, ?> project;
@Override
protected void setUp() throws Exception {
super.setUp();
hudson.setAuthorizationStrategy(new FullControlOnceLoggedInAuthorizationStrategy());
HudsonPrivateSecurityRealm realm = new HudsonPrivateSecurityRealm(false);
hudson.setSecurityRealm(realm);
User user1 = realm.createAccount("user1", "user1");
User user2 = realm.createAccount("user2", "user2");
project = createFreeStyleProject("x");
project.getBuildersList().add(new FailureBuilder());
project.getPublishersList().add(new ClaimPublisher());
build = project.scheduleBuild2(0).get();
}
public void testHasClaimAction() {
assertNotNull(build.getAction(ClaimBuildAction.class));
}
public void testFirstClaim() throws Exception {
WebClient wc = new WebClient();
wc.login("user1", "user1");
HtmlPage page = wc.goTo("/job/x/" + build.getNumber());
((HtmlAnchor) page.getElementById("claim")).click();
HtmlForm form = page.getFormByName("claim");
HtmlTextArea textArea = (HtmlTextArea) last(form.selectNodes(".//textarea"));
HtmlCheckBoxInput checkBox = (HtmlCheckBoxInput) last(form.selectNodes(".//input[@type='checkbox']"));
checkBox.setChecked(false);
String claimText = "claimReason";
textArea.setText(claimText);
form.submit((HtmlButton) last(form.selectNodes(".//button")));
ClaimBuildAction action = build.getAction(ClaimBuildAction.class);
assertEquals("claiming user incorrect", "user1", action.getClaimedBy());
assertEquals("claim text incorrect", claimText, action.getReason());
assertTrue("build is not claimed", action.isClaimed());
assertFalse("build should not be sticky", action.isSticky());
}
public void testClaimForYourself() throws Exception {
build.getAction(ClaimBuildAction.class).claim("user2", "reason", true);
WebClient wc = new WebClient();
wc.login("user1", "user1");
HtmlPage page = wc.goTo("/job/x/" + build.getNumber());
((HtmlAnchor) page.getElementById("claimForYourself")).click();
HtmlForm form = page.getFormByName("claim");
HtmlTextArea textArea = (HtmlTextArea) last(form.selectNodes(".//textarea"));
String claimText = "claimReason";
textArea.setText(claimText);
form.submit((HtmlButton) form.getElementsByTagName("button").item(0));
ClaimBuildAction action = build.getAction(ClaimBuildAction.class);
assertEquals("claiming user incorrect", "user1", action.getClaimedBy());
assertEquals("claim text incorrect", claimText, action.getReason());
assertTrue(action.isClaimed());
}
public void testDropClaim() throws Exception {
build.getAction(ClaimBuildAction.class).claim("user1", "reason", true);
WebClient wc = new WebClient();
wc.login("user1", "user1");
HtmlPage page = wc.goTo("/job/x/" + build.getNumber());
((HtmlAnchor) page.getElementById("dropClaim")).click();
ClaimBuildAction action = build.getAction(ClaimBuildAction.class);
assertFalse(action.isClaimed());
}
public void testStickyBuild() throws Exception {
ClaimBuildAction action1 = build.getAction(ClaimBuildAction.class);
action1.claim("user1", "reason", true);
Build<?,?> nextBuild = project.scheduleBuild2(0).get();
ClaimBuildAction action2 = nextBuild.getAction(ClaimBuildAction.class);
assertTrue("build is not claimed", action2.isClaimed());
assertEquals("claiming user not equal", action1.getClaimedBy(), action2.getClaimedBy());
assertEquals("claim reason not equal", action1.getReason(), action2.getReason());
assertTrue("build should be sticky", action2.isSticky());
}
public void testNotStickyBuild() throws Exception {
ClaimBuildAction action1 = build.getAction(ClaimBuildAction.class);
action1.claim("user1", "reason", false);
Build<?,?> nextBuild = project.scheduleBuild2(0).get();
ClaimBuildAction action2 = nextBuild.getAction(ClaimBuildAction.class);
assertFalse("build is claimed", action2.isClaimed());
}
}