You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
118 lines
3.7 KiB
Python
118 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
|
|
|
# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
"""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): # secs since the epoch
|
|
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 system time 1 hour later
|
|
set_systime(self.orig_time + 3600)
|
|
self.time_updated = True
|
|
|
|
def test_boot_time(self):
|
|
# Test that boot_time() reflects system clock updates.
|
|
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") # TODO: fix it
|
|
def test_proc_create_time(self):
|
|
# Test that Process.create_time() reflects system clock
|
|
# updates. On systems such as Linux this is added on top of the
|
|
# process monotonic time returned by the kernel.
|
|
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") # TODO: fix it
|
|
@unittest.skipIf(OPENBSD, "broken on OPENBSD") # TODO: fix it
|
|
@unittest.skipIf(FREEBSD, "broken on FREEBSD") # TODO: fix it
|
|
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)
|