#
import contextlib
+import os
import sys
+import time
from typing import Iterator, Optional
+def _get_time_ns():
+ # type: () -> int
+
+ # time.monotonic is only available since Python 3.3. We don't support
+ # those older versions so we can simply assert here.
+ assert sys.version_info >= (3, 3, 0)
+
+ # time.monotonic_ns is only available for python >= 3.8,
+ # so the value is multiplied by 10^9 to maintain compatibility with
+ # older versions of the interpreter.
+ return int(time.monotonic() * 1000000000)
+
+
class InvalidTestPlan(RuntimeError):
def __init__(self, msg):
# type: (str) -> None
self._last_test_case_id = 0 # type: int
self._printed_plan = False # type: bool
self._has_failure = False # type: bool
+ self._time_tests = True # type: bool
+ if os.getenv("TAP_AUTOTIME", "1") == "" or os.getenv("TAP_AUTOTIME", "1") == "0":
+ self._time_tests = False
+ self._last_time = _get_time_ns()
def __del__(self):
if self.remaining_test_cases > 0:
def test(self, result, description):
# type: (bool, str) -> None
+ duration = (_get_time_ns() - self._last_time) / 1000000
if self._last_test_case_id == self._total_test_count:
raise InvalidTestPlan("Executing too many tests")
description=description,
)
)
+ if self._time_tests:
+ self._print("---\n duration_ms: {}\n...\n".format(duration))
+ self._last_time = _get_time_ns()
def ok(self, description):
# type: (str) -> None