blob: 0cc126310b0b130521551322871b1546106c1549 [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,
'CountTrackingIDFatFingerValidator': weight_rare,
'CountTrackingIDNormalFingerValidator': weight_critical,
'DrumrollValidator': weight_rare,
'LinearityFatFingerValidator': weight_rare,
'LinearityNormalFingerValidator': 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,
'StationaryTapValidator': 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,
validators=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_CountTrackingIDNormalFingerValidator(self):
validator = 'CountTrackingIDNormalFingerValidator'
expected_scores = {
'fw_11.23': {
'one_finger_tracking': 1.0,
'two_finger_tracking': 1.0,
},
'fw_11.27': {
'one_finger_tracking': 1.0,
'two_finger_tracking': 1.0,
}
}
self._test_by_gesture(validator, expected_scores)
def test_by_gesture_CountTrackingIDFatFingerValidator(self):
validator = 'CountTrackingIDFatFingerValidator'
expected_scores = {
'fw_11.23': {'drag_edge_thumb': 0.0,},
'fw_11.27': {'drag_edge_thumb': 0.5,}
}
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_LinearityMiddleValidator(self):
validator = 'LinearityNormalFinger(Middle)Validator'
expected_scores = {
'fw_11.23': {
'one_finger_to_edge': 0.58086671000000001,
'one_finger_tracking': 0.42046572999999998,
'two_finger_tracking': 0.60548126000000002,
},
'fw_11.27': {
'one_finger_to_edge': 0.36506074999999999,
'one_finger_tracking': 0.73313022999999999,
'two_finger_tracking': 0.70906895999999997,
}
}
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_StationaryTapValidator(self):
validator = 'StationaryTapValidator'
expected_scores = {
'fw_11.23': {
'one_finger_physical_click': 0.1875,
'two_fingers_physical_click': 0.125,
},
'fw_11.27': {
'one_finger_physical_click': 0.58333332999999998,
'two_fingers_physical_click': 0.16666666999999999,
}
}
self._test_by_gesture(validator, expected_scores)
def test_by_validator(self):
expected_scores = {
'fw_11.23': {
'CountPacketsValidator': 0.895833333333,
'CountTrackingIDFatFingerValidator': 0.0,
'CountTrackingIDNormalFingerValidator': 0.96666666999999995,
'DrumrollValidator': 0.75,
'LinearityNormalFinger(Middle)Validator': 0.54910331999999995,
'NoGapValidator': 0.101144302433,
'PhysicalClickValidator': 0.75,
'PinchValidator': 0.875,
'StationaryTapValidator': 0.16666666999999999,
},
'fw_11.27': {
'CountPacketsValidator': 1.0,
'CountTrackingIDFatFingerValidator': 0.5,
'CountTrackingIDNormalFingerValidator': 0.95555555999999997,
'DrumrollValidator': 0.666666666667,
'LinearityNormalFinger(Middle)Validator': 0.66679957999999995,
'NoGapValidator': 0.623221473233,
'PhysicalClickValidator': 1.0,
'PinchValidator': 1.0,
'StationaryTapValidator': 0.44444444,
}
}
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, validators=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.68406327,
'fw_11.27': 0.83886367,
}
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()