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