def test_execute_commands_and_build_email_test_suite_timeout(self):
        """Test functions correctly when a test suite timeout occurs."""
        obs = _execute_commands_and_build_email(
            [['Test1', 'echo foo'], ['Test2', 'sleep 65 && echo bar']],
            ['echo setting up'],
            ['echo foo', 'sleep 65 && echo bar'],
            ['echo tearing down'],
            1, 1, 1, 'test-cluster-tag')
        self.assertEqual(obs[0], 'Test1: Pass\n\nThe maximum allowable time '
        'of 1 minutes for all test suites to run was exceeded. The following '
        'test suites were not tested: Test2\n\n')

        self.assertEqual(len(obs[1]), 2)
        name, log_f = obs[1][0]
        self.assertEqual(name, 'automated_testing_log.txt')
        self.assertEqual(log_f.read(),
            "Command:\n\necho setting up\n\nStdout:\n\nsetting up\n\n"
            "Stderr:\n\n\n"
            "Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n"
            "Command:\n\necho tearing down\n\nStdout:\n\ntearing down\n\n"
            "Stderr:\n\n\n")

        name, log_f = obs[1][1]
        self.assertEqual(name, 'Test1_results.txt')
        self.assertEqual(log_f.read(),
            "Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n")
    def test_execute_commands_and_build_email_teardown_timeout(self):
        """Test functions correctly when a teardown timeout occurs."""
        obs = _execute_commands_and_build_email(
            [['Test1', 'echo foo']],
            ['echo setting up'],
            ['echo foo'],
            ['echo tearing down && sleep 65'],
            1, 1, 1, 'test-cluster-tag')
        self.assertEqual(obs[0], "Test1: Pass\n\nThe maximum allowable "
        "cluster termination time of 1 minutes was exceeded.\n\nIMPORTANT: "
        "You should check that the cluster labelled with the tag "
        "'test-cluster-tag' was properly terminated. If not, you should "
        "manually terminate it.\n\n")

        self.assertEqual(len(obs[1]), 2)
        name, log_f = obs[1][0]
        self.assertEqual(name, 'automated_testing_log.txt')
        self.assertEqual(log_f.read(),
            "Command:\n\necho setting up\n\nStdout:\n\nsetting up\n\n"
            "Stderr:\n\n\n"
            "Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n")

        name, log_f = obs[1][1]
        self.assertEqual(name, 'Test1_results.txt')
        self.assertEqual(log_f.read(),
            "Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n")
    def test_execute_commands_and_build_email_failures(self):
        """Test functions correctly when a test suite fails."""
        obs = _execute_commands_and_build_email(
            [['Test1', 'foobarbaz']],
            ['echo setting up'],
            ['foobarbaz'],
            ['echo tearing down'],
            1, 1, 1, 'test-cluster-tag')
        self.assertEqual(obs[0], 'Test1: Fail\n\n')

        self.assertEqual(len(obs[1]), 2)
        name, log_f = obs[1][0]
        self.assertEqual(name, 'automated_testing_log.txt')

        # We can't directly test the error message returned by /bin/sh because
        # this will differ between platforms (tested on Mac OS X and Ubuntu).
        # So strip out the error message, but keep everything else.
        self.assertEqual(sub('Stderr:\n\n.*\n\n', 'Stderr:\n\n\n\n',
                             log_f.read()),
            "Command:\n\necho setting up\n\nStdout:\n\nsetting up\n\n"
            "Stderr:\n\n\n"
            "Command:\n\nfoobarbaz\n\nStdout:\n\n\nStderr:\n\n\n\n"
            "Command:\n\necho tearing down\n\nStdout:\n\ntearing down\n\n"
            "Stderr:\n\n\n")

        name, log_f = obs[1][1]
        self.assertEqual(name, 'Test1_results.txt')
        self.assertEqual(sub('Stderr:\n\n.*\n\n', 'Stderr:\n\n\n\n',
                             log_f.read()),
            "Command:\n\nfoobarbaz\n\nStdout:\n\n\nStderr:\n\n\n\n")
    def test_execute_commands_and_build_email(self):
        """Test functions correctly using standard, valid input."""
        obs = _execute_commands_and_build_email(
            [['Test1', 'echo foo'], ['Test2', 'echo bar']],
            ['echo setting up', 'echo ...'],
            ['echo foo', 'echo bar'],
            ['echo tearing down', 'echo ...'],
            1, 1, 1, 'test-cluster-tag')
        self.assertEqual(obs[0], 'Test1: Pass\nTest2: Pass\n\n')

        self.assertEqual(len(obs[1]), 3)
        name, log_f = obs[1][0]
        self.assertEqual(name, 'automated_testing_log.txt')
        self.assertEqual(log_f.read(),
            "Command:\n\necho setting up\n\nStdout:\n\nsetting up\n\n"
            "Stderr:\n\n\n"
            "Command:\n\necho ...\n\nStdout:\n\n...\n\nStderr:\n\n\n"
            "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"
            "Command:\n\necho tearing down\n\nStdout:\n\ntearing down\n\n"
            "Stderr:\n\n\n"
            "Command:\n\necho ...\n\nStdout:\n\n...\n\nStderr:\n\n\n")

        name, log_f = obs[1][1]
        self.assertEqual(name, 'Test1_results.txt')
        self.assertEqual(log_f.read(),
            "Command:\n\necho foo\n\nStdout:\n\nfoo\n\nStderr:\n\n\n")

        name, log_f = obs[1][2]
        self.assertEqual(name, 'Test2_results.txt')
        self.assertEqual(log_f.read(),
            "Command:\n\necho bar\n\nStdout:\n\nbar\n\nStderr:\n\n\n")
    def test_execute_commands_and_build_email_setup_timeout(self):
        """Test functions correctly when a setup timeout occurs."""
        obs = _execute_commands_and_build_email(
            [['Test1', 'echo foo']],
            ['echo setting up && sleep 65'],
            ['echo foo'],
            ['echo tearing down'],
            1, 1, 1, 'test-cluster-tag')
        self.assertEqual(obs[0], 'The maximum allowable cluster setup time of '
        '1 minutes was exceeded.\n\n')

        self.assertEqual(len(obs[1]), 1)
        name, log_f = obs[1][0]
        self.assertEqual(name, 'automated_testing_log.txt')
        self.assertEqual(log_f.read(),
            "Command:\n\necho tearing down\n\nStdout:\n\ntearing down\n\n"
            "Stderr:\n\n\n")
    def test_execute_commands_and_build_email_setup_failure(self):
        """Test functions correctly when a setup command fails."""
        obs = _execute_commands_and_build_email(
            [['Test1', 'echo foo']],
            ['foobarbaz', 'echo setting up'],
            ['echo foo'],
            ['echo tearing down'],
            1, 1, 1, 'test-cluster-tag')
        self.assertEqual(obs[0], 'There were problems in starting the remote '
        'cluster while preparing to execute the test suite(s). Please check '
        'the attached log for more details.\n\n')

        self.assertEqual(len(obs[1]), 1)
        name, log_f = obs[1][0]
        self.assertEqual(name, 'automated_testing_log.txt')
        self.assertEqual(sub('Stderr:\n\n.*\n\n', 'Stderr:\n\n\n\n',
                             log_f.read()),
            "Command:\n\nfoobarbaz\n\nStdout:\n\n\nStderr:\n\n\n\n"
            "Command:\n\necho tearing down\n\nStdout:\n\ntearing down\n\n"
            "Stderr:\n\n\n")
    def test_execute_commands_and_build_email_teardown_failure(self):
        """Test functions correctly when a teardown command fails."""
        obs = _execute_commands_and_build_email(
            [['Test1', 'echo foo']],
            ['foobarbaz', 'echo setting up'],
            ['echo foo'],
            ['foobarbaz'],
            1, 1, 1, 'test-cluster-tag')
        self.assertEqual(obs[0], "There were problems in starting the remote "
        "cluster while preparing to execute the test suite(s). Please check "
        "the attached log for more details.\n\nThere were problems in "
        "terminating the remote cluster. Please check the attached log for "
        "more details.\n\nIMPORTANT: You should check that the cluster "
        "labelled with the tag 'test-cluster-tag' was properly terminated. If "
        "not, you should manually terminate it.\n\n")

        self.assertEqual(len(obs[1]), 1)
        name, log_f = obs[1][0]
        self.assertEqual(name, 'automated_testing_log.txt')
        self.assertEqual(sub('Stderr:\n\n.*\n\n', 'Stderr:\n\n\n\n',
                             log_f.read()),
            "Command:\n\nfoobarbaz\n\nStdout:\n\n\nStderr:\n\n\n\n"
            "Command:\n\nfoobarbaz\n\nStdout:\n\n\nStderr:\n\n\n\n")