|
36 | 36 | import queue
|
37 | 37 | import random
|
38 | 38 | import re
|
| 39 | +import shutil |
39 | 40 | import socket
|
40 | 41 | import struct
|
41 | 42 | import sys
|
@@ -5434,6 +5435,53 @@ def test_compute_rollover_weekly_attime(self):
|
5434 | 5435 | finally:
|
5435 | 5436 | rh.close()
|
5436 | 5437 |
|
| 5438 | + def test_compute_files_to_delete(self): |
| 5439 | + # See bpo-46063 for background |
| 5440 | + wd = tempfile.mkdtemp(prefix='test_logging_') |
| 5441 | + self.addCleanup(shutil.rmtree, wd) |
| 5442 | + times = [] |
| 5443 | + dt = datetime.datetime.now() |
| 5444 | + for i in range(10): |
| 5445 | + times.append(dt.strftime('%Y-%m-%d_%H-%M-%S')) |
| 5446 | + dt += datetime.timedelta(seconds=5) |
| 5447 | + prefixes = ('a.b', 'a.b.c', 'd.e', 'd.e.f') |
| 5448 | + files = [] |
| 5449 | + rotators = [] |
| 5450 | + for prefix in prefixes: |
| 5451 | + p = os.path.join(wd, '%s.log' % prefix) |
| 5452 | + rotator = logging.handlers.TimedRotatingFileHandler(p, when='s', |
| 5453 | + interval=5, |
| 5454 | + backupCount=7) |
| 5455 | + rotators.append(rotator) |
| 5456 | + if prefix.startswith('a.b'): |
| 5457 | + for t in times: |
| 5458 | + files.append('%s.log.%s' % (prefix, t)) |
| 5459 | + else: |
| 5460 | + rotator.namer = lambda name: name.replace('.log', '') + '.log' |
| 5461 | + for t in times: |
| 5462 | + files.append('%s.%s.log' % (prefix, t)) |
| 5463 | + # Open empty files |
| 5464 | + for fn in files: |
| 5465 | + p = os.path.join(wd, fn) |
| 5466 | + with open(p, 'wb') as f: |
| 5467 | + pass |
| 5468 | + # Now the checks that only the correct files are offered up for deletion |
| 5469 | + for i, prefix in enumerate(prefixes): |
| 5470 | + rotator = rotators[i] |
| 5471 | + candidates = rotator.getFilesToDelete() |
| 5472 | + self.assertEqual(len(candidates), 3) |
| 5473 | + if prefix.startswith('a.b'): |
| 5474 | + p = '%s.log.' % prefix |
| 5475 | + for c in candidates: |
| 5476 | + d, fn = os.path.split(c) |
| 5477 | + self.assertTrue(fn.startswith(p)) |
| 5478 | + else: |
| 5479 | + for c in candidates: |
| 5480 | + d, fn = os.path.split(c) |
| 5481 | + self.assertTrue(fn.endswith('.log')) |
| 5482 | + self.assertTrue(fn.startswith(prefix + '.') and |
| 5483 | + fn[len(prefix) + 2].isdigit()) |
| 5484 | + |
5437 | 5485 |
|
5438 | 5486 | def secs(**kw):
|
5439 | 5487 | return datetime.timedelta(**kw) // datetime.timedelta(seconds=1)
|
|
0 commit comments