/*
* Copyright (c) 2013-2017 Chris Newland.
* Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD
* Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki
*/
package org.adoptopenjdk.jitwatch.test;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_RELEASE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_VM_VERSION;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import org.adoptopenjdk.jitwatch.core.JITWatchConstants;
import org.adoptopenjdk.jitwatch.core.TagProcessor;
import org.adoptopenjdk.jitwatch.model.Tag;
import org.junit.Test;
public class TestTagProcessor
{
@Test
public void testSingleLine()
{
TagProcessor tp = new TagProcessor();
String line = "<klass id='632' name='java/lang/String' flags='17'/>";
Tag tag = tp.processLine(line);
assertEquals("klass", tag.getName());
assertEquals(3, tag.getAttributes().size());
assertEquals("632", tag.getAttributes().get("id"));
assertEquals("java/lang/String", tag.getAttributes().get("name"));
assertEquals("17", tag.getAttributes().get("flags"));
assertTrue(!tp.wasFragmentSeen());
}
@Test
public void testSingleTag2Lines()
{
String line1 = "<loop idx='1012' inner_loop='1' >";
String line2 = "</loop>";
TagProcessor tp = new TagProcessor();
Tag tag = tp.processLine(line1);
assertNull(tag);
tag = tp.processLine(line2);
assertEquals("loop", tag.getName());
assertEquals(2, tag.getAttributes().size());
assertEquals("1012", tag.getAttributes().get("idx"));
assertEquals("1", tag.getAttributes().get("inner_loop"));
}
@Test
public void testNestedTags()
{
String line1 = "<phase name='idealLoop' nodes='1119' stamp='14.151'>";
String line2 = "<loop_tree>";
String line3 = "<loop idx='1124' >";
String line4 = "</loop>";
String line5 = "<loop idx='1012' inner_loop='1' >";
String line6 = "</loop>";
String line7 = "</loop_tree>";
String line8 = "<phase_done nodes='1144' stamp='14.151'/>";
String line9 = "</phase>";
String[] lines = new String[] { line1, line2, line3, line4, line5, line6, line7, line8, line9 };
TagProcessor tp = new TagProcessor();
int count = 0;
Tag tag = null;
for (String line : lines)
{
tag = tp.processLine(line);
if (count++ < lines.length - 1)
{
assertNull(tag);
}
}
assertNotNull(tag);
assertEquals("phase", tag.getName());
assertEquals(2, tag.getChildren().size());
Tag child0 = tag.getChildren().get(0);
assertEquals("loop_tree", child0.getName());
assertEquals(0, child0.getAttributes().size());
assertEquals(2, child0.getChildren().size());
Tag child01 = child0.getChildren().get(0);
assertEquals("loop", child01.getName());
assertEquals("1124", child01.getAttributes().get("idx"));
Tag child02 = child0.getChildren().get(1);
assertEquals("loop", child02.getName());
assertEquals("1012", child02.getAttributes().get("idx"));
assertEquals("1", child02.getAttributes().get("inner_loop"));
Tag child1 = tag.getChildren().get(1);
assertEquals("phase_done", child1.getName());
assertEquals(2, child1.getAttributes().size());
assertEquals(0, child1.getChildren().size());
assertEquals("1144", child1.getAttributes().get("nodes"));
assertEquals("14.151", child1.getAttributes().get("stamp"));
}
@Test
public void testTask()
{
String line1 = "<task compile_id='21' method='java/util/Properties loadConvert ([CII[C)Ljava/lang/String;' bytes='505' count='10000' backedge_count='5668' iicount='108' stamp='6.801'>";
String line2 = "<task_done success='1' nmsize='3160' count='10000' backedge_count='5723' stamp='6.744'/>";
String line3 = "</task>";
String[] lines = new String[] { line1, line2, line3 };
TagProcessor tp = new TagProcessor();
int count = 0;
Tag tag = null;
for (String line : lines)
{
tag = tp.processLine(line);
if (count++ < lines.length - 1)
{
assertNull(tag);
}
}
assertNotNull(tag);
assertEquals(7, tag.getAttributes().size());
assertEquals("java/util/Properties loadConvert ([CII[C)Ljava/lang/String;", tag.getAttributes().get("method"));
}
@Test
public void testGetChildren()
{
String line1 = "<a foo='1'>";
String line2 = "<b foo='2' bar='baz'/>";
String line3 = "<b foo='2'/>";
String line4 = "<b foo='bar'/>";
String line5 = "</a>";
String[] lines = new String[] { line1, line2, line3, line4, line5 };
TagProcessor tp = new TagProcessor();
int count = 0;
Tag tag = null;
for (String line : lines)
{
tag = tp.processLine(line);
if (count++ < lines.length - 1)
{
assertNull(tag);
}
}
assertNotNull(tag);
List<Tag> children = tag.getNamedChildren("b");
assertEquals(3, children.size());
Tag firstChild = tag.getFirstNamedChild("b");
assertEquals("2", firstChild.getAttributes().get("foo"));
assertEquals("baz", firstChild.getAttributes().get("bar"));
List<Tag> childrenWithAttr = tag.getNamedChildrenWithAttribute("b", "bar", "baz");
assertEquals(1, childrenWithAttr.size());
}
@Test
public void testTextNodes()
{
String line0 = "<vm_version>";
String line1 = "<name>";
String line2 = "Java HotSpot(TM) 64-Bit Server VM";
String line3 = "</name>";
String line4 = "<release>";
String line5 = "25.0-b70";
String line6 = "</release>";
String line7 = "<info>";
String line8 = "Java HotSpot(TM) 64-Bit Server VM (25.0-b70) for linux-amd64 JRE (1.8.0-b132), built on Mar 4 2014 03:07:25 by "java_re" with gcc 4.3.0 20080428 (RedHat 4.3.0-8)";
String line9 = "</info>";
String line10 = "</vm_version>";
String[] lines = new String[] { line0, line1, line2, line3, line4, line5, line6, line7, line8, line9, line10 };
TagProcessor tp = new TagProcessor();
int count = 0;
Tag tag = null;
for (String line : lines)
{
tag = tp.processLine(line);
if (count++ < lines.length - 1)
{
assertNull(tag);
}
}
assertNotNull(tag);
assertEquals(TAG_VM_VERSION, tag.getName());
List<Tag> children = tag.getChildren();
assertEquals(3, children.size());
Tag tagRelease = children.get(1);
assertEquals(TAG_RELEASE, tagRelease.getName());
assertEquals(line5, tagRelease.getTextContent());
}
@Test
public void testTextNodesWithClosingTagOnSameLine()
{
String line0 = "<vm_version>";
String line1 = "<name>";
String line2 = "Java HotSpot(TM) 64-Bit Server VM</name>";
String line4 = "<release>";
String line5 = "25.0-b70";
String line6 = "</release>";
String line7 = "<info>";
String line8 = "Java HotSpot(TM) 64-Bit Server VM (25.0-b70) for linux-amd64 JRE (1.8.0-b132), built on Mar 4 2014 03:07:25 by "java_re" with gcc 4.3.0 20080428 (RedHat 4.3.0-8)";
String line9 = "</info>";
String line10 = "</vm_version>";
String[] lines = new String[] { line0, line1, line2, line4, line5, line6, line7, line8, line9, line10 };
TagProcessor tp = new TagProcessor();
int count = 0;
Tag tag = null;
for (String line : lines)
{
tag = tp.processLine(line);
if (count++ < lines.length - 1)
{
assertNull(tag);
}
}
assertNotNull(tag);
assertEquals(TAG_VM_VERSION, tag.getName());
List<Tag> children = tag.getChildren();
assertEquals(3, children.size());
Tag tagRelease = children.get(1);
assertEquals(TAG_RELEASE, tagRelease.getName());
assertEquals(line5, tagRelease.getTextContent());
}
/*
* Scenario: Parsing an undefined line Given an undefined line is available
* When the tag processor parses such a line Then no tag objects are
* returned
*/
@Test
public void givenAnUndefinedLineIsAvailable_WhenTheTagProcessorProcessesIt_ThenNoTagsAreReturned()
{
// Given
Tag expectedParseResult = null;
String line = null;
// When
TagProcessor tagProcessor = new TagProcessor();
Tag actualParseResult = tagProcessor.processLine(line);
// Then
assertThat("No tags should have been returned.", actualParseResult, is(equalTo(expectedParseResult)));
}
/*
* Scenario: Parsing a line containing partially completed tag Given a line
* containing a partially completed tag is available When the tag processor
* parses such a line Then no tag objects are returned
*/
@Test
public void givenAThreeCharatersLineStartingWithOpenBracket_WhenTheTagProcessorActionsIt_ThenNoTagsAreReturned()
{
// Given
Tag expectedParseResult = null;
String lineWith3LettersStartingWithOpenAngleBracket = JITWatchConstants.C_OPEN_ANGLE + "12";
// When
TagProcessor tagProcessor = new TagProcessor();
Tag actualParseResult = tagProcessor.processLine(lineWith3LettersStartingWithOpenAngleBracket);
// Then
assertThat("No tags should have been returned.", actualParseResult, is(equalTo(expectedParseResult)));
}
/*
* Scenario: Parsing a line containing different open and close tags Given a
* line containing an open tag of type 'task' And another closing tag of
* type 'tag' When the tag processor parses such a line Then no tags should
* be returned
*/
@Test
public void givenALineWithTwoDifferentOpenCloseTags_WhenTheTagProcessorActionsIt_ThenNoTagsAreReturned()
{
// Given
Tag expectedParseResult = null;
String aLineWithOpeningTag = "<loop idx='1012' inner_loop='1' >";
String aLineWithClosingTag = "</line>";
// When
TagProcessor tagProcessor = new TagProcessor();
tagProcessor.processLine(aLineWithOpeningTag);
Tag actualTag = tagProcessor.processLine(aLineWithClosingTag);
// Then
assertThat("No tags should have been returned.", actualTag, is(equalTo(expectedParseResult)));
}
/*
* Scenario: Parsing a line containing an opening tag without a closing
* angle bracket (invalid) Given a line containing an open tag And the
* closing angle bracket of the tag is missing When the tag processor parses
* such a line Then no tags should be returned
*/
@Test
public void givenALineWithAnOpenTagWithNoCloseAngleBracket_WhenTheTagProcessorActionsIt_ThenNoTagsAreReturned()
{
// Given
Tag expectedParseResult = null;
String aLineWithOpeningTagWithoutClosingAngleBracket = "<loop";
// When
TagProcessor tagProcessor = new TagProcessor();
Tag actualTag = tagProcessor.processLine(aLineWithOpeningTagWithoutClosingAngleBracket);
// Then
assertThat("No tags should have been returned.", actualTag, is(equalTo(expectedParseResult)));
}
@Test
public void testRegressionFragmentTag()
{
List<String> lines = new ArrayList<>();
lines.add("<fragment>");
// lines.add("<![CDATA["); - stripped by log splitter
lines.add("<z attr0='zzz'/>");
lines.add("<a attr1='aaa'>");
lines.add("<b attr2='bbb' attr3='ccc'/>");
lines.add("<c attr4='ddd'/>");
lines.add("<d attr5='eee'>");
// lines.add("]]>"); - stripped by log splitter
lines.add("</fragment>");
TagProcessor tp = new TagProcessor();
Tag tag = null;
tag = tp.processLine(lines.get(0)); // <fragment>
tag = tp.processLine(lines.get(1)); // <a attr1='aaa'>
assertEquals("z", tag.getName());
assertEquals(1, tag.getAttributes().size());
assertEquals("zzz", tag.getAttributes().get("attr0"));
assertEquals(0, tag.getChildren().size());
tag = tp.processLine(lines.get(2)); // <a attr1='aaa'>
assertNull(tag);
tag = tp.processLine(lines.get(3)); // <b attr2='bbb' attr3='ccc'/>
assertNull(tag);
tag = tp.processLine(lines.get(4)); // <c attr4='ddd'/>
assertNull(tag);
tag = tp.processLine(lines.get(5)); // <d attr5='eee'>
assertNull(tag);
tag = tp.processLine(lines.get(6)); // </fragment>
assertNotNull(tag);
assertEquals("a", tag.getName());
assertEquals("aaa", tag.getAttributes().get("attr1"));
assertEquals(3, tag.getChildren().size());
List<Tag> childrenB = tag.getNamedChildren("b");
assertEquals(1, childrenB.size());
Tag firstChildB = tag.getFirstNamedChild("b");
assertEquals(2, firstChildB.getAttributes().size());
assertEquals("bbb", firstChildB.getAttributes().get("attr2"));
assertEquals("ccc", firstChildB.getAttributes().get("attr3"));
Tag firstChildC = tag.getFirstNamedChild("c");
assertEquals(1, firstChildC.getAttributes().size());
assertEquals("ddd", firstChildC.getAttributes().get("attr4"));
Tag firstChildD = tag.getFirstNamedChild("d");
assertEquals(1, firstChildD.getAttributes().size());
assertEquals("eee", firstChildD.getAttributes().get("attr5"));
assertTrue(tp.wasFragmentSeen());
}
@Test
public void testRegressionFragmentTagNotBroken()
{
List<String> lines = new ArrayList<>();
lines.add("<fragment>");
// lines.add("<![CDATA["); - stripped by log splitter
lines.add("<z attr0='zzz'/>");
// lines.add("]]>"); - stripped by log splitter
lines.add("</fragment>");
TagProcessor tp = new TagProcessor();
Tag tag = null;
tag = tp.processLine(lines.get(0)); // <fragment>
tag = tp.processLine(lines.get(1)); // <z attr0='zzz'>
assertEquals("z", tag.getName());
assertEquals(1, tag.getAttributes().size());
assertEquals("zzz", tag.getAttributes().get("attr0"));
assertEquals(0, tag.getChildren().size());
tag = tp.processLine(lines.get(2)); // </fragment>
assertNull(tag);
assertTrue(tp.wasFragmentSeen());
}
}