mirror of
https://github.com/gryf/fs-uae-wrapper.git
synced 2025-12-19 20:38:06 +01:00
To give user a possibility to choose what archiver he can use another options was introduced for cd32 and archive wrapper modules. This option will indicate what archiver should be used for compressing the save state directories.
244 lines
8.5 KiB
Python
244 lines
8.5 KiB
Python
import os
|
|
import sys
|
|
from tempfile import mkstemp, mkdtemp
|
|
from unittest import TestCase
|
|
import shutil
|
|
|
|
try:
|
|
from unittest import mock
|
|
except ImportError:
|
|
import mock
|
|
|
|
from fs_uae_wrapper import utils
|
|
|
|
|
|
class TestUtils(TestCase):
|
|
|
|
def setUp(self):
|
|
fd, self.fname = mkstemp()
|
|
self.dirname = mkdtemp()
|
|
os.close(fd)
|
|
self._argv = sys.argv[:]
|
|
sys.argv = ['fs-uae-wrapper']
|
|
self.curdir = os.path.abspath(os.curdir)
|
|
|
|
def tearDown(self):
|
|
os.chdir(self.curdir)
|
|
shutil.rmtree(self.dirname)
|
|
os.unlink(self.fname)
|
|
sys.argv = self._argv[:]
|
|
|
|
def test_get_config_options(self):
|
|
|
|
configs = ["[conf]\nwrapper=foo\n",
|
|
"[conf]\n wrapper =foo\n",
|
|
"[conf]\n wrapper = foo\n",
|
|
"[conf]\nwrapper = foo \n"]
|
|
|
|
for cfg in configs:
|
|
with open(self.fname, 'w') as fobj:
|
|
fobj.write(cfg)
|
|
|
|
val = utils.get_config_options(self.fname)
|
|
self.assertDictEqual(val, {'wrapper': 'foo'})
|
|
|
|
with open(self.fname, 'w') as fobj:
|
|
fobj.write("[conf]\nwraper=foo\n")
|
|
conf = utils.get_config_options(self.fname)
|
|
self.assertDictEqual(conf, {'wraper': 'foo'})
|
|
|
|
with open(self.fname, 'w') as fobj:
|
|
fobj.write("[conf]\nwrapper\n")
|
|
conf = utils.get_config_options(self.fname)
|
|
self.assertIsNone(conf)
|
|
|
|
with open(self.fname, 'w') as fobj:
|
|
fobj.write("[conf]\nfullscreen = 1\n")
|
|
conf = utils.get_config_options(self.fname)
|
|
self.assertDictEqual(conf, {'fullscreen': '1'})
|
|
|
|
with open(self.fname, 'w') as fobj:
|
|
fobj.write("[conf]\nwrapper= = = something went wrong\n")
|
|
conf = utils.get_config_options(self.fname)
|
|
self.assertDictEqual(conf, {'wrapper': '= = something went wrong'})
|
|
|
|
with open(self.fname, 'w') as fobj:
|
|
fobj.write("[conf]\nwrapper = = \n")
|
|
conf = utils.get_config_options(self.fname)
|
|
self.assertDictEqual(conf, {'wrapper': '='})
|
|
|
|
with open(self.fname, 'w') as fobj:
|
|
fobj.write("[conf]\nwrapper = \n")
|
|
conf = utils.get_config_options(self.fname)
|
|
self.assertDictEqual(conf, {'wrapper': ''})
|
|
|
|
@mock.patch('fs_uae_wrapper.path.which')
|
|
@mock.patch('fs_uae_wrapper.file_archive.Archive.extract')
|
|
@mock.patch('fs_uae_wrapper.file_archive.Archive.create')
|
|
@mock.patch('fs_uae_wrapper.message.Message.close')
|
|
@mock.patch('fs_uae_wrapper.message.Message.show')
|
|
def test_operate_archive(self, show, close, create, extract, which):
|
|
|
|
os.chdir(self.dirname)
|
|
which.return_value = None
|
|
|
|
# No config
|
|
self.assertFalse(utils.operate_archive('non-existend.7z', 'foo', ''))
|
|
|
|
# Archive type not known
|
|
with open('unsupported-archive.ace', 'w') as fobj:
|
|
fobj.write("\n")
|
|
self.assertFalse(utils.operate_archive('unsupported-archive.ace',
|
|
'foo', ''))
|
|
|
|
# archive is known, but extraction will fail - we have an empty
|
|
# archive and there is no guarantee, that 7z exists on system where
|
|
# test will run
|
|
which.return_value = '7z'
|
|
extract.return_value = True
|
|
with open('supported-archive.7z', 'w') as fobj:
|
|
fobj.write("\n")
|
|
self.assertTrue(utils.operate_archive('supported-archive.7z',
|
|
'extract', ''))
|
|
extract.assert_called_once()
|
|
|
|
extract.reset_mock()
|
|
self.assertTrue(utils.operate_archive('supported-archive.7z',
|
|
'extract', ''))
|
|
extract.assert_called_once()
|
|
|
|
os.unlink('supported-archive.7z')
|
|
self.assertTrue(utils.operate_archive('supported-archive.7z',
|
|
'create', 'test'))
|
|
create.assert_called_once()
|
|
show.assert_called_once()
|
|
|
|
def test_extract_archive(self):
|
|
|
|
os.chdir(self.dirname)
|
|
|
|
# No config
|
|
self.assertFalse(utils.extract_archive('non-existend.7z'))
|
|
|
|
# Archive type not known
|
|
with open('unsupported-archive.ace', 'w') as fobj:
|
|
fobj.write("\n")
|
|
self.assertFalse(utils.extract_archive('unsupported-archive.ace'))
|
|
|
|
# archive is known, but extraction will fail - we have an empty
|
|
# archive and there is no guarantee, that 7z exists on system where
|
|
# test will run
|
|
with open('supported-archive.7z', 'w') as fobj:
|
|
fobj.write("\n")
|
|
self.assertFalse(utils.extract_archive('supported-archive.7z'))
|
|
|
|
@mock.patch('fs_uae_wrapper.file_archive.Archive.create')
|
|
def test_create_archive(self, arch_create):
|
|
arch_create.return_value = True
|
|
|
|
os.chdir(self.dirname)
|
|
|
|
# No config
|
|
self.assertFalse(utils.extract_archive('non-existend.7z'))
|
|
|
|
# Archive type not known
|
|
with open('unsupported-archive.ace', 'w') as fobj:
|
|
fobj.write("\n")
|
|
self.assertFalse(utils.extract_archive('unsupported-archive.ace'))
|
|
|
|
# archive is known, but extraction will fail - we have an empty
|
|
# archive and there is no guarantee, that 7z exists on system where
|
|
# test will run
|
|
with open('supported-archive.7z', 'w') as fobj:
|
|
fobj.write("\n")
|
|
self.assertFalse(utils.extract_archive('supported-archive.7z'))
|
|
|
|
@mock.patch('fs_uae_wrapper.path.which')
|
|
@mock.patch('fs_uae_wrapper.file_archive.Archive.extract')
|
|
def test_extract_archive_positive(self, arch_extract, which):
|
|
arch_extract.return_value = True
|
|
which.return_value = '7z'
|
|
|
|
os.chdir(self.dirname)
|
|
# archive is known, and extraction should succeed
|
|
arch_name = 'archive.7z'
|
|
with open(arch_name, 'w') as fobj:
|
|
fobj.write("\n")
|
|
self.assertTrue(utils.extract_archive(arch_name))
|
|
arch_extract.assert_called_once_with(arch_name)
|
|
|
|
def test_merge_all_options(self):
|
|
|
|
conf = {'foo': '1', 'bar': 'zip'}
|
|
other = {'foo': '2', 'baz': '3'}
|
|
|
|
merged = utils.merge_all_options(conf, other)
|
|
|
|
self.assertDictEqual(merged, {'foo': '2', 'bar': 'zip', 'baz': '3'})
|
|
self.assertDictEqual(conf, {'foo': '1', 'bar': 'zip'})
|
|
self.assertDictEqual(other, {'foo': '2', 'baz': '3'})
|
|
|
|
|
|
class TestCmdOptions(TestCase):
|
|
|
|
def test_add(self):
|
|
|
|
cmd = utils.CmdOption()
|
|
|
|
# commandline origin
|
|
cmd.add('--fullscreen')
|
|
self.assertEqual(cmd['fullscreen'], '1')
|
|
|
|
cmd.add('--fade_out_duration=0')
|
|
self.assertEqual(cmd['fade_out_duration'], '0')
|
|
|
|
# pass the wrong parameter to fs-uae
|
|
self.assertRaises(AttributeError, cmd.add, '-typo=0')
|
|
|
|
# pass the wrong parameter to fs-uae again
|
|
self.assertRaises(AttributeError, cmd.add, 'typo=true')
|
|
|
|
# We have no idea what to do with this - might be a conf file
|
|
self.assertRaises(AttributeError, cmd.add, 'this-is-odd')
|
|
|
|
def test_list(self):
|
|
|
|
cmd = utils.CmdOption()
|
|
cmd.add('--fullscreen')
|
|
cmd.add('--fast_memory=4096')
|
|
|
|
self.assertDictEqual(cmd, {'fullscreen': '1', 'fast_memory': '4096'})
|
|
self.assertListEqual(sorted(cmd.list()),
|
|
['--fast_memory=4096', '--fullscreen'])
|
|
|
|
@mock.patch('os.getenv')
|
|
@mock.patch('os.path.expandvars')
|
|
@mock.patch('distutils.spawn.find_executable')
|
|
def test_interpolate_variables(self, find_exe, expandv, getenv):
|
|
|
|
itrpl = utils.interpolate_variables
|
|
|
|
string = 'foo = $CONFIG/../path/to/smth'
|
|
self.assertEqual(itrpl(string, '/home/user/Config.fs-uae'),
|
|
'foo = /home/user/../path/to/smth')
|
|
string = 'bar = $HOME'
|
|
expandv.return_value = '/home/user'
|
|
self.assertEqual(itrpl(string, '/home/user/Config.fs-uae'),
|
|
'bar = /home/user')
|
|
|
|
string = 'foo = $APP/$EXE'
|
|
find_exe.return_value = '/usr/bin/fs-uae'
|
|
self.assertEqual(itrpl(string, '/home/user/Config.fs-uae'),
|
|
'foo = /usr/bin/fs-uae//usr/bin/fs-uae')
|
|
|
|
string = 'docs = $DOCUMENTS'
|
|
getenv.return_value = '/home/user/Docs'
|
|
self.assertEqual(itrpl(string, '/home/user/Config.fs-uae'),
|
|
'docs = /home/user/Docs')
|
|
|
|
string = 'baz = $BASE'
|
|
self.assertEqual(itrpl(string, '/home/user/Config.fs-uae'),
|
|
'baz = $BASE')
|
|
self.assertEqual(itrpl(string, '/home/user/Config.fs-uae', 'base'),
|
|
'baz = base')
|