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()