summaryrefslogtreecommitdiffstats
path: root/build/android/pylib/results/json_results.py
blob: 1a60f648c833c5a6e93f3969b543dbebe8a9eefa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import json

from pylib.base import base_test_result


def GenerateResultsDict(test_run_results):
  """Create a results dict from |test_run_results| suitable for writing to JSON.
  Args:
    test_run_results: a list of base_test_result.TestRunResults objects.
  Returns:
    A results dict that mirrors the one generated by
      base/test/launcher/test_results_tracker.cc:SaveSummaryAsJSON.
  """
  # Example json output.
  # {
  #   "global_tags": [],
  #   "all_tests": [
  #     "test1",
  #     "test2",
  #    ],
  #   "disabled_tests": [],
  #   "per_iteration_data": [
  #     {
  #       "test1": [
  #         {
  #           "status": "SUCCESS",
  #           "elapsed_time_ms": 1,
  #           "output_snippet": "",
  #           "output_snippet_base64": "",
  #           "losless_snippet": "",
  #         },
  #       ],
  #       "test2": [
  #         {
  #           "status": "FAILURE",
  #           "elapsed_time_ms": 12,
  #           "output_snippet": "",
  #           "output_snippet_base64": "",
  #           "losless_snippet": "",
  #         },
  #       ],
  #     },
  #     {
  #       "test1": [
  #         {
  #           "status": "SUCCESS",
  #           "elapsed_time_ms": 1,
  #           "output_snippet": "",
  #           "output_snippet_base64": "",
  #           "losless_snippet": "",
  #         },
  #       ],
  #       "test2": [
  #         {
  #           "status": "FAILURE",
  #           "elapsed_time_ms": 12,
  #           "output_snippet": "",
  #           "output_snippet_base64": "",
  #           "losless_snippet": "",
  #         },
  #       ],
  #     },
  #     ...
  #   ],
  # }

  def status_as_string(s):
    if s == base_test_result.ResultType.PASS:
      return 'SUCCESS'
    elif s == base_test_result.ResultType.SKIP:
      return 'SKIPPED'
    elif s == base_test_result.ResultType.FAIL:
      return 'FAILURE'
    elif s == base_test_result.ResultType.CRASH:
      return 'CRASH'
    elif s == base_test_result.ResultType.TIMEOUT:
      return 'TIMEOUT'
    elif s == base_test_result.ResultType.UNKNOWN:
      return 'UNKNOWN'

  all_tests = set()
  per_iteration_data = []
  for test_run_result in test_run_results:
    iteration_data = {
      t.GetName(): [{
        'status': status_as_string(t.GetType()),
        'elapsed_time_ms': t.GetDuration(),
        'output_snippet': '',
        'losless_snippet': '',
        'output_snippet_base64:': '',
      }]
      for t in test_run_result.GetAll()
    }
    all_tests = all_tests.union(set(iteration_data.iterkeys()))
    per_iteration_data.append(iteration_data)

  return {
    'global_tags': [],
    'all_tests': sorted(list(all_tests)),
    # TODO(jbudorick): Add support for disabled tests within base_test_result.
    'disabled_tests': [],
    'per_iteration_data': per_iteration_data,
  }


def GenerateJsonResultsFile(test_run_result, file_path):
  """Write |test_run_result| to JSON.

  This emulates the format of the JSON emitted by
  base/test/launcher/test_results_tracker.cc:SaveSummaryAsJSON.

  Args:
    test_run_result: a base_test_result.TestRunResults object.
    file_path: The path to the JSON file to write.
  """
  with open(file_path, 'w') as json_result_file:
    json_result_file.write(json.dumps(GenerateResultsDict(test_run_result)))


def ParseResultsFromJson(json_results):
  """Creates a list of BaseTestResult objects from JSON.

  Args:
    json_results: A JSON dict in the format created by
                  GenerateJsonResultsFile.
  """

  def string_as_status(s):
    if s == 'SUCCESS':
      return base_test_result.ResultType.PASS
    elif s == 'SKIPPED':
      return base_test_result.ResultType.SKIP
    elif s == 'FAILURE':
      return base_test_result.ResultType.FAIL
    elif s == 'CRASH':
      return base_test_result.ResultType.CRASH
    elif s == 'TIMEOUT':
      return base_test_result.ResultType.TIMEOUT
    else:
      return base_test_result.ResultType.UNKNOWN

  results_list = []
  testsuite_runs = json_results['per_iteration_data']
  for testsuite_run in testsuite_runs:
    for test, test_runs in testsuite_run.iteritems():
      results_list.extend(
          [base_test_result.BaseTestResult(test,
                                           string_as_status(tr['status']),
                                           duration=tr['elapsed_time_ms'])
          for tr in test_runs])
  return results_list