#!/usr/bin/env python

# ===--- Benchmark_GuardMalloc.in ----------------------------------------===//
#
#  This source file is part of the Swift.org open source project
#
#  Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
#  Licensed under Apache License v2.0 with Runtime Library Exception
#
#  See https://swift.org/LICENSE.txt for license information
#  See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
#
# ===---------------------------------------------------------------------===//

import os
import subprocess
import sys

sys.path.append("@PATH_TO_DRIVER_LIBRARY@")

import perf_test_driver  # noqa (E402 module level import not at top of file)

# Regexes for the XFAIL_LIST. Matches against '([Onone|O|Osize],TestName)'
XFAIL_LIST = [
]


class GuardMallocResult(perf_test_driver.Result):

    def __init__(self, name, status):
        perf_test_driver.Result.__init__(self, name, status, "", XFAIL_LIST)


class GuardMallocBenchmarkDriver(perf_test_driver.BenchmarkDriver):

    def __init__(self, binary, xfail_list):
        perf_test_driver.BenchmarkDriver.__init__(
            self, binary, xfail_list,
            enable_parallel=True)
        self.new_env = os.environ.copy()
        self.new_env['DYLD_INSERT_LIBRARIES'] = '/usr/lib/libgmalloc.dylib'

    def prepare_input(self, name):
        return {'env': self.new_env}

    def process_input(self, data):
        test_name = '({},{})'.format(data['opt'], data['test_name'])
        print("Running {}...".format(test_name))
        sys.stdout.flush()

        p = subprocess.Popen(
            [data['path'], data['test_name'], '--num-iters=2'],
            env=data['env'], stderr=open('/dev/null', 'w'),
            stdout=open('/dev/null', 'w'))
        status = p.wait()

        return GuardMallocResult(test_name, status)


SWIFT_BIN_DIR = os.path.dirname(os.path.abspath(__file__))

if __name__ == "__main__":
    g = GuardMallocBenchmarkDriver(SWIFT_BIN_DIR, XFAIL_LIST)
    if g.run():
        sys.exit(0)
    else:
        sys.exit(-1)
