/*
* The MIT License
*
* Copyright (c) 2013 IKEDA Yasuyuki
*
* 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.copyartifact;
import static org.junit.Assert.*;
import hudson.matrix.AxisList;
import hudson.matrix.Combination;
import hudson.matrix.MatrixConfiguration;
import hudson.matrix.MatrixProject;
import hudson.matrix.TextAxis;
import hudson.model.FreeStyleProject;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import org.apache.commons.lang.StringUtils;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.JenkinsRule.WebClient;
import org.jvnet.hudson.test.MockFolder;
/**
* Tests for {@link CopyArtifactPermissionProperty}
*/
public class CopyArtifactPermissionPropertyTest {
@Rule
public JenkinsRule j = new JenkinsRule();
@Test
public void testCopyArtifactPermissionProperty() throws Exception {
// single
{
CopyArtifactPermissionProperty target = new CopyArtifactPermissionProperty("project1");
assertEquals(Arrays.asList("project1"), target.getProjectNameList());
}
// multiple
{
CopyArtifactPermissionProperty target = new CopyArtifactPermissionProperty("project1,project2,project3");
assertEquals(Arrays.asList("project1","project2","project3"), target.getProjectNameList());
}
// single with blanks
{
CopyArtifactPermissionProperty target = new CopyArtifactPermissionProperty(" project1 ");
assertEquals(Arrays.asList("project1"), target.getProjectNameList());
}
// multiple with blanks
{
CopyArtifactPermissionProperty target = new CopyArtifactPermissionProperty(" project1 , project2 , project3 ");
assertEquals(Arrays.asList("project1","project2","project3"), target.getProjectNameList());
}
// mixed
{
CopyArtifactPermissionProperty target = new CopyArtifactPermissionProperty(", project1 , project2 , ,, project3 ,");
assertEquals(Arrays.asList("project1","project2","project3"), target.getProjectNameList());
}
// only blank
{
CopyArtifactPermissionProperty target = new CopyArtifactPermissionProperty(" ");
assertEquals(Collections.emptyList(), target.getProjectNameList());
}
// empty
{
CopyArtifactPermissionProperty target = new CopyArtifactPermissionProperty("");
assertEquals(Collections.emptyList(), target.getProjectNameList());
}
// null
{
CopyArtifactPermissionProperty target = new CopyArtifactPermissionProperty(null);
assertEquals(Collections.emptyList(), target.getProjectNameList());
}
}
@Test
public void testIsNameMatch() throws Exception {
// no pattern
assertTrue(CopyArtifactPermissionProperty.isNameMatch("project1", "project1"));
assertFalse(CopyArtifactPermissionProperty.isNameMatch("xproject1", "project1"));
assertFalse(CopyArtifactPermissionProperty.isNameMatch("roject1", "project1"));
// pattern
assertTrue(CopyArtifactPermissionProperty.isNameMatch("project1", "*"));
assertTrue(CopyArtifactPermissionProperty.isNameMatch("project1", "project1*"));
assertTrue(CopyArtifactPermissionProperty.isNameMatch("project1", "project*"));
assertTrue(CopyArtifactPermissionProperty.isNameMatch("project1", "p*1"));
assertTrue(CopyArtifactPermissionProperty.isNameMatch("project1", "p*oject*1"));
assertTrue(CopyArtifactPermissionProperty.isNameMatch("project1", "*project1"));
assertFalse(CopyArtifactPermissionProperty.isNameMatch("xproject1", "project*"));
assertFalse(CopyArtifactPermissionProperty.isNameMatch("xproject1", "p*1"));
assertFalse(CopyArtifactPermissionProperty.isNameMatch("proxject1", "p*oject*1"));
// regex pattern (should not treat as special characters)
assertTrue(CopyArtifactPermissionProperty.isNameMatch("+).][(\\\\", "+).][(\\\\"));
// null
assertFalse(CopyArtifactPermissionProperty.isNameMatch("project1", null));
assertFalse(CopyArtifactPermissionProperty.isNameMatch(null, "project1"));
assertFalse(CopyArtifactPermissionProperty.isNameMatch(null, null));
}
@Test
public void testCanCopyArtifact() throws Exception {
MockFolder folder = j.jenkins.createProject(MockFolder.class, "folder");
{
FreeStyleProject copiee = j.createFreeStyleProject();
FreeStyleProject copier1 = j.createFreeStyleProject();
FreeStyleProject copier2 = j.createFreeStyleProject();
FreeStyleProject copier3 = j.createFreeStyleProject();
copiee.addProperty(new CopyArtifactPermissionProperty(StringUtils.join(Arrays.asList(
copier1.getFullName(), copier2.getFullName()
), ',')));
assertTrue(CopyArtifactPermissionProperty.canCopyArtifact(copier1, copiee));
assertTrue(CopyArtifactPermissionProperty.canCopyArtifact(copier2, copiee));
assertFalse(CopyArtifactPermissionProperty.canCopyArtifact(copier3, copiee));
}
// same folder
{
FreeStyleProject copiee = folder.createProject(FreeStyleProject.class, "sameCopiee");
FreeStyleProject copier = folder.createProject(FreeStyleProject.class, "sameCopier");
copiee.addProperty(new CopyArtifactPermissionProperty("sameCopier"));
assertTrue(CopyArtifactPermissionProperty.canCopyArtifact(copier, copiee));
// absolute
copiee.removeProperty(CopyArtifactPermissionProperty.class);
copiee.addProperty(new CopyArtifactPermissionProperty("/folder/sameCopier"));
assertTrue(CopyArtifactPermissionProperty.canCopyArtifact(copier, copiee));
}
// parent folder
{
FreeStyleProject copiee = folder.createProject(FreeStyleProject.class, "parentCopiee");
FreeStyleProject copier = j.jenkins.createProject(FreeStyleProject.class, "parentCopier");
copiee.addProperty(new CopyArtifactPermissionProperty("../parentCopier"));
assertTrue(CopyArtifactPermissionProperty.canCopyArtifact(copier, copiee));
// absolute
copiee.removeProperty(CopyArtifactPermissionProperty.class);
copiee.addProperty(new CopyArtifactPermissionProperty("/parentCopier"));
assertTrue(CopyArtifactPermissionProperty.canCopyArtifact(copier, copiee));
}
// child folder
{
FreeStyleProject copiee = j.jenkins.createProject(FreeStyleProject.class, "childCopiee");
FreeStyleProject copier = folder.createProject(FreeStyleProject.class, "childCopier");
copiee.addProperty(new CopyArtifactPermissionProperty(String.format("%s/childCopier", folder.getName())));
assertTrue(CopyArtifactPermissionProperty.canCopyArtifact(copier, copiee));
// absolute
copiee.removeProperty(CopyArtifactPermissionProperty.class);
copiee.addProperty(new CopyArtifactPermissionProperty("/folder/childCopier"));
assertTrue(CopyArtifactPermissionProperty.canCopyArtifact(copier, copiee));
}
}
@Test
public void testDescriptorNewInstance() throws Exception {
WebClient wc = j.createWebClient();
// not configured
{
FreeStyleProject p = j.createFreeStyleProject();
assertNull(p.getProperty(CopyArtifactPermissionProperty.class));
j.submit(wc.getPage(p, "configure").getFormByName("config"));
p = j.jenkins.getItemByFullName(p.getFullName(), FreeStyleProject.class);
assertNotNull(p);
assertNull(p.getProperty(CopyArtifactPermissionProperty.class));
}
// configured
{
FreeStyleProject p = j.createFreeStyleProject();
p.addProperty(new CopyArtifactPermissionProperty("project1"));
j.submit(wc.getPage(p, "configure").getFormByName("config"));
p = j.jenkins.getItemByFullName(p.getFullName(), FreeStyleProject.class);
assertNotNull(p);
CopyArtifactPermissionProperty prop = p.getProperty(CopyArtifactPermissionProperty.class);
assertNotNull(prop);
assertEquals("project1", prop.getProjectNames());
}
}
@Test
public void testDescriptorCheckNotFoundProjects() throws Exception {
CopyArtifactPermissionProperty.DescriptorImpl d
= (CopyArtifactPermissionProperty.DescriptorImpl)j.jenkins.getDescriptor(CopyArtifactPermissionProperty.class);
j.createFreeStyleProject("project1");
j.createFreeStyleProject("project2");
MatrixProject matrix = createMatrixProject("matrix1");
AxisList axes = new AxisList(new TextAxis("axis1", "value1"));
matrix.setAxes(axes);
MatrixConfiguration matrixConf = matrix.getItem(new Combination(axes, "value1"));
MockFolder folder = j.jenkins.createProject(MockFolder.class, "folder");
folder.createProject(FreeStyleProject.class, "child1");
folder.createProject(FreeStyleProject.class, "child2");
assertEquals(Collections.emptyList(), d.checkNotFoundProjects("folder/child1", j.jenkins));
assertEquals(Collections.emptyList(), d.checkNotFoundProjects(" project1,, project2, matrix1,folder/child1, folder/child2", j.jenkins));
assertEquals(Collections.emptyList(), d.checkNotFoundProjects("child1,child2,../project1", folder));
assertEquals(Collections.emptyList(), d.checkNotFoundProjects(null, j.jenkins));
assertEquals(Collections.emptyList(), d.checkNotFoundProjects("", j.jenkins));
assertEquals(Collections.emptyList(), d.checkNotFoundProjects("project*,*,nosuch*", j.jenkins));
assertEquals(Arrays.asList(matrixConf.getFullDisplayName()), d.checkNotFoundProjects(matrixConf.getFullDisplayName(), j.jenkins));
assertEquals(Arrays.asList("nosuch1", "nosuch2"), d.checkNotFoundProjects("nosuch1,project1,,nosuch2", j.jenkins));
}
@Test
public void testDescriptorDoAutoCompleteProjectNames() throws Exception {
CopyArtifactPermissionProperty.DescriptorImpl d
= (CopyArtifactPermissionProperty.DescriptorImpl)j.jenkins.getDescriptor(CopyArtifactPermissionProperty.class);
FreeStyleProject freestyle = j.createFreeStyleProject("project1");
MatrixProject matrix = createMatrixProject("matrix1");
AxisList axes = new AxisList(new TextAxis("axis1", "value1"));
matrix.setAxes(axes);
MockFolder folder = j.jenkins.createProject(MockFolder.class, "folder");
FreeStyleProject child = folder.createProject(FreeStyleProject.class, "child1");
assertEquals(Arrays.asList("project1"), d.doAutoCompleteProjectNames("p", freestyle).getValues());
assertEquals(Arrays.asList("project1"), d.doAutoCompleteProjectNames(" p", freestyle).getValues());
assertEquals(Arrays.asList("matrix1"), d.doAutoCompleteProjectNames("m", freestyle).getValues());
assertEquals(Arrays.asList("folder/child1"), d.doAutoCompleteProjectNames("f", freestyle).getValues());
assertEquals(Arrays.asList("child1"), d.doAutoCompleteProjectNames("c", child).getValues());
assertEquals(Arrays.asList("../project1"), d.doAutoCompleteProjectNames("../p", child).getValues());
assertEquals(Collections.emptyList(), d.doAutoCompleteProjectNames("x", freestyle).getValues());
assertEquals(Collections.emptyList(), d.doAutoCompleteProjectNames("", freestyle).getValues());
}
/**
* Creates an empty Matrix project with the provided name.
*
* @param name Project name.
* @return an empty Matrix project with the provided name.
*/
private MatrixProject createMatrixProject(String name) throws IOException {
return j.jenkins.createProject(MatrixProject.class, name);
}
}