forked from Delgan/loguru
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_filesink_watch.py
148 lines (117 loc) · 4.4 KB
/
test_filesink_watch.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import os
from unittest.mock import Mock
import pytest
from loguru import logger
from .conftest import check_dir
@pytest.mark.skipif(os.name == "nt", reason="Windows can't delete file in use")
def test_file_deleted_before_write_without_delay(tmp_path):
file = tmp_path / "test.log"
logger.add(file, format="{message}", watch=True, delay=False)
os.remove(str(file))
logger.info("Test")
assert file.read_text() == "Test\n"
@pytest.mark.skipif(os.name == "nt", reason="Windows can't delete file in use")
def test_file_deleted_before_write_with_delay(tmp_path):
file = tmp_path / "test.log"
logger.add(file, format="{message}", watch=True, delay=True)
logger.info("Test 1")
os.remove(str(file))
logger.info("Test 2")
assert file.read_text() == "Test 2\n"
@pytest.mark.skipif(os.name == "nt", reason="Windows can't delete file in use")
def test_file_path_containing_placeholder(tmp_path):
logger.add(tmp_path / "test_{time}.log", format="{message}", watch=True)
check_dir(tmp_path, size=1)
filepath = next(tmp_path.iterdir())
os.remove(str(filepath))
logger.info("Test")
check_dir(tmp_path, size=1)
assert filepath.read_text() == "Test\n"
@pytest.mark.skipif(os.name == "nt", reason="Windows can't delete file in use")
def test_file_reopened_with_arguments(tmp_path):
file = tmp_path / "test.log"
logger.add(file, format="{message}", watch=True, encoding="ascii", errors="replace")
os.remove(str(file))
logger.info("é")
assert file.read_text() == "?\n"
@pytest.mark.skipif(os.name == "nt", reason="Windows can't delete file in use")
def test_file_manually_changed(tmp_path):
file = tmp_path / "test.log"
logger.add(file, format="{message}", watch=True, mode="w")
os.remove(str(file))
file.write_text("Placeholder")
logger.info("Test")
assert file.read_text() == "Test\n"
@pytest.mark.skipif(os.name == "nt", reason="Windows can't delete file in use")
def test_file_folder_deleted(tmp_path):
file = tmp_path / "foo/bar/test.log"
logger.add(file, format="{message}", watch=True)
os.remove(str(file))
os.rmdir(str(tmp_path / "foo/bar"))
logger.info("Test")
assert file.read_text() == "Test\n"
@pytest.mark.skipif(os.name == "nt", reason="Windows can't delete file in use")
def test_file_deleted_before_rotation(tmp_path):
exists = None
file = tmp_path / "test.log"
def rotate(_, __):
nonlocal exists
exists = file.exists()
return False
logger.add(file, format="{message}", watch=True, rotation=rotate)
os.remove(str(file))
logger.info("Test")
assert exists is True
@pytest.mark.skipif(os.name == "nt", reason="Windows can't delete file in use")
def test_file_deleted_before_compression(tmp_path):
exists = None
file = tmp_path / "test.log"
def compress(_):
nonlocal exists
exists = file.exists()
return False
logger.add(file, format="{message}", watch=True, compression=compress)
os.remove(str(file))
logger.remove()
assert exists is True
@pytest.mark.skipif(os.name == "nt", reason="Windows can't delete file in use")
def test_file_deleted_before_retention(tmp_path):
exists = None
file = tmp_path / "test.log"
def retain(_):
nonlocal exists
exists = file.exists()
return False
logger.add(file, format="{message}", watch=True, retention=retain)
os.remove(str(file))
logger.remove()
assert exists is True
def test_file_correctly_reused_after_rotation(tmp_path):
filepath = tmp_path / "test.log"
logger.add(
filepath,
format="{message}",
mode="w",
watch=True,
rotation=Mock(side_effect=[False, True, False]),
)
logger.info("Test 1")
logger.info("Test 2")
logger.info("Test 3")
check_dir(tmp_path, size=2)
rotated = next(f for f in tmp_path.iterdir() if f != filepath)
assert rotated.read_text() == "Test 1\n"
assert filepath.read_text() == "Test 2\nTest 3\n"
@pytest.mark.parametrize("delay", [True, False])
@pytest.mark.parametrize("compression", [None, lambda _: None])
def test_file_closed_without_being_logged(tmp_path, delay, compression):
filepath = tmp_path / "test.log"
logger.add(
filepath,
format="{message}",
watch=True,
delay=delay,
compression=compression,
)
logger.remove()
assert filepath.exists() is (False if delay else True)