Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: tests/test_diff_script.py

Issue 29922555: Issue 7059 - Modify fldiff so it can handle multiple files (Closed) Base URL: https://hg.adblockplus.org/python-abp
Left Patch Set: Created Oct. 24, 2018, 2:27 a.m.
Right Patch Set: Address comments on PS4 Created Oct. 31, 2018, 7:11 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « abp/filters/diff_script.py ('k') | tests/test_differ.py » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 # This file is part of Adblock Plus <https://adblockplus.org/>, 1 # This file is part of Adblock Plus <https://adblockplus.org/>,
2 # Copyright (C) 2006-present eyeo GmbH 2 # Copyright (C) 2006-present eyeo GmbH
3 # 3 #
4 # Adblock Plus is free software: you can redistribute it and/or modify 4 # Adblock Plus is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License version 3 as 5 # it under the terms of the GNU General Public License version 3 as
6 # published by the Free Software Foundation. 6 # published by the Free Software Foundation.
7 # 7 #
8 # Adblock Plus is distributed in the hope that it will be useful, 8 # Adblock Plus is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details. 11 # GNU General Public License for more details.
12 # 12 #
13 # You should have received a copy of the GNU General Public License 13 # You should have received a copy of the GNU General Public License
14 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. 14 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
15 15
16 """Functional tests for the diff script.""" 16 """Functional tests for the diff script."""
17 17
18 from __future__ import unicode_literals 18 from __future__ import unicode_literals
19 19
20 import pytest 20 import pytest
21 import subprocess 21 import subprocess
22 import io 22 import io
23 import os 23 import os
24 import re
24 25
25 from test_differ import BASE, LATEST 26 from test_differ import BASE, LATEST
26 from abp.filters.diff_script import main as diff_script
27
28 BASE2 = BASE + '&adnet=\n'
29 27
30 28
31 @pytest.fixture 29 @pytest.fixture
32 def rootdir(tmpdir): 30 def rootdir(tmpdir):
33 """Directory with example filter lists.""" 31 """Root directory for test files."""
34 rootdir = tmpdir.join('root') 32 rootdir = tmpdir.join('root')
35 rootdir.mkdir() 33 rootdir.mkdir()
36 rootdir.join('latest.txt').write_text(LATEST, encoding='utf8') 34 rootdir.join('latest.txt').write_text(LATEST, encoding='utf8')
37 return rootdir 35 return rootdir
38 36
39 37
40 @pytest.fixture 38 @pytest.fixture
41 def archive_dir(tmpdir, rootdir): 39 def archive_dir(rootdir):
Vasily Kuznetsov 2018/10/24 11:30:10 You don't seem to be using tmpdir in this function
rhowell 2018/10/26 21:42:21 Done.
42 archive_dir = rootdir.join('archive') 40 return rootdir.mkdir('archive')
43 archive_dir.mkdir()
44 archive_dir.join('list1.txt').write_text(BASE, encoding='utf8')
45 archive_dir.join('list2.txt').write_text(BASE2, encoding='utf8')
46 return archive_dir
47 41
48 42
49 @pytest.fixture 43 @pytest.fixture
50 def diff_dir(tmpdir, rootdir): 44 def diff_dir(rootdir):
Vasily Kuznetsov 2018/10/24 11:30:09 tmpdir also unused here, and the function could be
rhowell 2018/10/26 21:42:21 Done.
51 diff_dir = rootdir.join('diff') 45 return rootdir.mkdir('diff')
52 diff_dir.mkdir()
53 return diff_dir
54 46
55 47
56 @pytest.fixture 48 @pytest.fixture
57 def dstfile(tmpdir): 49 def archived_files(archive_dir):
58 """Destination file for saving the diff output.""" 50 base2 = BASE + '&adnet=\n'
59 return tmpdir.join('dst') 51 base2 = re.sub(r'! Version: \d+', '! Version: 112', base2)
52 archive_dir.join('list111.txt').write_text(BASE, encoding='utf8')
53 archive_dir.join('list112.txt').write_text(base2, encoding='utf8')
54 return [str(x) for x in archive_dir.listdir()]
55
56
57 @pytest.fixture
58 def base_no_version(archive_dir):
59 base = re.sub(r'! Version: \d+', '! ', BASE)
60 archive_dir.join('list113.txt').write_text(base, encoding='utf8')
61 return [str(x) for x in archive_dir.listdir()]
60 62
61 63
62 def run_script(*args, **kw): 64 def run_script(*args, **kw):
63 """Run diff rendering script with given arguments and return its output.""" 65 """Run diff rendering script with given arguments and return its output."""
64 cmd = ['fldiff'] + list(args) 66 cmd = ['fldiff'] + list(args)
65 67
66 proc = subprocess.Popen(cmd, stderr=subprocess.PIPE, 68 proc = subprocess.Popen(cmd, stderr=subprocess.PIPE,
67 stdout=subprocess.PIPE, stdin=subprocess.PIPE, 69 stdout=subprocess.PIPE, stdin=subprocess.PIPE,
68 **kw) 70 **kw)
69 stdout, stderr = proc.communicate() 71 stdout, stderr = proc.communicate()
Vasily Kuznetsov 2018/10/24 11:30:09 Since we can't really output to stdout anymore (be
rhowell 2018/10/26 21:42:22 Looks like subprocess.run() was added in Python 3.
Vasily Kuznetsov 2018/10/29 16:31:48 Indeed, sorry, I forgot that we're also supporting
70 return proc.returncode, stderr.decode('utf-8'), stdout.decode('utf-8') 72 return proc.returncode, stderr.decode('utf-8'), stdout.decode('utf-8')
71 73
72 74
73 def test_diff_with_dict(rootdir, archive_dir, diff_dir): 75 def test_diff_with_outfile(rootdir, archived_files, diff_dir):
74 args = [] 76 run_script(str(rootdir.join('latest.txt')), '-o', str(diff_dir),
75 args.append('-l ' + str(rootdir.join('latest.txt'))) 77 *archived_files)
76 args.append('-o ' + str(diff_dir)) 78 assert len(diff_dir.listdir()) == 2
77 args.append(str(archive_dir.join('list1.txt'))) 79 for file in diff_dir.visit():
Vasily Kuznetsov 2018/10/24 11:30:09 With the way we use `archive_dir` fixture, I'm thi
rhowell 2018/10/26 21:42:22 Yeah, this way seems much cleaner.
78 args.append(str(archive_dir.join('list2.txt'))) 80 with io.open(str(file), encoding='utf-8') as dst:
79 diff_script(args) 81 result = dst.read()
80 for root, dirs, files in os.walk(str(diff_dir)): 82 assert '- &ad.vid=$~xmlhttprequest' in result
81 for file in files: 83 assert '+ &ad_channel=\xa3' in result
82 with io.open(str(diff_dir.join(file)), encoding='utf-8') as dst: 84 assert '! Version: 123' in result
83 result = dst.read()
84 assert '- &ad.vid=$~xmlhttprequest' in result
85 assert '+ &ad_channel=\xa3' in result
86 assert '! Version: 123' in result
87 85
88 86
89 def test_diff_with_outfile(rootdir, archive_dir, diff_dir): 87 def test_diff_no_outfile(rootdir, archived_files):
90 run_script('-o ' + str(diff_dir), 88 os.chdir(str(rootdir))
91 '-l ' + str(rootdir.join('latest.txt')), 89 run_script(str(rootdir.join('latest.txt')), *archived_files)
92 str(archive_dir.join('list1.txt')), 90 for file in ['diff111.txt', 'diff112.txt']:
93 str(archive_dir.join('list2.txt')), 91 with io.open(file, encoding='utf-8') as dst:
94 ) 92 result = dst.read()
95 for root, dirs, files in os.walk(str(diff_dir)): 93 assert '- &ad.vid=$~xmlhttprequest' in result
96 for file in files: 94 assert '+ &ad_channel=\xa3' in result
97 with io.open(str(diff_dir.join(file)), encoding='utf-8') as dst: 95 assert '! Version: 123' in result
98 result = dst.read()
99 assert '- &ad.vid=$~xmlhttprequest' in result
100 assert '+ &ad_channel=\xa3' in result
101 assert '! Version: 123' in result
102
103
104 def test_no_outfile(rootdir, archive_dir, diff_dir):
Vasily Kuznetsov 2018/10/24 11:30:09 Since this mode of running doesn't really work wit
rhowell 2018/10/26 21:42:21 Done.
105 _, _, out = run_script('-l ' + str(rootdir.join('latest.txt')),
106 str(archive_dir.join('list1.txt')),
107 str(archive_dir.join('list2.txt')),
108 )
109 assert '[Adblock Plus Diff]' in out
110 96
111 97
112 def test_no_base_file(rootdir): 98 def test_no_base_file(rootdir):
113 code, err, _ = run_script('-l ' + str(rootdir.join('latest.txt'))) 99 code, err, _ = run_script(str(rootdir.join('latest.txt')))
114 assert code == 1 100 assert code == 2
115 assert err == 'Archived lists are required\n' 101 assert 'usage: fldiff' in err
116 102
117 103
118 def test_no_latest_file(rootdir): 104 def test_wrong_file(rootdir):
119 code, err, _ = run_script(str(rootdir.join('base.txt')), 'wrong.txt') 105 code, err, _ = run_script(str(rootdir.join('base.txt')), 'wrong.txt')
120 assert code == 1 106 assert code == 1
121 assert err == 'The --latest list is required\n' 107 assert 'No such file or directory' in err
122 108
123 109
124 def test_diff_to_self(rootdir): 110 def test_diff_to_self(rootdir, diff_dir):
125 _, _, out = run_script('-l ' + str(rootdir.join('latest.txt')), 111 run_script(str(rootdir.join('latest.txt')), '-o', str(diff_dir),
126 str(rootdir.join('latest.txt'))) 112 str(rootdir.join('latest.txt')))
127 assert out == '[Adblock Plus Diff]\n' 113 assert len(diff_dir.listdir()) == 1
114 for file in diff_dir.visit():
115 with io.open(str(file), encoding='utf-8') as dst:
116 result = dst.read()
117 assert result == '[Adblock Plus Diff]\n'
118
119
120 def test_no_version(rootdir, base_no_version):
121 code, err, _ = run_script(str(rootdir.join('latest.txt')), '-o',
122 str(diff_dir), *base_no_version)
123 assert code == 1
124 assert 'Unable to find Version in ' in err
125
126
127 def test_write_and_overwrite(rootdir, archived_files, diff_dir):
128 test_diff_with_outfile(rootdir, archived_files, diff_dir)
129 latest = re.sub(r'&act=ads_', '! ', BASE)
130 latest = latest + '&adurl=\n'
131 rootdir.join('latest.txt').write_text(latest, encoding='utf8')
132 run_script(str(rootdir.join('latest.txt')), '-o', str(diff_dir),
133 *archived_files)
134 assert len(diff_dir.listdir()) == 2
135 for file in diff_dir.visit():
136 with io.open(str(file), encoding='utf-8') as dst:
137 result = dst.read()
138 assert '- &act=ads_' in result
139 assert '+ &adurl=' in result
140 assert '- &ad.vid=$~xmlhttprequest' not in result
LEFTRIGHT

Powered by Google App Engine
This is Rietveld