Repository navigation
Expand file tree
/
Copy pathtest_file_resource_leak.py
More file actions
151 lines (132 loc) · 4.46 KB
/
Copy pathtest_file_resource_leak.py
File metadata and controls
151 lines (132 loc) · 4.46 KB
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
149
150
151
from tests.codemods.base_codemod_test import BaseCodemodTest
from core_codemods.file_resource_leak import FileResourceLeak
from textwrap import dedent
class TestFileResourceLeak(BaseCodemodTest):
codemod = FileResourceLeak
def test_name(self):
assert self.codemod.name == "fix-file-resource-leak"
def test_simple(self, tmpdir):
input_code = """\
file = open('test.txt', 'r')
file.read()
"""
expected = """\
with open('test.txt', 'r') as file:
file.read()
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(expected))
def test_simple_annotated(self, tmpdir):
input_code = """\
file: int = open('test.txt', 'r')
file.read()
"""
expected = """\
with open('test.txt', 'r') as file:
file.read()
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(expected))
def test_just_open(self, tmpdir):
# strange as this change may be, it still leaks if left untouched
input_code = """\
file = open('test.txt', 'r')
"""
expected = """\
with open('test.txt', 'r') as file:
pass
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(expected))
def test_multiple_assignments(self, tmpdir):
input_code = """\
file = file2 = open('test.txt', 'r')
file.read()
"""
expected = """\
with open('test.txt', 'r') as file, file as file2:
file.read()
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(expected))
def test_minimal_block(self, tmpdir):
input_code = """\
file = open('test.txt', 'r')
file.read()
pass
"""
expected = """\
with open('test.txt', 'r') as file:
file.read()
pass
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(expected))
# negative tests below
def test_is_closed(self, tmpdir):
input_code = """\
file = open('test.txt', 'r')
file.read()
file.close()
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(input_code))
def test_is_closed_with_exit(self, tmpdir):
input_code = """\
file = open('test.txt', 'r')
file.read()
file.__exit__()
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(input_code))
def test_is_closed_with_statement(self, tmpdir):
input_code = """\
file = open('test.txt', 'r')
with file:
file.read()
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(input_code))
def test_is_closed_with_statement_and_contextlib(self, tmpdir):
input_code = """\
import contextlib
file = open('test.txt', 'r')
with contextlib.closing(file):
file.read()
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(input_code))
def test_is_closed_transitivelly(self, tmpdir):
input_code = """\
file = open('test.txt', 'r')
same_file = file
same_file.close()
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(input_code))
def test_escapes_with_assignment(self, tmpdir):
input_code = """\
file = open('test.txt', 'r')
Object.attribute = file
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(input_code))
def test_escapes_as_function_argument(self, tmpdir):
input_code = """\
file = open('test.txt', 'r')
foo(file)
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(input_code))
def test_escapes_returned(self, tmpdir):
input_code = """\
def foo():
file = open('test.txt', 'r')
return file
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(input_code))
def test_escapes_yielded(self, tmpdir):
input_code = """\
def foo():
file = open('test.txt', 'r')
yield file
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(input_code))
def test_escapes_outside_reference(self, tmpdir):
input_code = """\
out = None
if True:
file = open('test.txt', 'r')
out = file
file.read()
out.read()
"""
self.run_and_assert(tmpdir, dedent(input_code), dedent(input_code))