mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-04 00:51:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			98 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env bash
 | 
						|
 | 
						|
set -e
 | 
						|
 | 
						|
# Parse parameter:
 | 
						|
# - `e` - Parameter for `esphome` command. Default `compile`. Common alternative is `config`.
 | 
						|
# - `c` - Component folder name to test. Default `*`.
 | 
						|
esphome_command="compile"
 | 
						|
target_component="*"
 | 
						|
while getopts e:c:t: flag
 | 
						|
do
 | 
						|
    case $flag in
 | 
						|
        e) esphome_command=${OPTARG};;
 | 
						|
        c) target_component=${OPTARG};;
 | 
						|
        t) requested_target_platform=${OPTARG};;
 | 
						|
        \?) echo "Usage: $0 [-e <config|compile|clean>] [-c <string>] [-t <string>]" 1>&2; exit 1;;
 | 
						|
    esac
 | 
						|
done
 | 
						|
 | 
						|
cd "$(dirname "$0")/.."
 | 
						|
 | 
						|
if ! [ -d "./tests/test_build_components/build" ]; then
 | 
						|
  mkdir ./tests/test_build_components/build
 | 
						|
fi
 | 
						|
 | 
						|
start_esphome() {
 | 
						|
  if [ -n "$requested_target_platform" ] && [ "$requested_target_platform" != "$target_platform" ]; then
 | 
						|
    echo "Skiping $target_platform"
 | 
						|
    return
 | 
						|
  fi
 | 
						|
  # create dynamic yaml file in `build` folder.
 | 
						|
  # `./tests/test_build_components/build/[target_component].[test_name].[target_platform_with_version].yaml`
 | 
						|
  component_test_file="./tests/test_build_components/build/$target_component.$test_name.$target_platform_with_version.yaml"
 | 
						|
 | 
						|
  cp $target_platform_file $component_test_file
 | 
						|
  if [[ "$OSTYPE" == "darwin"* ]]; then
 | 
						|
    # macOS sed is...different
 | 
						|
    sed -i '' "s!\$component_test_file!../../.$f!g" $component_test_file
 | 
						|
  else
 | 
						|
    sed -i "s!\$component_test_file!../../.$f!g" $component_test_file
 | 
						|
  fi
 | 
						|
 | 
						|
  # Start esphome process
 | 
						|
  echo "> [$target_component] [$test_name] [$target_platform_with_version]"
 | 
						|
  set -x
 | 
						|
  # TODO: Validate escape of Command line substitution value
 | 
						|
  python -m esphome -s component_name $target_component -s component_dir ../../components/$target_component -s test_name $test_name -s target_platform $target_platform $esphome_command $component_test_file
 | 
						|
  { set +x; } 2>/dev/null
 | 
						|
}
 | 
						|
 | 
						|
# Find all test yaml files.
 | 
						|
# - `./tests/components/[target_component]/[test_name].[target_platform].yaml`
 | 
						|
# - `./tests/components/[target_component]/[test_name].all.yaml`
 | 
						|
for f in ./tests/components/$target_component/*.*.yaml; do
 | 
						|
  [ -f "$f" ] || continue
 | 
						|
  IFS='/' read -r -a folder_name <<< "$f"
 | 
						|
  target_component="${folder_name[3]}"
 | 
						|
 | 
						|
  IFS='.' read -r -a file_name <<< "${folder_name[4]}"
 | 
						|
  test_name="${file_name[0]}"
 | 
						|
  target_platform="${file_name[1]}"
 | 
						|
  file_name_parts=${#file_name[@]}
 | 
						|
 | 
						|
  if [ "$target_platform" = "all" ] || [ $file_name_parts = 2 ]; then
 | 
						|
    # Test has *not* defined a specific target platform. Need to run tests for all possible target platforms.
 | 
						|
    
 | 
						|
    for target_platform_file in ./tests/test_build_components/build_components_base.*.yaml; do
 | 
						|
      IFS='/' read -r -a folder_name <<< "$target_platform_file"
 | 
						|
      IFS='.' read -r -a file_name <<< "${folder_name[3]}"
 | 
						|
      target_platform="${file_name[1]}"
 | 
						|
 | 
						|
      start_esphome
 | 
						|
    done
 | 
						|
 | 
						|
  else
 | 
						|
    # Test has defined a specific target platform.
 | 
						|
  
 | 
						|
    # Validate we have a base test yaml for selected platform.
 | 
						|
    # The target_platform is sourced from the following location.
 | 
						|
    # 1. `./tests/test_build_components/build_components_base.[target_platform].yaml`
 | 
						|
    # 2. `./tests/test_build_components/build_components_base.[target_platform]-ard.yaml`
 | 
						|
    target_platform_file="./tests/test_build_components/build_components_base.$target_platform.yaml"
 | 
						|
    if ! [ -f "$target_platform_file" ]; then
 | 
						|
      echo "No base test file [./tests/test_build_components/build_components_base.$target_platform.yaml] for component test [$f] found."
 | 
						|
      exit 1
 | 
						|
    fi
 | 
						|
 | 
						|
    for target_platform_file in ./tests/test_build_components/build_components_base.$target_platform*.yaml; do
 | 
						|
      # trim off "./tests/test_build_components/build_components_base." prefix
 | 
						|
      target_platform_with_version=${target_platform_file:52}
 | 
						|
      # ...now remove suffix starting with "." leaving just the test target hardware and software platform (possibly with version)
 | 
						|
      # For example: "esp32-s3-idf-50"
 | 
						|
      target_platform_with_version=${target_platform_with_version%.*}
 | 
						|
      start_esphome
 | 
						|
    done
 | 
						|
  fi
 | 
						|
done
 |