"""
Test breakpoint command with AT_comp_dir set to symbolic link.
"""
from __future__ import print_function


import os
import shutil
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil


_EXE_NAME = 'CompDirSymLink'  # Must match Makefile
_SRC_FILE = 'relative.cpp'
_COMP_DIR_SYM_LINK_PROP = 'plugin.symbol-file.dwarf.comp-dir-symlink-paths'


class CompDirSymLinkTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        # Find the line number to break inside main().
        self.line = line_number(
            os.path.join(self.getSourceDir(), "main.cpp"),
            '// Set break point at this line.')

    @skipIf(hostoslist=["windows"])
    def test_symlink_paths_set(self):
        pwd_symlink = self.create_src_symlink()
        self.doBuild(pwd_symlink)
        self.runCmd(
            "settings set %s %s" %
            (_COMP_DIR_SYM_LINK_PROP, pwd_symlink))
        src_path = self.getBuildArtifact(_SRC_FILE)
        lldbutil.run_break_set_by_file_and_line(self, src_path, self.line)

    @skipIf(hostoslist=no_match(["linux"]))
    def test_symlink_paths_set_procselfcwd(self):
        os.chdir(self.getBuildDir())
        pwd_symlink = '/proc/self/cwd'
        self.doBuild(pwd_symlink)
        self.runCmd(
            "settings set %s %s" %
            (_COMP_DIR_SYM_LINK_PROP, pwd_symlink))
        src_path = self.getBuildArtifact(_SRC_FILE)
        lldbutil.run_break_set_by_file_and_line(self, src_path, self.line)

    @skipIf(hostoslist=["windows"])
    def test_symlink_paths_unset(self):
        pwd_symlink = self.create_src_symlink()
        self.doBuild(pwd_symlink)
        self.runCmd('settings clear ' + _COMP_DIR_SYM_LINK_PROP)
        src_path = self.getBuildArtifact(_SRC_FILE)
        self.assertRaises(
            AssertionError,
            lldbutil.run_break_set_by_file_and_line,
            self,
            src_path,
            self.line)

    def create_src_symlink(self):
        pwd_symlink = self.getBuildArtifact('pwd_symlink')
        if os.path.exists(pwd_symlink):
            os.unlink(pwd_symlink)
        os.symlink(self.getBuildDir(), pwd_symlink)
        self.addTearDownHook(lambda: os.remove(pwd_symlink))
        return pwd_symlink

    def doBuild(self, pwd_symlink):
        self.build(None, None, {'PWD': pwd_symlink})

        exe = self.getBuildArtifact(_EXE_NAME)
        self.runCmd('file ' + exe, CURRENT_EXECUTABLE_SET)
