# -*- coding: utf-8 -*-
# Copyright 2015 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.

"""Test for chromite qemu logic"""

from __future__ import print_function

import glob
import os
import sys

from chromite.lib import cros_test_lib
from chromite.lib import qemu


assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'


class QemuTests(cros_test_lib.TestCase):
  """Verify Qemu logic works"""

  def testArchDetect(self):
    """Verify we correctly probe each arch"""
    test_dir = os.path.join(os.path.realpath(os.path.dirname(__file__)),
                            'datafiles')
    test_files = os.path.join(test_dir, 'arch.*.elf')

    for test in glob.glob(test_files):
      test_file = os.path.basename(test)
      exp_arch = test_file.split('.')[1]

      arch = qemu.Qemu.DetectArch(test_file, test_dir)
      if arch is None:
        # See if we have a mask for it.
        # pylint: disable=protected-access
        self.assertNotIn(exp_arch, list(qemu.Qemu._MAGIC_MASK),
                         msg='ELF "%s" did not match "%s", but should have' %
                         (test, exp_arch))
      else:
        self.assertEqual(arch, exp_arch)

  def testArmRegisterStr(self):
    """Make sure the register string is exact.

    We don't check every arch, just one to make sure the general logic is OK.
    """
    exp = (b':foo:M::'
           b'\x7fELF\x01\x01\x01!\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\x02'
           b'\\x00(\\x00:\xff\xff\xff\xff\xff\xff\xff\\x00\xff\xff\xff\xff\xff'
           b'\xff\xff\xff\xfe\xff\xff\xff:'
           b'/pfx-binfmt-wrapper:POC')
    self.assertEqual(exp, qemu.Qemu.GetRegisterBinfmtStr('arm', 'foo', '/pfx'))

  def testRegisterStrLengths(self):
    """Verify the binfmt register string doesn't exceed kernel limits"""
    # pylint: disable=protected-access
    for arch in qemu.Qemu._MAGIC_MASK.keys():
      name = 'qemu-%s' % arch
      interp = '/build/bin/%s' % name
      register = qemu.Qemu.GetRegisterBinfmtStr(arch, name, interp)
      self.assertGreaterEqual(256, len(register),
                              msg='arch "%s" has too long of a register string:'
                                  ' %i: %r' % (arch, len(register), register))

  def testFullInterpPath(self):
    """Sanity check for the interp helper."""
    self.assertNotEqual('', qemu.Qemu.GetFullInterpPath('foo'))

  def testInode(self):
    """Sanity check for the inode helper."""
    self.assertEqual(-1, qemu.Qemu.inode('/.....'))
    self.assertLess(0, qemu.Qemu.inode('/'))
