# -*- coding: utf-8 -*-
# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""check whether intended components exists in the given dso."""

from __future__ import print_function

import os
import subprocess

from allowlist import is_allowlisted


def check_debug_info(dso_path, readelf_content):
  """Check whether debug info section exists in the elf file.

  Args:
    dso_path: path to the dso.
    readelf_content: debug info dumped by command readelf.

  Returns:
    True if debug info section exists, otherwise False.
  """

  # Return True if it is allowlisted
  if is_allowlisted('exist_debug_info', dso_path):
    return True

  for l in readelf_content:
    if 'debug_info' in l:
      return True
  return False


def check_producer(dso_path, readelf_content):
  """Check whether DW_AT_producer exists in each compile unit.

  Args:
    dso_path: path to the dso.
    readelf_content: debug info dumped by command readelf.

  Returns:
    True if DW_AT_producer exists in each compile unit, otherwise False.
    Notice: If no compile unit in DSO, also return True.
  """

  # Return True if it is allowlisted
  if is_allowlisted('exist_producer', dso_path):
    return True

  # Indicate if there is a producer under each cu
  cur_producer = False

  first_cu = True
  producer_exist = True

  for l in readelf_content:
    if 'DW_TAG_compile_unit' in l:
      if not first_cu and not cur_producer:
        producer_exist = False
        break
      first_cu = False
      cur_producer = False
    elif 'DW_AT_producer' in l:
      cur_producer = True

  # Check whether last producer of compile unit exists in the elf,
  # also return True if no cu in the DSO.
  if not first_cu and not cur_producer:
    producer_exist = False

  return producer_exist


def check_exist_all(dso_path):
  """check whether intended components exists in the given dso.

  Args:
    dso_path: path to the dso.

  Returns:
    True if everything looks fine otherwise False.
  """

  readelf = subprocess.Popen(
      ['readelf', '--debug-dump=info', '--dwarf-depth=1', dso_path],
      stdout=subprocess.PIPE,
      stderr=open(os.devnull, 'w'),
      encoding='utf-8')
  readelf_content = list(readelf.stdout)

  exist_checks = [check_debug_info, check_producer]

  for e in exist_checks:
    if not e(dso_path, readelf_content):
      check_failed = e.__module__ + ': ' + e.__name__
      print('%s failed check: %s' % (dso_path, check_failed))
      return False

  return True
