|
|
|
|
|
|
|
|
|
|
|
|
| """Tests which are meant to be run as root.
|
|
|
| NOTE: keep this module compatible with unittest: we want to run this
|
| file with the unittest runner, since pytest may not be installed for
|
| the root user.
|
| """
|
|
|
| import datetime
|
| import time
|
| import unittest
|
|
|
| import psutil
|
| from psutil import FREEBSD
|
| from psutil import LINUX
|
| from psutil import OPENBSD
|
| from psutil import WINDOWS
|
| from psutil.tests import CI_TESTING
|
| from psutil.tests import PsutilTestCase
|
|
|
|
|
| def get_systime():
|
| if hasattr(time, "clock_gettime") and hasattr(time, "CLOCK_REALTIME"):
|
| return time.clock_gettime(time.CLOCK_REALTIME)
|
| return time.time()
|
|
|
|
|
| def set_systime(secs):
|
| if hasattr(time, "clock_settime") and hasattr(time, "CLOCK_REALTIME"):
|
| try:
|
| time.clock_settime(time.CLOCK_REALTIME, secs)
|
| except PermissionError:
|
| raise unittest.SkipTest("needs root")
|
| elif WINDOWS:
|
| import pywintypes
|
| import win32api
|
|
|
| dt = datetime.datetime.fromtimestamp(secs, datetime.timezone.utc)
|
| try:
|
| win32api.SetSystemTime(
|
| dt.year,
|
| dt.month,
|
| dt.isoweekday() % 7,
|
| dt.day,
|
| dt.hour,
|
| dt.minute,
|
| dt.second,
|
| int(dt.microsecond / 1000),
|
| )
|
| except pywintypes.error as err:
|
| if err.winerror == 1314:
|
| raise unittest.SkipTest("needs Administrator user")
|
| raise
|
| else:
|
| raise unittest.SkipTest("setting systime not supported")
|
|
|
|
|
| class TestUpdatedSystemTime(PsutilTestCase):
|
| """Tests which update the system clock."""
|
|
|
| def setUp(self):
|
| self.time_updated = False
|
| self.orig_time = get_systime()
|
| self.time_started = time.monotonic()
|
|
|
| def tearDown(self):
|
| if self.time_updated:
|
| extra_t = time.monotonic() - self.time_started
|
| set_systime(self.orig_time + extra_t)
|
|
|
| def update_systime(self):
|
|
|
| set_systime(self.orig_time + 3600)
|
| self.time_updated = True
|
|
|
| def test_boot_time(self):
|
|
|
| t1 = psutil.boot_time()
|
| self.update_systime()
|
| t2 = psutil.boot_time()
|
| self.assertGreater(t2, t1)
|
| diff = int(t2 - t1)
|
| self.assertAlmostEqual(diff, 3600, delta=1)
|
|
|
| @unittest.skipIf(WINDOWS, "broken on WINDOWS")
|
| def test_proc_create_time(self):
|
|
|
|
|
|
|
| t1 = psutil.Process().create_time()
|
| self.update_systime()
|
| t2 = psutil.Process().create_time()
|
| diff = int(t2 - t1)
|
| self.assertAlmostEqual(diff, 3600, delta=1)
|
|
|
| @unittest.skipIf(CI_TESTING, "skipped on CI for now")
|
| @unittest.skipIf(OPENBSD, "broken on OPENBSD")
|
| @unittest.skipIf(FREEBSD, "broken on FREEBSD")
|
| def test_proc_ident(self):
|
| p1 = psutil.Process()
|
| self.update_systime()
|
| p2 = psutil.Process()
|
| self.assertEqual(p1._get_ident(), p2._get_ident())
|
| self.assertEqual(p1, p2)
|
|
|
| @unittest.skipIf(not LINUX, "LINUX only")
|
| def test_linux_monotonic_proc_time(self):
|
| t1 = psutil.Process()._proc.create_time(monotonic=True)
|
| self.update_systime()
|
| time.sleep(0.05)
|
| t2 = psutil.Process()._proc.create_time(monotonic=True)
|
| self.assertEqual(t1, t2)
|
|
|