blob: 5bcd373416738eb98f11efa065db45b411ae57e0 [file] [log] [blame]
#! /usr/bin/env python
# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Main module for debugging command line interface"""
from collections import namedtuple
from fnmatch import fnmatch
import sys
import traceback
import numpy as np
from debugger_main import LoadBenchmarkFromURL
from optofidelity.detection import MultithreadedVideoProcessor
from optofidelity.reporting import BenchmarkReport
Test = namedtuple("test", ("uid", "expectations"))
TEST_DEFINITIONS = {
"finger.small.s6edge":
Test("20150825_1410_000", {}),
"finger.small.s6":
Test("20150825_1630_000", {}),
"finger.low_finger.z4":
Test("20150929_1515_000", {}),
"led.false_suppression.nexus4":
Test("20150825_1953_000", {}),
"led.false_suppression.s6edge":
Test("20150825_1855_001", {}),
"led.screen_on_edge.s6edge":
Test("20150903_1018_000", {}),
"led.false_distance_suppression.m9":
Test("20150826_2244_000", {}),
"led.false_distance_suppression.nexus4":
Test("20150826_2139_000", {}),
"led.inconsistent.nexus5":
Test("20150915_2230_003", {}),
"led.inconsistent.s6edge":
Test("20150928_1805_000", {}),
"led.poor_calibration.s6edge":
Test("20151003_0456_001", {}),
"line.brightness_changed.nexus6":
Test("20150908_1624_000", {}),
"line.brightness_changed_2.nexus6":
Test("20150916_0037_000", {}),
"screen_draw.dimmed_screen.nexus6":
Test("20150916_0014_000", {}),
"screen_draw.draw_start_misdetected.s6edge":
Test("20150925_1207_001", {}),
"keyboard.mask_misdetected.s6edge":
Test("20151002_0444_000", {}),
"keyboard.missed_state_change.s6edge":
Test("20150928_2234_000", {}),
"keyboard.mask_issues.s6edge":
Test("20151002_1417_000", {}),
"keyboard.segmentation_error.s6edge":
Test("20151008_0437_000", {}),
"baseline.tap.nexus4":
Test("20150825_1908_000", {"DownLatency": 98, "UpLatency": 81}),
"baseline.tap.nexus5":
Test("20150925_1435_000", {}),
"baseline.tap.iphone6":
Test("20150925_1408_000", {}),
"baseline.tap.s6edge":
Test("20150925_1207_003", {}),
"baseline.tap.m9":
Test("20150925_1447_000", {}),
"baseline.tap.iphone6plus":
Test("20150928_1350_000", {}),
"baseline.tap.nexus6":
Test("20150928_1452_000", {}),
"baseline.tap.s6":
Test("20150928_1550_001", {}),
"baseline.keyboard.nexus6":
Test("20150915_2353_001", {}),
"baseline.keyboard.s6edge.1":
Test("20150925_1455_000", {}),
"baseline.keyboard.s6edge.2":
Test("20150925_1455_001", {}),
"baseline.keyboard.s6edge.3":
Test("20150925_1455_002", {}),
"baseline.keyboard.s6":
Test("20150928_1424_001", {}),
"baseline.keyboard.nexus4":
Test("20150928_1400_000", {}),
"baseline.keyboard.nexus5":
Test("20150928_1443_000", {}),
"baseline.scroll.nexus4":
Test("20151001_1750_001", {}),
"baseline.scroll.nexus5":
Test("20150925_1428_000", {}),
"baseline.scroll.s6edge":
Test("20150925_1202_000", {}),
"baseline.scroll.m9":
Test("20150925_1442_000", {}),
"baseline.scroll.iphone6plus":
Test("20150928_1341_000", {}),
"baseline.scroll.nexus6":
Test("20150928_1500_000", {}),
"baseline.scroll.s6":
Test("20150928_1544_000", {}),
}
FAILURE_THRESHOLD = 5
def RunBenchmark(benchmark, expectations):
try:
video_processor = MultithreadedVideoProcessor()
benchmark.results.error = ""
benchmark.ProcessVideo(video_processor, [])
benchmark.ProcessTrace()
print "Results:"
print benchmark.results
if len(benchmark.results.error):
return False
if isinstance(expectations, dict):
measurements = benchmark.results.measurements
for value_name, expected in expectations.iteritems():
actual = np.mean(measurements.SummarizeValues(value_name))
if abs(actual - expected) > FAILURE_THRESHOLD:
print "Assertion failed: %s != %d" % (value_name, expected)
return False
elif isinstance(expectations, type) and issubclass(expectations, Exception):
print "Expected exception of type", expectations
return False
print "Test successful."
return True
except KeyboardInterrupt:
raise
except:
traceback.print_exc()
if isinstance(expectations, type) and issubclass(expectations, Exception):
print "Exception expected"
return True
return False
def RunTest(name, uid, expectations):
success = False
try:
print "-" * 80
print "- %s (%s)" % (name, uid)
print "-" * 80
benchmark, url = LoadBenchmarkFromURL(uid)
success = RunBenchmark(benchmark, expectations)
benchmark.Save(url)
if not success:
report = BenchmarkReport(url)
report.GenerateReport(benchmark.results, benchmark.trace,
benchmark.screen_calibration, benchmark.video)
print "Test Failed: file://%s/report.html" % url
except KeyboardInterrupt:
raise
except:
traceback.print_exc()
return success
def Main():
pattern = "*"
if len(sys.argv) > 1:
pattern = sys.argv[1]
failed = []
success = []
for name, definition in TEST_DEFINITIONS.iteritems():
if fnmatch(name, pattern):
if RunTest(name, definition.uid, definition.expectations):
success.append(name)
else:
failed.append(name)
print
if len(failed):
print "%d tests failed:" % len(failed)
for name in failed:
print " %s (%s)" % (name, TEST_DEFINITIONS[name].uid)
else:
print "All tests were successful."
if __name__ == "__main__":
Main()