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


def compute(context):
    if hasattr(context, 'executable_hash'):
        return
    executable = context.executable
    try:
        # Darwin's and Solaris' "strip" don't support these arguments.
        if platform.system() != 'Darwin' and platform.system() != 'SunOS':
            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 Exception:
        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': context.executable_hash}


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