1import os
2import shutil
3import subprocess
4import pytest
5
6@pytest.fixture(scope='session', autouse=True)
7def prepare_testdata(request):
8	print('Preparing test data for "rename"')
9	pytest.check_config()
10
11	nserv_datadir = pytest.config.getini('nserv_datadir')
12	nzbget_bin = pytest.config.getini('nzbget_bin')
13	sevenzip_bin = pytest.config.getini('sevenzip_bin')
14	par2_bin = pytest.config.getini('par2_bin')
15
16	if not os.path.exists(nserv_datadir):
17		print('Creating nserv datadir')
18		os.makedirs(nserv_datadir)
19
20	nzbget_srcdir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
21	testdata_dir = nzbget_srcdir + '/tests/testdata'
22
23	if not os.path.exists(nserv_datadir + '/parrename'):
24		os.makedirs(nserv_datadir + '/parrename')
25		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3.part01.rar', nserv_datadir + '/parrename/testfile3.part01.rar')
26		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3.part02.rar', nserv_datadir + '/parrename/testfile3.part02.rar')
27		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3.part03.rar', nserv_datadir + '/parrename/testfile3.part03.rar')
28		os.chdir(nserv_datadir + '/parrename')
29		if 0 != subprocess.call([par2_bin, 'c', '-b20', 'parrename.par2', '*']):
30			pytest.exit('Test file generation failed')
31		os.rename(nserv_datadir + '/parrename/testfile3.part01.rar', nserv_datadir + '/parrename/abc.21')
32		os.rename(nserv_datadir + '/parrename/testfile3.part02.rar', nserv_datadir + '/parrename/abc.02')
33		os.rename(nserv_datadir + '/parrename/testfile3.part03.rar', nserv_datadir + '/parrename/abc.15')
34
35	def prepare_test(dirname, testfile):
36		if not os.path.exists(nserv_datadir + '/' + dirname + '.nzb'):
37			os.makedirs(nserv_datadir + '/' + dirname)
38			shutil.copyfile(testdata_dir + '/rarrenamer/' + testfile + '.part01.rar', nserv_datadir + '/' + dirname + '/abc.21')
39			shutil.copyfile(testdata_dir + '/rarrenamer/' + testfile + '.part02.rar', nserv_datadir + '/' + dirname + '/abc.02')
40			shutil.copyfile(testdata_dir + '/rarrenamer/' + testfile + '.part03.rar', nserv_datadir + '/' + dirname + '/abc.15')
41			os.chdir(nserv_datadir + '/' + dirname)
42			if 0 != subprocess.call([par2_bin, 'c', '-b20', 'parrename.par2', '*']):
43				pytest.exit('Test file generation failed')
44
45	prepare_test('rarrename3', 'testfile3')
46	prepare_test('rarrename5', 'testfile5')
47	prepare_test('rarrename3encdata', 'testfile3encdata')
48	prepare_test('rarrename5encdata', 'testfile5encdata')
49	prepare_test('rarrename3encnam', 'testfile3encnam')
50	prepare_test('rarrename5encnam', 'testfile5encnam')
51
52	if not os.path.exists(nserv_datadir + '/rarrename2sets'):
53		os.makedirs(nserv_datadir + '/rarrename2sets')
54		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3.part01.rar', nserv_datadir + '/rarrename2sets/abc.21')
55		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3.part02.rar', nserv_datadir + '/rarrename2sets/abc.02')
56		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3.part03.rar', nserv_datadir + '/rarrename2sets/abc.15')
57		shutil.copyfile(testdata_dir + '/rarrenamer/testfile5.part01.rar', nserv_datadir + '/rarrename2sets/abc.22')
58		shutil.copyfile(testdata_dir + '/rarrenamer/testfile5.part02.rar', nserv_datadir + '/rarrename2sets/abc.03')
59		shutil.copyfile(testdata_dir + '/rarrenamer/testfile5.part03.rar', nserv_datadir + '/rarrename2sets/abc.14')
60
61	if not os.path.exists(nserv_datadir + '/rarrename3oldnam'):
62		os.makedirs(nserv_datadir + '/rarrename3oldnam')
63		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3oldnam.rar', nserv_datadir + '/rarrename3oldnam/abc.61')
64		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3oldnam.r00', nserv_datadir + '/rarrename3oldnam/abc.32')
65		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3oldnam.r01', nserv_datadir + '/rarrename3oldnam/abc.45')
66
67	if not os.path.exists(nserv_datadir + '/rarrename3badext'):
68		os.makedirs(nserv_datadir + '/rarrename3badext')
69		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3oldnam.rar', nserv_datadir + '/rarrename3badext/testfile3oldnam.rar')
70		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3oldnam.r00', nserv_datadir + '/rarrename3badext/testfile3oldnam.r03')
71		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3oldnam.r01', nserv_datadir + '/rarrename3badext/testfile3oldnam.r02')
72
73	if not os.path.exists(nserv_datadir + '/rarrename5badext'):
74		os.makedirs(nserv_datadir + '/rarrename5badext')
75		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3.part01.rar', nserv_datadir + '/rarrename5badext/testfile3.part01.rar')
76		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3.part02.rar', nserv_datadir + '/rarrename5badext/testfile3.part0002.rar')
77		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3.part03.rar', nserv_datadir + '/rarrename5badext/testfile3.part03.rar')
78
79	if not os.path.exists(nserv_datadir + '/rar3ignoreext'):
80		os.makedirs(nserv_datadir + '/rar3ignoreext')
81		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3.part01.rar', nserv_datadir + '/rar3ignoreext/testfile3-1.cbr')
82		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3.part02.rar', nserv_datadir + '/rar3ignoreext/testfile3-2.cbr')
83		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3.part03.rar', nserv_datadir + '/rar3ignoreext/testfile3-3.cbr')
84
85	if not os.path.exists(nserv_datadir + '/parjoin1.nzb'):
86		os.makedirs(nserv_datadir + '/parjoin1')
87		shutil.copyfile(testdata_dir + '/parchecker/testfile.dat', nserv_datadir + '/parjoin1/testfile.dat')
88		shutil.copyfile(testdata_dir + '/parchecker/testfile.nfo', nserv_datadir + '/parjoin1/testfile.nfo')
89		shutil.copyfile(testdata_dir + '/parchecker/testfile.par2', nserv_datadir + '/parjoin1/testfile.par2')
90		shutil.copyfile(testdata_dir + '/parchecker/testfile.vol00+1.PAR2', nserv_datadir + '/parjoin1/testfile.vol00+1.PAR2')
91		split_test_file(nserv_datadir + '/parjoin1', 'testfile.dat', 50244);
92
93	if not os.path.exists(nserv_datadir + '/parjoin2.nzb'):
94		os.makedirs(nserv_datadir + '/parjoin2')
95		shutil.copyfile(testdata_dir + '/parchecker/testfile.dat', nserv_datadir + '/parjoin2/testfile.dat')
96		shutil.copyfile(testdata_dir + '/parchecker/testfile.nfo', nserv_datadir + '/parjoin2/testfile.nfo')
97		shutil.copyfile(testdata_dir + '/parchecker/testfile.par2', nserv_datadir + '/parjoin2/testfile.par2')
98		shutil.copyfile(testdata_dir + '/parchecker/testfile.vol00+1.PAR2', nserv_datadir + '/parjoin2/testfile.vol00+1.PAR2')
99		split_test_file(nserv_datadir + '/parjoin2', 'testfile.dat', 50244);
100		os.rename(nserv_datadir + '/parjoin2/testfile.dat.001', nserv_datadir + '/parjoin2/renamed.001')
101		os.rename(nserv_datadir + '/parjoin2/testfile.dat.002', nserv_datadir + '/parjoin2/renamed.002')
102		os.rename(nserv_datadir + '/parjoin2/testfile.dat.003', nserv_datadir + '/parjoin2/renamed.003')
103
104	if 0 != subprocess.call([nzbget_bin, '--nserv', '-d', nserv_datadir, '-v', '2', '-z', '3000', '-q']):
105		pytest.exit('Test file generation failed')
106
107	if not os.path.exists(nserv_datadir + '/parjoin3.nzb'):
108		os.makedirs(nserv_datadir + '/parjoin3')
109		create_test_file(nserv_datadir + '/parjoin3', None, 20, 1)
110		os.chdir(nserv_datadir + '/parjoin3')
111		if 0 != subprocess.call([par2_bin, 'c', '-b100', 'parrename.par2', '*']):
112			pytest.exit('Test file generation failed')
113		split_test_file(nserv_datadir + '/parjoin3', '20mb.dat', 7*1024*1024);
114		os.rename(nserv_datadir + '/parjoin3/20mb.dat.001', nserv_datadir + '/parjoin3/renamed.001')
115		os.rename(nserv_datadir + '/parjoin3/20mb.dat.002', nserv_datadir + '/parjoin3/renamed.002')
116		os.rename(nserv_datadir + '/parjoin3/20mb.dat.003', nserv_datadir + '/parjoin3/renamed.003')
117		if 0 != subprocess.call([nzbget_bin, '--nserv', '-d', nserv_datadir, '-v', '2', '-z', '100000', '-q']):
118			pytest.exit('Test file generation failed')
119
120	if not os.path.exists(nserv_datadir + '/rarrename3sm'):
121		os.makedirs(nserv_datadir + '/rarrename3sm')
122		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3oldnam.rar', nserv_datadir + '/rarrename3sm/abc.61')
123		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3oldnam.r00', nserv_datadir + '/rarrename3sm/abc.32')
124		shutil.copyfile(testdata_dir + '/rarrenamer/testfile3oldnam.r01', nserv_datadir + '/rarrename3sm/abc.45')
125		os.chdir(nserv_datadir + '/rarrename3sm')
126		if 0 != subprocess.call([par2_bin, 'c', '-b100', 'parrename.par2', '*']):
127			pytest.exit('Test file generation failed')
128		if 0 != subprocess.call([nzbget_bin, '--nserv', '-d', nserv_datadir, '-v', '2', '-z', '500', '-q']):
129			pytest.exit('Test file generation failed')
130
131	if not os.path.exists(nserv_datadir + '/obfuscated1.nzb'):
132		create_test_file(nserv_datadir + '/obfuscated1', sevenzip_bin, 5, 1)
133		os.chdir(nserv_datadir + '/obfuscated1')
134		if 0 != subprocess.call([par2_bin, 'c', '-b100', 'parrename.par2', '*']):
135			pytest.exit('Test file generation failed')
136		os.rename(nserv_datadir + '/obfuscated1/5mb.7z.001', nserv_datadir + '/obfuscated1/abc.51')
137		os.rename(nserv_datadir + '/obfuscated1/5mb.7z.002', nserv_datadir + '/obfuscated1/abc.01')
138		os.rename(nserv_datadir + '/obfuscated1/5mb.7z.003', nserv_datadir + '/obfuscated1/abc.21')
139		os.rename(nserv_datadir + '/obfuscated1/5mb.7z.004', nserv_datadir + '/obfuscated1/abc.34')
140		os.rename(nserv_datadir + '/obfuscated1/5mb.7z.005', nserv_datadir + '/obfuscated1/abc.17')
141		os.rename(nserv_datadir + '/obfuscated1/5mb.7z.006', nserv_datadir + '/obfuscated1/abc.00')
142		if 0 != subprocess.call([nzbget_bin, '--nserv', '-d', nserv_datadir, '-v', '2', '-z', '100000', '-q']):
143			pytest.exit('Test file generation failed')
144
145	if not os.path.exists(nserv_datadir + '/obfuscated2.nzb'):
146		create_test_file(nserv_datadir + '/obfuscated2', sevenzip_bin, 5, 1)
147		os.chdir(nserv_datadir + '/obfuscated2')
148		if 0 != subprocess.call([par2_bin, 'c', '-b100', 'parrename.par2', '*']):
149			pytest.exit('Test file generation failed')
150		os.rename(nserv_datadir + '/obfuscated2/5mb.7z.001', nserv_datadir + '/obfuscated2/abc.51')
151		os.rename(nserv_datadir + '/obfuscated2/5mb.7z.002', nserv_datadir + '/obfuscated2/abc.01')
152		os.rename(nserv_datadir + '/obfuscated2/5mb.7z.003', nserv_datadir + '/obfuscated2/abc.21')
153		os.rename(nserv_datadir + '/obfuscated2/5mb.7z.004', nserv_datadir + '/obfuscated2/abc.34')
154		os.rename(nserv_datadir + '/obfuscated2/5mb.7z.005', nserv_datadir + '/obfuscated2/abc.17')
155		os.rename(nserv_datadir + '/obfuscated2/5mb.7z.006', nserv_datadir + '/obfuscated2/abc.00')
156		os.rename(nserv_datadir + '/obfuscated2/parrename.par2', nserv_datadir + '/obfuscated2/abc.90')
157		os.rename(nserv_datadir + '/obfuscated2/parrename.vol0+1.par2', nserv_datadir + '/obfuscated2/abc.95')
158		os.rename(nserv_datadir + '/obfuscated2/parrename.vol1+2.par2', nserv_datadir + '/obfuscated2/abc.91')
159		os.rename(nserv_datadir + '/obfuscated2/parrename.vol3+2.par2', nserv_datadir + '/obfuscated2/abc.92')
160		if 0 != subprocess.call([nzbget_bin, '--nserv', '-d', nserv_datadir, '-v', '2', '-z', '100000', '-q']):
161			pytest.exit('Test file generation failed')
162
163	if not os.path.exists(nserv_datadir + '/obfuscated3.nzb'):
164		create_test_file(nserv_datadir + '/obfuscated3', sevenzip_bin, 100, 10)
165		os.chdir(nserv_datadir + '/obfuscated3')
166		if 0 != subprocess.call([par2_bin, 'c', '-b100', 'parrename.par2', '*']):
167			pytest.exit('Test file generation failed')
168		os.rename(nserv_datadir + '/obfuscated3/100mb.7z.001', nserv_datadir + '/obfuscated3/abc.51')
169		os.rename(nserv_datadir + '/obfuscated3/100mb.7z.002', nserv_datadir + '/obfuscated3/abc.01')
170		os.rename(nserv_datadir + '/obfuscated3/100mb.7z.003', nserv_datadir + '/obfuscated3/abc.21')
171		os.rename(nserv_datadir + '/obfuscated3/100mb.7z.004', nserv_datadir + '/obfuscated3/abc.34')
172		os.rename(nserv_datadir + '/obfuscated3/100mb.7z.005', nserv_datadir + '/obfuscated3/abc.17')
173		os.rename(nserv_datadir + '/obfuscated3/100mb.7z.006', nserv_datadir + '/obfuscated3/abc.60')
174		os.rename(nserv_datadir + '/obfuscated3/100mb.7z.007', nserv_datadir + '/obfuscated3/abc.32')
175		os.rename(nserv_datadir + '/obfuscated3/100mb.7z.008', nserv_datadir + '/obfuscated3/abc.35')
176		os.rename(nserv_datadir + '/obfuscated3/100mb.7z.009', nserv_datadir + '/obfuscated3/abc.41')
177		os.rename(nserv_datadir + '/obfuscated3/100mb.7z.010', nserv_datadir + '/obfuscated3/abc.50')
178		os.rename(nserv_datadir + '/obfuscated3/100mb.7z.011', nserv_datadir + '/obfuscated3/abc.43')
179		os.rename(nserv_datadir + '/obfuscated3/parrename.par2', nserv_datadir + '/obfuscated3/abc.00')
180		os.rename(nserv_datadir + '/obfuscated3/parrename.vol0+1.par2', nserv_datadir + '/obfuscated3/abc.02')
181		os.rename(nserv_datadir + '/obfuscated3/parrename.vol1+2.par2', nserv_datadir + '/obfuscated3/abc.91')
182		os.rename(nserv_datadir + '/obfuscated3/parrename.vol3+2.par2', nserv_datadir + '/obfuscated3/abc.92')
183		if 0 != subprocess.call([nzbget_bin, '--nserv', '-d', nserv_datadir, '-v', '2', '-z', '100000', '-q']):
184			pytest.exit('Test file generation failed')
185
186def create_test_file(bigdir, sevenzip_bin, sizemb, partmb):
187	print('Preparing test file (' + str(sizemb) + 'MB)')
188
189	if not os.path.exists(bigdir):
190		os.makedirs(bigdir)
191
192	f = open(bigdir + '/' + str(sizemb) + 'mb.dat', 'wb')
193	for n in xrange(sizemb / partmb):
194		print('Writing block %i from %i' % (n + 1, sizemb / partmb))
195		f.write(os.urandom(partmb * 1024 * 1024))
196	f.close()
197
198	if sevenzip_bin != None:
199		if 0 != subprocess.call([sevenzip_bin, 'a', bigdir + '/' + str(sizemb) + 'mb.7z', '-mx=0', '-v' + str(partmb) + 'm', bigdir + '/' + str(sizemb) + 'mb.dat']):
200			pytest.exit('Test file generation failed')
201
202		os.remove(bigdir + '/' + str(sizemb) + 'mb.dat')
203
204def split_test_file(filedir, filename, partsize):
205	print('Splitting test file ' + filename)
206
207	inp = open(filedir + '/' + filename, 'rb')
208	inp.seek(0,2) # move the cursor to the end of the file
209	size = inp.tell()
210	inp.seek(0,0) # move the cursor to the start of the file
211
212	written = 0
213	part = 1
214	while (written < size):
215		block = inp.read(partsize)
216		written += partsize
217		f = open(filedir + '/' + filename + '.' + str(part).zfill(3), 'wb')
218		f.write(block)
219		f.close()
220		part += 1
221	inp.close()
222
223	os.remove(filedir + '/' + filename)
224