#!/usr/bin/env python3
"""Test the utilities module."""
import os
from shutil import rmtree, copyfile
from argparse import ArgumentError
from platform import system
try:
import unittest.mock as mock
except ImportError:
import mock
import pytest
import bbarchivist.utilities as bu
[docs]def setup_module(module):
"""
Create necessary files.
"""
if not os.path.exists("temp_utilities"):
os.mkdir("temp_utilities")
os.chdir("temp_utilities")
with open("cap-3.11.0.22.dat", "w") as targetfile:
targetfile.write("Jackdaws love my big sphinx of quartz")
copyfile("cap-3.11.0.22.dat", "cfp-3.10.0.57.dat")
copyfile("cap-3.11.0.22.dat", "7za.exe")
copyfile("cap-3.11.0.22.dat", "7za64.exe")
copyfile("cap-3.11.0.22.dat", "Z10_loader1.exe")
copyfile("cap-3.11.0.22.dat", "Z10_loader2.exe")
copyfile("cap-3.11.0.22.dat", "Z10_loader3.exe")
[docs]def teardown_module(module):
"""
Delete necessary files.
"""
os.chdir("..")
rmtree("temp_utilities", ignore_errors=True)
[docs]class TestClassUtilities7z:
"""
Test utilities related to 7-Zip.
"""
[docs] def test_get_seven_zip(self):
"""
Test checking of 7z.
"""
with mock.patch('platform.system', mock.MagicMock(return_value="Wandows")):
assert bu.get_seven_zip(True) == "7za"
[docs] def test_win_seven_zip_local_32(self):
"""
Test local checking of 7z, 32-bit on 32-bit.
"""
if system != "Windows":
pass
else:
with mock.patch('winreg.QueryValueEx', mock.MagicMock(return_value=OSError)):
with mock.patch('platform.machine', mock.MagicMock(return_value="AMD69")):
assert bu.win_seven_zip(True) == "7za.exe"
[docs] def test_win_seven_zip_local_6432(self):
"""
Test local checking of 7z, 32-bit on 64-bit.
"""
if system != "Windows":
pass
else:
with mock.patch('winreg.QueryValueEx', mock.MagicMock(return_value=OSError)):
with mock.patch('platform.machine', mock.MagicMock(return_value="AMD64")):
if not os.path.exists("7za.exe"):
copyfile("cap-3.11.0.22.dat", "7za.exe")
if os.path.exists("7za64.exe"):
os.remove("7za64.exe")
assert bu.win_seven_zip(True) == "error"
if os.path.exists("7za64.exe"):
os.remove("7za.exe")
[docs] def test_win_seven_zip_local_6464(self):
"""
Test local checking of 7z, 64-bit on 64-bit.
"""
if system != "Windows":
pass
else:
with mock.patch('winreg.QueryValueEx', mock.MagicMock(return_value=OSError)):
with mock.patch('platform.machine', mock.MagicMock(return_value="AMD64")):
if not os.path.exists("7za64.exe"):
copyfile("cap-3.11.0.22.dat", "7za64.exe")
assert bu.win_seven_zip(True) == "7za64.exe"
if os.path.exists("7za64.exe"):
os.remove("7za64.exe")
[docs] def test_win_seven_zip_remote(self):
"""
Test registry checking of 7z.
"""
if system != "Windows":
pass
else:
with mock.patch('winreg.QueryValueEx', mock.MagicMock(return_value="C:\\Program Files\\7-Zip\\")):
assert bu.win_seven_zip(True) == "C:\\Program Files\\7-Zip\\7z.exe"
[docs] def test_prep_seven_zip_good(self):
"""
Test availability of 7z, best case.
"""
with mock.patch('platform.system', mock.MagicMock(return_value="Wandows")):
with mock.patch("bbarchivist.utilities.where_which", mock.MagicMock(return_value="/usr/bin/7za")):
assert bu.prep_seven_zip(True)
[docs] def test_prep_seven_zip_bad(self):
"""
Test availability of 7z, worst case.
"""
with mock.patch('platform.system', mock.MagicMock(return_value="Wandows")):
with mock.patch("bbarchivist.utilities.where_which", mock.MagicMock(return_value=None)):
assert not bu.prep_seven_zip(True)
[docs] def test_prep_seven_zip_which(self):
"""
Test availability of 7z, no which.
"""
with mock.patch('platform.system', mock.MagicMock(return_value="Wandows")):
with mock.patch("bbarchivist.utilities.where_which", mock.MagicMock(side_effect=ImportError)):
assert not bu.prep_seven_zip(True)
[docs]class TestClassUtilitiesLoaders:
"""
Test autoloader integrity checking.
"""
[docs] def test_integrity_single_good(self):
"""
Test checking return code of one autoloader, best case.
"""
with mock.patch('platform.system', mock.MagicMock(return_value="Windows")):
with mock.patch('subprocess.call', mock.MagicMock(return_value=0)):
assert bu.verify_loader_integrity("Z10_loader1.exe")
[docs] def test_integrity_single_bad(self):
"""
Test checking return code of one autoloader, worst case.
"""
with mock.patch('platform.system', mock.MagicMock(return_value="Windows")):
with mock.patch('subprocess.call', mock.MagicMock(return_value=255)):
assert not bu.verify_loader_integrity("Z10_loader1.exe")
[docs] def test_integrity_single_exception(self):
"""
Test checking return code of one autoloader, if OSError is raised.
"""
with mock.patch('platform.system', mock.MagicMock(return_value="Windows")):
with mock.patch('subprocess.call', mock.MagicMock(side_effect=OSError)):
assert not bu.verify_loader_integrity("Z10_loader1.exe")
[docs] def test_integrity_single_nonwin(self):
"""
Test checking return code of one autoloader, non-Windows.
"""
with mock.patch('platform.system', mock.MagicMock(return_value="Wandows")):
assert bu.verify_loader_integrity(os.devnull) is None
[docs] def test_integrity_bulk_good(self):
"""
Test checking return code of all autoloaders, best case.
"""
with mock.patch('platform.system', mock.MagicMock(return_value="Windows")):
with mock.patch('subprocess.call', mock.MagicMock(return_value=0)):
assert not bu.verify_bulk_loaders(os.getcwd())
[docs] def test_integrity_bulk_bad(self):
"""
Test checking return code of all autoloaders, worst case.
"""
with mock.patch('platform.system', mock.MagicMock(return_value="Windows")):
with mock.patch('subprocess.call', mock.MagicMock(return_value=255)):
assert bu.verify_bulk_loaders(os.getcwd())
[docs] def test_integrity_bulk_nonwin(self):
"""
Test checking return code of all autoloaders, non-Windows.
"""
with mock.patch('platform.system', mock.MagicMock(return_value="Wandows")):
assert bu.verify_bulk_loaders(os.devnull) is None
[docs]class TestClassUtilities:
"""
Test miscellaneous utilities.
"""
[docs] def test_grab_cap(self):
"""
Test finding cap location.
"""
assert os.path.dirname(bu.grab_cap()) == os.getcwd()
[docs] def test_grab_cfp(self):
"""
Test finding cfp location.
"""
assert os.path.dirname(bu.grab_cfp()) == os.getcwd()
[docs] def test_where_which(self):
"""
Test implementation of where.
"""
with mock.patch("shutil.which", mock.MagicMock(return_value="here")):
assert bu.where_which("woodo") == "here"
[docs] def test_str2bool_good(self):
"""
Test checking of input parsing, best case.
"""
assert bu.s2b("YES")
[docs] def test_str2bool_bad(self):
"""
Test checking of input parsing, worst case.
"""
assert not bu.s2b("BANANA")
[docs] def test_version_incrementer_good(self):
"""
Test version incrementing, best case.
"""
assert bu.increment("10.3.2.2000", 1000) == "10.3.2.3000"
[docs] def test_version_incrementer_bad(self):
"""
Test version incrementing, worst case.
"""
assert bu.increment("10.3.2.9999", 3) == "10.3.2.3"
[docs] def test_barname_stripper(self):
"""
Test bar name cleaning.
"""
assert bu.stripper("base-nto+armle-v7+signed.bar") == "base"
[docs] def test_return_and_delete(self):
"""
Test reading a file then deleting it.
"""
with open("TEST.txt", "w") as afile:
afile.write("You can call me Al")
assert bu.return_and_delete("TEST.txt") == "You can call me Al"
[docs]class TestClassUtilitiesStdout:
"""
Test UselessStdout and related things.
"""
[docs] def test_uselessstdout_tty(self):
"""
Test if UselessStdout is a terminal.
"""
assert bu.UselessStdout.isatty()
[docs] def test_spinner_interrupt(self):
"""
Test interrupting the Spinner.
"""
with mock.patch("bbarchivist.utilities.Spinner.after",
mock.MagicMock(side_effect=KeyboardInterrupt)):
with pytest.raises(KeyboardInterrupt):
spin = bu.Spinner()
spin.after()
[docs]class TestClassUtilitiesUrls:
"""
Test generation of URLs.
"""
[docs] def test_bulk(self):
"""
Test generating all URLs.
"""
osu, radu, coru = bu.generate_urls("http://www.qrrbrbirlbel.yu/", "10.3.2.4567", "10.9.8.7654", True)
del radu, coru
assert "http://www.qrrbrbirlbel.yu//qc8960.factory_sfi_hybrid_qc8974.desktop-10.3.2.4567-nto+armle-v7+signed.bar" in osu
[docs] def test_bulk_nocore(self):
"""
Test generating only debrick and radio URLs.
"""
osu, radu, coru = bu.generate_urls("http://www.qrrbrbirlbel.yu/", "10.2.3.4567", "10.9.8.7654", False)
del osu, radu
assert not coru
[docs] def test_stl1(self):
"""
Test STL100-1 URLs.
"""
ourl, rurl = bu.generate_lazy_urls("http://www.qrrbrbirlbel.yu/", "10.2.3.4567", "10.9.8.7654", 0)
assert "winchester" in ourl
assert "m5730" in rurl
[docs] def test_stlx(self):
"""
Test STL100-X URLs.
"""
ourl, rurl = bu.generate_lazy_urls("http://www.qrrbrbirlbel.yu/", "10.2.3.4567", "10.9.8.7654", 1)
assert "qc8960.factory_sfi" in ourl
assert "qc8960-" in rurl
[docs] def test_stl4(self):
"""
Test STL100-4 URLs.
"""
ourl, rurl = bu.generate_lazy_urls("http://www.qrrbrbirlbel.yu/", "10.2.3.4567", "10.9.8.7654", 2)
assert "verizon" in ourl
assert "qc8960.omadm" in rurl
[docs] def test_q10(self):
"""
Test Q10 URLs.
"""
ourl, rurl = bu.generate_lazy_urls("http://www.qrrbrbirlbel.yu/", "10.2.3.4567", "10.9.8.7654", 3)
assert "qc8960.factory_sfi" in ourl
assert "qc8960.wtr" in rurl
[docs] def test_z30(self):
"""
Test Z30 URLs.
"""
ourl, rurl = bu.generate_lazy_urls("http://www.qrrbrbirlbel.yu/", "10.2.3.4567", "10.9.8.7654", 4)
assert "qc8960.factory_sfi" in ourl
assert "qc8960.wtr5" in rurl
[docs] def test_z3(self):
"""
Test Z3 URLs.
"""
ourl, rurl = bu.generate_lazy_urls("http://www.qrrbrbirlbel.yu/", "10.2.3.4567", "10.9.8.7654", 5)
assert "qc8960.factory_sfi" in ourl
assert "qc8930" in rurl
[docs] def test_z3_alt(self):
"""
Test Z3 URLs, having been updated due to OS version.
"""
ourl, rurl = bu.generate_lazy_urls("http://www.qrrbrbirlbel.yu/", "10.9.8.7654", "10.2.3.4567", 5)
assert "qc8960.factory_sfi_hybrid_qc8x30" in ourl
assert "qc8930" in rurl
[docs] def test_8974(self):
"""
Test 8974 URLs.
"""
ourl, rurl = bu.generate_lazy_urls("http://www.qrrbrbirlbel.yu/", "10.2.3.4567", "10.9.8.7654", 6)
assert "qc8974" in ourl
assert "8974.wtr2" in rurl
[docs] def test_8974_alt(self):
"""
Test 8974 URLs, having been updated due to OS version.
"""
ourl, rurl = bu.generate_lazy_urls("http://www.qrrbrbirlbel.yu/", "10.9.8.7654", "10.2.3.4567", 6)
assert "qc8960.factory_sfi_hybrid_qc8974" in ourl
assert "qc8974.wtr2" in rurl
[docs]class TestClassUtilitiesArgparse:
"""
Test miscellaneous utilities involving arguments.
"""
[docs] def test_filesize_parser_good(self):
"""
Test parsing of filesize, ideal case.
"""
assert bu.fsizer(987654321) == "941.90MB"
[docs] def test_filesize_parser_none(self):
"""
Test parsing of filesize, None given.
"""
assert bu.fsizer(None) == "0.00B"
[docs] def test_filesize_parser_huge(self):
"""
Test parsing of filesize, large number given.
"""
assert bu.fsizer(pow(2, 80)) == "1.00YB"
[docs] def test_file_exists_good(self):
"""
Test if self exists. How very Cartesian.
"""
assert bu.file_exists(__file__)
[docs] def test_file_exists_bad(self):
"""
Test if non-existent file exists. Of course.
"""
with pytest.raises(ArgumentError) as argexc:
bu.file_exists("qrrbrbirlbel")
assert "not found" in str(argexc.value)
[docs] def test_positive_integer_good(self):
"""
Test integer for positive-ness, best case.
"""
assert bu.positive_integer(1048576) == 1048576
[docs] def test_positive_integer_bad(self):
"""
Test integer for positive-ness, worst case.
"""
with pytest.raises(ArgumentError) as argexc:
bu.positive_integer(-34)
assert "is too low" in str(argexc.value)
[docs] def test_valid_method_good(self):
"""
Test compression method validity, best case.
"""
assert bu.valid_method("tbz") == "tbz"
[docs] def test_valid_method_bad(self):
"""
Test compression method validity, worst case.
"""
with pytest.raises(ArgumentError) as argexc:
bu.valid_method("jackdaw")
assert "invalid method" in argexc
[docs] def test_valid_carrier_good(self):
"""
Test checking of carrier validity, best case.
"""
assert bu.valid_carrier("302") == "302"
[docs] def test_valid_carrier_bad(self):
"""
Test checking of carrier validity, worst case.
"""
with pytest.raises(ArgumentError) as argexc:
bu.valid_carrier("1048576")
assert "invalid code" in str(argexc.value)
[docs] def test_valid_carrier_reallybad(self):
"""
Test checking of carrier validity, Ragnarök case.
"""
with pytest.raises(ArgumentError) as argexc:
bu.valid_carrier("BANANA")
assert "integer" in str(argexc.value)
[docs] def test_escreens_pin_good(self):
"""
Test checking of escreens PIN.
"""
assert bu.escreens_pin("ACDCACDC") == "acdcacdc"
[docs] def test_escreens_pin_long(self):
"""
Test checking of escreens PIN, too long.
"""
with pytest.raises(ArgumentError) as argexc:
bu.escreens_pin("ACDCACDCACDCACDC")
assert "Invalid PIN" in str(argexc.value)
[docs] def test_escreens_pin_nonhex(self):
"""
Test checking of escreens PIN, not hexadecimal.
"""
with pytest.raises(ArgumentError) as argexc:
bu.escreens_pin("MONGOLIA")
assert "Invalid PIN" in str(argexc.value)
[docs] def test_escreens_duration_good(self):
"""
Test checking of escreens duration, best case.
"""
for dur in (1, 3, 6, 15, 30):
assert bu.escreens_duration(dur) == dur
[docs] def test_escreens_duration_bad(self):
"""
Test checking of escreens duration, worst case.
"""
with pytest.raises(ArgumentError) as argexc:
for dur in (2, 4, 7, 16, 31):
bu.escreens_duration(dur)
assert "duration" in str(argexc.value)
[docs]class TestClassUtilitiesConfig:
"""
Test reading/writing configs with ConfigParser.
"""
[docs] def test_cappath_loader(self):
"""
Test reading CAP path settings.
"""
try:
FileNotFoundError
except NameError:
FileNotFoundError = IOError
try:
os.remove("bbarchivist.ini")
except (OSError, FileNotFoundError):
pass
with mock.patch('os.path.expanduser', mock.MagicMock(return_value=os.getcwd())):
with mock.patch('bbarchivist.bbconstants.CAPLOCATION', "cap.dat"):
assert bu.cappath_config_loader() == "cap.dat"
[docs] def test_cappath_writer(self):
"""
Test writing CAP path settings.
"""
try:
FileNotFoundError
except NameError:
FileNotFoundError = IOError
try:
os.remove("bbarchivist.ini")
except (OSError, FileNotFoundError):
pass
with mock.patch('bbarchivist.utilities.grab_cap',
mock.MagicMock(return_value=os.path.abspath(os.path.join(os.getcwd(), "cap.dat")))):
with mock.patch('os.path.expanduser', mock.MagicMock(return_value=os.getcwd())):
bu.cappath_config_writer()
with mock.patch('bbarchivist.utilities.grab_cap',
mock.MagicMock(return_value=os.path.abspath(os.path.join(os.getcwd(), "cap.dat")))):
with mock.patch('os.path.expanduser', mock.MagicMock(return_value=os.getcwd())):
assert bu.cappath_config_loader() == os.path.join(os.getcwd(), "cap.dat")