#!/bin/bash # # Copyright 2015 The Bazel Authors. All rights reserved. # # 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. # # Test git_repository and new_git_repository workspace rules. # # Load the test setup defined in the parent directory CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${CURRENT_DIR}/../integration_test_setup.sh" \ || { echo "integration_test_setup.sh not found!" >&2; exit 1; } # Global test setup. # # Unpacks the test Git repositories in the test temporary directory. function set_up() { bazel clean --expunge local repos_dir=$TEST_TMPDIR/repos if [ -e "$repos_dir" ]; then rm -rf $repos_dir fi mkdir -p $repos_dir cp $testdata_path/pluto-repo.tar.gz $repos_dir cp $testdata_path/outer-planets-repo.tar.gz $repos_dir cp $testdata_path/refetch-repo.tar.gz $repos_dir cd $repos_dir tar zxf pluto-repo.tar.gz tar zxf outer-planets-repo.tar.gz tar zxf refetch-repo.tar.gz # Fix environment variables for a hermetic use of git. export GIT_CONFIG_NOSYSTEM=1 export GIT_CONFIG_NOGLOBAL=1 export HOME= export XDG_CONFIG_HOME= } # Test cloning a Git repository using the git_repository rule. # # This test uses the pluto Git repository at tag 1-build, which contains the # following files: # # pluto/ # WORKSPACE # BUILD # info # # Followed by a test at 2-subdir which contains the following files to test # the strip_prefix functionality: # # pluto/ # pluto/ # WORKSPACE # BUILD # info # # In each case, set up workspace with the following files: # # $WORKSPACE_DIR/ # WORKSPACE # planets/ # BUILD # planet_info.sh # # //planets has a dependency on a target in the pluto Git repository. function do_git_repository_test() { local pluto_repo_dir=$TEST_TMPDIR/repos/pluto # Commit corresponds to tag 1-build. See testdata/pluto.git_log. local commit_hash="$1" local strip_prefix="" local shallow_since="" [ $# -eq 2 ] && strip_prefix="strip_prefix=\"$2\"," [ $# -eq 3 ] && shallow_since="shallow_since=\"$3\"," # Create a workspace that clones the repository at the first commit. cd $WORKSPACE_DIR cat > WORKSPACE < planets/BUILD < planets/planet_info.sh <& $TEST_log \ || echo "Expected build/run to succeed" expect_log "Pluto is a dwarf planet" } function test_git_repository() { do_git_repository_test "52f9a3f87a2dd17ae0e5847bbae9734f09354afd" } function test_git_repository_strip_prefix() { # This commit has the files in a subdirectory named 'pluto' # so we strip_prefix and the build should still work. do_git_repository_test "dbf9236251a9ea01b7a2eb563ca8e911060fc97c" "pluto" } function test_git_repository_shallow_since() { # This date is the day the commit was made. do_git_repository_test "52f9a3f87a2dd17ae0e5847bbae9734f09354afd" "" "2016-07-16" } function test_new_git_repository_with_build_file() { do_new_git_repository_test "0-initial" "build_file" } function test_new_git_repository_with_build_file_strip_prefix() { do_new_git_repository_test "3-subdir-bare" "build_file" "pluto" } function test_new_git_repository_with_build_file_content() { do_new_git_repository_test "0-initial" "build_file_content" } function test_new_git_repository_with_build_file_content_strip_prefix() { do_new_git_repository_test "3-subdir-bare" "build_file_content" "pluto" } # Test cloning a Git repository using the new_git_repository rule. # # This test uses the pluto Git repository at tag 0-initial, which contains the # following files: # # pluto/ # info # # Then it uses the pluto Git repository at tag 3-subdir-bare, which contains the # following files: # pluto/ # pluto/ # info # # Set up workspace with the following files: # # $WORKSPACE_DIR/ # WORKSPACE # pluto.BUILD # planets/ # BUILD # planet_info.sh # # //planets has a dependency on a target in the $TEST_TMPDIR/pluto Git # repository. function do_new_git_repository_test() { local pluto_repo_dir=$TEST_TMPDIR/repos/pluto local strip_prefix="" [ $# -eq 3 ] && strip_prefix="strip_prefix=\"$3\"," # Create a workspace that clones the repository at the first commit. cd $WORKSPACE_DIR if [ "$2" == "build_file" ] ; then cat > WORKSPACE < BUILD < pluto.BUILD < WORKSPACE < planets/BUILD < planets/planet_info.sh <& $TEST_log \ || echo "Expected build/run to succeed" if [ "$1" == "0-initial" ]; then expect_log "Pluto is a planet" else expect_log "Pluto is a dwarf planet" fi } # Test cloning a Git repository that has a submodule using the # new_git_repository rule. # # This test uses the outer-planets Git repository at revision 1-submodule, which # contains the following files: # # outer_planets/ # neptune/ # info # pluto/ --> submodule ../pluto # info # # Set up workspace with the following files: # # $WORKSPACE_DIR/ # WORKSPACE # outer_planets.BUILD # planets/ # BUILD # planet_info.sh # # planets has a dependency on targets in the $TEST_TMPDIR/outer_planets Git # repository. function test_new_git_repository_submodules() { local outer_planets_repo_dir=$TEST_TMPDIR/repos/outer-planets # Create a workspace that clones the outer_planets repository. cd $WORKSPACE_DIR cat > WORKSPACE < BUILD < outer_planets.BUILD < planets/BUILD < planets/planet_info.sh <& $TEST_log \ || echo "Expected build/run to succeed" expect_log "Neptune is a planet" expect_log "Pluto is a planet" } function test_git_repository_not_refetched_on_server_restart() { local repo_dir=$TEST_TMPDIR/repos/refetch cd $WORKSPACE_DIR cat > WORKSPACE <& $TEST_log || fail "Build failed" expect_log "Cloning" assert_contains "GIT 1" bazel-genfiles/external/g/go # Without changing anything, restart the server, which should not cause the checkout to be re-cloned. bazel --batch build @g//:g >& $TEST_log || fail "Build failed" expect_not_log "Cloning" assert_contains "GIT 1" bazel-genfiles/external/g/go # Change the commit id, which should cause the checkout to be re-cloned. cat > WORKSPACE <& $TEST_log || fail "Build failed" expect_log "Cloning" assert_contains "GIT 2" bazel-genfiles/external/g/go # Change the WORKSPACE but not the commit id, which should not cause the checkout to be re-cloned. cat > WORKSPACE <& $TEST_log || fail "Build failed" expect_not_log "Cloning" assert_contains "GIT 2" bazel-genfiles/external/g/go } function test_git_repository_not_refetched_on_server_restart_strip_prefix() { local repo_dir=$TEST_TMPDIR/repos/refetch # Change the strip_prefix which should cause a new checkout cat > WORKSPACE <& $TEST_log || fail "Build failed" expect_log "Cloning" assert_contains "GIT 2" bazel-genfiles/external/g/gdir/go cat > WORKSPACE <& $TEST_log || fail "Build failed" expect_log "Cloning" assert_contains "GIT 2" bazel-genfiles/external/g/go } function test_git_repository_refetched_when_commit_changes() { local repo_dir=$TEST_TMPDIR/repos/refetch cd $WORKSPACE_DIR cat > WORKSPACE <& $TEST_log || fail "Build failed" expect_log "Cloning" assert_contains "GIT 1" bazel-genfiles/external/g/go # Change the commit id, which should cause the checkout to be re-cloned. cat > WORKSPACE <& $TEST_log || fail "Build failed" expect_log "Cloning" assert_contains "GIT 2" bazel-genfiles/external/g/go } function test_git_repository_and_nofetch() { local repo_dir=$TEST_TMPDIR/repos/refetch cd $WORKSPACE_DIR cat > WORKSPACE <& $TEST_log && fail "Build succeeded" expect_log "fetching repositories is disabled" bazel build @g//:g >& $TEST_log || fail "Build failed" assert_contains "GIT 1" bazel-genfiles/external/g/go cat > WORKSPACE <& $TEST_log || fail "Build failed" expect_log "External repository 'g' is not up-to-date" assert_contains "GIT 1" bazel-genfiles/external/g/go bazel build @g//:g >& $TEST_log || fail "Build failed" assert_contains "GIT 2" bazel-genfiles/external/g/go cat > WORKSPACE <& $TEST_log || fail "Build failed" expect_log "External repository 'g' is not up-to-date" bazel build @g//:g >& $TEST_log || fail "Build failed" assert_contains "GIT 2" bazel-genfiles/external/g/go } # Helper function for setting up the workspace as follows # # $WORKSPACE_DIR/ # WORKSPACE # planets/ # planet_info.sh # BUILD function setup_error_test() { cd $WORKSPACE_DIR mkdir -p planets cat > planets/planet_info.sh < planets/BUILD < WORKSPACE <& $TEST_log \ || echo "Expect run to fail." expect_log "Exactly one of commit" } # Verifies that rule fails if neither tag or commit are set. # # This test uses the pluto Git repository at tag 1-build, which contains the # following files: # # pluto/ # WORKSPACE # BUILD # info function test_git_repository_no_commit_tag_error() { setup_error_test local pluto_repo_dir=$TEST_TMPDIR/repos/pluto cd $WORKSPACE_DIR cat > WORKSPACE <& $TEST_log \ || echo "Expect run to fail." expect_log "Exactly one of commit" } # Verifies that if a non-existent subdirectory is supplied, then strip_prefix # throws an error. function test_invalid_strip_prefix_error() { setup_error_test local pluto_repo_dir=$TEST_TMPDIR/repos/pluto cd $WORKSPACE_DIR cat > WORKSPACE <& $TEST_log \ || echo "Expect run to fail." expect_log "strip_prefix at dir_does_not_exist does not exist in repo" } # Verifies that rule fails if tag and shallow_since are set # function test_git_repository_shallow_since_with_tag_error() { setup_error_test local pluto_repo_dir=$TEST_TMPDIR/pluto cd $WORKSPACE_DIR cat > WORKSPACE <& $TEST_log \ || echo "Expect run to fail." expect_log "shallow_since not allowed if a tag is specified; --depth=1 will be used for tags" } # Verifies that rule fails if you target a commit that is before # the shallow point # function test_git_repository_shallow_since_with_earlier_commit_error() { setup_error_test local pluto_repo_dir=$TEST_TMPDIR/pluto cd $WORKSPACE_DIR # This commit was made in July so should not be available if we # shallow since December. cat > WORKSPACE <& $TEST_log \ || echo "Expect run to fail." expect_log "error cloning" } run_suite "skylark git_repository tests"