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