"""Test module to collect test executable hashsum."""
from lit.Test import toMetricValue
from litsupport import shellcommand
from litsupport import testplan
import hashlib
import lit.Test
import logging
import platform


def compute(context):
    if hasattr(context, 'executable_hash'):
        return
    executable = context.executable
    try:
        # Darwin's "strip" doesn't support these arguments.
        if platform.system() != 'Darwin':
            stripped_executable = executable + '.stripped'
            testplan.check_call([context.config.strip_tool,
                                 '--remove-section=.comment',
                                 "--remove-section='.note*'",
                                 '-o', stripped_executable,
                                 executable])
            executable = stripped_executable

        h = hashlib.md5()
        h.update(open(executable, 'rb').read())
        context.executable_hash = h.hexdigest()
    except:
        logging.info('Could not calculate hash for %s' % executable)
        context.executable_hash = ''


def same_as_previous(context):
    """Check whether hash has changed compared to the results in
    config.previous_results."""
    previous_results = context.config.previous_results
    testname = context.test.getFullName()
    executable_hash = context.executable_hash
    if previous_results and "tests" in previous_results:
        for test in previous_results["tests"]:
            if "name" not in test or test["name"] != testname:
                continue
            if "metrics" not in test:
                continue
            metrics = test["metrics"]
            return "hash" in metrics and metrics["hash"] == executable_hash
    return False


def _getHash(context):
    compute(context)
    return {'hash': lit.Test.toMetricValue(context.executable_hash)}


def mutatePlan(context, plan):
    plan.metric_collectors.append(_getHash)
