38 lines
1.7 KiB
Python
38 lines
1.7 KiB
Python
import importlib.util
|
|
from pathlib import Path
|
|
import unittest
|
|
|
|
spec=importlib.util.spec_from_file_location('interval',Path(__file__).parents[1]/'platform_timing_nts_interval.py')
|
|
interval=importlib.util.module_from_spec(spec);spec.loader.exec_module(interval)
|
|
|
|
|
|
class IntervalTests(unittest.TestCase):
|
|
def endpoint(self, boot, utc, error=3):
|
|
return dict(observer_started_wall_ns=utc-100,
|
|
observation=dict(boot_id='a'*32,boottime_ns=boot,utc_ns=utc,
|
|
sampling_bracket_ns=1,observation_error_ns=error,collected_at_ns=boot+1,
|
|
assessment=dict(reference_time=str(utc/10**9))))
|
|
|
|
def test_conservative_interval_and_ceil_never_profile(self):
|
|
result=interval.analyze(self.endpoint(1,10**9),self.endpoint(4,10**9+5))
|
|
self.assertEqual(result['elapsed_error_interval_ns'],[-8,4])
|
|
self.assertEqual(result['observed_interval_envelope_ppb'],2666666667)
|
|
self.assertIsNone(result['max_elapsed_error_ppb'])
|
|
self.assertFalse(result['qualified'])
|
|
|
|
def test_cross_boot_rejected(self):
|
|
a,b=self.endpoint(1,10**9),self.endpoint(100,10**9+100)
|
|
b['observation']['boot_id']='b'*32
|
|
with self.assertRaises(ValueError):interval.analyze(a,b)
|
|
|
|
def test_stale_reference_rejected(self):
|
|
a,b=self.endpoint(1,10**9),self.endpoint(100,10**9+100)
|
|
b['observer_started_wall_ns']=2*10**9
|
|
with self.assertRaises(ValueError):interval.analyze(a,b)
|
|
|
|
def test_overlapping_endpoints_rejected(self):
|
|
with self.assertRaises(ValueError):interval.analyze(self.endpoint(1,10**9),self.endpoint(2,10**9+1))
|
|
|
|
|
|
if __name__=='__main__':unittest.main()
|