| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 1 | import io |
| 2 | import logging |
| 3 | import http |
| 4 | import os |
| 5 | import pytest |
| 6 | import tarfile |
| 7 | import tempfile |
| 8 | import uuid |
| 9 | import shutil |
| 10 | |
| 11 | from osm_common.fsbase import FsException |
| 12 | from osm_common.fslocal import FsLocal |
| 13 | |
| 14 | __author__ = "Eduardo Sousa <eduardosousa@av.it.pt>" |
| 15 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 16 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 17 | def valid_path(): |
| 18 | return tempfile.gettempdir() + '/' |
| 19 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 20 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 21 | def invalid_path(): |
| 22 | return '/#tweeter/' |
| 23 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 24 | |
| tierno | 1e9a329 | 2018-11-05 18:18:45 +0100 | [diff] [blame] | 25 | @pytest.fixture(scope="function", params=[True, False]) |
| 26 | def fs_local(request): |
| 27 | fs = FsLocal(lock=request.param) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 28 | fs.fs_connect({'path': valid_path()}) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 29 | return fs |
| 30 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 31 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 32 | def fs_connect_exception_message(path): |
| 33 | return "storage exception Invalid configuration param at '[storage]': path '{}' does not exist".format(path) |
| 34 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 35 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 36 | def file_open_file_not_found_exception(storage): |
| 37 | f = storage if isinstance(storage, str) else '/'.join(storage) |
| 38 | return "storage exception File {} does not exist".format(f) |
| 39 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 40 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 41 | def file_open_io_exception(storage): |
| 42 | f = storage if isinstance(storage, str) else '/'.join(storage) |
| 43 | return "storage exception File {} cannot be opened".format(f) |
| 44 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 45 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 46 | def dir_ls_not_a_directory_exception(storage): |
| 47 | f = storage if isinstance(storage, str) else '/'.join(storage) |
| 48 | return "storage exception File {} does not exist".format(f) |
| 49 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 50 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 51 | def dir_ls_io_exception(storage): |
| 52 | f = storage if isinstance(storage, str) else '/'.join(storage) |
| 53 | return "storage exception File {} cannot be opened".format(f) |
| 54 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 55 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 56 | def file_delete_exception_message(storage): |
| 57 | return "storage exception File {} does not exist".format(storage) |
| 58 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 59 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 60 | def test_constructor_without_logger(): |
| 61 | fs = FsLocal() |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 62 | assert fs.logger == logging.getLogger('fs') |
| 63 | assert fs.path is None |
| 64 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 65 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 66 | def test_constructor_with_logger(): |
| 67 | logger_name = 'fs_local' |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 68 | fs = FsLocal(logger_name=logger_name) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 69 | assert fs.logger == logging.getLogger(logger_name) |
| 70 | assert fs.path is None |
| 71 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 72 | |
| Eduardo Sousa | 5ffda64 | 2018-05-09 19:42:00 +0100 | [diff] [blame] | 73 | def test_get_params(fs_local): |
| 74 | params = fs_local.get_params() |
| Eduardo Sousa | 5ffda64 | 2018-05-09 19:42:00 +0100 | [diff] [blame] | 75 | assert len(params) == 2 |
| 76 | assert "fs" in params |
| 77 | assert "path" in params |
| 78 | assert params["fs"] == "local" |
| 79 | assert params["path"] == valid_path() |
| 80 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 81 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 82 | @pytest.mark.parametrize("config, exp_logger, exp_path", [ |
| 83 | ({'logger_name': 'fs_local', 'path': valid_path()}, 'fs_local', valid_path()), |
| 84 | ({'logger_name': 'fs_local', 'path': valid_path()[:-1]}, 'fs_local', valid_path()), |
| 85 | ({'path': valid_path()}, 'fs', valid_path()), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 86 | ({'path': valid_path()[:-1]}, 'fs', valid_path())]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 87 | def test_fs_connect_with_valid_config(config, exp_logger, exp_path): |
| 88 | fs = FsLocal() |
| 89 | fs.fs_connect(config) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 90 | assert fs.logger == logging.getLogger(exp_logger) |
| 91 | assert fs.path == exp_path |
| 92 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 93 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 94 | @pytest.mark.parametrize("config, exp_exception_message", [ |
| 95 | ({'logger_name': 'fs_local', 'path': invalid_path()}, fs_connect_exception_message(invalid_path())), |
| 96 | ({'logger_name': 'fs_local', 'path': invalid_path()[:-1]}, fs_connect_exception_message(invalid_path()[:-1])), |
| 97 | ({'path': invalid_path()}, fs_connect_exception_message(invalid_path())), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 98 | ({'path': invalid_path()[:-1]}, fs_connect_exception_message(invalid_path()[:-1]))]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 99 | def test_fs_connect_with_invalid_path(config, exp_exception_message): |
| 100 | fs = FsLocal() |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 101 | with pytest.raises(FsException) as excinfo: |
| 102 | fs.fs_connect(config) |
| 103 | assert str(excinfo.value) == exp_exception_message |
| 104 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 105 | |
| Eduardo Sousa | 5ffda64 | 2018-05-09 19:42:00 +0100 | [diff] [blame] | 106 | def test_fs_disconnect(fs_local): |
| 107 | fs_local.fs_disconnect() |
| 108 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 109 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 110 | def test_mkdir_with_valid_path(fs_local): |
| 111 | folder_name = str(uuid.uuid4()) |
| 112 | folder_path = valid_path() + folder_name |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 113 | fs_local.mkdir(folder_name) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 114 | assert os.path.exists(folder_path) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 115 | os.rmdir(folder_path) |
| 116 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 117 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 118 | def test_mkdir_with_exception(fs_local): |
| 119 | folder_name = str(uuid.uuid4()) |
| 120 | folder_path = valid_path() + folder_name |
| 121 | os.mkdir(folder_path) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 122 | with pytest.raises(FsException) as excinfo: |
| 123 | fs_local.mkdir(folder_name) |
| 124 | assert excinfo.value.http_code == http.HTTPStatus.INTERNAL_SERVER_ERROR |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 125 | os.rmdir(folder_path) |
| 126 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 127 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 128 | @pytest.mark.parametrize("storage, mode, expected", [ |
| 129 | (str(uuid.uuid4()), 'file', False), |
| 130 | ([str(uuid.uuid4())], 'file', False), |
| 131 | (str(uuid.uuid4()), 'dir', False), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 132 | ([str(uuid.uuid4())], 'dir', False)]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 133 | def test_file_exists_returns_false(fs_local, storage, mode, expected): |
| 134 | assert fs_local.file_exists(storage, mode) == expected |
| 135 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 136 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 137 | @pytest.mark.parametrize("storage, mode, expected", [ |
| 138 | (str(uuid.uuid4()), 'file', True), |
| 139 | ([str(uuid.uuid4())], 'file', True), |
| 140 | (str(uuid.uuid4()), 'dir', True), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 141 | ([str(uuid.uuid4())], 'dir', True)]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 142 | def test_file_exists_returns_true(fs_local, storage, mode, expected): |
| 143 | path = valid_path() + storage if isinstance(storage, str) else valid_path() + storage[0] |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 144 | if mode == 'file': |
| 145 | os.mknod(path) |
| 146 | elif mode == 'dir': |
| 147 | os.mkdir(path) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 148 | assert fs_local.file_exists(storage, mode) == expected |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 149 | if mode == 'file': |
| 150 | os.remove(path) |
| 151 | elif mode == 'dir': |
| 152 | os.rmdir(path) |
| 153 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 154 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 155 | @pytest.mark.parametrize("storage, mode", [ |
| 156 | (str(uuid.uuid4()), 'file'), |
| 157 | ([str(uuid.uuid4())], 'file'), |
| 158 | (str(uuid.uuid4()), 'dir'), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 159 | ([str(uuid.uuid4())], 'dir')]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 160 | def test_file_size(fs_local, storage, mode): |
| 161 | path = valid_path() + storage if isinstance(storage, str) else valid_path() + storage[0] |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 162 | if mode == 'file': |
| 163 | os.mknod(path) |
| 164 | elif mode == 'dir': |
| 165 | os.mkdir(path) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 166 | size = os.path.getsize(path) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 167 | assert fs_local.file_size(storage) == size |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 168 | if mode == 'file': |
| 169 | os.remove(path) |
| 170 | elif mode == 'dir': |
| 171 | os.rmdir(path) |
| 172 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 173 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 174 | @pytest.mark.parametrize("files, path", [ |
| 175 | (['foo', 'bar', 'foobar'], str(uuid.uuid4())), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 176 | (['foo', 'bar', 'foobar'], [str(uuid.uuid4())])]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 177 | def test_file_extract(fs_local, files, path): |
| 178 | for f in files: |
| 179 | os.mknod(valid_path() + f) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 180 | tar_path = valid_path() + str(uuid.uuid4()) + '.tar' |
| 181 | with tarfile.open(tar_path, 'w') as tar: |
| 182 | for f in files: |
| 183 | tar.add(valid_path() + f, arcname=f) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 184 | with tarfile.open(tar_path, 'r') as tar: |
| 185 | fs_local.file_extract(tar, path) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 186 | extracted_path = valid_path() + (path if isinstance(path, str) else '/'.join(path)) |
| 187 | ls_dir = os.listdir(extracted_path) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 188 | assert len(ls_dir) == len(files) |
| 189 | for f in files: |
| 190 | assert f in ls_dir |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 191 | os.remove(tar_path) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 192 | for f in files: |
| 193 | os.remove(valid_path() + f) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 194 | shutil.rmtree(extracted_path) |
| 195 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 196 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 197 | @pytest.mark.parametrize("storage, mode", [ |
| 198 | (str(uuid.uuid4()), 'r'), |
| 199 | (str(uuid.uuid4()), 'w'), |
| 200 | (str(uuid.uuid4()), 'a'), |
| 201 | (str(uuid.uuid4()), 'rb'), |
| 202 | (str(uuid.uuid4()), 'wb'), |
| 203 | (str(uuid.uuid4()), 'ab'), |
| 204 | ([str(uuid.uuid4())], 'r'), |
| 205 | ([str(uuid.uuid4())], 'w'), |
| 206 | ([str(uuid.uuid4())], 'a'), |
| 207 | ([str(uuid.uuid4())], 'rb'), |
| 208 | ([str(uuid.uuid4())], 'wb'), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 209 | ([str(uuid.uuid4())], 'ab')]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 210 | def test_file_open(fs_local, storage, mode): |
| 211 | path = valid_path() + storage if isinstance(storage, str) else valid_path() + storage[0] |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 212 | os.mknod(path) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 213 | file_obj = fs_local.file_open(storage, mode) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 214 | assert isinstance(file_obj, io.IOBase) |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 215 | assert file_obj.closed is False |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 216 | os.remove(path) |
| 217 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 218 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 219 | @pytest.mark.parametrize("storage, mode", [ |
| 220 | (str(uuid.uuid4()), 'r'), |
| 221 | (str(uuid.uuid4()), 'rb'), |
| 222 | ([str(uuid.uuid4())], 'r'), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 223 | ([str(uuid.uuid4())], 'rb')]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 224 | def test_file_open_file_not_found_exception(fs_local, storage, mode): |
| 225 | with pytest.raises(FsException) as excinfo: |
| 226 | fs_local.file_open(storage, mode) |
| 227 | assert str(excinfo.value) == file_open_file_not_found_exception(storage) |
| 228 | assert excinfo.value.http_code == http.HTTPStatus.NOT_FOUND |
| 229 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 230 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 231 | @pytest.mark.parametrize("storage, mode", [ |
| 232 | (str(uuid.uuid4()), 'r'), |
| 233 | (str(uuid.uuid4()), 'w'), |
| 234 | (str(uuid.uuid4()), 'a'), |
| 235 | (str(uuid.uuid4()), 'rb'), |
| 236 | (str(uuid.uuid4()), 'wb'), |
| 237 | (str(uuid.uuid4()), 'ab'), |
| 238 | ([str(uuid.uuid4())], 'r'), |
| 239 | ([str(uuid.uuid4())], 'w'), |
| 240 | ([str(uuid.uuid4())], 'a'), |
| 241 | ([str(uuid.uuid4())], 'rb'), |
| 242 | ([str(uuid.uuid4())], 'wb'), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 243 | ([str(uuid.uuid4())], 'ab')]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 244 | def test_file_open_io_error(fs_local, storage, mode): |
| 245 | path = valid_path() + storage if isinstance(storage, str) else valid_path() + storage[0] |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 246 | os.mknod(path) |
| 247 | os.chmod(path, 0) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 248 | with pytest.raises(FsException) as excinfo: |
| 249 | fs_local.file_open(storage, mode) |
| 250 | assert str(excinfo.value) == file_open_io_exception(storage) |
| 251 | assert excinfo.value.http_code == http.HTTPStatus.BAD_REQUEST |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 252 | os.remove(path) |
| 253 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 254 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 255 | @pytest.mark.parametrize("storage, with_files", [ |
| 256 | (str(uuid.uuid4()), True), |
| 257 | (str(uuid.uuid4()), False), |
| 258 | ([str(uuid.uuid4())], True), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 259 | ([str(uuid.uuid4())], False)]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 260 | def test_dir_ls(fs_local, storage, with_files): |
| 261 | path = valid_path() + storage if isinstance(storage, str) else valid_path() + storage[0] |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 262 | os.mkdir(path) |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 263 | if with_files is True: |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 264 | file_name = str(uuid.uuid4()) |
| 265 | file_path = path + '/' + file_name |
| 266 | os.mknod(file_path) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 267 | result = fs_local.dir_ls(storage) |
| 268 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 269 | if with_files is True: |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 270 | assert len(result) == 1 |
| 271 | assert result[0] == file_name |
| 272 | else: |
| 273 | assert len(result) == 0 |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 274 | shutil.rmtree(path) |
| 275 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 276 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 277 | @pytest.mark.parametrize("storage", [ |
| 278 | (str(uuid.uuid4())), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 279 | ([str(uuid.uuid4())])]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 280 | def test_dir_ls_with_not_a_directory_error(fs_local, storage): |
| 281 | path = valid_path() + storage if isinstance(storage, str) else valid_path() + storage[0] |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 282 | os.mknod(path) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 283 | with pytest.raises(FsException) as excinfo: |
| 284 | fs_local.dir_ls(storage) |
| 285 | assert str(excinfo.value) == dir_ls_not_a_directory_exception(storage) |
| 286 | assert excinfo.value.http_code == http.HTTPStatus.NOT_FOUND |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 287 | os.remove(path) |
| 288 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 289 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 290 | @pytest.mark.parametrize("storage", [ |
| 291 | (str(uuid.uuid4())), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 292 | ([str(uuid.uuid4())])]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 293 | def test_dir_ls_with_io_error(fs_local, storage): |
| 294 | path = valid_path() + storage if isinstance(storage, str) else valid_path() + storage[0] |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 295 | os.mkdir(path) |
| 296 | os.chmod(path, 0) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 297 | with pytest.raises(FsException) as excinfo: |
| 298 | fs_local.dir_ls(storage) |
| 299 | assert str(excinfo.value) == dir_ls_io_exception(storage) |
| 300 | assert excinfo.value.http_code == http.HTTPStatus.BAD_REQUEST |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 301 | os.rmdir(path) |
| 302 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 303 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 304 | @pytest.mark.parametrize("storage, with_files, ignore_non_exist", [ |
| 305 | (str(uuid.uuid4()), True, True), |
| 306 | (str(uuid.uuid4()), False, True), |
| 307 | (str(uuid.uuid4()), True, False), |
| 308 | (str(uuid.uuid4()), False, False), |
| 309 | ([str(uuid.uuid4())], True, True), |
| 310 | ([str(uuid.uuid4())], False, True), |
| 311 | ([str(uuid.uuid4())], True, False), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 312 | ([str(uuid.uuid4())], False, False)]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 313 | def test_file_delete_with_dir(fs_local, storage, with_files, ignore_non_exist): |
| 314 | path = valid_path() + storage if isinstance(storage, str) else valid_path() + storage[0] |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 315 | os.mkdir(path) |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 316 | if with_files is True: |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 317 | file_path = path + '/' + str(uuid.uuid4()) |
| 318 | os.mknod(file_path) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 319 | fs_local.file_delete(storage, ignore_non_exist) |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 320 | assert os.path.exists(path) is False |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 321 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 322 | |
| 323 | @pytest.mark.parametrize("storage", [ |
| 324 | (str(uuid.uuid4())), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 325 | ([str(uuid.uuid4())])]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 326 | def test_file_delete_expect_exception(fs_local, storage): |
| 327 | with pytest.raises(FsException) as excinfo: |
| 328 | fs_local.file_delete(storage) |
| 329 | assert str(excinfo.value) == file_delete_exception_message(storage) |
| 330 | assert excinfo.value.http_code == http.HTTPStatus.NOT_FOUND |
| 331 | |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 332 | |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 333 | @pytest.mark.parametrize("storage", [ |
| 334 | (str(uuid.uuid4())), |
| Eduardo Sousa | acbbdf2 | 2018-05-03 15:47:41 +0100 | [diff] [blame] | 335 | ([str(uuid.uuid4())])]) |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 336 | def test_file_delete_no_exception(fs_local, storage): |
| 337 | path = valid_path() + storage if isinstance(storage, str) else valid_path() + storage[0] |
| Eduardo Sousa | f5119a8 | 2018-04-25 17:55:17 +0100 | [diff] [blame] | 338 | fs_local.file_delete(storage, ignore_non_exist=True) |
| tierno | b20a902 | 2018-05-22 12:07:05 +0200 | [diff] [blame] | 339 | assert os.path.exists(path) is False |