/*
* The MIT License
*
* Copyright 2011 Sony Ericsson Mobile Communications. All rights reserved.
*
* 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 com.sonyericsson.hudson.plugins.metadata.cli;
import com.sonyericsson.hudson.plugins.metadata.MockUtils;
import com.sonyericsson.hudson.plugins.metadata.model.MetadataBuildAction;
import com.sonyericsson.hudson.plugins.metadata.model.MetadataJobProperty;
import com.sonyericsson.hudson.plugins.metadata.model.MetadataNodeProperty;
import com.sonyericsson.hudson.plugins.metadata.model.MetadataParent;
import com.sonyericsson.hudson.plugins.metadata.model.values.MetadataValue;
import hudson.matrix.MatrixProject;
import hudson.model.FreeStyleBuild;
import hudson.model.FreeStyleProject;
import hudson.model.Hudson;
import hudson.model.JobProperty;
import hudson.model.Node;
import hudson.model.TopLevelItem;
import hudson.util.DescribableList;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kohsuke.args4j.CmdLineException;
import org.mockito.Matchers;
import org.mockito.internal.util.reflection.Whitebox;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.same;
import static org.mockito.Mockito.isA;
//CS IGNORE MagicNumber FOR NEXT 400 LINES. REASON: TestData
/**
* Tests for {@link CliUtils}.
*
* @author Robert Sandell <robert.sandell@sonyericsson.com>
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(Hudson.class)
public class CliUtilsTest {
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with no job or node.
*
* @throws Exception if so.
*/
@Test(expected = CmdLineException.class)
public void testGetContainerBadParams() throws Exception {
CliUtils.getContainer(null, null, null, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with no job but a node and a build.
*
* @throws Exception if so.
*/
@Test(expected = CmdLineException.class)
public void testGetContainerBadParams2() throws Exception {
CliUtils.getContainer("Test", null, 1, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with no job or node as empty strings.
*
* @throws Exception if so.
*/
@Test(expected = CmdLineException.class)
public void testGetContainerBadParams3() throws Exception {
CliUtils.getContainer("", "", null, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with no job but a node and a build as empty
* strings.
*
* @throws Exception if so.
*/
@Test(expected = CmdLineException.class)
public void testGetContainerBadParams4() throws Exception {
CliUtils.getContainer("Test", "", 1, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a non existent node.
*
* @throws Exception if so.
*/
@Test(expected = CliUtils.NoItemException.class)
public void testGetContainerNoNode() throws Exception {
Hudson hudson = MockUtils.mockHudson();
when(hudson.getNode("fake")).thenReturn(null);
CliUtils.getContainer("fake", null, null, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a existent node but no metadata.
*
* @throws Exception if so.
*/
@Test(expected = CliUtils.NoMetadataException.class)
public void testGetContainerNoMetadataOnNode() throws Exception {
Hudson hudson = MockUtils.mockHudson();
Node node = mock(Node.class);
when(hudson.getNode("theNode")).thenReturn(node);
DescribableList describableList = mock(DescribableList.class);
when(node.getNodeProperties()).thenReturn(describableList);
when(describableList.get(MetadataNodeProperty.class)).thenReturn(null);
CliUtils.getContainer("theNode", null, null, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a node.
*
* @throws Exception if so.
*/
@Test()
public void testGetContainerOnNode() throws Exception {
Hudson hudson = MockUtils.mockHudson();
Node node = mock(Node.class);
when(hudson.getNode("theNode")).thenReturn(node);
DescribableList describableList = mock(DescribableList.class);
when(node.getNodeProperties()).thenReturn(describableList);
MetadataNodeProperty property = mock(MetadataNodeProperty.class);
when(describableList.get(MetadataNodeProperty.class)).thenReturn(property);
MetadataParent container = CliUtils.getContainer("theNode", null, null, false);
assertNotNull(container);
assertSame(property, container);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a existent node but no metadata.
*
* @throws Exception if so.
*/
@Test(expected = CliUtils.NoMetadataException.class)
public void testGetContainerNoPropertiesOnNode() throws Exception {
Hudson hudson = MockUtils.mockHudson();
Node node = mock(Node.class);
when(hudson.getNode("theNode")).thenReturn(node);
when(node.getNodeProperties()).thenReturn(null);
CliUtils.getContainer("theNode", null, null, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a existent node but no metadata.
*
* @throws Exception if so.
*/
@Test(expected = CliUtils.NoMetadataException.class)
public void testGetContainerNoPropertiesOnNodeCreate() throws Exception {
Hudson hudson = MockUtils.mockHudson();
Node node = mock(Node.class);
when(hudson.getNode("theNode")).thenReturn(node);
when(node.getNodeProperties()).thenReturn(null);
CliUtils.getContainer("theNode", null, null, true);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a existent node and no metadata that
* should be created.
*
* @throws Exception if so.
*/
@Test
public void testGetContainerNoMetadataOnNodeCreate() throws Exception {
Hudson hudson = MockUtils.mockHudson();
Node node = mock(Node.class);
when(hudson.getNode("theNode")).thenReturn(node);
DescribableList describableList = mock(DescribableList.class);
when(node.getNodeProperties()).thenReturn(describableList);
when(describableList.get(MetadataNodeProperty.class)).thenReturn(null);
MetadataParent container = CliUtils.getContainer("theNode", null, null, true);
assertNotNull(container);
verify(describableList).add(same(container));
assertSame(node, Whitebox.getInternalState(container, "node"));
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a non existent job.
*
* @throws Exception if so.
*/
@Test(expected = CliUtils.NoItemException.class)
public void testGetContainerNoJob() throws Exception {
Hudson hudson = MockUtils.mockHudson();
when(hudson.getItem("fake")).thenReturn(null);
CliUtils.getContainer(null, "fake", null, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a job.
*
* @throws Exception if so.
*/
@Test
public void testGetContainerJob() throws Exception {
Hudson hudson = MockUtils.mockHudson();
FreeStyleProject project = mock(FreeStyleProject.class);
when(hudson.getItem("fake")).thenReturn(project);
MetadataJobProperty property = mock(MetadataJobProperty.class);
when(project.getProperty(MetadataJobProperty.class)).thenReturn(property);
MetadataParent<MetadataValue> container = CliUtils.getContainer(null, "fake", null, false);
assertNotNull(container);
assertSame(property, container);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a existent item that is not a job.
*
* @throws Exception if so.
*/
@Test(expected = CliUtils.NoItemException.class)
public void testGetContainerItemButNoJob() throws Exception {
Hudson hudson = MockUtils.mockHudson();
TopLevelItem itemMock = mock(TopLevelItem.class);
when(hudson.getItem("fake")).thenReturn(itemMock);
CliUtils.getContainer(null, "fake", null, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a existent job but no metadata.
*
* @throws Exception if so.
*/
@Test(expected = CliUtils.NoMetadataException.class)
public void testGetContainerNoMetadataOnJob() throws Exception {
Hudson hudson = MockUtils.mockHudson();
FreeStyleProject project = mock(FreeStyleProject.class);
when(hudson.getItem("theJob")).thenReturn(project);
when(project.getProperty(MetadataJobProperty.class)).thenReturn(null);
CliUtils.getContainer(null, "theJob", null, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a existent job but no metadata.
*
* @throws Exception if so.
*/
@Test(expected = CliUtils.NoMetadataException.class)
public void testGetContainerNoMetadataOnMatrixJob() throws Exception {
Hudson hudson = MockUtils.mockHudson();
MatrixProject project = mock(MatrixProject.class);
when(hudson.getItem("theJob")).thenReturn(project);
when(project.getProperty(MetadataJobProperty.class)).thenReturn(null);
CliUtils.getContainer(null, "theJob", null, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a existent job and no metadata that
* should be created.
*
* @throws Exception if so.
*/
@Test
public void testGetContainerNoMetadataOnJobCreate() throws Exception {
Hudson hudson = MockUtils.mockHudson();
FreeStyleProject project = mock(FreeStyleProject.class);
when(hudson.getItem("theJob")).thenReturn(project);
when(project.getProperty(MetadataJobProperty.class)).thenReturn(null);
MetadataParent<MetadataValue> container = CliUtils.getContainer(null, "theJob", null, true);
assertNotNull(container);
verify(project).addProperty(Matchers.<JobProperty>same((JobProperty)container));
assertSame(project, Whitebox.getInternalState(container, "owner"));
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a existent build but no metadata.
*
* @throws Exception if so.
*/
@Test(expected = CliUtils.NoMetadataException.class)
public void testGetContainerNoMetadataOnBuild() throws Exception {
Hudson hudson = MockUtils.mockHudson();
FreeStyleProject project = mock(FreeStyleProject.class);
when(hudson.getItem("theJob")).thenReturn(project);
FreeStyleBuild build = mock(FreeStyleBuild.class);
when(project.getBuildByNumber(1)).thenReturn(build);
when(build.getAction(MetadataBuildAction.class)).thenReturn(null);
CliUtils.getContainer(null, "theJob", 1, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a existent build but no metadata.
*
* @throws Exception if so.
*/
@Test()
public void testGetContainerOnBuild() throws Exception {
Hudson hudson = MockUtils.mockHudson();
FreeStyleProject project = mock(FreeStyleProject.class);
when(hudson.getItem("theJob")).thenReturn(project);
FreeStyleBuild build = mock(FreeStyleBuild.class);
when(project.getBuildByNumber(1)).thenReturn(build);
MetadataBuildAction action = mock(MetadataBuildAction.class);
when(build.getAction(MetadataBuildAction.class)).thenReturn(action);
MetadataParent<MetadataValue> container = CliUtils.getContainer(null, "theJob", 1, false);
assertNotNull(container);
assertSame(action, container);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)} with a existent build but no metadata.
*
* @throws Exception if so.
*/
@Test(expected = CliUtils.NoItemException.class)
public void testGetContainerNoBuild() throws Exception {
Hudson hudson = MockUtils.mockHudson();
FreeStyleProject project = mock(FreeStyleProject.class);
when(hudson.getItem("theJob")).thenReturn(project);
when(project.getBuildByNumber(10)).thenReturn(null);
CliUtils.getContainer(null, "theJob", 10, false);
}
/**
* Tests {@link CliUtils#getContainer(String, String, Integer, boolean)}
* with a existent job build no metadata, that should be created.
*
* @throws Exception if so.
*/
@Test()
public void testGetContainerNoMetadataOnBuildCreate() throws Exception {
Hudson hudson = MockUtils.mockHudson();
FreeStyleProject project = mock(FreeStyleProject.class);
when(hudson.getItem("theJob")).thenReturn(project);
FreeStyleBuild build = mock(FreeStyleBuild.class);
when(project.getBuildByNumber(1)).thenReturn(build);
when(build.getAction(MetadataBuildAction.class)).thenReturn(null);
MetadataParent container = CliUtils.getContainer(null, "theJob", 1, true);
assertNotNull(container);
verify(build).addAction(isA(MetadataBuildAction.class));
}
}