1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)# Copyright 2013 The Chromium Authors. All rights reserved.
2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)# found in the LICENSE file.
4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)import json
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)import unittest
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)from telemetry.core.heap import chrome_js_heap_snapshot_parser
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class ChromeJsHeapSnapshotParserUnittest(unittest.TestCase):
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  def _HeapSnapshotData(self, node_types, edge_types, node_fields, edge_fields,
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                        node_list, edge_list, strings):
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    """Helper for creating heap snapshot data."""
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return {'snapshot': {'meta': {'node_types': [node_types],
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                  'edge_types': [edge_types],
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                  'node_fields': node_fields,
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                  'edge_fields': edge_fields}},
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            'nodes': node_list,
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            'edges': edge_list,
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)            'strings': strings}
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  def testParseSimpleSnapshot(self):
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    # Create a snapshot containing 2 nodes and an edge between them.
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    node_types = ['object']
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    edge_types = ['property']
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    node_fields = ['type', 'name', 'id', 'edge_count']
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    edge_fields = ['type', 'name_or_index', 'to_node']
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    node_list = [0, 0, 0, 1,
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                 0, 1, 1, 0]
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    edge_list = [0, 2, 4]
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    strings = ['node1', 'node2', 'edge1']
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    heap = self._HeapSnapshotData(node_types, edge_types, node_fields,
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                  edge_fields, node_list, edge_list, strings)
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    objects = list(chrome_js_heap_snapshot_parser.ChromeJsHeapSnapshotParser(
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        json.dumps(heap)).GetAllLiveHeapObjects())
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual(2, len(objects))
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if objects[0].edges_from:
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      from_ix = 0
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      to_ix = 1
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    else:
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      from_ix = 1
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      to_ix = 0
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual('node1', objects[from_ix].class_name)
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual('node2', objects[to_ix].class_name)
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual(1, len(objects[from_ix].edges_from))
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual(0, len(objects[from_ix].edges_to))
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual(0, len(objects[to_ix].edges_from))
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual(1, len(objects[to_ix].edges_to))
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual('node1',
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     objects[from_ix].edges_from[0].from_object.class_name)
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual('node2',
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                     objects[from_ix].edges_from[0].to_object.class_name)
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual('edge1', objects[from_ix].edges_from[0].name_string)
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual('node1', objects[to_ix].edges_to[0].from_object.class_name)
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual('node2', objects[to_ix].edges_to[0].to_object.class_name)
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    self.assertEqual('edge1', objects[to_ix].edges_to[0].name_string)
58