Index: tracing/tracing/ui/analysis/memory_dump_heap_details_pane_test.html |
diff --git a/tracing/tracing/ui/analysis/memory_dump_heap_details_pane_test.html b/tracing/tracing/ui/analysis/memory_dump_heap_details_pane_test.html |
index d378324babc1938e616be90a93de8fd975aac4b1..3fdd677213c76d0e87c74742e568268ed2c33480 100644 |
--- a/tracing/tracing/ui/analysis/memory_dump_heap_details_pane_test.html |
+++ b/tracing/tracing/ui/analysis/memory_dump_heap_details_pane_test.html |
@@ -7,7 +7,7 @@ found in the LICENSE file. |
<link rel='import' href='/tracing/base/iteration_helpers.html'> |
<link rel='import' href='/tracing/base/multi_dimensional_view.html'> |
-<link rel="import" href="/tracing/base/unit.html"> |
+<link rel='import' href='/tracing/base/unit.html'> |
<link rel='import' href='/tracing/core/test_utils.html'> |
<link rel='import' href='/tracing/model/heap_dump.html'> |
<link rel='import' href='/tracing/model/memory_dump_test_utils.html'> |
@@ -26,10 +26,10 @@ tr.b.unittest.testSuite(function() { |
var TOP_DOWN_HEAVY_VIEW = ViewType.TOP_DOWN_HEAVY_VIEW; |
var BOTTOM_UP_HEAVY_VIEW = ViewType.BOTTOM_UP_HEAVY_VIEW; |
var HeapDump = tr.model.HeapDump; |
- var RowDimension = tr.ui.analysis.RowDimension; |
- var ROOT = RowDimension.ROOT; |
- var STACK_FRAME = RowDimension.STACK_FRAME; |
- var OBJECT_TYPE = RowDimension.OBJECT_TYPE; |
+ var HeapDetailsRowDimension = tr.ui.analysis.HeapDetailsRowDimension; |
+ var ROOT = HeapDetailsRowDimension.ROOT; |
+ var STACK_FRAME = HeapDetailsRowDimension.STACK_FRAME; |
+ var OBJECT_TYPE = HeapDetailsRowDimension.OBJECT_TYPE; |
var TitleColumn = tr.ui.analysis.TitleColumn; |
var NumericMemoryColumn = tr.ui.analysis.NumericMemoryColumn; |
var AggregationMode = tr.ui.analysis.MemoryColumn.AggregationMode; |
@@ -185,14 +185,14 @@ tr.b.unittest.testSuite(function() { |
displayExpectations.infoText); |
assert.strictEqual(isElementDisplayed(viewEl.$.info_bar), |
displayExpectations.infoBar); |
- assert.strictEqual(isElementDisplayed(viewEl.$.table), |
- displayExpectations.tableAndSelector); |
+ assert.strictEqual(isElementDisplayed(viewEl.$.split_view), |
+ displayExpectations.tableAndSplitView); |
assert.strictEqual(isElementDisplayed(viewEl.$.view_mode_container), |
- displayExpectations.tableAndSelector); |
+ displayExpectations.tableAndSplitView); |
} |
var EXPECTED_COLUMNS_WITHOUT_COUNT = [ |
- { title: 'Stack frame', type: TitleColumn, noAggregation: true }, |
+ { title: 'Current path', type: TitleColumn, noAggregation: true }, |
{ title: 'Size', type: NumericMemoryColumn } |
]; |
@@ -201,88 +201,87 @@ tr.b.unittest.testSuite(function() { |
{ title: 'Average size per allocation', type: NumericMemoryColumn } |
]); |
- function checkRow(columns, row, expectedDimension, expectedTitle, |
- expectedSizes, expectedCounts, expectedAverageSizes, |
- expectedDefinedValues) { |
- var formattedTitle = columns[0].formatTitle(row); |
- switch (expectedDimension) { |
- case ROOT: |
- assert.equal(formattedTitle, expectedTitle); |
- break; |
+ var EXPECTED_CELLS = ['Size', 'Count', 'Average size per allocation']; |
- case STACK_FRAME: |
- case OBJECT_TYPE: |
- assert.lengthOf(Polymer.dom(formattedTitle).childNodes, 2); |
- assert.strictEqual( |
- Polymer.dom(formattedTitle).childNodes[0].textContent, |
- expectedDimension === STACK_FRAME ? '\u0192' : '\u24C9'); |
- assert.strictEqual( |
- Polymer.dom(formattedTitle).childNodes[1].textContent, |
- expectedTitle); |
- break; |
+ function checkNode(node, expectedNodeStructure, expectedParentNode) { |
+ assert.strictEqual(node.title, expectedNodeStructure.title); |
+ assert.strictEqual(node.dimension, expectedNodeStructure.dimension); |
+ assert.strictEqual(node.parentNode, expectedParentNode); |
- default: |
- throw new Error('Invalid expected dimension: ' + expectedDimension); |
- } |
+ // Check that there AREN'T any cells that we are NOT expecting. |
+ var cells = node.cells; |
+ assert.includeMembers(EXPECTED_CELLS, Object.keys(cells)); |
- checkSizeNumericFields(row, columns[1], expectedSizes); |
- if (expectedCounts !== undefined) { |
- // Test sanity check. |
- assert.lengthOf(expectedCounts, expectedSizes.length); |
- assert.lengthOf(expectedAverageSizes, expectedSizes.length); |
+ var sizeCell = cells['Size']; |
+ var sizeFields = sizeCell ? sizeCell.fields : undefined; |
+ checkSizeNumericFields(sizeFields, undefined, expectedNodeStructure.size); |
- checkNumericFields(row, columns[2], expectedCounts, |
- count_smallerIsBetter); |
- checkSizeNumericFields(row, columns[3], expectedAverageSizes); |
- } else { |
- // Test sanity check. |
- assert.lengthOf(columns, EXPECTED_COLUMNS_WITHOUT_COUNT.length); |
- assert.isUndefined(expectedAverageSizes); |
- } |
+ var countCell = cells['Count']; |
+ var countFields = countCell ? countCell.fields : undefined; |
+ checkNumericFields(countFields, undefined, expectedNodeStructure.count, |
+ count_smallerIsBetter); |
- var actualDefinedValues = new Array(row.contexts.length); |
- for (var i = 0; i < row.contexts.length; i++) |
- actualDefinedValues[i] = row.contexts[i] !== undefined; |
- assert.deepEqual(actualDefinedValues, expectedDefinedValues); |
- } |
+ var averageSizeCell = cells['Average size per allocation']; |
+ var averageSizeFields = averageSizeCell ? averageSizeCell.fields : |
+ undefined; |
+ checkSizeNumericFields(averageSizeFields, undefined, |
+ expectedNodeStructure.averageSize); |
+ |
+ assert.strictEqual(node.childNodes.size, 2); |
- function checkRows(columns, rows, expectedStructure) { |
- if (expectedStructure === undefined) { |
- assert.isUndefined(rows); |
+ // If |expectedNodeStructure.children| is undefined, check that there are |
+ // no child nodes. |
+ if (!expectedNodeStructure.children) { |
+ assert.lengthOf(node.childNodes.get(STACK_FRAME), 0); |
+ assert.lengthOf(node.childNodes.get(OBJECT_TYPE), 0); |
return; |
} |
- if (typeof expectedStructure === 'number') { |
- assert.lengthOf(rows, expectedStructure); |
+ // If |expectedNodeStructure.children| is just a number, check total number |
+ // of child nodes. |
+ if (typeof expectedNodeStructure.children === 'number') { |
+ assert.strictEqual(expectedNodeStructure.children, |
+ node.childNodes.get(STACK_FRAME).length + |
+ node.childNodes.get(OBJECT_TYPE).length); |
return; |
} |
- assert.lengthOf(rows, expectedStructure.length); |
+ // Check child nodes wrt both dimensions. |
+ checkNodes(node.childNodes.get(STACK_FRAME), |
+ expectedNodeStructure.children.filter(c => c.dimension === STACK_FRAME), |
+ node); |
+ checkNodes(node.childNodes.get(OBJECT_TYPE), |
+ expectedNodeStructure.children.filter(c => c.dimension === OBJECT_TYPE), |
+ node); |
+ } |
+ |
+ function checkNodes(nodes, expectedStructure, expectedParentNode) { |
+ assert.lengthOf(nodes, expectedStructure.length); |
for (var i = 0; i < expectedStructure.length; i++) { |
- var row = rows[i]; |
- var expectedRowStructure = expectedStructure[i]; |
- checkRow(columns, row, expectedRowStructure.dimension, |
- expectedRowStructure.title, expectedRowStructure.size, |
- expectedRowStructure.count, expectedRowStructure.averageSize, |
- expectedRowStructure.defined); |
- checkRows(columns, row.subRows, expectedRowStructure.children); |
+ checkNode(nodes[i], expectedStructure[i], expectedParentNode); |
} |
} |
- function checkTable(viewEl, expectedConfig, expectedStructure) { |
+ function checkSplitView(viewEl, expectedConfig, expectedStructure) { |
checkDisplayedElements(viewEl, { |
infoText: false, |
- tableAndSelector: true, |
+ tableAndSplitView: true, |
infoBar: !!expectedConfig.expectedInfoBarDisplayed |
}); |
- var table = viewEl.$.table; |
- var columns = table.tableColumns; |
- var rows = table.tableRows; |
+ |
+ // Both the split view and breakdown view should be displaying the same |
+ // node. |
+ var selectedNode = viewEl.$.path_view.selectedNode; |
+ assert.strictEqual(viewEl.$.breakdown_view.displayedNode, selectedNode); |
+ checkNodes([selectedNode], expectedStructure, |
+ undefined /* expectedParentNode */); |
+ |
+ // TODO: Add proper tests for tr-ui-a-memory-dump-heap-details-path-view |
+ // and tr-ui-a-memory-dump-heap-details-breakdown-view. |
var expectedColumns = expectedConfig.expectedCountColumns ? |
EXPECTED_COLUMNS_WITH_COUNT : EXPECTED_COLUMNS_WITHOUT_COUNT; |
- checkColumns(columns, expectedColumns, |
+ checkColumns(viewEl.$.path_view.$.table.tableColumns, expectedColumns, |
expectedConfig.expectedAggregationMode); |
- checkRows(columns, rows, expectedStructure); |
} |
function changeView(viewEl, viewType) { |
@@ -290,97 +289,6 @@ tr.b.unittest.testSuite(function() { |
viewEl.rebuild(); |
} |
- /** |
- * Helper function for generating the expected structures of heap details |
- * pane tables. Given a table, this function generates its structure. |
- * |
- * This avoids the need to write such structures manually, which is very |
- * tedious. However, the correctness of the generated structures needs to be |
- * verified by the developer! Maximum line length must also be enforced |
- * manually. |
- */ |
- function printTable(test, viewEl) { |
- var generator = new tr.c.TestUtils.SourceGenerator(); |
- |
- function formatRows(rows) { |
- generator.formatMultiLineList(rows, function(row) { |
- generator.push('{'); |
- generator.indentBlock(2, true /* break line */, function() { |
- generator.push('dimension: '); |
- for (var dimensionTitle in RowDimension) { |
- if (row.dimension === RowDimension[dimensionTitle]) { |
- generator.push(dimensionTitle); |
- break; |
- } |
- } |
- generator.push(','); |
- generator.breakLine(); |
- |
- generator.push('title: \'', row.title, '\','); |
- generator.breakLine(); |
- |
- |
- var sizeFields = row.cells['Size'].fields; |
- generator.push('size: '); |
- generator.formatSingleLineList(sizeFields, function(field) { |
- generator.push( |
- field === undefined ? 'undefined' : String(field.value)); |
- }); |
- generator.push(','); |
- generator.breakLine(); |
- |
- if (row.cells['Count'] !== undefined) { |
- var countFields = row.cells['Count'].fields; |
- generator.push('count: '); |
- generator.formatSingleLineList(countFields, function(field) { |
- generator.push( |
- field === undefined ? 'undefined' : String(field.value)); |
- }); |
- generator.push(','); |
- generator.breakLine(); |
- |
- generator.push('averageSize: '); |
- generator.formatSingleLineList(row.cells['Average size'].fields, |
- function(field, index) { |
- if (field === undefined) { |
- generator.push('undefined'); |
- } else if (field.value === 0) { |
- generator.push('0'); |
- } else { |
- generator.push(String(sizeFields[index].value) + ' / ' + |
- String(countFields[index].value)); |
- } |
- }); |
- generator.push(','); |
- generator.breakLine(); |
- } |
- |
- generator.push('defined: '); |
- generator.formatSingleLineList(sizeFields, function(field) { |
- generator.push(String(field !== undefined)); |
- }); |
- |
- if (row.subRows && row.subRows.length > 0) { |
- generator.push(','); |
- generator.breakLine(); |
- generator.push('children: '); |
- formatRows(row.subRows); |
- } |
- }); |
- generator.breakLine(); |
- generator.push('}'); |
- }); |
- } |
- |
- generator.indentBlock(8, false /* don't break line */, |
- formatRows.bind(null, viewEl.$.table.tableRows)); |
- |
- tr.c.TestUtils.addSourceListing(test, generator.build()); |
- |
- throw new Error('This error is thrown to prevent accidentally ' + |
- 'checking in a test which calls this function.'); |
- } |
- |
test('instantiate_empty', function() { |
tr.ui.analysis.createAndCheckEmptyPanes(this, |
'tr-ui-a-memory-dump-heap-details-pane', 'heapDumps', |
@@ -388,7 +296,7 @@ tr.b.unittest.testSuite(function() { |
// Check that the info text is shown. |
checkDisplayedElements(viewEl, { |
infoText: true, |
- tableAndSelector: false, |
+ tableAndSplitView: false, |
infoBar: false |
}); |
}); |
@@ -405,7 +313,7 @@ tr.b.unittest.testSuite(function() { |
this.addHTMLOutput(viewEl); |
// Top-down tree view (default). |
- checkTable(viewEl, |
+ checkSplitView(viewEl, |
{ /* empty expectedConfig */ }, |
[ |
{ |
@@ -417,7 +325,7 @@ tr.b.unittest.testSuite(function() { |
]); |
changeView(viewEl, TOP_DOWN_HEAVY_VIEW); |
- checkTable(viewEl, |
+ checkSplitView(viewEl, |
{ expectedInfoBarDisplayed: true }, |
[ |
{ |
@@ -429,7 +337,7 @@ tr.b.unittest.testSuite(function() { |
]); |
changeView(viewEl, BOTTOM_UP_HEAVY_VIEW); |
- checkTable(viewEl, |
+ checkSplitView(viewEl, |
{ expectedInfoBarDisplayed: true }, |
[ |
{ |
@@ -453,7 +361,7 @@ tr.b.unittest.testSuite(function() { |
this.addHTMLOutput(viewEl); |
// Top-down tree view (default). |
- checkTable(viewEl, |
+ checkSplitView(viewEl, |
{ /* empty expectedConfig */ }, |
[ |
{ |
@@ -761,7 +669,7 @@ tr.b.unittest.testSuite(function() { |
]); |
changeView(viewEl, BOTTOM_UP_HEAVY_VIEW); |
- checkTable(viewEl, |
+ checkSplitView(viewEl, |
{ expectedInfoBarDisplayed: true }, |
[ |
{ |
@@ -1541,7 +1449,7 @@ tr.b.unittest.testSuite(function() { |
]); |
changeView(viewEl, TOP_DOWN_HEAVY_VIEW); |
- checkTable(viewEl, |
+ checkSplitView(viewEl, |
{ expectedInfoBarDisplayed: true }, [ |
{ |
dimension: ROOT, |
@@ -2331,7 +2239,7 @@ tr.b.unittest.testSuite(function() { |
this.addHTMLOutput(viewEl); |
changeView(viewEl, TOP_DOWN_HEAVY_VIEW); |
- checkTable(viewEl, |
+ checkSplitView(viewEl, |
{ |
expectedAggregationMode: AggregationMode.DIFF, |
expectedInfoBarDisplayed: true, |
@@ -3567,7 +3475,7 @@ tr.b.unittest.testSuite(function() { |
]); |
changeView(viewEl, TOP_DOWN_TREE_VIEW); |
- checkTable(viewEl, |
+ checkSplitView(viewEl, |
{ |
expectedAggregationMode: AggregationMode.DIFF, |
expectedCountColumns: true |
@@ -4047,7 +3955,7 @@ tr.b.unittest.testSuite(function() { |
this.addHTMLOutput(viewEl); |
changeView(viewEl, TOP_DOWN_HEAVY_VIEW); |
- checkTable(viewEl, |
+ checkSplitView(viewEl, |
{ |
expectedAggregationMode: AggregationMode.MAX, |
expectedInfoBarDisplayed: true |
@@ -4075,7 +3983,7 @@ tr.b.unittest.testSuite(function() { |
this.addHTMLOutput(viewEl); |
// Top-down tree view (default). |
- checkTable(viewEl, |
+ checkSplitView(viewEl, |
{ expectedAggregationMode: AggregationMode.DIFF }, |
[ |
{ |