blob: acd8ab8844ab4cd48b7f80da2b8225394ca91e72 [file] [log] [blame]
# Copyright (c) 2013 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.
"""This module contains unit tests for firmware_summary module."""
import os
import unittest
import common_unittest_utils
from firmware_constants import VAL
from firmware_summary import FirmwareSummary
# Define the relative segment weights of a validator.
segment_weights = {VAL.BEGIN: 0.15,
VAL.MIDDLE: 0.7,
VAL.END: 0.15,
VAL.BOTH_ENDS: 0.15 + 0.15,
VAL.WHOLE: 0.15 + 0.7 + 0.15}
# Define the validator score weights
weight_rare = 1
weight_common = 2
weight_critical = 3
validator_weights = {'CountPacketsValidator': weight_common,
'CountTrackingIDValidator': weight_critical,
'DrumrollValidator': weight_rare,
'LinearityValidator': weight_common,
'NoGapValidator': weight_common,
'NoLevelJumpValidator': weight_rare,
'NoReversedMotionValidator': weight_common,
'PhysicalClickValidator': weight_critical,
'PinchValidator': weight_common,
'RangeValidator': weight_common,
'ReportRateValidator': weight_common,
'StationaryFingerValidator': weight_common}
class FirmwareSummaryTest(unittest.TestCase):
"""A base class for FirwareSummary unit tests."""
@classmethod
def setUpClass(cls):
test_dir = os.path.join(os.getcwd(), 'tests')
log_dir = os.path.join(test_dir, 'logs', cls.log_category)
summary = FirmwareSummary(log_dir=log_dir,
validator_weights=validator_weights,
segment_weights=segment_weights)
cls.slog = summary.slog
cls._round_digits = 8
def _get_score(self, fw=None, gesture=None, validator=None):
"""Score = sum / count, rounded to the 4th digit."""
result= self.slog.get_result(fw=fw, gesture=gesture,
validator=validator)
average = result.stat_scores.average
return round(average, self._round_digits)
class FirmwareSummaryLumpyTest(FirmwareSummaryTest):
"""Unit tests for firmware_summary.FirmwareSummary class using Lumpy logs.
Tests were conducted with both fw 11.23 and 11.26, and in combination of
single and multiple iterations.
"""
@classmethod
def setUpClass(cls):
cls.log_category = 'lumpy'
cls.fws = ['fw_11.23', 'fw_11.27']
super(FirmwareSummaryLumpyTest, cls).setUpClass()
def _test_by_gesture(self, validator, expected_scores):
for fw, fw_expected_scores in expected_scores.items():
for gesture, expected_score in fw_expected_scores.items():
actual_score = self._get_score(fw=fw,
gesture=gesture,
validator=validator)
self.assertAlmostEqual(actual_score, expected_score)
def test_by_gesture_CountTrackingIDValidator(self):
validator = 'CountTrackingIDValidator'
expected_scores = {
'fw_11.23': {
'drag_edge_thumb': 0.0,
'one_finger_tracking': 1.0,
'two_finger_tracking': 1.0,
},
'fw_11.27': {
'drag_edge_thumb': 0.5,
'one_finger_tracking': 1.0,
'two_finger_tracking': 1.0,
}
}
self._test_by_gesture(validator, expected_scores)
def test_by_gesture_DrumrollValidator(self):
validator = 'DrumrollValidator'
expected_scores = {
'fw_11.23': {
'drumroll': 0.75,
},
'fw_11.27': {
'drumroll': 0.66666667,
}
}
self._test_by_gesture(validator, expected_scores)
def test_by_gesture_LinearityBothEndsValidator(self):
validator = 'Linearity(BothEnds)Validator'
expected_scores = {
'fw_11.23': {
'one_finger_to_edge': 0.0,
'one_finger_tracking': 0.0463055176218,
'two_finger_tracking': 0.0675201120507,
},
'fw_11.27': {
'one_finger_to_edge': 0.0,
'one_finger_tracking': 0.0307156362557,
'two_finger_tracking': 0.018688307809,
}
}
self._test_by_gesture(validator, expected_scores)
def test_by_gesture_LinearityMiddleValidator(self):
validator = 'Linearity(Middle)Validator'
expected_scores = {
'fw_11.23': {
'one_finger_to_edge': 0.0,
'one_finger_tracking': 0.141366526226,
'two_finger_tracking': 0.374448984788,
},
'fw_11.27': {
'one_finger_to_edge': 0.104395042218,
'one_finger_tracking': 0.180251899598,
'two_finger_tracking': 0.414553692112,
}
}
self._test_by_gesture(validator, expected_scores)
def test_by_gesture_NoGapValidator(self):
validator = 'NoGapValidator'
expected_scores = {
'fw_11.23': {
'one_finger_to_edge': 0.16022362,
'one_finger_tracking': 0.11006574,
'two_finger_tracking': 0.09455679,
},
'fw_11.27': {
'one_finger_to_edge': 0.00000000,
'one_finger_tracking': 0.86488696,
'two_finger_tracking': 0.76206434,
}
}
self._test_by_gesture(validator, expected_scores)
def test_by_gesture_PhysicalClickValidator(self):
validator = 'PhysicalClickValidator'
expected_scores = {
'fw_11.23': {
'one_finger_physical_click': 0.875,
'two_fingers_physical_click': 0.25,
},
'fw_11.27': {
'one_finger_physical_click': 1.0,
'two_fingers_physical_click': 1.0,
}
}
self._test_by_gesture(validator, expected_scores)
def test_by_gesture_StationaryFingerValidator(self):
validator = 'StationaryFingerValidator'
expected_scores = {
'fw_11.23': {
'one_finger_physical_click': 0.748714663186,
'two_fingers_physical_click': 1.0,
},
'fw_11.27': {
'one_finger_physical_click': 0.891563952369,
'two_fingers_physical_click': 1.0,
}
}
self._test_by_gesture(validator, expected_scores)
def test_by_validator(self):
expected_scores = {
'fw_11.23': {
'CountPacketsValidator': 0.895833333333,
'CountTrackingIDValidator': 0.935483870968,
'DrumrollValidator': 0.75,
'Linearity(BothEnds)Validator': 0.0483588644595,
'Linearity(Middle)Validator': 0.239845374323,
'NoGapValidator': 0.101144302433,
'PhysicalClickValidator': 0.75,
'PinchValidator': 0.875,
'StationaryFingerValidator': 0.832476442124,
},
'fw_11.27': {
'CountPacketsValidator': 1.0,
'CountTrackingIDValidator': 0.936170212766,
'DrumrollValidator': 0.666666666667,
'Linearity(BothEnds)Validator': 0.017763196141,
'Linearity(Middle)Validator': 0.313444723824,
'NoGapValidator': 0.623221473233,
'PhysicalClickValidator': 1.0,
'PinchValidator': 1.0,
'StationaryFingerValidator': 0.92770930158,
}
}
for fw, fw_expected_scores in expected_scores.items():
for validator, expected_score in fw_expected_scores.items():
actual_score = self._get_score(fw=fw, validator=validator)
actual_score = round(actual_score, self._round_digits)
self.assertAlmostEqual(actual_score, expected_score)
def test_stat_metrics(self):
"""Test the statistics of metrics."""
expected_stats_values = {
'fw_11.23': {
'CountPacketsValidator': [
('pct of incorrect cases (%)--packets', 25.00)],
'PhysicalClickValidator': [
('1f-click miss rate (%)', 12.50),
('2f-click miss rate (%)', 75.00)],
'PinchValidator': [
('pct of incorrect cases (%)--pinch', 12.50)],
},
'fw_11.27': {
'CountPacketsValidator': [
('pct of incorrect cases (%)--packets', 0.00)],
'PhysicalClickValidator': [
('1f-click miss rate (%)', 0.00),
('2f-click miss rate (%)', 0.00)],
'PinchValidator': [
('pct of incorrect cases (%)--pinch', 0.00)],
},
}
for fw, fw_stats_values in expected_stats_values.items():
for validator, stats_metrics in fw_stats_values.items():
result = self.slog.get_result(fw=fw, validator=validator)
for metric_name, expected_value in stats_metrics:
actual_value = result.stat_metrics.stats_values[metric_name]
self.assertAlmostEqual(actual_value, expected_value)
def test_final_weighted_average(self):
expected_weighted_averages = {
'fw_11.23': 0.735617659970924,
'fw_11.27': 0.8575493345406989,
}
final_weighted_average = self.slog.get_final_weighted_average()
for fw, expected_value in expected_weighted_averages.items():
actual_value = final_weighted_average[fw]
actual_value = round(actual_value, self._round_digits)
self.assertAlmostEqual(actual_value, expected_value)
if __name__ == '__main__':
unittest.main()