#
# Copyright (C) 2015 The Android Open Source Project
#
# 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.
#
import os
import shutil
import site
import subprocess
import tempfile

site.addsitedir(os.path.join(os.environ['NDK'], 'build/lib'))

import build_support  # pylint: disable=import-error


def make_standalone_toolchain(arch, platform, toolchain, install_dir):
    ndk_dir = os.environ['NDK']
    make_standalone_toolchain_path = os.path.join(
        ndk_dir, 'build/tools/make-standalone-toolchain.sh')

    cmd = [make_standalone_toolchain_path, '--install-dir=' + install_dir]

    if arch is not None:
        cmd.append('--arch=' + arch)
    if platform is not None:
        cmd.append('--platform=' + platform)

    if toolchain is not None:
        if toolchain == 'clang':
            # make-standalone-toolchain.sh still expects a version.
            toolchain = 'clang3.6'
        toolchain_triple = build_support.arch_to_toolchain(arch)
        name = '{}-{}'.format(toolchain_triple, toolchain)
        cmd.append('--toolchain=' + name)

    subprocess.check_call(cmd)


def test_standalone_toolchain(arch, toolchain, install_dir):
    if toolchain == '4.9':
        triple = build_support.arch_to_triple(arch)
        # x86 toolchain names are dumb: http://b/25800583
        if arch == 'x86':
            triple = 'i686-linux-android'
        compiler_name = triple + '-g++'
    elif toolchain == 'clang':
        compiler_name = 'clang++'
    else:
        raise ValueError

    compiler = os.path.join(install_dir, 'bin', compiler_name)
    test_source = 'foo.cpp'
    proc = subprocess.Popen([compiler, '-shared', test_source],
                            stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    out, _ = proc.communicate()
    return proc.returncode == 0, out


def run_test(abi=None, platform=None, toolchain=None,
             build_flags=None):  # pylint: disable=unused-argument
    arch = 'arm'
    if abi is not None:
        arch = build_support.abi_to_arch(abi)

    install_dir = tempfile.mkdtemp()
    try:
        make_standalone_toolchain(arch, platform, toolchain, install_dir)
        return test_standalone_toolchain(arch, toolchain, install_dir)
    finally:
        shutil.rmtree(install_dir)
