/*******************************************************************************
* Copyright (c) 2013, 2015 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 java.io.File;
import java.io.Reader;
import java.io.StringReader;
import java.net.URL;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import org.junit.Assert;
import org.junit.Test;
import com.ibm.team.build.internal.hjplugin.RTCChangeLogChangeSetEntry;
import com.ibm.team.build.internal.hjplugin.RTCChangeLogChangeSetEntry.ChangeDesc;
import com.ibm.team.build.internal.hjplugin.RTCChangeLogChangeSetEntry.WorkItemDesc;
import com.ibm.team.build.internal.hjplugin.RTCChangeLogComponentEntry;
import com.ibm.team.build.internal.hjplugin.RTCChangeLogParser;
import com.ibm.team.build.internal.hjplugin.RTCChangeLogSet;
import com.ibm.team.build.internal.hjplugin.RTCChangeLogSet.ComponentDescriptor;
import com.ibm.team.build.internal.hjplugin.RTCChangeLogSetEntry;
import com.ibm.team.build.internal.hjplugin.tests.utils.AbstractTestCase;
import hudson.scm.EditType;
@SuppressWarnings("nls")
public class RTCChangeLogParserTest extends AbstractTestCase {
//https://issues.jenkins-ci.org/browse/JENKINS-21977
private static final String EOL = System.getProperty("line.separator", "\n");
@Test
public void testBasic() throws Exception {
Reader changeLog = new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL +
"<changelog version=\"1\" baselineSetItemId=\"_u1CB8V-JEeKvo5cWqp-wYg\" baselineSetName=\"Jenkins Happy Build#44\" workspaceItemId=\"_cc-LYUhlEeK5tewUzhIIVw\">" + EOL +
" <component action=\"Added\" itemId=\"_9O6uoqjcEeGldOeoQAxwFA\" name=\"My favourite component\" />" + EOL +
" <changeset action=\"Added\" owner=\"heatherf\" date=\"1359389120942\" comment=\"my comment is really long from a UI perspective
And spans 3 lines containing incredibly awesome essential
information about the myriad of changes in the change set.\" changeSetItemId=\"_ojFTsVwQEeKvo5cWqp-wYg\" componentItemId=\"_K7ukIGPuEeKs7d1U683ZJg\" componentName=\"TestComponent1\">" + EOL +
" <changes>" + EOL +
" <change kind=\"2\" name=\"RTCFacade.java\" />" + EOL +
" <change kind=\"1\" name=\"RTCChangeLogParser.java\" />" + EOL +
" <change kind=\"0\" name=\"RTCBuildClient.java\" />" + EOL +
" <change kind=\"4\" name=\"RTCChangeLogSet.java\" />" + EOL +
" <change kind=\"8\" name=\"RTCChangeLogComponentEntry.java\" />" + EOL +
" <change kind=\"16\" name=\"RTCAlternateParser.java\" />" + EOL +
" </changes>" + EOL +
" <workItems>" + EOL +
" <workItem number=\"246737\" summary=\"HPI: Simple Hudson/Jenkins\" />" + EOL +
" </workItems>" + EOL +
" </changeset>" + EOL +
" <changeset action=\"Added\" owner=\"nedgar\" date=\"1359389181332\" comment=\"Add RTC project sources to Launch and it is magnificent\" changeSetItemId=\"_NIoxMVuWEeKvo5cWqp-wYg\" componentItemId=\"_K7ukIGPuEeKs7d1U683ZJg\" componentName=\"TestComponent1\">" + EOL +
" <changes>" + EOL +
" <change kind=\"2\" name=\"RTCFacade.java\" />" + EOL +
" <change kind=\"12\" name=\"RTCChangeLogSet2.java\" />" + EOL +
" <change kind=\"14\" name=\"RTCChangeLogComponentEntry2.java\" />" + EOL +
" </changes>" + EOL +
" <workItems>" + EOL +
" <workItem number=\"246335\" summary=\"As a developer of the Hudson/Jenkins plugin for RTC, I can compile and and run against the RTC client libraries\" />" + EOL +
" <workItem number=\"185990\" summary=\"Test Failure (RTC-Buildsystem-C20111122-1359): com.ibm.team.build.engine.tests.JazzScmPreBuildParticipantTests.testDeleteWithSymlinkExternalTarget\" />" + EOL +
" <workItem number=\"246737\" summary=\"HPI: Simple Hudson/Jenkins\" />" + EOL +
" </workItems>" + EOL +
" </changeset>" + EOL +
" <changeset action=\"Added\" owner=\"ADMIN\" date=\"1359131227571\" comment=\"\" changeSetItemId=\"_W8i8kUuCEeK5tewUzhIIVw\" componentItemId=\"_K7ukIGPuEeKs7d1U683ZJg\" componentName=\"TestComponent1\">" + EOL +
" <changes>" + EOL +
" <change kind=\"2\" name=\"pom.xml\" />" + EOL +
" </changes>" + EOL +
" <workItems>" + EOL +
" <workItem number=\"246737\" summary=\"HPI: Simple Hudson/Jenkins\"/>" + EOL +
" </workItems>" + EOL +
" </changeset>" + EOL +
" <changeset action=\"Dropped\" owner=\"ADMIN\" date=\"1359132327571\" comment=\"\" changeSetItemId=\"_xZS89ltAEeKvo5cWqp-wYg\" componentItemId=\"_K7ukIGPuEeKs7d1U683ZJg\" componentName=\"TestComponent1\">" + EOL +
" <changes>" + EOL +
" <change kind=\"2\" name=\"pom.xml\" />" + EOL +
" </changes>" + EOL +
" </changeset>" + EOL +
" <changeset action=\"Added\" owner=\"scowan\" date=\"1359129257571\" comment=\"share\" additionalChanges=\"2034\" changeSetItemId=\"_H7VJsUuOEeK5tewUzhIIVw\" componentItemId=\"_K7ukIGPuEeKs7d1U683ZJg\" componentName=\"TestComponent1\"/>" + EOL +
" <changeset action=\"Added\" owner=\"scowan\" date=\"1359131887571\" additionalChanges=\"129\" changeSetItemId=\"_AJnUgVpuEeKvo5cWqp-wYg\" componentItemId=\"_K7ukIGPuEeKs7d1U683ZJg\" componentName=\"TestComponent1\">" + EOL +
" <workItems>" + EOL +
" <workItem number=\"246335\" summary=\"As a developer of the Hudson/Jenkins plugin for RTC, I can compile and and run against the RTC client libraries\"/>" + EOL +
" <workItem number=\"185990\" summary=\"Test Failure (RTC-Buildsystem-C20111122-1359): com.ibm.team.build.engine.tests.JazzScmPreBuildParticipantTests.testDeleteWithSymlinkExternalTarget\" />" + EOL +
" <workItem number=\"246737\" summary=\"HPI: Simple Hudson/Jenkins\" />" + EOL +
" </workItems>" + EOL +
" </changeset>" + EOL +
" <component action=\"Dropped\" itemId=\"_jbCkEKjgEeGldOeoQAxwFA\" name=\"Bad bad component\" />" + EOL +
" <changeset action=\"Dropped\" owner=\"ADMIN\" date=\"1359123427571\" comment=\"\" changeSetItemId=\"_9PGm0WGiEeKvo5cWqp-wYg\" componentItemId=\"_yBCJIYXDEeKO4ogEo4hN1g\" componentName=\"TestComponent2\">" + EOL +
" </changeset>" + EOL +
"</changelog>");
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet result = (RTCChangeLogSet) parser.parse(null, null, changeLog);
// use the iterator to collect all the items
// compare against the other methods that return the categorized items
// make sure we have paths, workitems, first work items, etc.
Assert.assertEquals("baselineSetItemId", "_u1CB8V-JEeKvo5cWqp-wYg", result.getBaselineSetItemId());
Assert.assertEquals("baselineSetName", "Jenkins Happy Build#44", result.getBaselineSetName());
Set<RTCChangeLogComponentEntry> componentEntries = new HashSet<RTCChangeLogComponentEntry>();
Set<RTCChangeLogChangeSetEntry> acceptedEntries = new HashSet<RTCChangeLogChangeSetEntry>();
Set<RTCChangeLogChangeSetEntry> discardedEntries = new HashSet<RTCChangeLogChangeSetEntry>();
Iterator<RTCChangeLogSetEntry> i = result.iterator();
int count = 0;
for (;i.hasNext();) {
RTCChangeLogSetEntry change=i.next();
count++;
if (change instanceof RTCChangeLogComponentEntry) {
RTCChangeLogComponentEntry componentEntry = (RTCChangeLogComponentEntry) change;
Assert.assertEquals(0, componentEntry.getAffectedPaths().size());
componentEntries.add(componentEntry);
String message = componentEntry.getMsg();
if (message.contains("Added")) {
Assert.assertTrue(message, message.contains("My favourite component"));
} else if (message.contains("Dropped")) {
Assert.assertTrue(message, message.contains("Bad bad component"));
} else {
Assert.fail(message);
}
} else if (change instanceof RTCChangeLogChangeSetEntry) {
RTCChangeLogChangeSetEntry changeSetEntry = (RTCChangeLogChangeSetEntry) change;
if (changeSetEntry.isAccept()) {
acceptedEntries.add(changeSetEntry);
} else {
discardedEntries.add(changeSetEntry);
}
} else {
Assert.fail("unexpected change entry " + change.getClass().getName());
}
if (count > 256) break; // paranoia check
}
Assert.assertEquals("Number of changes in change log", 9, count);
Assert.assertEquals("Number of changes to components", 2, componentEntries.size());
Assert.assertEquals("Number of discarded change sets", 2, discardedEntries.size());
Assert.assertEquals(discardedEntries.size(), result.getChangeSetsDiscardedCount());
Assert.assertEquals("Number of accepted change sets", 5, acceptedEntries.size());
Assert.assertEquals(acceptedEntries.size(), result.getChangeSetsAcceptedCount());
Assert.assertEquals("Affected components", 2, result.getAffectedComponents().size());
// affected components are sorted by name so this should always work out
Iterator<ComponentDescriptor> iter = result.getAffectedComponents().iterator();
ComponentDescriptor affectedComponent1 = iter.next();
ComponentDescriptor affectedComponent2 = iter.next();
Assert.assertTrue(affectedComponent1.getName() + " " + affectedComponent2.getName(), affectedComponent2.getName().compareTo(affectedComponent1.getName()) > 0);
assertEquals(5, result.getChangeSetsAccepted(affectedComponent1.getItemId()).size());
assertEquals(0, result.getChangeSetsAccepted(affectedComponent2.getItemId()).size());
assertEquals(1, result.getChangeSetsDiscarded(affectedComponent1.getItemId()).size());
assertEquals(1, result.getChangeSetsDiscarded(affectedComponent2.getItemId()).size());
for (RTCChangeLogChangeSetEntry changeSetEntry : acceptedEntries) {
String changeSetItemId = changeSetEntry.getChangeSetItemId();
if (changeSetItemId.equals("_ojFTsVwQEeKvo5cWqp-wYg")) {
Assert.assertEquals("author", "heatherf", changeSetEntry.getOwner());
Assert.assertEquals("comment", "my comment is really long from a UI perspective\nAnd spans 3 lines containing incredibly awesome essential\ninformation about the myriad of changes in the change set.", changeSetEntry.getComment());
Assert.assertEquals("Change count for " + changeSetItemId, 6, changeSetEntry.getAffectedPaths().size());
Assert.assertTrue("change set date missmatch expected 2013-01-28 was " + changeSetEntry.getChangeSetModDate(), changeSetEntry.getChangeSetModDate().startsWith("2013-01-28"));
Assert.assertEquals("Versionable change count for " + changeSetItemId, 6, changeSetEntry.getAffectedVersionables().size());
Assert.assertEquals("Work item count " + changeSetItemId, 0, changeSetEntry.getAdditionalWorkItems().size());
WorkItemDesc workItem = changeSetEntry.getWorkItem();
Assert.assertEquals("Work item Number", "246737", workItem.getNumber());
Assert.assertEquals("Work item summary", "HPI: Simple Hudson/Jenkins", workItem.getSummary());
Assert.assertEquals("Additional work items", 0, changeSetEntry.getAdditionalWorkItems().size());
} else if (changeSetItemId.equals("_NIoxMVuWEeKvo5cWqp-wYg")) {
Assert.assertEquals("author", "nedgar", changeSetEntry.getOwner());
Assert.assertEquals("Component item id", "_K7ukIGPuEeKs7d1U683ZJg", changeSetEntry.getComponentItemId());
Assert.assertEquals("Component name", "TestComponent1", changeSetEntry.getComponentName());
Assert.assertEquals("workspace item id", "_cc-LYUhlEeK5tewUzhIIVw", changeSetEntry.getWorkspaceItemId());
Assert.assertEquals("Change count for " + changeSetItemId, 3, changeSetEntry.getAffectedPaths().size());
Assert.assertNotNull("Null primary work item", changeSetEntry.getWorkItem());
Assert.assertEquals("Work item count " + changeSetItemId, 2, changeSetEntry.getAdditionalWorkItems().size());
WorkItemDesc workItem = changeSetEntry.getWorkItem();
Assert.assertEquals("Work item Number", "246335", workItem.getNumber());
} else if (changeSetItemId.equals("_W8i8kUuCEeK5tewUzhIIVw")) {
Assert.assertEquals("author", "ADMIN", changeSetEntry.getOwner());
Assert.assertEquals("Change count for " + changeSetItemId, 1, changeSetEntry.getAffectedPaths().size());
Assert.assertEquals("Work item count " + changeSetItemId, 0, changeSetEntry.getAdditionalWorkItems().size());
ChangeDesc change = changeSetEntry.getAffectedVersionables().iterator().next();
Assert.assertEquals("Versionable name", "pom.xml", change.getName());
Assert.assertEquals("Change Kind", EditType.EDIT, change.getType());
WorkItemDesc workItem = changeSetEntry.getWorkItem();
Assert.assertEquals("Work item Number", "246737", workItem.getNumber());
} else if (changeSetItemId.equals("_H7VJsUuOEeK5tewUzhIIVw")) {
Assert.assertEquals("Change count for " + changeSetItemId, 0, changeSetEntry.getAffectedVersionables().size());
String path = changeSetEntry.getAffectedPaths().iterator().next();
Assert.assertTrue(path, path.contains("2034") || path.contains("2,034"));
Assert.assertTrue("Doesn't report back too many changes", changeSetEntry.isTooManyChanges());
Assert.assertTrue(changeSetEntry.getTooManyChangesMsg(),
changeSetEntry.getTooManyChangesMsg().contains("2034") || path.contains("2,034"));
Assert.assertNull("Primary work item", changeSetEntry.getWorkItem());
Assert.assertEquals("Work item count " + changeSetItemId, 0, changeSetEntry.getAdditionalWorkItems().size());
WorkItemDesc workItem = changeSetEntry.getWorkItem();
Assert.assertNull("primary work item", workItem);
} else if (changeSetItemId.equals("_AJnUgVpuEeKvo5cWqp-wYg")) {
Assert.assertEquals("Change count for " + changeSetItemId, 0, changeSetEntry.getAffectedVersionables().size());
String path = changeSetEntry.getAffectedPaths().iterator().next();
Assert.assertTrue(path, path.contains("129"));
Assert.assertTrue("Doesn't report back too many changes", changeSetEntry.isTooManyChanges());
Assert.assertTrue(changeSetEntry.getTooManyChangesMsg(), changeSetEntry.getTooManyChangesMsg().contains("129"));
Assert.assertEquals("Work item count " + changeSetItemId, 2, changeSetEntry.getAdditionalWorkItems().size());
} else {
Assert.fail("Unexpected change set " + changeSetItemId + " id=" + changeSetEntry.getOwner());
}
}
}
@Test
public void testMissingComponentName() throws Exception {
URL changeLogURL = getClass().getResource("MissingComponentName.xml");
File changeLogFile = new File(changeLogURL.toURI());
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet result = (RTCChangeLogSet) parser.parse(null, null, changeLogFile);
Assert.assertEquals(1, result.getAffectedComponents().size());
Assert.assertEquals(3, result.getChangeSetsAcceptedCount());
String componentItemId = result.getAffectedComponents().iterator().next().getItemId();
String componentName = result.getAffectedComponents().iterator().next().getName();
Assert.assertNull(componentName);
Assert.assertEquals(3, result.getChangeSetsAccepted(componentItemId).size());
}
@Test
public void testDuplicateComponentName() throws Exception {
URL changeLogURL = getClass().getResource("DuplicateComponentName.xml");
File changeLogFile = new File(changeLogURL.toURI());
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet result = (RTCChangeLogSet) parser.parse(null, null, changeLogFile);
Assert.assertEquals(2, result.getAffectedComponents().size());
Assert.assertEquals(2, result.getChangeSetsAcceptedCount());
Iterator<ComponentDescriptor> iterator = result.getAffectedComponents().iterator();
ComponentDescriptor descriptor1 = iterator.next();
ComponentDescriptor descriptor2 = iterator.next();
Assert.assertNotNull(descriptor1.getName());
Assert.assertEquals(descriptor1.getName(), descriptor2.getName());
Assert.assertNotSame(descriptor1.getItemId(), descriptor2.getItemId());
Assert.assertEquals(1, result.getChangeSetsAccepted(descriptor1.getItemId()).size());
Assert.assertEquals(1, result.getChangeSetsAccepted(descriptor2.getItemId()).size());
}
@Test
public void testEmpty() throws Exception {
Reader changeLog = new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL +
"<changelog version=\"1\" >" + EOL +
"</changelog>");
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet result = (RTCChangeLogSet) parser.parse(null, null, changeLog);
Assert.assertFalse("Expected no change entries", result.iterator().hasNext());
Assert.assertTrue("Expected it to be an empty set", result.isEmptySet());
Assert.assertEquals(0, result.getAffectedComponents().size());
}
@Test
public void testDefect261133() throws Exception {
URL changeLogURL = getClass().getResource("Defect261133.xml");
File changeLogFile = new File(changeLogURL.toURI());
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet result = (RTCChangeLogSet) parser.parse(null, null, changeLogFile);
Assert.assertEquals("ハローワールド #6", result.getBaselineSetName());
Assert.assertEquals(1, result.getAffectedComponents().size());
Assert.assertEquals(2, result.getChangeSetsAcceptedCount());
Iterator<ComponentDescriptor> iterator = result.getAffectedComponents().iterator();
ComponentDescriptor descriptor1 = iterator.next();
Assert.assertEquals("Jenkinsプロジェクト デフォルト・コンポーネント", descriptor1.getName());
Assert.assertEquals(2, result.getChangeSetsAccepted(descriptor1.getItemId()).size());
for (RTCChangeLogChangeSetEntry changeSet : result.getChangeSetsAccepted(descriptor1.getItemId())) {
if (changeSet.getChangeSetItemId().equals("_AU7yEKdBEeKcuK73L2Ob6A")) {
assertEquals("共有", changeSet.getComment());
} else {
assertEquals("あ", changeSet.getWorkItem().getSummary());
}
}
}
@Test
public void testPersonalBuild() throws Exception {
URL changeLogURL = getClass().getResource("PersonalBuild.xml");
File changeLogFile = new File(changeLogURL.toURI());
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet result = (RTCChangeLogSet) parser.parse(null, null, changeLogFile);
Assert.assertFalse("Expected no change entries", result.iterator().hasNext());
Assert.assertTrue("Expected it to be an empty set", result.isEmptySet());
Assert.assertEquals(0, result.getAffectedComponents().size());
Assert.assertTrue("Should be a personal build", result.isPersonalBuild());
}
@Test
public void testWorkspaceNameItemIdPair() throws Exception {
String workspaceName = "TestWorkspaceName";
String workspaceItemId = "_9O6uoqjcEeGldOeoQAxwFA";
Reader changelogReader = new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL +
"<changelog baselineSetName=\"Jenkins RTC Plugin Selfhost Build #31\""
+ " baselineSetItemId=\"_MIYgw4gaEeKBi6C3NnsqSw\" workspaceItemId=\"" +workspaceItemId + "\" workspaceName=\"" + workspaceName + "\"/>");
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet changelogSet = (RTCChangeLogSet) parser.parse(null, null, changelogReader);
// Assert
assertEquals(workspaceName, changelogSet.getWorkspaceName());
assertEquals(workspaceItemId, changelogSet.getWorkspaceItemId());
assertEquals(0, changelogSet.getChangeSetsAcceptedCount());
assertEquals(0, changelogSet.getChangeSetsDiscardedCount());
}
@Test
public void testWorkspaceNameMissingNoError() throws Exception {
String workspaceItemId = "_9O6uoqjcEeGldOeoQAxwFA";
Reader changelogReader = new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL +
"<changelog baselineSetName=\"Jenkins RTC Plugin Selfhost Build #31\""
+ " baselineSetItemId=\"_MIYgw4gaEeKBi6C3NnsqSw\" workspaceItemId=\"" +workspaceItemId + "\"/>");
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet changelogSet = (RTCChangeLogSet) parser.parse(null, null, changelogReader);
// Assert
assertEquals("Expecting a null workspace name", null, changelogSet.getWorkspaceName());
assertEquals(workspaceItemId, changelogSet.getWorkspaceItemId());
assertEquals(0, changelogSet.getChangeSetsAcceptedCount());
assertEquals(0, changelogSet.getChangeSetsDiscardedCount());
}
@Test
public void testBuildDefinitionIdItemIdPair() throws Exception {
String buildDefinitionItemId = "_9O6uoqjcEeGldOeoQAxwFA";
String buildDefinitionName = "TestBuildDefinition";
String baselineSetItemId = "_MIYgw4gaEeKBi6C3NnsqSw";
String baselineSetName = "Jenkins RTC Plugin Selfhost Build #31";
Reader changelogReader = new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL +
"<changelog baselineSetName=\"" + baselineSetName + "\"" + EOL +
" baselineSetItemId=\""+ baselineSetItemId + "\"" + EOL +
" buildDefinitionItemId=\"" + buildDefinitionItemId + "\"" + EOL +
" buildDefinitionName=\"" + buildDefinitionName + "\"" + EOL +
"/>");
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet changelogSet = (RTCChangeLogSet) parser.parse(null, null, changelogReader);
// Assert
assertEquals(buildDefinitionItemId, changelogSet.getBuildDefinitionItemId());
assertEquals(buildDefinitionName, changelogSet.getBuildDefinitionName());
assertEquals(baselineSetItemId, changelogSet.getBaselineSetItemId());
assertEquals(baselineSetName, changelogSet.getBaselineSetName());
assertEquals(0, changelogSet.getChangeSetsAcceptedCount());
assertEquals(0, changelogSet.getChangeSetsDiscardedCount());
}
@Test
public void testBuildStreamNameItemIdPair() throws Exception {
String streamItemId = "_9O6uoqjcEeGldOeoQAxwFA";
String streamName = "TestBuildDefinition";
String baselineSetItemId = "_MIYgw4gaEeKBi6C3NnsqSw";
String baselineSetName = "Jenkins RTC Plugin Selfhost Build #31";
Reader changelogReader = new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL +
"<changelog baselineSetName=\"" + baselineSetName + "\"" + EOL +
" baselineSetItemId=\""+ baselineSetItemId + "\"" + EOL +
" streamName=\"" + streamName + "\"" + EOL +
" streamItemId=\"" + streamItemId + "\"" + EOL +
"/>");
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet changelogSet = (RTCChangeLogSet) parser.parse(null, null, changelogReader);
// Assert
assertEquals(streamItemId, changelogSet.getStreamItemId());
assertEquals(streamName, changelogSet.getStreamName());
assertEquals(baselineSetItemId, changelogSet.getBaselineSetItemId());
assertEquals(baselineSetName, changelogSet.getBaselineSetName());
assertEquals(0, changelogSet.getChangeSetsAcceptedCount());
assertEquals(0, changelogSet.getChangeSetsDiscardedCount());
}
@Test
public void testMultipleArtifactNameItemIdPair() throws Exception {
String streamItemId = "_9O6uoqjcEeGldOeoQAxwFA";
String streamName = "TestBuildDefinition";
String workspaceName = "TestWorkspaceName";
String workspaceItemId = "_9O6uoqjcEeGldOeoQAxwFA";
String buildDefinitionItemId = "_9O6uoqjcEeGldOeoQAxwFA";
String buildDefinitionName = "TestBuildDefinition";
String baselineSetItemId = "_MIYgw4gaEeKBi6C3NnsqSw";
String baselineSetName = "Jenkins RTC Plugin Selfhost Build #31";
Reader changelogReader = new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL +
"<changelog baselineSetName=\"" + baselineSetName + "\"" + EOL +
" baselineSetItemId=\""+ baselineSetItemId + "\"" + EOL +
" streamName=\"" + streamName + "\"" + EOL +
" streamItemId=\"" + streamItemId + "\"" + EOL +
" buildDefinitionName=\"" + buildDefinitionName + "\"" + EOL +
" buildDefinitionItemId=\"" + buildDefinitionItemId + "\"" + EOL +
" workspaceName=\"" + workspaceName + "\"" + EOL +
" workspaceItemId=\"" + workspaceItemId + "\"" + EOL +
"/>");
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet changelogSet = (RTCChangeLogSet) parser.parse(null, null, changelogReader);
// Assert
assertEquals(streamItemId, changelogSet.getStreamItemId());
assertEquals(streamName, changelogSet.getStreamName());
assertEquals(buildDefinitionItemId, changelogSet.getBuildDefinitionItemId());
assertEquals(buildDefinitionName, changelogSet.getBuildDefinitionName());
assertEquals(baselineSetItemId, changelogSet.getBaselineSetItemId());
assertEquals(baselineSetName, changelogSet.getBaselineSetName());
assertEquals(workspaceName, changelogSet.getWorkspaceName());
assertEquals(workspaceItemId, changelogSet.getWorkspaceItemId());
assertEquals(0, changelogSet.getChangeSetsAcceptedCount());
assertEquals(0, changelogSet.getChangeSetsDiscardedCount());
}
@Test
public void testNonExistentPreviousBuildUrlIsNull() throws Exception {
Reader changelogReader = new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL +
"<changelog " + EOL +
"/>");
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet changelogSet = (RTCChangeLogSet) parser.parse(null, null, changelogReader);
// Assert
assertEquals(null, changelogSet.getPreviousBuildUrl());
}
@Test
public void testEmptyPreviousBuildUrlIsEmpty() throws Exception {
Reader changelogReader = new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL +
"<changelog " + EOL +
" previousBuildUrl=\"" + "\"" + EOL +
"/>");
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet changelogSet = (RTCChangeLogSet) parser.parse(null, null, changelogReader);
// Assert
assertEquals("", changelogSet.getPreviousBuildUrl());
}
@Test
public void testPreviousBuildUrl() throws Exception {
String previousBuildUrl = "/build/21";
Reader changelogReader = new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL +
"<changelog " + EOL +
" previousBuildUrl=\"" + previousBuildUrl + "\"" + EOL +
"/>");
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet changelogSet = (RTCChangeLogSet) parser.parse(null, null, changelogReader);
// Assert
assertEquals(previousBuildUrl, changelogSet.getPreviousBuildUrl());
}
@Test
public void testPreviousBuildUrlRetainsWhitespace() throws Exception {
// RTCChangeLogParser does not handle whitespaces
String previousBuildUrl = " /build/21 ";
Reader changelogReader = new StringReader("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + EOL +
"<changelog " + EOL +
" previousBuildUrl=\"" + previousBuildUrl + "\"" + EOL +
"/>");
RTCChangeLogParser parser = new RTCChangeLogParser();
RTCChangeLogSet changelogSet = (RTCChangeLogSet) parser.parse(null, null, changelogReader);
// Assert
assertEquals(previousBuildUrl, changelogSet.getPreviousBuildUrl());
}
}