89 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#
 | 
						|
# Dependency Integration Test script
 | 
						|
#
 | 
						|
 | 
						|
# Runs a test to verify whether each service has the correct dependencies listed in setup.py
 | 
						|
#
 | 
						|
# Tests that depend on multiple services are assumed to be located in dedicated testfiles (and ignored during this test)
 | 
						|
# (test_*_integration.py/test_*_cloudformation.py)
 | 
						|
#
 | 
						|
# ::Algorithm::
 | 
						|
# For each valid service:
 | 
						|
#   - Create a virtual environment
 | 
						|
#   - Install only the necessary dependencies
 | 
						|
#   - Run the tests for that service
 | 
						|
#   - If the tests fail:
 | 
						|
#     - This service is probably missing a dependency
 | 
						|
#     - A log file with the test results will be created (test_results_service.log)
 | 
						|
#   - Delete the virtual environment
 | 
						|
#
 | 
						|
# Note:
 | 
						|
#   Only tested on Linux
 | 
						|
#   Parallelized to test 4 services at the time.
 | 
						|
#   Could take some time to run - around 20 minutes on the author's machine
 | 
						|
 | 
						|
 | 
						|
overwrite() { echo -e "\r\033[1A\033[0K$@"; }
 | 
						|
 | 
						|
contains() {
 | 
						|
    [[ $1 =~ (^|[[:space:]])$2($|[[:space:]]) ]] && return 0 || return 1
 | 
						|
}
 | 
						|
 | 
						|
valid_service() {
 | 
						|
  # Verify whether this is a valid service
 | 
						|
  # We'll ignore metadata folders, and folders that test generic Moto behaviour
 | 
						|
  # We'll also ignore CloudFormation, as it will always depend on other services
 | 
						|
  local ignore_moto_folders="core instance_metadata __pycache__ templates cloudformation moto_api moto_server packages utilities s3bucket_path"
 | 
						|
  if echo $ignore_moto_folders | grep -q "$1"; then
 | 
						|
    return 1
 | 
						|
  else
 | 
						|
    return 0
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
test_service() {
 | 
						|
  service=$1
 | 
						|
  path_to_test_file=$2
 | 
						|
  venv_path="test_venv_${service}"
 | 
						|
  overwrite "Running tests for ${service}.."
 | 
						|
  python -m venv ${venv_path}
 | 
						|
  source ${venv_path}/bin/activate
 | 
						|
  pip install --upgrade pip setuptools
 | 
						|
  # Can't just install requirements-file, as it points to all dependencies
 | 
						|
  pip install -r requirements-tests.txt
 | 
						|
  pip install .[$service]
 | 
						|
  pip install boto
 | 
						|
  if [[ $service != "xray" ]]; then
 | 
						|
    pip uninstall setuptools pkg_resources -y
 | 
						|
  fi
 | 
						|
  # Restart venv - ensure these deps are loaded
 | 
						|
  deactivate
 | 
						|
  source ${venv_path}/bin/activate
 | 
						|
  # Run tests for this service
 | 
						|
  pytest -sv --ignore-glob="**/test_server.py" --ignore-glob="**/test_*_cloudformation.py" --ignore-glob="**/test_*_integration.py" $path_to_test_file
 | 
						|
  RESULT=$?
 | 
						|
  deactivate
 | 
						|
  rm -rf ${venv_path}
 | 
						|
  if [[ $RESULT != 0 ]]; then
 | 
						|
    echo -e "Tests for ${service} have failed!\n"
 | 
						|
    exit -1
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
service=$1
 | 
						|
if [[ $# -eq 0 ]] ; then
 | 
						|
    echo 'Please add the name of the service you want to test as the first argument:'
 | 
						|
    echo '    scripts/dependency_test.sh acm'
 | 
						|
    exit 0
 | 
						|
fi
 | 
						|
echo "Running Dependency tests for {$1}..."
 | 
						|
path_to_test_file="tests/test_${service}"
 | 
						|
if valid_service $service && [[ -d $path_to_test_file ]]; then
 | 
						|
  test_service $service $path_to_test_file
 | 
						|
  if [[ $? != 0 ]]; then
 | 
						|
    exit -1
 | 
						|
  fi
 | 
						|
elif valid_service $service; then
 | 
						|
  echo -e "No tests for ${service} can be found on ${path_to_test_file}!\n"
 | 
						|
fi
 |