Exemplo n.º 1
0
    def test_connect_failure_bad_device_ok(self):
        create_ssl_connection = create_autospec(ssl.create_ssl_connection)
        ssl_socket = create_autospec(SSLSocket)
        settings_module = create_autospec(settings)
        settings_module.getb.side_effect = (
            lambda key: {
                b'CONNECTION_SELECT_LIVE_USERNAME': b'foo',
                b'CONNECTION_SELECT_LIVE_PASSWORD': b'bar',
                b'CONNECTION_SELECT_LIVE_DEVICE': b'1234567',
            }[key])
        connection = ConnectionSelectLive(
            create_ssl_connection_function=create_ssl_connection,
            settings_module=settings_module)
        create_ssl_connection.side_effect = [ssl_socket]
        ssl_socket.read.side_effect = [
            b'LOGIN\r\n',
            b'OK\r\n',
            b'WHAT\r\n',
        ]

        with self.assertRaises(ValidationException) as context:
            connection.connect()

        self.assertEqual(
            "Authentication failed, device not accepted, received b'WHAT\\r\\n'",
            context.exception.args[0])
        create_ssl_connection.assert_has_calls([call(b'select.live', 7528)])
        ssl_socket.write.assert_has_calls([])
        ssl_socket.read.assert_has_calls([call(1024), call(1024), call(1024)])
Exemplo n.º 2
0
    def test_connect_success(self):
        create_ssl_connection = create_autospec(ssl.create_ssl_connection)
        ssl_socket = create_autospec(SSLSocket)
        settings_module = create_autospec(settings)
        settings_module.getb.side_effect = (
            lambda key: {
                b'CONNECTION_SELECT_LIVE_USERNAME': b'foo',
                b'CONNECTION_SELECT_LIVE_PASSWORD': b'bar',
                b'CONNECTION_SELECT_LIVE_DEVICE': b'1234567',
            }[key])
        connection = ConnectionSelectLive(
            create_ssl_connection_function=create_ssl_connection,
            settings_module=settings_module)
        create_ssl_connection.side_effect = [ssl_socket]
        ssl_socket.read.side_effect = [
            b'LOGIN\r\n',
            b'OK\r\n',
            b'READY\r\n',
        ]

        connection.connect()

        create_ssl_connection.assert_has_calls([call(b'select.live', 7528)])
        ssl_socket.write.assert_has_calls([
            call(b'USER:foo:bar\r\n'),
            call(b'CONNECT:1234567\r\n'),
        ])
        ssl_socket.read.assert_has_calls([call(1024), call(1024), call(1024)])
Exemplo n.º 3
0
    def test_write_recovers_from_write_failure(self):
        create_ssl_connection = create_autospec(ssl.create_ssl_connection)
        ssl_socket_a = create_autospec(SSLSocket)
        ssl_socket_b = create_autospec(SSLSocket)
        settings_module = create_autospec(settings)
        settings_module.getb.side_effect = (
            lambda key: {
                b'CONNECTION_SELECT_LIVE_USERNAME': b'foo',
                b'CONNECTION_SELECT_LIVE_PASSWORD': b'bar',
                b'CONNECTION_SELECT_LIVE_DEVICE': b'1234567',
            }[key])
        connection = ConnectionSelectLive(
            create_ssl_connection_function=create_ssl_connection,
            settings_module=settings_module)
        create_ssl_connection.side_effect = [ssl_socket_a, ssl_socket_b]
        ssl_socket_a.read.side_effect = [
            b'LOGIN\r\n',
            b'OK\r\n',
            b'READY\r\n',
        ]
        ssl_socket_a.write.side_effect = [
            len(b'USER:foo:bar\r\n'),
            len(b'CONNECT:1234567\r\b'),
            SSLZeroReturnError("TLS/SSL connection has been closed (EOF)"),
        ]
        ssl_socket_b.read.side_effect = [
            b'LOGIN\r\n',
            b'OK\r\n',
            b'READY\r\n',
        ]
        ssl_socket_b.write.side_effect = [
            len(b'USER:foo:bar\r\n'),
            len(b'CONNECT:1234567\r\b'),
            len(b'some-data'),
        ]

        connection.connect()
        written = connection.write(b"some-data")

        self.assertEqual(len(b'some-data'), written)
        create_ssl_connection.assert_has_calls([call(b'select.live', 7528)])
        ssl_socket_a.write.assert_has_calls([
            call(b'USER:foo:bar\r\n'),
            call(b'CONNECT:1234567\r\n'),
            call(b'some-data'),
        ])
        ssl_socket_b.write.assert_has_calls([
            call(b'USER:foo:bar\r\n'),
            call(b'CONNECT:1234567\r\n'),
        ])
        ssl_socket_a.read.assert_has_calls(
            [call(1024), call(1024), call(1024)])
        ssl_socket_b.read.assert_has_calls(
            [call(1024), call(1024), call(1024)])
    def test_connect_bad_device(self):
        create_ssl_connection = create_autospec(ssl.create_ssl_connection)
        ssl_socket = create_autospec(SSLSocket)
        settings_module = create_autospec(settings)
        settings_module.getb.side_effect = (
            lambda key: {
                b'CONNECTION_SELECT_LIVE_USERNAME': b'foo',
                b'CONNECTION_SELECT_LIVE_PASSWORD': b'bar',
                b'CONNECTION_SELECT_LIVE_DEVICE': b'987654',
            }[key])
        connection = ConnectionSelectLive(
            create_ssl_connection_function=create_ssl_connection,
            settings_module=settings_module)
        create_ssl_connection.side_effect = [ssl_socket]
        ssl_socket.read.side_effect = [
            b'LOGIN\r\n',
            b'OK\r\n',
            b'REJECTED\r\n',
            b'DEVICES:1\r\nDEVICE:1234567\r\n',
        ]

        with self.assertRaises(ValidationException) as context:
            connection.connect()

        self.assertEqual(
            "Authentication failed.\n  Device '987654' not accepted\n  Response: 'REJECTED'\n  Available devices: 1234567",
            context.exception.args[0])

        create_ssl_connection.assert_has_calls([call(b'select.live', 7528)])
        ssl_socket.write.assert_has_calls([
            call(b'USER:foo:bar\r\n'),
            call(b'CONNECT:987654\r\n'),
            call(b'LIST DEVICES\r\n'),
        ])
        ssl_socket.read.assert_has_calls(
            [call(1024), call(1024),
             call(1024), call(1024)])