Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/firecracker
Path: blob/main/tests/framework/stats/criteria.py
1956 views
1
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
# SPDX-License-Identifier: Apache-2.0
3
4
"""Module for comparison criteria."""
5
6
from abc import ABC, abstractmethod
7
from pydoc import locate
8
9
10
class CriteriaException(Exception):
11
"""Exception returned by failure of check criteria."""
12
13
14
# pylint: disable=R0903
15
class CriteriaFactory:
16
"""Comparison criteria factory class."""
17
18
@classmethod
19
def get(cls, criteria_cls_name) -> 'ComparisonCriteria':
20
"""`criteria_cls_name` must be a valid criteria class name."""
21
return locate(f"framework.stats.criteria.{criteria_cls_name}")
22
23
24
# pylint: disable=R0903
25
class ComparisonCriteria(ABC):
26
"""Comparison criteria between results and targets."""
27
28
def __init__(self, name: str, baseline: dict):
29
"""Initialize the comparison criteria.
30
31
Baseline expected schema:
32
```
33
{
34
"type": "object",
35
"properties": {
36
"target": number,
37
},
38
"required": ["target"]
39
}
40
```
41
"""
42
self._baseline = baseline
43
self._name = name
44
45
@abstractmethod
46
def check(self, actual):
47
"""Compare the target and the actual."""
48
49
@property
50
def name(self):
51
"""Return criteria name."""
52
return self._name
53
54
@property
55
def target(self):
56
"""Return criteria target."""
57
target = self._baseline.get("target")
58
if not target:
59
raise CriteriaException("Baseline target not defined.")
60
61
return target
62
63
@property
64
def baseline(self) -> dict:
65
"""Return the baseline."""
66
return self._baseline
67
68
def fail_msg(self, actual):
69
"""Return the default fail message."""
70
return self.name + f" failed. Target: '{self.target} vs Actual: " \
71
f"'{actual}'."
72
73
74
# pylint: disable=R0903
75
class GreaterThan(ComparisonCriteria):
76
"""Greater than comparison criteria."""
77
78
def __init__(self, baseline: dict):
79
"""Initialize the criteria."""
80
super().__init__("GreaterThan", baseline)
81
82
def check(self, actual):
83
"""Compare the target and the actual."""
84
if actual < self.target:
85
raise CriteriaException(self.fail_msg(actual))
86
87
88
# pylint: disable=R0903
89
class LowerThan(ComparisonCriteria):
90
"""Lower than comparison criteria."""
91
92
def __init__(self, baseline: dict):
93
"""Initialize the criteria."""
94
super().__init__("LowerThan", baseline)
95
96
def check(self, actual):
97
"""Compare the target and the actual."""
98
if actual > self.target:
99
raise CriteriaException(self.fail_msg(actual))
100
101
102
# pylint: disable=R0903
103
class EqualWith(ComparisonCriteria):
104
"""Equal with comparison criteria.
105
106
Baseline expected schema:
107
```
108
{
109
"type": "object",
110
"properties": {
111
"target": number,
112
"delta": number
113
},
114
"required": ["target", "delta"]
115
}
116
```
117
"""
118
119
def __init__(self, baseline: dict):
120
"""Initialize the criteria."""
121
super().__init__("EqualWith", baseline)
122
123
@property
124
def delta(self):
125
"""Return the `delta` field of the baseline."""
126
delta = self._baseline.get("delta")
127
if not delta:
128
raise CriteriaException("Baseline delta not defined.")
129
return delta
130
131
def fail_msg(self, actual):
132
"""Return the `EqualWith` failure message."""
133
return self.name + f" failed. Target: '{self.target} +- " \
134
f"{self.delta}' vs Actual: '{actual}'."
135
136
def check(self, actual):
137
"""Compare the target and the actual."""
138
if abs(self.target - actual) > self.delta:
139
raise CriteriaException(self.fail_msg(actual))
140
141