mycroft-core/test/unittests/util/test_file_utils.py

215 lines
8.1 KiB
Python

from os import makedirs
from os.path import (abspath, dirname, expanduser, join, normpath, isdir,
exists)
import shutil
import tempfile
from unittest import TestCase, mock
from mycroft import MYCROFT_ROOT_PATH
from mycroft.util import (
resolve_resource_file,
curate_cache,
create_file,
get_temp_path,
get_cache_directory,
read_stripped_lines,
read_dict)
test_config = {
'data_dir': join(dirname(__file__), 'datadir'),
'cache_dir': tempfile.gettempdir(),
}
@mock.patch('mycroft.configuration.Configuration')
class TestResolveResource(TestCase):
def test_absolute_path(self, mock_conf):
mock_conf.get.return_value = test_config
test_path = abspath(__file__)
self.assertEqual(resolve_resource_file(test_path), test_path)
@mock.patch('os.path.isfile')
def test_dot_mycroft(self, mock_isfile, mock_conf):
mock_conf.get.return_value = test_config
def files_in_dotmycroft_exists(path):
return '.mycroft/' in path
mock_isfile.side_effect = files_in_dotmycroft_exists
self.assertEqual(resolve_resource_file('1984.txt'),
expanduser('~/.mycroft/1984.txt'))
@mock.patch('os.path.isfile')
def test_data_dir(self, mock_isfile, mock_conf):
"""Check for file in the "configured data dir"/res/"""
mock_conf.get.return_value = test_config
def files_in_mycroft_datadir_exists(path):
return 'datadir' in path
mock_isfile.side_effect = files_in_mycroft_datadir_exists
self.assertEqual(resolve_resource_file('1984.txt'),
join(test_config['data_dir'], 'res', '1984.txt'))
def test_source_package(self, mock_conf):
"""Check file shipped in the mycroft res folder."""
mock_conf.get.return_value = test_config
expected_path = join(MYCROFT_ROOT_PATH, 'mycroft', 'res',
'text', 'en-us', 'and.word')
res_path = resolve_resource_file('text/en-us/and.word')
self.assertEqual(normpath(res_path), normpath(expected_path))
def test_missing_file(self, mock_conf):
"""Assert that the function returns None when file is not foumd."""
mock_conf.get.return_value = test_config
self.assertTrue(resolve_resource_file('1984.txt') is None)
def create_cache_files(cache_dir):
"""Create a couple of files in the cache directory."""
huxley_path = join(cache_dir, 'huxley.txt')
aldous_path = join(cache_dir, 'alduos.txt')
f = open(huxley_path, 'w+')
f.close()
f = open(aldous_path, 'w+')
f.close()
return huxley_path, aldous_path
class TestReadFiles(TestCase):
base = dirname(__file__)
def test_read_stripped_lines(self):
expected = ['Once upon a time', 'there was a great Dragon',
'It was red and cute', 'The end']
unstripped_path = join(TestReadFiles.base, 'unstripped_lines.txt')
self.assertEqual(list(read_stripped_lines(unstripped_path)), expected)
def test_read_dict(self):
expected = {'fraggle': 'gobo', 'muppet': 'miss piggy'}
dict_path = join(TestReadFiles.base, 'muppets.dict')
self.assertEqual(read_dict(dict_path), expected)
@mock.patch('mycroft.configuration.Configuration')
class TestCache(TestCase):
def tearDownClass():
shutil.rmtree(test_config['cache_dir'], ignore_errors=True)
def test_get_cache_directory(self, mock_conf):
mock_conf.get.return_value = test_config
expected_path = join(test_config['cache_dir'], 'mycroft', 'cache')
self.assertEqual(get_cache_directory(), expected_path)
self.assertTrue(isdir(expected_path))
def test_get_cache_directory_with_domain(self, mock_conf):
mock_conf.get.return_value = test_config
expected_path = join(test_config['cache_dir'], 'mycroft',
'cache', 'whales')
self.assertEqual(get_cache_directory('whales'), expected_path)
self.assertTrue(isdir(expected_path))
@mock.patch('mycroft.util.file_utils.psutil')
def test_curate_cache_plenty_space(self, mock_psutil, mock_conf):
"""Test plenty of space free."""
mock_conf.get.return_value = test_config
space = mock.Mock(name='diskspace')
mock_psutil.disk_usage.return_value = space
cache_dir = get_cache_directory('braveNewWorld')
# Create files in the cache directory
huxley_path, aldous_path = create_cache_files(cache_dir)
space.percent = 5.0
space.free = 2 * 1024 * 1024 * 1024 # 2GB
space.total = 20 * 1024 * 1024 * 1024 # 20GB
self.assertEqual(curate_cache(cache_dir), [])
self.assertTrue(exists(aldous_path))
self.assertTrue(exists(huxley_path))
@mock.patch('mycroft.util.file_utils.psutil')
def test_curate_cache_percent_low(self, mock_psutil, mock_conf):
"""Free Percentage low but not free space."""
mock_conf.get.return_value = test_config
space = mock.Mock(name='diskspace')
mock_psutil.disk_usage.return_value = space
cache_dir = get_cache_directory('braveNewWorld')
# Create files in the cache directory
huxley_path, aldous_path = create_cache_files(cache_dir)
space.percent = 96.0
space.free = 2 * 1024 * 1024 * 1024 # 2GB
space.total = 20 * 1024 * 1024 * 1024 # 20GB
self.assertEqual(curate_cache(cache_dir), [])
self.assertTrue(exists(aldous_path))
self.assertTrue(exists(huxley_path))
@mock.patch('mycroft.util.file_utils.psutil')
def test_curate_cache_space_low(self, mock_psutil, mock_conf):
"""Free space low, but not percentage."""
mock_conf.get.return_value = test_config
space = mock.Mock(name='diskspace')
mock_psutil.disk_usage.return_value = space
cache_dir = get_cache_directory('braveNewWorld')
# Create files in the cache directory
huxley_path, aldous_path = create_cache_files(cache_dir)
space.percent = 95.0
space.free = 2 * 1024 * 1024 # 2MB
space.total = 20 * 1024 * 1024 * 1024 # 20GB
self.assertEqual(curate_cache(cache_dir), [])
self.assertTrue(exists(aldous_path))
self.assertTrue(exists(huxley_path))
@mock.patch('mycroft.util.file_utils.psutil')
def test_curate_cache_both_low(self, mock_psutil, mock_conf):
"""Test Free space and percentage low."""
mock_conf.get.return_value = test_config
space = mock.Mock(name='diskspace')
mock_psutil.disk_usage.return_value = space
cache_dir = get_cache_directory('braveNewWorld')
# Create files in the cache directory
huxley_path, aldous_path = create_cache_files(cache_dir)
space.percent = 96.0
space.free = 2 * 1024 * 1024 # 2MB
space.total = 20 * 1024 * 1024 * 1024 # 20GB
self.assertEqual(curate_cache(cache_dir),
[aldous_path, huxley_path])
self.assertFalse(exists(aldous_path))
self.assertFalse(exists(huxley_path))
TEST_CREATE_FILE_DIR = join(tempfile.gettempdir(), 'create_file_test')
class TestCreateFile(TestCase):
def setUp(self):
shutil.rmtree(TEST_CREATE_FILE_DIR, ignore_errors=True)
def test_create_file_in_existing_dir(self):
makedirs(TEST_CREATE_FILE_DIR)
test_path = join(TEST_CREATE_FILE_DIR, 'test_file')
create_file(test_path)
self.assertTrue(exists(test_path))
def test_create_file_in_nonexisting_dir(self):
test_path = join(TEST_CREATE_FILE_DIR, 'test_file')
create_file(test_path)
self.assertTrue(exists(test_path))
def test_get_temp_path(self):
temp_dir = tempfile.gettempdir()
temp_file = get_temp_path('example.txt')
self.assertEqual(temp_file, temp_dir + '/example.txt')
temp_path = get_temp_path('mycroft', 'audio', 'example.wav')
self.assertEqual(temp_path, temp_dir + '/mycroft/audio/example.wav')
with self.assertRaises(TypeError):
failed_temp_path = get_temp_path(1)
def tearDownClass():
shutil.rmtree(TEST_CREATE_FILE_DIR, ignore_errors=True)