blob: cb2dc58d35a1b5a0baacb8dc959f69ee8af69ea2 [file] [log] [blame]
#!/bin/bash
# Copyright 2023 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.
################################################################################
DEFAULT_DIR="$(pwd)"
if [[ -n "${TEST_SRCDIR}" ]]; then
DEFAULT_DIR="${TEST_SRCDIR}"
fi
readonly DEFAULT_DIR
readonly CLI_RELATIVE_PATH="${1:-"maven_deploy_library.sh"}"
readonly CLI="${DEFAULT_DIR}/${CLI_RELATIVE_PATH}"
readonly TEST_UTILS="${DEFAULT_DIR}/${2}"
readonly SETTINGS_XML="${DEFAULT_DIR}/${3}"
readonly RELATIVE_MVN_DIR_PATH="$(dirname "${CLI_RELATIVE_PATH}")"
readonly ACTUAL_MVN_CMD="$(which mvn)"
# Load the test library.
source "${TEST_UTILS}"
create_maven_folder_and_pom_file() {
mkdir -p "${RELATIVE_MVN_DIR_PATH}"
cp "${SETTINGS_XML}" "${RELATIVE_MVN_DIR_PATH}"
cat << EOF > "${RELATIVE_MVN_DIR_PATH}/tink.pom.xml"
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<name>Tink Cryptography API</name>
<description>Tink is a small cryptographic library that provides a safe, simple, agile and fast way to accomplish some common cryptographic tasks.</description>
<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>7</version>
</parent>
<groupId>com.google.crypto.tink</groupId>
<artifactId>tink</artifactId>
<version>VERSION_PLACEHOLDER</version>
<!-- Skip the rest as not useful here -->
</project>
EOF
}
# Mock Bazel command that pretends to build a given target.
mock_bazel() {
local -r bazel_cmd="$1"
case "${bazel_cmd}" in
"build")
mkdir bazel-bin/
touch bazel-bin/tink.jar
touch bazel-bin/tink-src.jar
# Create the javadoc zip.
mkdir META-INF
touch META-INF/MANIFEST.MF
zip bazel-bin/tink-javadoc.jar META-INF/
;;
*) return 1 ;; # No other command should be called.
esac
}
test_MavenDeployLibraryTest_InstallSucceeds() {
cd "${TEST_CASE_TMPDIR}"
create_maven_folder_and_pom_file
cat << EOF > expected_commands.txt
bazel build tink.jar tink-src.jar tink-javadoc.jar
mvn install:install-file -Dfile=${TEST_CASE_TMPDIR}/bazel-bin/tink.jar \
-Dsources=${TEST_CASE_TMPDIR}/bazel-bin/tink-src.jar \
-Djavadoc=${TEST_CASE_TMPDIR}/bazel-bin/tink-javadoc.jar \
-DpomFile=${RELATIVE_MVN_DIR_PATH}/tink.pom.xml
EOF
bazel() {
echo "bazel $@" >> actual_commands.txt
mock_bazel "$@"
}
bazelisk() {
bazel "$@"
}
mvn() {
echo "mvn $@" >> actual_commands.txt
}
(
source "${CLI}" install tink "${RELATIVE_MVN_DIR_PATH}/tink.pom.xml" HEAD \
> /dev/null
)
ASSERT_CMD_SUCCEEDED
ASSERT_FILE_EQUALS actual_commands.txt expected_commands.txt
}
test_MavenDeployLibraryTest_ReleaseFailsIfNoUrl() {
cd "${TEST_CASE_TMPDIR}"
create_maven_folder_and_pom_file
# No calls to bazel should be made.
bazel() {
return 1
}
bazelisk() {
bazel "$@"
}
# No calls to mvn should be made.
mvn() {
return 1
}
(
source "${CLI}" release tink "${RELATIVE_MVN_DIR_PATH}/tink.pom.xml" 1.2.3 \
> /dev/null
)
ASSERT_CMD_FAILED
}
create_test_gpg_key() {
gpg --pinentry-mode loopback --gen-key --batch << EOF
Key-Type: 1
Key-Length: 2048
Subkey-Type: 1
Subkey-Length: 2048
Name-Real: Test User
Name-Email: test@test.com
Expire-Date: 0
Passphrase: This-is-a-passphrase
EOF
}
delete_gpg_test_key() {
gpg --list-secret-keys --with-colon --fingerprint test@test.com\
| grep -m 1 fpr \
| sed -n 's/^fpr:::::::::\([[:alnum:]]\+\):/\1/p' \
| xargs gpg --delete-secret-keys --batch --yes
}
test_MavenDeployLibraryTest_ReleaseSucceeds() {
cd "${TEST_CASE_TMPDIR}"
create_maven_folder_and_pom_file
cat << EOF > expected_commands.txt
bazel build tink.jar tink-src.jar tink-javadoc.jar
mvn gpg:sign-and-deploy-file -DrepositoryId=ossrh \
-Durl=https://oss.sonatype.org/service/local/staging/deploy/maven2/ \
-Dgpg.keyname=tink-dev@google.com \
--settings=${TEST_CASE_TMPDIR}/${RELATIVE_MVN_DIR_PATH}/settings.xml \
-Dfile=${TEST_CASE_TMPDIR}/bazel-bin/tink.jar \
-Dsources=${TEST_CASE_TMPDIR}/bazel-bin/tink-src.jar \
-Djavadoc=${TEST_CASE_TMPDIR}/bazel-bin/tink-javadoc.jar \
-DpomFile=${RELATIVE_MVN_DIR_PATH}/tink.pom.xml
EOF
bazel() {
echo "bazel $@" >> actual_commands.txt
mock_bazel "$@"
}
bazelisk() {
bazel "$@"
}
git() {
mkdir -p gh-pages
}
mvn() {
echo "mvn $@" >> actual_commands.txt
local -r repo_url="https://oss.sonatype.org/service/local/staging/deploy/maven2/"
# Make sure the correct URL is set, if not, return. This is to guarantee the
# parameter is replaced with the local URI below.
if ! echo "$@" | grep "${repo_url}" > /dev/null; then
echo "URL not found" >&2
return 1
fi
params=($(echo "$@" | sed 's#'${repo_url}'#file://'${TEST_CASE_TMPDIR}'#g' \
| sed 's#tink-dev@google.com#test@test.com#g'))
export SONATYPE_USERNAME="some_username"
export SONATYPE_PASSWORD="some_password"
export TINK_DEV_MAVEN_PGP_PASSPHRASE="This-is-a-passphrase"
create_test_gpg_key || return 1
"${ACTUAL_MVN_CMD}" "${params[@]}" || return 1
delete_gpg_test_key || return 1
}
(
source "${CLI}" -u github.com/tink-crypto/tink-java release tink \
"${RELATIVE_MVN_DIR_PATH}/tink.pom.xml" 1.2.3 > /dev/null
)
ASSERT_CMD_SUCCEEDED
ASSERT_FILE_EQUALS actual_commands.txt expected_commands.txt
}
test_MavenDeployLibraryTest_SnapshotSucceeds() {
cd "${TEST_CASE_TMPDIR}"
create_maven_folder_and_pom_file
cat << EOF > expected_commands.txt
bazel build tink.jar tink-src.jar tink-javadoc.jar
mvn deploy:deploy-file -DrepositoryId=ossrh \
-Durl=https://oss.sonatype.org/content/repositories/snapshots \
--settings=${TEST_CASE_TMPDIR}/${RELATIVE_MVN_DIR_PATH}/settings.xml \
-Dfile=${TEST_CASE_TMPDIR}/bazel-bin/tink.jar \
-Dsources=${TEST_CASE_TMPDIR}/bazel-bin/tink-src.jar \
-Djavadoc=${TEST_CASE_TMPDIR}/bazel-bin/tink-javadoc.jar \
-DpomFile=${RELATIVE_MVN_DIR_PATH}/tink.pom.xml
EOF
bazel() {
echo "bazel $@" >> actual_commands.txt
mock_bazel "$@"
}
bazelisk() {
bazel "$@"
}
git() {
mkdir -p gh-pages
}
mvn() {
echo "mvn $@" >> actual_commands.txt
}
(
source "${CLI}" -u github.com/tink-crypto/tink-java snapshot tink \
"${RELATIVE_MVN_DIR_PATH}/tink.pom.xml" HEAD > /dev/null
)
ASSERT_CMD_SUCCEEDED
ASSERT_FILE_EQUALS actual_commands.txt expected_commands.txt
}
main() {
run_all_tests "$@"
}
main "$@"