1# Copyright 2017 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4"""Helper functions to parse result collected from device"""
5
6from __future__ import print_function
7from fix_skia_results import _TransformBenchmarks
8
9import json
10
11def normalize(bench, dict_list):
12  bench_base = {
13      'Panorama': 1,
14      'Dex2oat': 1,
15      'Hwui': 10000,
16      'Skia': 1,
17      'Synthmark': 1,
18      'Binder': 0.001
19  }
20  result_dict = dict_list[0]
21  for key in result_dict:
22    result_dict[key] = result_dict[key] / bench_base[bench]
23  return [result_dict]
24
25
26# Functions to parse benchmark result for data collection.
27def parse_Panorama(bench, fin):
28  result_dict = {}
29  for line in fin:
30    words = line.split()
31    if 'elapsed' in words:
32      #TODO: Need to restructure the embedded word counts.
33      result_dict['total_time_s'] = float(words[3])
34      result_dict['retval'] = 0
35      return normalize(bench, [result_dict])
36  raise ValueError('You passed the right type of thing, '
37                   'but it didn\'t have the expected contents.')
38
39
40def parse_Synthmark(bench, fin):
41  result_dict = {}
42  accum = 0
43  cnt = 0
44  for line in fin:
45    words = line.split()
46    if 'normalized' in words:
47      #TODO: Need to restructure the embedded word counts.
48      accum += float(words[-1])
49      cnt += 1
50  if accum != 0:
51    result_dict['total_voices'] = accum / cnt
52    result_dict['retval'] = 0
53    return normalize(bench, [result_dict])
54  raise ValueError('You passed the right type of thing, '
55                   'but it didn\'t have the expected contents.')
56
57
58def parse_Binder(bench, fin):
59  result_dict = {}
60  accum = 0
61  cnt = 0
62  for line in fin:
63    words = line.split()
64    for word in words:
65      if 'average' in word:
66        #TODO: Need to restructure the embedded word counts.
67        accum += float(word[8:-2])
68        cnt += 1
69  if accum != 0:
70    result_dict['avg_time_ms'] = accum / cnt
71    result_dict['retval'] = 0
72    return normalize(bench, [result_dict])
73  raise ValueError('You passed the right type of thing, '
74                   'but it didn\'t have the expected contents.')
75
76
77def parse_Dex2oat(bench, fin):
78  result_dict = {}
79  cnt = 0
80  for line in fin:
81    words = line.split()
82    if 'elapsed' in words:
83      cnt += 1
84      #TODO: Need to restructure the embedded word counts.
85      if cnt == 1:
86        # First 'elapsed' time is for microbench 'Chrome'
87        result_dict['chrome_s'] = float(words[3])
88      elif cnt == 2:
89        # Second 'elapsed' time is for microbench 'Camera'
90        result_dict['camera_s'] = float(words[3])
91
92        result_dict['retval'] = 0
93        # Two results found, return
94        return normalize(bench, [result_dict])
95  raise ValueError('You passed the right type of thing, '
96                   'but it didn\'t have the expected contents.')
97
98
99def parse_Hwui(bench, fin):
100  result_dict = {}
101  for line in fin:
102    words = line.split()
103    if 'elapsed' in words:
104      #TODO: Need to restructure the embedded word counts.
105      result_dict['total_time_s'] = float(words[3])
106      result_dict['retval'] = 0
107      return normalize(bench, [result_dict])
108  raise ValueError('You passed the right type of thing, '
109                   'but it didn\'t have the expected contents.')
110
111
112def parse_Skia(bench, fin):
113  obj = json.load(fin)
114  return normalize(bench, _TransformBenchmarks(obj))
115