#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2018 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Test for debug info."""


import os
import subprocess
import sys

import check_cus
import check_exist
import check_icf


elf_checks = [
    check_exist.check_exist_all,
    check_cus.check_compile_units,
    check_icf.check_identical_code_folding,
]


def scanelf(root):
    """Find ELFs in root.

    Args:
      root: root dir to start with the search.

    Returns:
      Filenames of ELFs in root.
    """
    p = subprocess.Popen(
        ["scanelf", "-y", "-B", "-F", "%F", "-R", root],
        stdout=subprocess.PIPE,
        encoding="utf-8",
    )
    return [l.strip() for l in p.stdout]


def Main(argv):
    if len(argv) < 2:
        print("usage: %s [file|dir]")
        return 1

    files = []
    cand = argv[1]
    if os.path.isfile(cand):
        files = [cand]
    elif os.path.isdir(cand):
        files = scanelf(cand)
    else:
        print("usage: %s [file|dir]")
        return 1

    failed = False
    for f in files:
        for c in elf_checks:
            if not c(f):
                failed = True

    if failed:
        return 1
    return 0


if __name__ == "__main__":
    sys.exit(Main(sys.argv))
