"""Test the LLDB module cache funcionality for universal mach-o files."""

import glob
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
import os
import time


class ModuleCacheTestcaseUniversal(TestBase):
    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Find the line number in a(int) to break at.
        self.cache_dir = os.path.join(self.getBuildDir(), "lldb-module-cache")
        # Set the lldb module cache directory to a directory inside the build
        # artifacts directory so no other tests are interfered with.
        self.runCmd(
            'settings set symbols.lldb-index-cache-path "%s"' % (self.cache_dir)
        )
        self.runCmd("settings set symbols.enable-lldb-index-cache true")

    def get_module_cache_files(self, basename):
        module_file_glob = os.path.join(self.cache_dir, "llvmcache-*%s*" % (basename))
        return glob.glob(module_file_glob)

    # Doesn't depend on any specific debug information.
    @no_debug_info_test
    def test(self):
        """
        Test module cache functionality for a universal mach-o files.

        This will test that if we enable the module cache, we can create
        lldb module caches for each slice of a universal mach-o file and
        they will each have a unique directory.
        """
        exe_basename = "testit"
        src_dir = self.getSourceDir()
        yaml_path = os.path.join(src_dir, "universal.yaml")
        yaml_base, ext = os.path.splitext(yaml_path)
        exe = self.getBuildArtifact(exe_basename)
        self.yaml2obj(yaml_path, exe)
        self.assertTrue(os.path.exists(exe))
        # Create a module with no dependencies.
        self.runCmd("target create -d --arch x86_64 %s" % (exe))
        self.runCmd("image dump symtab %s" % (exe_basename))
        self.runCmd("target create -d --arch arm64 %s" % (exe))
        self.runCmd("image dump symtab %s" % (exe_basename))

        cache_files = self.get_module_cache_files(exe_basename)

        self.assertEqual(
            len(cache_files),
            2,
            "make sure there are two files in the module cache directory (%s) for %s"
            % (self.cache_dir, exe_basename),
        )
