blob: e86b608d2e01ccb8d14d6605bae8a59b9c286c50 [file] [log] [blame]
#!/bin/bash
# Copyright 2020 Google LLC
#
# 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.
################################################################################
set -euo pipefail
REPO_DIR="${KOKORO_ARTIFACTS_DIR}/git/tink"
cd "${REPO_DIR}"
./kokoro/testutils/copy_credentials.sh "go/testdata" "all"
# Sourcing required to update callers environment.
source ./kokoro/testutils/install_go.sh
echo "Using go binary from $(which go): $(go version)"
readonly TINK_VERSION="$(cat ${REPO_DIR}/go/tink_version.bzl \
| grep ^TINK \
| cut -f 2 -d \")"
# Create a temporary directory for performing module tests.
TMP_DIR="$(mktemp -dt go-module-test.XXXXXX)"
GO_MOD_DIR="${TMP_DIR}/go-mod-test"
REPO_URL_PREFIX="github.com/google/tink"
#######################################
# Test an individual Go module within the Tink repository.
# Globals:
# REPO_DIR
# TINK_VERISON
# GO_MOD_DIR
# REPO_URL_PREFIX
# Arguments:
# The name of the Go module, relative to the repository root.
# Outputs:
# Prints progress to STDOUT.
#######################################
function test_go_mod() {
local mod_name="$1"
local full_mod_name="${REPO_URL_PREFIX}/${mod_name}"
echo "### Testing ${full_mod_name}..."
(
echo "Using go binary from $(which go): $(go version)"
set -x
cd "${REPO_DIR}/${mod_name}"
go build -v ./...
go test -v ./...
)
mkdir "${GO_MOD_DIR}"
(
cd "${GO_MOD_DIR}"
echo "Using go binary from $(which go): $(go version)"
# Display commands being run for the remainder of this subshell.
set -x
# Initialize a test Go module.
go mod init tink-go-mod-test
overlay_module "${mod_name}" "${full_mod_name}"
overlay_internal_deps "${mod_name}"
# Print the prepared go.mod.
cat go.mod
# Get the module at the latest commit and print graph output depicting
# direct dependencies.
go get -v "${full_mod_name}@master"
# Pint contextual information concerning dependencies.
go mod graph | grep google/tink
go list -m all | grep google/tink
)
# Leave a clean environment for subsequent tests.
go clean -modcache
rm -rf "${GO_MOD_DIR}"
}
#######################################
# Add a require statement for a Tink module and a replace statement to point it
# to the local copy.
# Globals:
# REPO_DIR
# TINK_VERISON
# Arguments:
# The name of the Go module, relative to the repository root.
# The full name of the Go module, as specified in import statements.
#######################################
function overlay_module() {
local mod_name="$1"
local full_mod_name="$2"
go mod edit "-require=${full_mod_name}@v${TINK_VERSION}"
go mod edit "-replace=${full_mod_name}=${REPO_DIR}/${mod_name}"
}
#######################################
# Search the go.mod being tested for internal dependencies and overlay them with
# the local copies.
# Globals:
# REPO_DIR
# REPO_URL_PREFIX
# Arguments:
# The name of the Go module being tested, relative to the repository root.
#######################################
function overlay_internal_deps() {
local mod_name="$1"
declare -a internal_deps
while read internal_dep; do
internal_deps+=("${internal_dep}")
done < <(grep "${REPO_URL_PREFIX}" "${REPO_DIR}/${mod_name}/go.mod" \
| grep -v ^module \
| awk '{print $1}')
# If internal_deps are found...
if [[ ! -z "${internal_deps+x}" ]]; then
for full_dep_name in "${internal_deps[@]}"; do
local dep_name="$(echo "${full_dep_name}" | sed "s#${REPO_URL_PREFIX}/##")"
overlay_module "${dep_name}" "${full_dep_name}"
done
fi
}
function main() {
# Extract all go.mod instances from the repository.
declare -a go_mod_dirs
while read go_mod_dir; do
go_mod_dirs+=("${go_mod_dir}")
done < <(find "${REPO_DIR}" -name "go.mod" \
| sed "s#^${REPO_DIR}/##" \
| xargs -n 1 dirname)
echo "### Go modules found:"
for go_mod_dir in "${go_mod_dirs[@]}"; do
echo "${go_mod_dir}"
done
for go_mod_dir in "${go_mod_dirs[@]}"; do
test_go_mod "${go_mod_dir}"
done
}
main "$@"