tobiko/tobiko/run/_find.py

91 lines
2.7 KiB
Python

# Copyright (c) 2021 Red Hat, Inc.
#
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import absolute_import
import os
import subprocess
import sys
import typing
from oslo_log import log
from tobiko.run import _config
LOG = log.getLogger(__name__)
def find_test_files(test_path: typing.Iterable[str] = None,
test_filename: str = None,
config: _config.RunConfigFixture = None) \
-> typing.List[str]:
config = _config.run_confing(config)
if test_path:
test_path = list(test_path)
if not test_path:
test_path = config.test_path
if not test_filename:
test_filename = config.test_filename
test_files: typing.List[str] = []
for path in test_path:
path = os.path.realpath(path)
if os.path.isfile(path):
test_files.append(path)
LOG.debug("Found test file:\n"
f" {path}\n",)
continue
if os.path.isdir(path):
find_dir = path
find_name = test_filename
else:
find_dir = os.path.dirname(path)
find_name = os.path.basename(path)
LOG.debug("Find test files...\n"
f" dir: '{find_dir}'\n"
f" name: '{find_name}'\n")
output = subprocess.check_output(
['find', find_dir, '-name', find_name],
universal_newlines=True)
for line in output.splitlines():
line = line.strip()
if line:
assert os.path.isfile(line)
test_files.append(line)
LOG.debug("Found test file(s):\n"
" %s", ' \n'.join(test_files))
return test_files
def main(test_path: typing.List[str] = None):
if test_path is None:
test_path = sys.argv[1:]
try:
test_files = find_test_files(test_path=test_path)
except Exception as ex:
sys.stderr.write(f'{ex}\n')
sys.exit(1)
else:
output = ''.join(f'{test_file}\n'
for test_file in test_files)
sys.stdout.write(output)
sys.exit(0)
if __name__ == '__main__':
main()