Ejemplo n.º 1
0
class TestTTY(unittest.TestCase):
    def setUp(self):
        logging.getLogger('jnpr.junos.tty')
        self.terminal = Terminal(user='******',
                                 password='******',
                                 attempts=1)

    def test_login_bad_password_runtimeerror(self):
        self.terminal._badpasswd = 4
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'badpasswd')
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)

    def test_login_bad_password_ConnectAuthError(self):
        self.terminal._badpasswd = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'badpasswd')
        self.terminal.write = MagicMock()
        self.assertRaises(EzErrors.ConnectAuthError,
                          self.terminal._login_state_machine)

    def test_tty_no_login(self):
        self.terminal._badpasswd = 4
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'testing')
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with('<close-session/>')

    @patch('jnpr.junos.transport.tty.sleep')
    @patch('jnpr.junos.transport.tty.logger')
    def test_tty_cli(self, mock_logger, mock_sleep):
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'cli')
        self.terminal._login_state_machine()
        self.assertEqual(self.terminal.state, 4)

    @patch('jnpr.junos.transport.tty.sleep')
    def test_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal._loader = 2
        # self.terminal._login_state_machine = MagicMock()
        self.terminal.read_prompt.side_effect = [(None, 'loader'),
                                                 (None, 'testing')]
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        mock_sleep.assert_called_with(300)

    @patch('jnpr.junos.transport.tty.logger')
    def test_ev_shell(self, mock_logger):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'shell')
        self.terminal._login_state_machine()
        self.assertEqual(self.terminal.state, 4)

    def test_ev_option(self):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'option')
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with("1")
        self.assertEqual(self.terminal.state, 7)
Ejemplo n.º 2
0
class TestTTY(unittest.TestCase):

    def setUp(self):
        logging.getLogger('jnpr.junos.tty')
        self.terminal = Terminal(user='******',
                                 password='******', attempts=1)

    def test_login_bad_password_runtimeerror(self):
        self.terminal._badpasswd = 4
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'badpasswd')
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)

    def test_login_bad_password_ConnectAuthError(self):
        self.terminal._badpasswd = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'badpasswd')
        self.terminal.write = MagicMock()
        self.assertRaises(EzErrors.ConnectAuthError,
                          self.terminal._login_state_machine)

    def test_tty_no_login(self):
        self.terminal._badpasswd = 4
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'testing')
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with('<close-session/>')

    @patch('jnpr.junos.transport.tty.sleep')
    @patch('jnpr.junos.transport.tty.logger')
    def test_tty_cli(self, mock_logger, mock_sleep):
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'cli')
        self.terminal._login_state_machine()
        self.assertEqual(self.terminal.state, 4)

    @patch('jnpr.junos.transport.tty.sleep')
    def test_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal._loader = 2
        # self.terminal._login_state_machine = MagicMock()
        self.terminal.read_prompt.side_effect = [(None, 'loader'),
                                                 (None, 'testing')]
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        mock_sleep.assert_called_with(300)

    @patch('jnpr.junos.transport.tty.logger')
    def test_ev_shell(self, mock_logger):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'shell')
        self.terminal._login_state_machine()
        self.assertEqual(self.terminal.state, 4)

    def test_ev_option(self):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'option')
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with("1")
        self.assertEqual(self.terminal.state, 7)

    def test_tty_ev_already_closed(self):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'already_closed')
        self.assertTrue(self.terminal._logout_state_machine())

    def test_tty_already_logout(self):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, None)
        self.assertTrue(self.terminal._logout_state_machine())

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_login_state_machine_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal._loader = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.side_effect = iter([(None, 'loader'),
                                                      (None, 'hotkey'),
                                                      (None, 'shell')])
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_login_state_machine_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal._loader = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.side_effect = iter([(None, 'loader'),
                                                      (None, 'shell')])
        try:
            self.terminal._login_state_machine()
        except RuntimeError as ex:
            self.assertEqual(str(ex),
                             'probably corrupted image, stuck in loader')

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_login_state_machine_hotkey(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'hotkey')
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.assertEqual(self.terminal.state, 8)  # 8 is for hot keys

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_ev_tty_nologin(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, None)
        self.terminal.console_has_banner = True
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with('\n')

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_logout_state_machine_attempt_10(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'cli')
        try:
            self.terminal._logout_state_machine()
        except RuntimeError as ex:
            self.assertEqual(str(ex),
                             'logout_sm_failure')
Ejemplo n.º 3
0
class TestTTY(unittest.TestCase):

    def setUp(self):
        logging.getLogger('jnpr.junos.tty')
        self.terminal = Terminal(user='******',
                                 password='******', attempts=1)

    def test_login_bad_password_runtimeerror(self):
        self.terminal._badpasswd = 4
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'badpasswd')
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)

    def test_login_bad_password_ConnectAuthError(self):
        self.terminal._badpasswd = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'badpasswd')
        self.terminal.write = MagicMock()
        self.assertRaises(EzErrors.ConnectAuthError,
                          self.terminal._login_state_machine)

    def test_tty_no_login(self):
        self.terminal._badpasswd = 4
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'testing')
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with('<close-session/>')

    @patch('jnpr.junos.transport.tty.sleep')
    @patch('jnpr.junos.transport.tty.logger')
    def test_tty_cli(self, mock_logger, mock_sleep):
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'cli')
        self.terminal._login_state_machine()
        self.assertEqual(self.terminal.state, 4)

    @patch('jnpr.junos.transport.tty.sleep')
    def test_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal._loader = 2
        # self.terminal._login_state_machine = MagicMock()
        self.terminal.read_prompt.side_effect = [(None, 'loader'),
                                                 (None, 'testing')]
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        mock_sleep.assert_called_with(300)

    @patch('jnpr.junos.transport.tty.logger')
    def test_ev_shell(self, mock_logger):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'shell')
        self.terminal._login_state_machine()
        self.assertEqual(self.terminal.state, 4)

    def test_ev_option(self):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'option')
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with("1")
        self.assertEqual(self.terminal.state, 7)
Ejemplo n.º 4
0
class TestTTY(unittest.TestCase):
    def setUp(self):
        logging.getLogger("jnpr.junos.tty")
        self.terminal = Terminal(user="******",
                                 password="******",
                                 attempts=1)

    def test_login_bad_password_runtimeerror(self):
        self.terminal._badpasswd = 4
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "badpasswd")
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)

    def test_login_bad_password_ConnectAuthError(self):
        self.terminal._badpasswd = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "badpasswd")
        self.terminal.write = MagicMock()
        self.assertRaises(EzErrors.ConnectAuthError,
                          self.terminal._login_state_machine)

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_no_login(self, mock_sleep):
        self.terminal._badpasswd = 4
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "testing")
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with("\n")
        self.terminal.read_prompt.return_value = (None, "testing")
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with("<close-session/>")

    @patch("jnpr.junos.transport.tty.sleep")
    @patch("jnpr.junos.transport.tty.logger")
    def test_tty_cli(self, mock_logger, mock_sleep):
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "cli")
        self.terminal._login_state_machine()
        self.assertEqual(self.terminal.state, 4)

    @patch("jnpr.junos.transport.tty.sleep")
    def test_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal._loader = 2
        # self.terminal._login_state_machine = MagicMock()
        self.terminal.read_prompt.side_effect = [(None, "loader"),
                                                 (None, "testing")]
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        mock_sleep.assert_called_with(300)

    @patch("jnpr.junos.transport.tty.logger")
    def test_ev_shell(self, mock_logger):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "shell")
        self.terminal._login_state_machine()
        self.assertEqual(self.terminal.state, 4)

    @patch("jnpr.junos.transport.tty.sleep")
    def test_ev_option(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "option")
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with("1")
        self.assertEqual(self.terminal.state, 7)

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_ev_netconf_closed(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal._tty_close = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.side_effect = iter([(None, "netconf_closed"),
                                                      (None, "shell"),
                                                      (None, "login")])
        self.assertTrue(self.terminal._logout_state_machine())

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_already_logout(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, None)
        self.assertTrue(self.terminal._logout_state_machine())

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_login_state_machine_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal._loader = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.side_effect = iter([(None, "loader"),
                                                      (None, "hotkey"),
                                                      (None, "shell")])
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_login_state_machine_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal._loader = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.side_effect = iter([(None, "loader"),
                                                      (None, "shell")])
        try:
            self.terminal._login_state_machine()
        except RuntimeError as ex:
            self.assertEqual(str(ex),
                             "probably corrupted image, stuck in loader")

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_login_state_machine_hotkey(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "hotkey")
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.assertEqual(self.terminal.state, 8)  # 8 is for hot keys

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_ev_tty_nologin(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, None)
        self.terminal.console_has_banner = True
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with("\n")

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_logout_state_machine_attempt_10(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "cli")
        try:
            self.terminal._logout_state_machine()
        except RuntimeError as ex:
            self.assertEqual(str(ex), "logout_sm_failure")
Ejemplo n.º 5
0
class TestTTY(unittest.TestCase):
    def setUp(self):
        logging.getLogger("jnpr.junos.tty")
        self.terminal = Terminal(user="******", password="******", attempts=1)

    def test_login_bad_password_runtimeerror(self):
        self.terminal._badpasswd = 4
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "badpasswd")
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)

    def test_login_bad_password_ConnectAuthError(self):
        self.terminal._badpasswd = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "badpasswd")
        self.terminal.write = MagicMock()
        self.assertRaises(EzErrors.ConnectAuthError, self.terminal._login_state_machine)

    def test_tty_no_login(self):
        self.terminal._badpasswd = 4
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "testing")
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with("<close-session/>")

    @patch("jnpr.junos.transport.tty.sleep")
    @patch("jnpr.junos.transport.tty.logger")
    def test_tty_cli(self, mock_logger, mock_sleep):
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "cli")
        self.terminal._login_state_machine()
        self.assertEqual(self.terminal.state, 4)

    @patch("jnpr.junos.transport.tty.sleep")
    def test_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal._loader = 2
        # self.terminal._login_state_machine = MagicMock()
        self.terminal.read_prompt.side_effect = [(None, "loader"), (None, "testing")]
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        mock_sleep.assert_called_with(300)

    @patch("jnpr.junos.transport.tty.logger")
    def test_ev_shell(self, mock_logger):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "shell")
        self.terminal._login_state_machine()
        self.assertEqual(self.terminal.state, 4)

    def test_ev_option(self):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "option")
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with("1")
        self.assertEqual(self.terminal.state, 7)

    def test_tty_ev_already_closed(self):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "already_closed")
        self.assertTrue(self.terminal._logout_state_machine())

    def test_tty_already_logout(self):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, None)
        self.assertTrue(self.terminal._logout_state_machine())

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_login_state_machine_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal._loader = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.side_effect = iter([(None, "loader"), (None, "hotkey"), (None, "shell")])
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_login_state_machine_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal._loader = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.side_effect = iter([(None, "loader"), (None, "shell")])
        try:
            self.terminal._login_state_machine()
        except RuntimeError as ex:
            self.assertEqual(str(ex), "probably corrupted image, stuck in loader")

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_login_state_machine_hotkey(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "hotkey")
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.assertEqual(self.terminal.state, 8)  # 8 is for hot keys

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_ev_tty_nologin(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, None)
        self.terminal.console_has_banner = True
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with("\n")

    @patch("jnpr.junos.transport.tty.sleep")
    def test_tty_logout_state_machine_attempt_10(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, "cli")
        try:
            self.terminal._logout_state_machine()
        except RuntimeError as ex:
            self.assertEqual(str(ex), "logout_sm_failure")
Ejemplo n.º 6
0
class TestTTY(unittest.TestCase):

    def setUp(self):
        logging.getLogger('jnpr.junos.tty')
        self.terminal = Terminal(user='******',
                                 password='******', attempts=1)

    def test_login_bad_password_runtimeerror(self):
        self.terminal._badpasswd = 4
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'badpasswd')
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)

    def test_login_bad_password_ConnectAuthError(self):
        self.terminal._badpasswd = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'badpasswd')
        self.terminal.write = MagicMock()
        self.assertRaises(EzErrors.ConnectAuthError,
                          self.terminal._login_state_machine)

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_no_login(self, mock_sleep):
        self.terminal._badpasswd = 4
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'testing')
        self.terminal.write = MagicMock()
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with('<close-session/>')

    @patch('jnpr.junos.transport.tty.sleep')
    @patch('jnpr.junos.transport.tty.logger')
    def test_tty_cli(self, mock_logger, mock_sleep):
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'cli')
        self.terminal._login_state_machine()
        self.assertEqual(self.terminal.state, 4)

    @patch('jnpr.junos.transport.tty.sleep')
    def test_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal._loader = 2
        # self.terminal._login_state_machine = MagicMock()
        self.terminal.read_prompt.side_effect = [(None, 'loader'),
                                                 (None, 'testing')]
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        mock_sleep.assert_called_with(300)

    @patch('jnpr.junos.transport.tty.logger')
    def test_ev_shell(self, mock_logger):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'shell')
        self.terminal._login_state_machine()
        self.assertEqual(self.terminal.state, 4)

    @patch('jnpr.junos.transport.tty.sleep')
    def test_ev_option(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'option')
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with("1")
        self.assertEqual(self.terminal.state, 7)

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_ev_netconf_closed(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal._tty_close = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.side_effect = iter([(None, 'netconf_closed'),
                                                      (None, 'shell'),
                                                      (None, 'login')])
        self.assertTrue(self.terminal._logout_state_machine())

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_already_logout(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, None)
        self.assertTrue(self.terminal._logout_state_machine())

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_login_state_machine_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal._loader = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.side_effect = iter([(None, 'loader'),
                                                      (None, 'hotkey'),
                                                      (None, 'shell')])
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_login_state_machine_loader(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal._loader = 1
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.side_effect = iter([(None, 'loader'),
                                                      (None, 'shell')])
        try:
            self.terminal._login_state_machine()
        except RuntimeError as ex:
            self.assertEqual(str(ex),
                             'probably corrupted image, stuck in loader')

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_login_state_machine_hotkey(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'hotkey')
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.assertEqual(self.terminal.state, 8)  # 8 is for hot keys

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_ev_tty_nologin(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, None)
        self.terminal.console_has_banner = True
        self.assertRaises(RuntimeError, self.terminal._login_state_machine)
        self.terminal.write.assert_called_with('\n')

    @patch('jnpr.junos.transport.tty.sleep')
    def test_tty_logout_state_machine_attempt_10(self, mock_sleep):
        self.terminal.write = MagicMock()
        self.terminal.read_prompt = MagicMock()
        self.terminal.read_prompt.return_value = (None, 'cli')
        try:
            self.terminal._logout_state_machine()
        except RuntimeError as ex:
            self.assertEqual(str(ex),
                             'logout_sm_failure')