#!/bin/bash
#
# Copyright 2016 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.
#
# Tests for package labels that cross repository boundaries
# Includes regression tests for #1592.
#

# 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; }

function write_rule {
  name=$1
  shift
  srcs=""
  for src in "$@"; do
    srcs="\"$src\", $srcs"
  done

  cat <<EOF
genrule(
  name = "$name",
  srcs = [
    $srcs
  ],
  outs = ["$name.out"],
  cmd = "echo $name > \$@",
  visibility = ["//visibility:public"],
)
EOF
}

# Basic use case: Define a repository nested in the main repository, check
# correct targets are visible
function test_basic_cross_repo_targets {
  cat > WORKSPACE <<EOF
local_repository(
    name = "bar",
    path = "bar",
)
EOF

  write_rule depend_via_repo "@bar//:bar" >> BUILD
  write_rule depend_via_repo_subdir "@bar//subbar:subbar" >> BUILD
  write_rule depend_directly "//bar:bar" >> BUILD
  write_rule depend_directly_subdir "//bar/subbar:subbar" >> BUILD

  mkdir -p bar
  touch bar/WORKSPACE
  write_rule bar >> bar/BUILD
  mkdir -p bar/subbar
  write_rule subbar >> bar/subbar/BUILD

  # These should succeed, they use the correct label.
  bazel build //:depend_via_repo || fail "build should succeed"
  bazel build //:depend_via_repo_subdir || fail "build should succeed"

  # These should fail, they is using the wrong label that crosses the
  # repository boundary.
  bazel build //:depend_directly >& $TEST_log && fail "build should fail"
  expect_log "no such package 'bar': Invalid package reference bar crosses into repository @bar"
  bazel build //:depend_directly_subdir >& $TEST_log && fail "build should fail"
  expect_log "no such package 'bar/subbar': Invalid package reference bar/subbar crosses into repository @bar"
}

function test_top_level_local_repository {
  cat > WORKSPACE <<EOF
local_repository(
    name = "loc",
    path = ".",
)
EOF

  write_rule foo >> BUILD

  # These should succeed, they use the correct label.
  bazel build //:foo || fail "build should succeed"
  bazel build @loc//:foo || fail "build should succeed"
}

# Loading rules.
function test_workspace_loads_rules {
  cat > WORKSPACE <<EOF
load("//baz:rules.bzl", "baz_rule")
local_repository(
    name = "bar",
    path = "bar",
)
EOF

  write_rule depend_via_repo "@bar//:bar" >> BUILD
  write_rule depend_directly "//bar:bar" >> BUILD

  mkdir -p bar
  touch bar/WORKSPACE
  write_rule bar >> bar/BUILD

  mkdir -p baz
  touch baz/BUILD
  cat > baz/rules.bzl <<EOF
baz_rule = 'baz_rule'
EOF

  # This should succeed, it uses the correct label.
  bazel build //:depend_via_repo || fail "build should succeed"

  # This should fail, it is using the wrong label that crosses the repository
  # boundary.
  bazel build //:depend_directly >& $TEST_log && fail "build should fail"
  expect_log "no such package 'bar': Invalid package reference bar crosses into repository @bar"
}

# Load rules via an invalid label.
function test_workspace_loads_rules_failure {
  cat > WORKSPACE <<EOF
load("//bar:rules.bzl", "bar_rule")
local_repository(
    name = "bar",
    path = "bar",
)
EOF

  write_rule depend_via_repo "@bar//:bar" >> BUILD

  mkdir -p bar
  touch bar/WORKSPACE
  write_rule bar >> bar/BUILD
  cat > bar/rules.bzl <<EOF
bar_rule = 'bar_rule'
EOF

  # This should fail in workspace parsing.
  bazel build //:depend_via_repo >& $TEST_log && fail "build should fail"
  # TODO(jcater): Show a better error when this occurs
  #expect_log "no such package 'bar': Package crosses into repository @bar"
  # This is the current error shown.
  expect_log "cycles detected"
}

function test_top_level_local_repository {
  cat > WORKSPACE <<EOF
local_repository(
    name = "loc",
    path = ".",
)
EOF

  write_rule foo >> BUILD

  # These should succeed, they use the correct label.
  bazel build //:foo || fail "build should succeed"
  bazel build @loc//:foo || fail "build should succeed"
}

function test_incremental_add_repository {
  # Empty workspace, defines no local_repository.
  cat > WORKSPACE

  mkdir -p bar
  write_rule bar >> bar/BUILD
  mkdir -p bar/subbar
  write_rule subbar >> bar/subbar/BUILD

  bazel query //bar/... >& $TEST_log || fail "query should succeed"

  # Now add the local_repository and WORKSPACE.
  cat > WORKSPACE <<EOF
local_repository(
    name = "bar",
    path = "bar",
)
EOF
  touch bar/WORKSPACE

  # These should now fail, using the incorrect label.
  bazel query //bar:bar >& $TEST_log && fail "build should fail"
  expect_log "no such package 'bar': Invalid package reference bar crosses into repository @bar"
  bazel query //bar/subbar:subbar >& $TEST_log && fail "build should fail"
  expect_log "no such package 'bar/subbar': Invalid package reference bar/subbar crosses into repository @bar"

  # These should succeed.
  echo "about to test @bar//"
  bazel query @bar//:bar || fail "query should succeed"
  bazel query @bar//subbar:subbar || fail "query should succeed"
}

function test_incremental_remove_repository {
  # Add the local_repository and WORKSPACE.
  cat > WORKSPACE <<EOF
local_repository(
    name = "bar",
    path = "bar",
)
EOF
  mkdir -p bar
  touch bar/WORKSPACE
  write_rule bar >> bar/BUILD
  mkdir -p bar/subbar
  write_rule subbar >> bar/subbar/BUILD

  # These should succeed.
  echo "about to test @bar//"
  bazel query @bar//:bar || fail "query should succeed"
  bazel query @bar//subbar:subbar || fail "query should succeed"

  # Now remove the workspace and the local_repository.
  cat > WORKSPACE
  rm bar/WORKSPACE

  # These should now succeed.
  bazel query //bar:bar || fail "query should succeed"
  bazel query //bar/subbar:subbar || fail "query should succeed"


  # These should now fail.
  bazel query @bar//:bar >& $TEST_log && fail "build should fail"
  expect_log "no such package '@bar//': The repository '@bar' could not be resolved"
  bazel query @bar//subbar:subbar >& $TEST_log && fail "build should fail"
  expect_log "no such package '@bar//subbar': The repository '@bar' could not be resolved"
}

# Test for https://github.com/bazelbuild/bazel/issues/2580
# This issue does not involve a local repository but it is triggered by the
# local repository cross-reference check.
function test_workspace_directory {
  cat > WORKSPACE <<EOF
load('//pkg/WORKSPACE:ext.bzl', 'VALUE')
EOF

  mkdir -p pkg/WORKSPACE

  cat > pkg/WORKSPACE/BUILD <<EOF
exports_files(['ext.bzl'])
EOF

  cat > pkg/WORKSPACE/ext.bzl <<EOF
VALUE = 'a value'
EOF

  # These should succeed, they use the correct label.
  bazel build //pkg/WORKSPACE:all || fail "build should succeed"
}

# TODO(katre): Add tests to verify incremental package reloads are necessary and correct.
# - /WORKSPACE edited, rule not changed - no reload
# - /WORKSPACE not edited, /dir/WORKSPACE added or removed - only packages in
#   /dir invalidated and re-loaded

run_suite "cross-repository tests"
