Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .github/workflows/validation_unit_tests.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: Validation Unit Tests

on:
pull_request:

jobs:
validation_unit_tests:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Install dependencies
run: |
pip install pydantic pytest

- name: Run validation unit tests
run: |
pytest
2 changes: 2 additions & 0 deletions pyperf/pyperf_run
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,8 @@ if [ $to_pbench -eq 0 ]; then
fi

generate_csv_file ${pyresults}
$TOOLS_BIN/csv_to_json $to_json_flags --csv_file ${pyresults}.csv --output_file ${pyresults}.json
$TOOLS_BIN/verify_results $to_verify_flags --file ${pyresults}.json --schema_file $to_script_dir/../result_schema.py --class_name PyperfResult
else
source ~/.bashrc
arguments="${arguments} --test_iterations ${to_times_to_run}"
Expand Down
13 changes: 13 additions & 0 deletions result_schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from enum import Enum
import pydantic

class DurationUnit(str, Enum):
sec = "sec"
ms = "ms"
us = "us"
ns = "ns"

class PyperfResult(pydantic.BaseModel):
Test: str = pydantic.Field(description="Name of the test that was ran")
Avg: float = pydantic.Field(description="Duration, unit is determined by duration_unit field", allow_inf_nan=False, gt=0)
Unit: DurationUnit = pydantic.Field(description="Unit of duration")
26 changes: 26 additions & 0 deletions tests/test_duration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from pathlib import Path
import pydantic
import sys
import pytest

file = Path(__file__).resolve()
parent = file.parent.parent
sys.path.append(str(parent))

from result_schema import PyperfResult, DurationUnit

@pytest.mark.parametrize("duration", [
"-12", "0", "0.0", "inf", "nan",
"abc", "123abc", "123abc", "12abc34",
"123.123.123", "-0", "-0.0", "-inf", "-nan"
])
def test_duration_invalid(duration):
with pytest.raises(pydantic.ValidationError):
PyperfResult(Test="test", Avg=duration, Unit=DurationUnit.sec)

@pytest.mark.parametrize("duration", [
"123", "123.456", "0.000001", "0.000000001", "1234567890", "1234567890.1234567890"
])
def test_duration_valid(duration):
result = PyperfResult(Test="test", Avg=duration, Unit=DurationUnit.sec)
assert result.Avg == float(duration)
26 changes: 26 additions & 0 deletions tests/test_duration_unit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from pathlib import Path
import pydantic
import sys
import pytest

file = Path(__file__).resolve()
parent = file.parent.parent
sys.path.append(str(parent))

from result_schema import PyperfResult, DurationUnit

@pytest.mark.parametrize("duration_unit", [
"MS", "Day", "Year", "Hour", "cat", "dog",
"123", "-12034"
])
def test_duration_unit_invalid(duration_unit):
with pytest.raises(pydantic.ValidationError):
PyperfResult(Test="test", Avg=12, Unit=duration_unit)

@pytest.mark.parametrize("duration_unit", [
DurationUnit.sec, DurationUnit.ms, DurationUnit.us, DurationUnit.ns,
"sec", "ms", "us", "ns"
])
def test_duration_unit_invalid(duration_unit):
result = PyperfResult(Test="test", Avg=12, Unit=duration_unit)
assert result.Unit == duration_unit