def test_execute_commands(self):
        """Test executing arbitrary commands and logging their output."""
        # All commands succeed.
        exp = (True, [])
        log_f = TemporaryFile(prefix=self.prefix, suffix='.txt')
        obs = _execute_commands(['echo foo', 'echo bar'], log_f, 1)
        self.assertEqual(obs, exp)

        exp = ("Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n"
               "Command:\n\necho bar\n\nStdout:\n\nbar\n\nStderr:\n\n\n")
        log_f.seek(0, 0)
        obs = log_f.read()
        self.assertEqual(obs, exp)

        # One command fails.
        exp = (False, [])
        log_f = TemporaryFile(prefix=self.prefix, suffix='.txt')
        obs = _execute_commands(['echo foo', 'foobarbaz'], log_f, 1)
        self.assertEqual(obs, exp)

        exp = ("Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n"
               "Command:\n\nfoobarbaz\n\nStdout:\n\n\nStderr:\n\n\n\n")
        log_f.seek(0, 0)

        obs = sub('Stderr:\n\n.*\n\n', 'Stderr:\n\n\n\n',
                             log_f.read())
        self.assertEqual(obs, exp)
    def test_execute_commands_log_individual_cmds(self):
        """execute arbitrary commands and log each one separately."""
        # All commands succeed.
        log_f = TemporaryFile(prefix=self.prefix, suffix='.txt')
        obs = _execute_commands(['echo foo', 'echo bar'], log_f, 1,
                                log_individual_cmds=True)
        self.assertEqual(obs[0], True)
        self.assertEqual(len(obs[1]), 2)
        self.assertEqual(obs[1][0][1], 0)
        self.assertEqual(obs[1][1][1], 0)

        exp = ("Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n"
               "Command:\n\necho bar\n\nStdout:\n\nbar\n\nStderr:\n\n\n")
        log_f.seek(0, 0)
        log_obs = log_f.read()
        self.assertEqual(log_obs, exp)

        exp = "Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n"
        log_f = obs[1][0][0]
        log_f.seek(0, 0)
        log_obs = log_f.read()
        self.assertEqual(log_obs, exp)

        exp = "Command:\n\necho bar\n\nStdout:\n\nbar\n\nStderr:\n\n\n"
        log_f = obs[1][1][0]
        log_f.seek(0, 0)
        log_obs = log_f.read()
        self.assertEqual(log_obs, exp)

        # First command fails.
        log_f = TemporaryFile(prefix=self.prefix, suffix='.txt')
        obs = _execute_commands(['foobarbaz', 'echo foo'], log_f, 1,
                                log_individual_cmds=True)
        self.assertEqual(obs[0], False)
        self.assertEqual(len(obs[1]), 2)
        self.assertEqual(obs[1][0][1], 127)
        self.assertEqual(obs[1][1][1], 0)

        exp = ("Command:\n\nfoobarbaz\n\nStdout:\n\n\nStderr:\n\n\n\n"
               "Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n")
        log_f.seek(0, 0)
        log_obs = sub('Stderr:\n\n.*\n\n', 'Stderr:\n\n\n\n',
                             log_f.read())
        self.assertEqual(log_obs, exp)

        exp = ("Command:\n\nfoobarbaz\n\nStdout:\n\n\nStderr:\n\n\n\n")
        log_f = obs[1][0][0]
        log_f.seek(0, 0)
        log_obs = sub('Stderr:\n\n.*\n\n', 'Stderr:\n\n\n\n',
                             log_f.read())
        self.assertEqual(log_obs, exp)

        exp = "Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n"
        log_f = obs[1][1][0]
        log_f.seek(0, 0)
        log_obs = log_f.read()
        self.assertEqual(log_obs, exp)
    def test_execute_commands_stop_on_first_failure(self):
        """Test executing arbitrary commands and stopping on first failure."""
        # All commands succeed.
        exp = (True, [])
        log_f = TemporaryFile(prefix=self.prefix, suffix='.txt')
        obs = _execute_commands(['echo foo', 'echo bar'], log_f, 1, True)
        self.assertEqual(obs, exp)

        exp = ("Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n"
               "Command:\n\necho bar\n\nStdout:\n\nbar\n\nStderr:\n\n\n")
        log_f.seek(0, 0)
        obs = log_f.read()
        self.assertEqual(obs, exp)

        # First command fails.
        exp = (False, [])
        log_f = TemporaryFile(prefix=self.prefix, suffix='.txt')
        obs = _execute_commands(['foobarbaz', 'echo foo'], log_f, 1, True)
        self.assertEqual(obs, exp)

        exp = ("Command:\n\nfoobarbaz\n\nStdout:\n\n\nStderr:\n\n\n\n")
        log_f.seek(0, 0)
        obs = sub('Stderr:\n\n.*\n\n', 'Stderr:\n\n\n\n',
                             log_f.read())
        self.assertEqual(obs, exp)

        # Second command fails.
        exp = (False, [])
        log_f = TemporaryFile(prefix=self.prefix, suffix='.txt')
        obs = _execute_commands(['echo foo', 'foobarbaz'], log_f, 1, True)
        self.assertEqual(obs, exp)

        exp = ("Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n"
               "Command:\n\nfoobarbaz\n\nStdout:\n\n\nStderr:\n\n\n\n")
        log_f.seek(0, 0)
        obs = sub('Stderr:\n\n.*\n\n', 'Stderr:\n\n\n\n',
                             log_f.read())
        self.assertEqual(obs, exp)