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