#!/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.

# --- begin runfiles.bash initialization ---
# Copy-pasted from Bazel's Bash runfiles library (tools/bash/runfiles/runfiles.bash).
set -euo pipefail
if [[ ! -d "${RUNFILES_DIR:-/dev/null}" && ! -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
  if [[ -f "$0.runfiles_manifest" ]]; then
    export RUNFILES_MANIFEST_FILE="$0.runfiles_manifest"
  elif [[ -f "$0.runfiles/MANIFEST" ]]; then
    export RUNFILES_MANIFEST_FILE="$0.runfiles/MANIFEST"
  elif [[ -f "$0.runfiles/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
    export RUNFILES_DIR="$0.runfiles"
  fi
fi
if [[ -f "${RUNFILES_DIR:-/dev/null}/bazel_tools/tools/bash/runfiles/runfiles.bash" ]]; then
  source "${RUNFILES_DIR}/bazel_tools/tools/bash/runfiles/runfiles.bash"
elif [[ -f "${RUNFILES_MANIFEST_FILE:-/dev/null}" ]]; then
  source "$(grep -m1 "^bazel_tools/tools/bash/runfiles/runfiles.bash " \
            "$RUNFILES_MANIFEST_FILE" | cut -d ' ' -f 2-)"
else
  echo >&2 "ERROR: cannot find @bazel_tools//tools/bash/runfiles:runfiles.bash"
  exit 1
fi
# --- end runfiles.bash initialization ---

source "$(rlocation "io_bazel/src/test/shell/integration_test_setup.sh")" \
  || { echo "integration_test_setup.sh not found!" >&2; exit 1; }

case "$(uname -s | tr [:upper:] [:lower:])" in
msys*|mingw*|cygwin*)
  declare -r is_windows=true
  ;;
*)
  declare -r is_windows=false
  ;;
esac

if "$is_windows"; then
  export MSYS_NO_PATHCONV=1
  export MSYS2_ARG_CONV_EXCL="*"
fi

if ! type try_with_timeout >&/dev/null; then
  # Bazel's testenv.sh defines try_with_timeout but the Google-internal version
  # uses a different testenv.sh.
  function try_with_timeout() { $* ; }
fi

#### TESTS #############################################################

function test_no_rebuild_on_irrelevant_header_change() {
  local -r pkg=$FUNCNAME
  mkdir -p $pkg
  cat > $pkg/BUILD <<EOF
cc_binary(name="a", srcs=["a.cc"], deps=["b"])
cc_library(name="b", srcs=["b1.h", "b2.h"])
EOF

  cat > $pkg/a.cc <<EOF
#include "$pkg/b1.h"

int main(void) {
  return B_RETURN_VALUE;
}
EOF

  cat > $pkg/b1.h <<EOF
#define B_RETURN_VALUE 31
EOF

  cat > $pkg/b2.h <<EOF
=== BANANA ===
EOF

  bazel build //$pkg:a || fail "build failed"
  echo "CHERRY" > $pkg/b2.h
  bazel build //$pkg:a >& $TEST_log || fail "build failed"
  expect_not_log "Compiling $pkg/a.cc"
}

function test_new_header_is_required() {
  local -r pkg=$FUNCNAME
  mkdir -p $pkg
  cat > $pkg/BUILD <<EOF
cc_binary(name="a", srcs=["a.cc"], deps=[":b"])
cc_library(name="b", srcs=["b1.h", "b2.h"])
EOF

  cat > $pkg/a.cc << EOF
#include "$pkg/b1.h"

int main(void) {
    return B1;
}
EOF

  cat > $pkg/b1.h <<EOF
#define B1 3
EOF

  cat > $pkg/b2.h <<EOF
#define B2 4
EOF

  bazel build //$pkg:a || fail "build failed"
  cat > $pkg/a.cc << EOF
#include "$pkg/b1.h"
#include "$pkg/b2.h"

int main(void) {
    return B1 + B2;
}
EOF

  bazel build //$pkg:a || fail "build failed"
}

function test_no_recompile_on_shutdown() {
  local -r pkg=$FUNCNAME
  mkdir -p $pkg
  cat > $pkg/BUILD <<EOF
cc_binary(name="a", srcs=["a.cc"], deps=["b"])
cc_library(name="b", includes=["."], hdrs=["b.h"])
EOF

  cat > $pkg/a.cc <<EOF
#include "b.h"

int main(void) {
  return B_RETURN_VALUE;
}
EOF

  cat > $pkg/b.h <<EOF
#define B_RETURN_VALUE 31
EOF

  bazel build -s //$pkg:a >& $TEST_log || fail "build failed"
  expect_log "Compiling $pkg/a.cc"
  try_with_timeout bazel shutdown || fail "shutdown failed"
  bazel build -s //$pkg:a >& $TEST_log || fail "build failed"
  expect_not_log "Compiling $pkg/a.cc"
}

# host_crosstool_top should default to the initial value of crosstool_top,
# not the value after a transition.
function test_default_host_crosstool_top() {
  local -r pkg=$FUNCNAME

  # Define two different toolchain suites to use with crosstool_top.
  mkdir -p $pkg/toolchain
  cat >> $pkg/toolchain/BUILD <<EOF
package(default_visibility = ["//visibility:public"])

load(":toolchain.bzl", "toolchains")

cc_library(
    name = "link_extra_lib",
)

cc_library(
    name = "malloc",
)

filegroup(
    name = "empty",
    srcs = [],
)

[toolchains(id) for id in [
    "alpha",
    "beta",
]]
EOF
  cat >> $pkg/toolchain/toolchain.bzl <<EOF
load(
    "${TOOLS_REPOSITORY}//tools/cpp:cc_toolchain_config_lib.bzl",
    "action_config",
    "flag_group",
    "flag_set",
    "make_variable",
)

def _get_make_variables():
    return []

def _get_action_configs():
    return []

def _impl(ctx):
    out = ctx.actions.declare_file(ctx.label.name)
    ctx.actions.write(out, "Fake executable")
    return [
        cc_common.create_cc_toolchain_config_info(
            ctx = ctx,
            target_cpu = ctx.attr.cpu,
            compiler = ctx.attr.compiler,
            toolchain_identifier = ctx.attr.toolchain_identifier,
            host_system_name = ctx.attr.host_system_name,
            target_system_name = ctx.attr.target_system_name,
            target_libc = ctx.attr.target_libc,
            abi_version = ctx.attr.abi_version,
            abi_libc_version = ctx.attr.abi_libc_version,
            action_configs = _get_action_configs(),
            make_variables = _get_make_variables(),
        ),
        DefaultInfo(
            executable = out,
        ),
    ]

cc_toolchain_config = rule(
    implementation = _impl,
    attrs = {
        "cpu": attr.string(mandatory = True),
        "compiler": attr.string(mandatory = True),
        "toolchain_identifier": attr.string(mandatory = True),
        "host_system_name": attr.string(mandatory = True),
        "target_system_name": attr.string(mandatory = True),
        "target_libc": attr.string(mandatory = True),
        "abi_version": attr.string(mandatory = True),
        "abi_libc_version": attr.string(mandatory = True),
    },
    provides = [CcToolchainConfigInfo],
    executable = True,
)

def toolchains(id):
    native.cc_toolchain_suite(
        name = "%s" % id,
        toolchains = {
            "fake": ":cc-toolchain-%s" % id,
        },
    )

    name = "toolchain-%s" % id
    cc_toolchain_config(
        name = "cc-toolchain-config-%s" % id,
        abi_libc_version = name,
        abi_version = name,
        compiler = name,
        cpu = name,
        host_system_name = name,
        target_libc = name,
        target_system_name = name,
        toolchain_identifier = name,
    )

    native.cc_toolchain(
        name = "cc-toolchain-%s" % id,
        all_files = ":empty",
        ar_files = ":empty",
        as_files = ":empty",
        compiler_files = ":empty",
        dwp_files = ":empty",
        linker_files = ":empty",
        objcopy_files = ":empty",
        strip_files = ":empty",
        toolchain_config = ":cc-toolchain-config-%s" % id,
        toolchain_identifier = name,
    )
EOF

  # Create an outer target, which uses a transition to depend on an inner.
  # The inner then depends on a tool in the exec configuration.
  # Even though te outer->inner dependency changes the value of crosstool_top,
  # the tool should use the initial crosstool.
  cat >> $pkg/BUILD <<EOF
load(":display.bzl", "inner", "outer", "tool")

outer(
    name = "outer",
    inner = ":inner",
)

inner(
    name = "inner",
    tool = ":tool",
)

tool(name = "tool")
EOF
  cat >> $pkg/display.bzl <<EOF
def find_cc_toolchain(ctx):
    return ctx.attr._cc_toolchain[cc_common.CcToolchainInfo]

# Custom transition to change the crosstool.
def _crosstool_transition_impl(settings, attr):
    _ignore = (settings, attr)
    return {"//command_line_option:crosstool_top": "//${pkg}/toolchain:beta"}

crosstool_transition = transition(
    implementation = _crosstool_transition_impl,
    inputs = [],
    outputs = ["//command_line_option:crosstool_top"],
)

# Outer display rule.
def _outer_impl(ctx):
    cc_toolchain = find_cc_toolchain(ctx)
    print("Outer %s found cc toolchain %s" % (ctx.label, cc_toolchain.target_gnu_system_name))
    pass

outer = rule(
    implementation = _outer_impl,
    attrs = {
        "inner": attr.label(mandatory = True, cfg = crosstool_transition),
        "_cc_toolchain": attr.label(
            default = Label(
                "${TOOLS_REPOSITORY}//tools/cpp:current_cc_toolchain",
            ),
        ),
        "_whitelist_function_transition": attr.label(default = "${TOOLS_REPOSITORY}//tools/whitelists/function_transition_whitelist"),
    },
)

# Inner display rule.
def _inner_impl(ctx):
    cc_toolchain = find_cc_toolchain(ctx)
    print("Inner %s found cc toolchain %s" % (ctx.label, cc_toolchain.target_gnu_system_name))
    pass

inner = rule(
    implementation = _inner_impl,
    attrs = {
        "tool": attr.label(mandatory = True, cfg = "exec"),
        "_cc_toolchain": attr.label(
            default = Label(
                "${TOOLS_REPOSITORY}//tools/cpp:current_cc_toolchain",
            ),
        ),
    },
)

# Tool rule.
def _tool_impl(ctx):
    cc_toolchain = find_cc_toolchain(ctx)
    print("Tool %s found cc toolchain %s" % (ctx.label, cc_toolchain.target_gnu_system_name))
    pass

tool = rule(
    implementation = _tool_impl,
    attrs = {
        "_cc_toolchain": attr.label(
            default = Label(
                "${TOOLS_REPOSITORY}//tools/cpp:current_cc_toolchain",
            ),
        ),
    },
)
EOF


  bazel build \
    --noincompatible_enable_cc_toolchain_resolution \
    --cpu=fake --host_cpu=fake \
    --crosstool_top=//$pkg/toolchain:alpha \
    //$pkg:outer >& $TEST_log || fail "build failed"
  expect_log "Outer @//$pkg:outer found cc toolchain toolchain-alpha"
  expect_log "Inner @//$pkg:inner found cc toolchain toolchain-beta"
  expect_log "Tool @//$pkg:tool found cc toolchain toolchain-alpha"
}

run_suite "Tests for Bazel's C++ rules"
