Fix format produced by chart data recorder.

 - dashboard wants a dictionary of dictionaries indexed by name of the
   measurement
 - the uploading logic already serializes the chart data together w/
   metadata, recorder should return Python data structure

R=etiennej@chromium.org

Review URL: https://codereview.chromium.org/1422983002 .

Cr-Mirrored-From: https://github.com/domokit/mojo
Cr-Mirrored-Commit: dd48bf5ed9763b8b01a495046f73610c6b8e3d88
diff --git a/devtoolslib/perf_dashboard.py b/devtoolslib/perf_dashboard.py
index 68d87a3..defb54d 100644
--- a/devtoolslib/perf_dashboard.py
+++ b/devtoolslib/perf_dashboard.py
@@ -10,7 +10,6 @@
 See http://www.chromium.org/developers/speed-infra/performance-dashboard/sending-data-to-the-performance-dashboard.
 """
 
-from collections import defaultdict
 import httplib
 import json
 import pprint
@@ -28,18 +27,19 @@
   """
 
   def __init__(self, benchmark_name):
-    self.charts = defaultdict(list)
+    self.charts = {}
     self.benchmark_name = benchmark_name
 
   def record_scalar(self, chart_name, value_name, units, value):
     """Records a single measurement value of a scalar type."""
-    self.charts[chart_name].append({
+    if chart_name not in self.charts:
+      self.charts[chart_name] = {}
+    self.charts[chart_name][value_name] = {
         'type': 'scalar',
-        'name': value_name,
         'units': units,
-        'value': value})
+        'value': value}
 
-  def get_json(self):
+  def get_chart_data(self):
     """Returns the JSON string representing the recorded chart data, wrapping
     it with the required meta data."""
     chart_data = {
@@ -47,7 +47,7 @@
         'benchmark_name': self.benchmark_name,
         'charts': self.charts
     }
-    return json.dumps(chart_data)
+    return chart_data
 
 
 def add_argparse_server_arguments(parser):
diff --git a/devtoolslib/perf_dashboard_unittest.py b/devtoolslib/perf_dashboard_unittest.py
index b9c3b17..98714c9 100644
--- a/devtoolslib/perf_dashboard_unittest.py
+++ b/devtoolslib/perf_dashboard_unittest.py
@@ -5,7 +5,6 @@
 """Tests for the Chromium Performance Dashboard data format implementation."""
 
 import imp
-import json
 import os.path
 import sys
 import unittest
@@ -24,7 +23,7 @@
   def test_empty(self):
     """Tests chart data with no charts."""
     recorder = ChartDataRecorder('benchmark')
-    result = json.loads(recorder.get_json())
+    result = recorder.get_chart_data()
     self.assertEquals({
         'format_version': '1.0',
         'benchmark_name': 'benchmark',
@@ -36,7 +35,7 @@
     recorder.record_scalar('chart', 'val1', 'ms', 1)
     recorder.record_scalar('chart', 'val2', 'ms', 2)
 
-    result = json.loads(recorder.get_json())
+    result = recorder.get_chart_data()
     self.assertEquals('1.0', result['format_version'])
     self.assertEquals('benchmark', result['benchmark_name'])
 
@@ -45,14 +44,12 @@
     self.assertEquals(2, len(charts['chart']))
     self.assertEquals({
         'type': 'scalar',
-        'name': 'val1',
         'units': 'ms',
-        'value': 1}, charts['chart'][0])
+        'value': 1}, charts['chart']['val1'])
     self.assertEquals({
         'type': 'scalar',
-        'name': 'val2',
         'units': 'ms',
-        'value': 2}, charts['chart'][1])
+        'value': 2}, charts['chart']['val2'])
 
   def test_two_charts(self):
     """Tests chart data with two samples over two charts."""
@@ -60,7 +57,7 @@
     recorder.record_scalar('chart1', 'val1', 'ms', 1)
     recorder.record_scalar('chart2', 'val2', 'ms', 2)
 
-    result = json.loads(recorder.get_json())
+    result = recorder.get_chart_data()
     self.assertEquals('1.0', result['format_version'])
     self.assertEquals('benchmark', result['benchmark_name'])
 
@@ -69,12 +66,10 @@
     self.assertEquals(1, len(charts['chart1']))
     self.assertEquals({
         'type': 'scalar',
-        'name': 'val1',
         'units': 'ms',
-        'value': 1}, charts['chart1'][0])
+        'value': 1}, charts['chart1']['val1'])
     self.assertEquals(1, len(charts['chart2']))
     self.assertEquals({
         'type': 'scalar',
-        'name': 'val2',
         'units': 'ms',
-        'value': 2}, charts['chart2'][0])
+        'value': 2}, charts['chart2']['val2'])
diff --git a/mojo_benchmark b/mojo_benchmark
index 8413490..ff50689 100755
--- a/mojo_benchmark
+++ b/mojo_benchmark
@@ -6,11 +6,12 @@
 """Runner for Mojo application benchmarks."""
 
 import argparse
+import json
 import logging
-import sys
-import time
 import os.path
 import re
+import sys
+import time
 
 from devtoolslib import shell_arguments
 from devtoolslib import shell_config
@@ -244,7 +245,8 @@
         exit_code = 1
 
       if script_args.chart_data_output_file:
-        script_args.chart_data_output_file.write(chart_data_recorder.get_json())
+        script_args.chart_data_output_file.write(
+            json.dumps(chart_data_recorder.get_chart_data()))
         script_args.chart_data_output_file.write('\n')
 
   return exit_code