1*cc02d7e2SAndroid Build Coastguard Worker#!/usr/bin/env bash 2*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2018 gRPC authors. 3*cc02d7e2SAndroid Build Coastguard Worker# 4*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 5*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 6*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at 7*cc02d7e2SAndroid Build Coastguard Worker# 8*cc02d7e2SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 9*cc02d7e2SAndroid Build Coastguard Worker# 10*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 11*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 12*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 14*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License. 15*cc02d7e2SAndroid Build Coastguard Worker 16*cc02d7e2SAndroid Build Coastguard Workerset -ex 17*cc02d7e2SAndroid Build Coastguard Worker 18*cc02d7e2SAndroid Build Coastguard Workercd "$(dirname "$0")" 19*cc02d7e2SAndroid Build Coastguard Worker 20*cc02d7e2SAndroid Build Coastguard Workershopt -s nullglob 21*cc02d7e2SAndroid Build Coastguard Worker 22*cc02d7e2SAndroid Build Coastguard Workerecho "Testing Python packages with input artifacts:" 23*cc02d7e2SAndroid Build Coastguard Workerls "$EXTERNAL_GIT_ROOT"/input_artifacts 24*cc02d7e2SAndroid Build Coastguard Worker 25*cc02d7e2SAndroid Build Coastguard Workerif [[ "$1" == "binary" ]] 26*cc02d7e2SAndroid Build Coastguard Workerthen 27*cc02d7e2SAndroid Build Coastguard Worker echo "Testing Python binary distribution" 28*cc02d7e2SAndroid Build Coastguard Worker ARCHIVES=("$EXTERNAL_GIT_ROOT"/input_artifacts/grpcio[-_0-9a-z.]*.whl) 29*cc02d7e2SAndroid Build Coastguard Worker TOOLS_ARCHIVES=("$EXTERNAL_GIT_ROOT"/input_artifacts/grpcio[_-]*tools[-_0-9a-z.]*.whl) 30*cc02d7e2SAndroid Build Coastguard Worker OBSERVABILITY_ARCHIVES=("$EXTERNAL_GIT_ROOT"/input_artifacts/grpcio[_-]*observability[-_0-9a-z.]*.whl) 31*cc02d7e2SAndroid Build Coastguard Workerelse 32*cc02d7e2SAndroid Build Coastguard Worker echo "Testing Python source distribution" 33*cc02d7e2SAndroid Build Coastguard Worker ARCHIVES=("$EXTERNAL_GIT_ROOT"/input_artifacts/grpcio[-_0-9a-z.]*.tar.gz) 34*cc02d7e2SAndroid Build Coastguard Worker TOOLS_ARCHIVES=("$EXTERNAL_GIT_ROOT"/input_artifacts/grpcio[_-]*tools[-_0-9a-z.]*.tar.gz) 35*cc02d7e2SAndroid Build Coastguard Worker OBSERVABILITY_ARCHIVES=("$EXTERNAL_GIT_ROOT"/input_artifacts/grpcio[_-]*observability[-_0-9a-z.]*.tar.gz) 36*cc02d7e2SAndroid Build Coastguard Workerfi 37*cc02d7e2SAndroid Build Coastguard Worker 38*cc02d7e2SAndroid Build Coastguard WorkerHEALTH_ARCHIVES=("$EXTERNAL_GIT_ROOT"/input_artifacts/grpcio[_-]*health[_-]*checking[-_0-9a-z.]*.tar.gz) 39*cc02d7e2SAndroid Build Coastguard WorkerREFLECTION_ARCHIVES=("$EXTERNAL_GIT_ROOT"/input_artifacts/grpcio[_-]*reflection[-_0-9a-z.]*.tar.gz) 40*cc02d7e2SAndroid Build Coastguard WorkerTESTING_ARCHIVES=("$EXTERNAL_GIT_ROOT"/input_artifacts/grpcio[_-]*testing[-_0-9a-z.]*.tar.gz) 41*cc02d7e2SAndroid Build Coastguard Worker 42*cc02d7e2SAndroid Build Coastguard WorkerVIRTUAL_ENV=$(mktemp -d) 43*cc02d7e2SAndroid Build Coastguard Workerpython3 -m virtualenv "$VIRTUAL_ENV" 44*cc02d7e2SAndroid Build Coastguard WorkerPYTHON=$VIRTUAL_ENV/bin/python 45*cc02d7e2SAndroid Build Coastguard Worker"$PYTHON" -m pip install --upgrade six pip wheel setuptools 46*cc02d7e2SAndroid Build Coastguard Worker 47*cc02d7e2SAndroid Build Coastguard Workerfunction validate_wheel_hashes() { 48*cc02d7e2SAndroid Build Coastguard Worker for file in "$@"; do 49*cc02d7e2SAndroid Build Coastguard Worker "$PYTHON" -m wheel unpack "$file" -d /tmp || return 1 50*cc02d7e2SAndroid Build Coastguard Worker done 51*cc02d7e2SAndroid Build Coastguard Worker return 0 52*cc02d7e2SAndroid Build Coastguard Worker} 53*cc02d7e2SAndroid Build Coastguard Worker 54*cc02d7e2SAndroid Build Coastguard Workerfunction at_least_one_installs() { 55*cc02d7e2SAndroid Build Coastguard Worker for file in "$@"; do 56*cc02d7e2SAndroid Build Coastguard Worker if "$PYTHON" -m pip install "$file"; then 57*cc02d7e2SAndroid Build Coastguard Worker return 0 58*cc02d7e2SAndroid Build Coastguard Worker fi 59*cc02d7e2SAndroid Build Coastguard Worker done 60*cc02d7e2SAndroid Build Coastguard Worker return 1 61*cc02d7e2SAndroid Build Coastguard Worker} 62*cc02d7e2SAndroid Build Coastguard Worker 63*cc02d7e2SAndroid Build Coastguard Worker 64*cc02d7e2SAndroid Build Coastguard Worker# 65*cc02d7e2SAndroid Build Coastguard Worker# Validate the files in wheel matches their hashes and size in RECORD 66*cc02d7e2SAndroid Build Coastguard Worker# 67*cc02d7e2SAndroid Build Coastguard Worker 68*cc02d7e2SAndroid Build Coastguard Workerif [[ "$1" == "binary" ]]; then 69*cc02d7e2SAndroid Build Coastguard Worker validate_wheel_hashes "${ARCHIVES[@]}" 70*cc02d7e2SAndroid Build Coastguard Worker validate_wheel_hashes "${TOOLS_ARCHIVES[@]}" 71*cc02d7e2SAndroid Build Coastguard Worker validate_wheel_hashes "${OBSERVABILITY_ARCHIVES[@]}" 72*cc02d7e2SAndroid Build Coastguard Workerfi 73*cc02d7e2SAndroid Build Coastguard Worker 74*cc02d7e2SAndroid Build Coastguard Worker 75*cc02d7e2SAndroid Build Coastguard Worker# 76*cc02d7e2SAndroid Build Coastguard Worker# Install our distributions in order of dependencies 77*cc02d7e2SAndroid Build Coastguard Worker# 78*cc02d7e2SAndroid Build Coastguard Worker 79*cc02d7e2SAndroid Build Coastguard Workerat_least_one_installs "${ARCHIVES[@]}" 80*cc02d7e2SAndroid Build Coastguard Workerat_least_one_installs "${TOOLS_ARCHIVES[@]}" 81*cc02d7e2SAndroid Build Coastguard Workerat_least_one_installs "${HEALTH_ARCHIVES[@]}" 82*cc02d7e2SAndroid Build Coastguard Workerat_least_one_installs "${REFLECTION_ARCHIVES[@]}" 83*cc02d7e2SAndroid Build Coastguard Workerat_least_one_installs "${TESTING_ARCHIVES[@]}" 84*cc02d7e2SAndroid Build Coastguard Workerat_least_one_installs "${OBSERVABILITY_ARCHIVES[@]}" 85*cc02d7e2SAndroid Build Coastguard Worker 86*cc02d7e2SAndroid Build Coastguard Worker 87*cc02d7e2SAndroid Build Coastguard Worker# 88*cc02d7e2SAndroid Build Coastguard Worker# Test our distributions 89*cc02d7e2SAndroid Build Coastguard Worker# 90*cc02d7e2SAndroid Build Coastguard Worker 91*cc02d7e2SAndroid Build Coastguard Worker# TODO(jtattermusch): add a .proto file to the distribtest, generate python 92*cc02d7e2SAndroid Build Coastguard Worker# code from it and then use the generated code from distribtest.py 93*cc02d7e2SAndroid Build Coastguard Worker"$PYTHON" -m grpc_tools.protoc --help 94*cc02d7e2SAndroid Build Coastguard Worker 95*cc02d7e2SAndroid Build Coastguard Worker"$PYTHON" distribtest.py 96