"""
Test that argdumper is a viable launching strategy.
"""
from __future__ import print_function


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


class LaunchWithShellExpandTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    @expectedFailureAll(
        oslist=[
            "windows",
            "linux",
            "freebsd"],
        bugnumber="llvm.org/pr24778 llvm.org/pr22627")
    @skipIfDarwinEmbedded # iOS etc don't launch the binary via a shell, so arg expansion won't happen
    def test(self):
        self.build()
        exe = self.getBuildArtifact("a.out")

        self.runCmd("target create %s" % exe)

        # Create the target
        target = self.dbg.CreateTarget(exe)

        # Create any breakpoints we need
        breakpoint = target.BreakpointCreateBySourceRegex(
            'break here', lldb.SBFileSpec("main.cpp", False))
        self.assertTrue(breakpoint, VALID_BREAKPOINT)

        self.runCmd(
            "process launch -X true -w %s -- fi*.tx? () > <" %
            (self.getSourceDir()))

        process = self.process()

        self.assertTrue(process.GetState() == lldb.eStateStopped,
                        STOPPED_DUE_TO_BREAKPOINT)

        thread = process.GetThreadAtIndex(0)

        self.assertTrue(thread.IsValid(),
                        "Process stopped at 'main' should have a valid thread")

        stop_reason = thread.GetStopReason()

        self.assertTrue(
            stop_reason == lldb.eStopReasonBreakpoint,
            "Thread in process stopped in 'main' should have a stop reason of eStopReasonBreakpoint")

        self.expect("frame variable argv[1]", substrs=['file1.txt'])
        self.expect("frame variable argv[2]", substrs=['file2.txt'])
        self.expect("frame variable argv[3]", substrs=['file3.txt'])
        self.expect("frame variable argv[4]", substrs=['file4.txy'])
        self.expect("frame variable argv[5]", substrs=['()'])
        self.expect("frame variable argv[6]", substrs=['>'])
        self.expect("frame variable argv[7]", substrs=['<'])
        self.expect(
            "frame variable argv[5]",
            substrs=['file5.tyx'],
            matching=False)
        self.expect(
            "frame variable argv[8]",
            substrs=['file5.tyx'],
            matching=False)

        self.runCmd("process kill")

        self.runCmd(
            'process launch -X true -w %s -- "foo bar"' %
            (self.getSourceDir()))

        process = self.process()

        self.assertTrue(process.GetState() == lldb.eStateStopped,
                        STOPPED_DUE_TO_BREAKPOINT)

        thread = process.GetThreadAtIndex(0)

        self.assertTrue(thread.IsValid(),
                        "Process stopped at 'main' should have a valid thread")

        stop_reason = thread.GetStopReason()

        self.assertTrue(
            stop_reason == lldb.eStopReasonBreakpoint,
            "Thread in process stopped in 'main' should have a stop reason of eStopReasonBreakpoint")

        self.expect("frame variable argv[1]", substrs=['foo bar'])

        self.runCmd("process kill")

        self.runCmd('process launch -X true -w %s -- foo\ bar'
                    % (self.getBuildDir()))

        process = self.process()

        self.assertTrue(process.GetState() == lldb.eStateStopped,
                        STOPPED_DUE_TO_BREAKPOINT)

        thread = process.GetThreadAtIndex(0)

        self.assertTrue(thread.IsValid(),
                        "Process stopped at 'main' should have a valid thread")

        stop_reason = thread.GetStopReason()

        self.assertTrue(
            stop_reason == lldb.eStopReasonBreakpoint,
            "Thread in process stopped in 'main' should have a stop reason of eStopReasonBreakpoint")

        self.expect("frame variable argv[1]", substrs=['foo bar'])
