OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/env python |
| 2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. |
| 5 |
| 6 """ Source file for results_dashboard testcases.""" |
| 7 |
| 8 import json |
| 9 import os |
| 10 import shutil |
| 11 import tempfile |
| 12 import unittest |
| 13 import urllib |
| 14 import urllib2 |
| 15 |
| 16 import test_env # pylint: disable=W0403,W0611 |
| 17 |
| 18 from slave import results_dashboard |
| 19 from slave import slave_utils |
| 20 from testing_support.super_mox import mox |
| 21 |
| 22 |
| 23 class IsEncodedJson(mox.Comparator): |
| 24 def __init__(self, expected_json): |
| 25 self._json = expected_json |
| 26 |
| 27 def equals(self, rhs): |
| 28 rhs_json = urllib.unquote_plus(rhs.data.replace("data=", "")) |
| 29 return sorted(json.loads(self._json)) == sorted(json.loads(rhs_json)) |
| 30 |
| 31 def __repr__(self): |
| 32 return "<Is Request JSON %s>" % self._json |
| 33 |
| 34 |
| 35 class ResultsDashboardTest(unittest.TestCase): |
| 36 def setUp(self): |
| 37 super(ResultsDashboardTest, self).setUp() |
| 38 self.mox = mox.Mox() |
| 39 self.build_dir = tempfile.mkdtemp() |
| 40 os.makedirs(os.path.join(self.build_dir, results_dashboard.CACHE_DIR)) |
| 41 self.cache_filename = os.path.join(self.build_dir, |
| 42 results_dashboard.CACHE_DIR, |
| 43 results_dashboard.CACHE_FILENAME) |
| 44 |
| 45 def tearDown(self): |
| 46 self.mox.UnsetStubs() |
| 47 shutil.rmtree(self.build_dir) |
| 48 |
| 49 def _SendResults(self, send_results_args, expected_new_json, errors): |
| 50 self.mox.UnsetStubs() # Needed for multiple calls from same test. |
| 51 self.mox.StubOutWithMock(slave_utils, "GetActiveMaster") |
| 52 slave_utils.GetActiveMaster().AndReturn("ChromiumPerf") |
| 53 self.mox.StubOutWithMock(urllib2, "urlopen") |
| 54 for json_line, error in zip(expected_new_json, errors): |
| 55 if error: |
| 56 urllib2.urlopen(IsEncodedJson(json_line)).AndRaise(error) |
| 57 else: |
| 58 urllib2.urlopen(IsEncodedJson(json_line)) |
| 59 self.mox.ReplayAll() |
| 60 send_results_args.append(self.build_dir) |
| 61 results_dashboard.SendResults(*send_results_args) |
| 62 self.mox.VerifyAll() |
| 63 |
| 64 def test_SingleLogLine(self): |
| 65 args = [ |
| 66 "bar-summary.dat", |
| 67 ['{"traces": {"baz": ["100.0", "5.0"]},' |
| 68 ' "rev": "12345", "webkit_rev": "6789"}'], |
| 69 "linux-release", |
| 70 "foo", |
| 71 "https://chrome-perf.googleplex.com"] |
| 72 expected_new_json = [json.dumps([{ |
| 73 "master": "ChromiumPerf", |
| 74 "bot": "linux-release", |
| 75 "test": "foo/bar/baz", |
| 76 "revision": "12345", |
| 77 "value": "100.0", |
| 78 "error": "5.0", |
| 79 "supplemental_columns": { |
| 80 "r_webkit_rev": "6789", |
| 81 }}])] |
| 82 errors = [None] |
| 83 self._SendResults(args, expected_new_json, errors) |
| 84 |
| 85 def test_MultipleLogLines(self): |
| 86 args = [ |
| 87 "bar-summary.dat", [ |
| 88 '{"traces": {"baz": ["100.0", "5.0"]},' |
| 89 ' "rev": "12345", "webkit_rev": "6789"}', |
| 90 '{"traces": {"box": ["101.0", "4.0"]},' |
| 91 ' "rev": "12345", "webkit_rev": "6789"}'], |
| 92 "linux-release", |
| 93 "foo", |
| 94 "https://chrome-perf.googleplex.com"] |
| 95 expected_new_json = [json.dumps([{ |
| 96 "master": "ChromiumPerf", |
| 97 "bot": "linux-release", |
| 98 "test": "foo/bar/baz", |
| 99 "revision": "12345", |
| 100 "value": "100.0", |
| 101 "error": "5.0", |
| 102 "supplemental_columns": { |
| 103 "r_webkit_rev": "6789", |
| 104 }}, { |
| 105 "master": "ChromiumPerf", |
| 106 "bot": "linux-release", |
| 107 "test": "foo/bar/box", |
| 108 "revision": "12345", |
| 109 "value": "101.0", |
| 110 "error": "4.0", |
| 111 "supplemental_columns": { |
| 112 "r_webkit_rev": "6789", |
| 113 }}])] |
| 114 errors = [None] |
| 115 self._SendResults(args, expected_new_json, errors) |
| 116 |
| 117 def test_ModifiedTraceNames(self): |
| 118 args = [ |
| 119 "bar-summary.dat", |
| 120 ['{"traces": {"bar": ["100.0", "5.0"], "bar_ref": ["99.0", "2.0"],' |
| 121 ' "baz/y": ["101.0", "3.0"], "notchanged": ["102.0", "1.0"]},' |
| 122 ' "rev": "12345", "webkit_rev": "6789"}'], |
| 123 "linux-release", |
| 124 "foo", |
| 125 "https://chrome-perf.googleplex.com"] |
| 126 expected_new_json = [json.dumps([{ |
| 127 "master": "ChromiumPerf", |
| 128 "bot": "linux-release", |
| 129 "test": "foo/bar", |
| 130 "revision": "12345", |
| 131 "value": "100.0", |
| 132 "error": "5.0", |
| 133 "supplemental_columns": { |
| 134 "r_webkit_rev": "6789", |
| 135 }},{ |
| 136 "master": "ChromiumPerf", |
| 137 "bot": "linux-release", |
| 138 "test": "foo/bar/ref", |
| 139 "revision": "12345", |
| 140 "value": "99.0", |
| 141 "error": "2.0", |
| 142 "supplemental_columns": { |
| 143 "r_webkit_rev": "6789", |
| 144 }}, { |
| 145 "master": "ChromiumPerf", |
| 146 "bot": "linux-release", |
| 147 "test": "foo/bar/baz_y", |
| 148 "revision": "12345", |
| 149 "value": "101.0", |
| 150 "error": "3.0", |
| 151 "supplemental_columns": { |
| 152 "r_webkit_rev": "6789", |
| 153 }},{ |
| 154 "master": "ChromiumPerf", |
| 155 "bot": "linux-release", |
| 156 "test": "foo/bar/notchanged", |
| 157 "revision": "12345", |
| 158 "value": "102.0", |
| 159 "error": "1.0", |
| 160 "supplemental_columns": { |
| 161 "r_webkit_rev": "6789", |
| 162 }}])] |
| 163 errors = [None] |
| 164 self._SendResults(args, expected_new_json, errors) |
| 165 |
| 166 def test_ByUrlGraph(self): |
| 167 args = [ |
| 168 "bar_by_url-summary.dat", |
| 169 ['{"traces": {"baz": ["100.0", "5.0"]},' |
| 170 ' "rev": "12345", "webkit_rev": "6789"}'], |
| 171 "linux-release", |
| 172 "foo", |
| 173 "https://chrome-perf.googleplex.com"] |
| 174 expected_new_json = [json.dumps([{ |
| 175 "master": "ChromiumPerf", |
| 176 "bot": "linux-release", |
| 177 "test": "foo/bar/baz", |
| 178 "revision": "12345", |
| 179 "value": "100.0", |
| 180 "error": "5.0", |
| 181 "supplemental_columns": { |
| 182 "r_webkit_rev": "6789", |
| 183 }}])] |
| 184 errors = [None] |
| 185 self._SendResults(args, expected_new_json, errors) |
| 186 |
| 187 def test_FailureRetried(self): |
| 188 args = [ |
| 189 "bar-summary.dat", |
| 190 ['{"traces": {"baz": ["100.0", "5.0"]},' |
| 191 ' "rev": "12345", "webkit_rev": "6789"}'], |
| 192 "linux-release", |
| 193 "foo", |
| 194 "https://chrome-perf.googleplex.com"] |
| 195 expected_new_json = [json.dumps([{ |
| 196 "master": "ChromiumPerf", |
| 197 "bot": "linux-release", |
| 198 "test": "foo/bar/baz", |
| 199 "revision": "12345", |
| 200 "value": "100.0", |
| 201 "error": "5.0", |
| 202 "supplemental_columns": { |
| 203 "r_webkit_rev": "6789", |
| 204 }}])] |
| 205 errors = [urllib2.URLError("reason")] |
| 206 self._SendResults(args, expected_new_json, errors) |
| 207 args2 = [ |
| 208 "bar-summary.dat", |
| 209 ['{"traces": {"baz": ["101.0", "6.0"]},' |
| 210 ' "rev": "12346", "webkit_rev": "6790"}'], |
| 211 "linux-release", |
| 212 "foo", |
| 213 "https://chrome-perf.googleplex.com"] |
| 214 expected_new_json.append(json.dumps([{ |
| 215 "master": "ChromiumPerf", |
| 216 "bot": "linux-release", |
| 217 "test": "foo/bar/baz", |
| 218 "revision": "12346", |
| 219 "value": "101.0", |
| 220 "error": "6.0", |
| 221 "supplemental_columns": { |
| 222 "r_webkit_rev": "6790", |
| 223 } |
| 224 }])) |
| 225 errors = [None, None] |
| 226 self._SendResults(args2, expected_new_json, errors) |
| 227 |
| 228 def test_SuccessNotRetried(self): |
| 229 args = [ |
| 230 "bar-summary.dat", |
| 231 ['{"traces": {"baz": ["100.0", "5.0"]},' |
| 232 ' "rev": "12345", "webkit_rev": "6789"}'], |
| 233 "linux-release", |
| 234 "foo", |
| 235 "https://chrome-perf.googleplex.com"] |
| 236 expected_new_json = [json.dumps([{ |
| 237 "master": "ChromiumPerf", |
| 238 "bot": "linux-release", |
| 239 "test": "foo/bar/baz", |
| 240 "revision": "12345", |
| 241 "value": "100.0", |
| 242 "error": "5.0", |
| 243 "supplemental_columns": { |
| 244 "r_webkit_rev": "6789", |
| 245 }}])] |
| 246 errors = [None] |
| 247 self._SendResults(args, expected_new_json, errors) |
| 248 args2 = [ |
| 249 "bar-summary.dat", |
| 250 ['{"traces": {"baz": ["101.0", "6.0"]},' |
| 251 ' "rev": "12346", "webkit_rev": "6790"}'], |
| 252 "linux-release", |
| 253 "foo", |
| 254 "https://chrome-perf.googleplex.com"] |
| 255 expected_new_json2 = [json.dumps([{ |
| 256 "master": "ChromiumPerf", |
| 257 "bot": "linux-release", |
| 258 "test": "foo/bar/baz", |
| 259 "revision": "12346", |
| 260 "value": "101.0", |
| 261 "error": "6.0", |
| 262 "supplemental_columns": { |
| 263 "r_webkit_rev": "6790", |
| 264 } |
| 265 }])] |
| 266 errors = [None] |
| 267 self._SendResults(args2, expected_new_json2, errors) |
| 268 |
| 269 def test_FailureCached(self): |
| 270 args = [ |
| 271 "bar-summary.dat", |
| 272 ['{"traces": {"baz": ["100.0", "5.0"]},' |
| 273 ' "rev": "12345", "webkit_rev": "6789"}'], |
| 274 "linux-release", |
| 275 "foo", |
| 276 "https://chrome-perf.googleplex.com"] |
| 277 expected_new_json = [json.dumps([{ |
| 278 "master": "ChromiumPerf", |
| 279 "bot": "linux-release", |
| 280 "test": "foo/bar/baz", |
| 281 "revision": "12345", |
| 282 "value": "100.0", |
| 283 "error": "5.0", |
| 284 "supplemental_columns": { |
| 285 "r_webkit_rev": "6789", |
| 286 }}])] |
| 287 errors = [urllib2.URLError("reason")] |
| 288 self._SendResults(args, expected_new_json, errors) |
| 289 cache_file = open(self.cache_filename, "rb") |
| 290 actual_cache = cache_file.read() |
| 291 cache_file.close() |
| 292 self.assertEqual(expected_new_json[0], actual_cache) |
| 293 |
| 294 |
| 295 if __name__ == '__main__': |
| 296 unittest.main() |
OLD | NEW |