"""
Test that LLDB correctly allows scripted commands to set an immediate output file
"""

from __future__ import print_function


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


class CommandScriptImmediateOutputTestCase (PExpectTest):

    mydir = TestBase.compute_mydir(__file__)
    NO_DEBUG_INFO_TESTCASE = True

    def setUp(self):
        # Call super's setUp().
        PExpectTest.setUp(self)

    @skipIfRemote  # test not remote-ready llvm.org/pr24813
    @expectedFailureAll(
        oslist=["windows"],
        bugnumber="llvm.org/pr22274: need a pexpect replacement for windows")
    @expectedFailureAll(oslist=["freebsd"], bugnumber="llvm.org/pr26139")
    def test_command_script_immediate_output_console(self):
        """Test that LLDB correctly allows scripted commands to set immediate output to the console."""
        self.launch(timeout=10)

        script = os.path.join(self.getSourceDir(), 'custom_command.py')
        prompt = "\(lldb\) "

        self.sendline('command script import %s' % script, patterns=[prompt])
        self.sendline(
            'command script add -f custom_command.command_function mycommand',
            patterns=[prompt])
        self.sendline(
            'mycommand',
            patterns='this is a test string, just a test string')
        self.sendline('command script delete mycommand', patterns=[prompt])
        self.quit(gracefully=False)

    @skipIfRemote  # test not remote-ready llvm.org/pr24813
    @expectedFailureAll(
        oslist=["windows"],
        bugnumber="llvm.org/pr22274: need a pexpect replacement for windows")
    @expectedFailureAll(oslist=["freebsd"], bugnumber="llvm.org/pr26139")
    def test_command_script_immediate_output_file(self):
        """Test that LLDB correctly allows scripted commands to set immediate output to a file."""
        self.launch(timeout=10)

        test_files = {self.getBuildArtifact('read.txt'): 'r',
                      self.getBuildArtifact('write.txt'): 'w',
                      self.getBuildArtifact('append.txt'): 'a',
                      self.getBuildArtifact('write_plus.txt'): 'w+',
                      self.getBuildArtifact('read_plus.txt'): 'r+',
                      self.getBuildArtifact('append_plus.txt'): 'a+'}

        starter_string = 'Starter Garbage\n'
        write_string = 'writing to file with mode: '

        for path, mode in test_files.iteritems():
            with open(path, 'w+') as init:
                init.write(starter_string)

        script = os.path.join(self.getSourceDir(), 'custom_command.py')
        prompt = "\(lldb\) "

        self.sendline('command script import %s' % script, patterns=[prompt])

        self.sendline(
            'command script add -f custom_command.write_file mywrite',
            patterns=[prompt])
        for path, mode in test_files.iteritems():
            command = 'mywrite "' + path + '" ' + mode

            self.sendline(command, patterns=[prompt])

        self.sendline('command script delete mywrite', patterns=[prompt])

        self.quit(gracefully=False)

        for path, mode in test_files.iteritems():
            with open(path, 'r') as result:
                if mode in ['r', 'a', 'a+']:
                    self.assertEquals(result.readline(), starter_string)
                if mode in ['w', 'w+', 'r+', 'a', 'a+']:
                    self.assertEquals(
                        result.readline(), write_string + mode + '\n')

            self.assertTrue(os.path.isfile(path))
            os.remove(path)
