Beispiel #1
0
 def test_create_test_module(self, problem: Problem, mocker: MockerFixture,
                             tmp_path: Path) -> None:
     out = tmp_path / "test_problem.py"
     mocker.patch(
         "euler.scraper.Problem.test_module_path",
         new=mocker.PropertyMock(return_value=out),
     )
     problem.create_test_module()
     assert out.is_file()
Beispiel #2
0
async def test_deployment_progress(mocker: MockerFixture, gstate: GlobalState):

    from gravel.controllers.nodes.conn import ConnMgr
    from gravel.controllers.nodes.deployment import (
        DeploymentErrorEnum,
        NodeDeployment,
        ProgressEnum,
    )

    fake_connmgr: ConnMgr = cast(ConnMgr, mocker.MagicMock())
    deployment = NodeDeployment(gstate, fake_connmgr)

    # no bootstrapper, nostage
    assert deployment.progress == 0

    # test actual progress
    deployment.state.mark_bootstrap()
    assert deployment.progress == 0  # no bootstrapper set

    deployment._bootstrapper = mocker.MagicMock()
    assert deployment._bootstrapper is not None

    # we need to do creative mocking for a property that happens to be an
    # attribute on a mock object itself.
    #  https://docs.python.org/3/library/unittest.mock.html#unittest.mock.PropertyMock
    fake_progress = mocker.PropertyMock()
    type(deployment._bootstrapper).progress = fake_progress  # type: ignore

    fake_progress.return_value = 0

    # progress is set at NONE
    assert deployment.progress == 0

    deployment._progress = ProgressEnum.PREPARING
    assert deployment.progress == 25

    deployment._progress = ProgressEnum.PERFORMING
    assert deployment._bootstrapper.progress == 0
    assert deployment.progress == 25
    fake_progress.return_value = 100
    assert deployment._bootstrapper.progress == 100
    assert deployment.progress == 80

    deployment._progress = ProgressEnum.ASSIMILATING
    assert deployment.progress == 90

    deployment._progress = ProgressEnum.DONE
    assert deployment.progress == 100

    # deployed stage
    deployment.state.mark_deployed()
    assert deployment.progress == 100

    # error state
    deployment.state.mark_error(DeploymentErrorEnum.UNKNOWN_ERROR, "foobar")
    assert deployment.progress == 0
    def _setUp(self, request: Any, mocker: MockerFixture) -> None:
        self.mock_fromfd = mocker.patch('socket.fromfd')
        self.mock_selector = mocker.patch('selectors.DefaultSelector')
        self.mock_sign_csr = mocker.patch('proxy.http.proxy.server.sign_csr')
        self.mock_gen_csr = mocker.patch('proxy.http.proxy.server.gen_csr')
        self.mock_gen_public_key = mocker.patch(
            'proxy.http.proxy.server.gen_public_key', )
        self.mock_server_conn = mocker.patch(
            'proxy.http.proxy.server.TcpServerConnection', )
        self.mock_ssl_context = mocker.patch('ssl.create_default_context')
        self.mock_ssl_wrap = mocker.patch('ssl.wrap_socket')

        self.mock_sign_csr.return_value = True
        self.mock_gen_csr.return_value = True
        self.mock_gen_public_key.return_value = True

        self.fileno = 10
        self._addr = ('127.0.0.1', 54382)
        self.flags = FlagParser.initialize(
            ca_cert_file='ca-cert.pem',
            ca_key_file='ca-key.pem',
            ca_signing_key_file='ca-signing-key.pem',
            threaded=True,
        )
        self.plugin = mocker.MagicMock()

        plugin = get_plugin_by_test_name(request.param)

        self.flags.plugins = {
            b'HttpProtocolHandlerPlugin': [HttpProxyPlugin],
            b'HttpProxyBasePlugin': [plugin],
        }
        self._conn = mocker.MagicMock(spec=socket.socket)
        self.mock_fromfd.return_value = self._conn
        self.protocol_handler = HttpProtocolHandler(
            HttpClientConnection(self._conn, self._addr),
            flags=self.flags,
        )
        self.protocol_handler.initialize()

        self.server = self.mock_server_conn.return_value

        self.server_ssl_connection = mocker.MagicMock(spec=ssl.SSLSocket)
        self.mock_ssl_context.return_value.wrap_socket.return_value = self.server_ssl_connection
        self.client_ssl_connection = mocker.MagicMock(spec=ssl.SSLSocket)
        self.mock_ssl_wrap.return_value = self.client_ssl_connection

        def has_buffer() -> bool:
            return cast(bool, self.server.queue.called)

        def closed() -> bool:
            return not self.server.connect.called

        def mock_connection() -> Any:
            if self.mock_ssl_context.return_value.wrap_socket.called:
                return self.server_ssl_connection
            return self._conn

        # Do not mock the original wrap method
        self.server.wrap.side_effect = \
            lambda x, y, as_non_blocking: TcpServerConnection.wrap(
                self.server, x, y, as_non_blocking=as_non_blocking,
            )

        self.server.has_buffer.side_effect = has_buffer
        type(self.server).closed = mocker.PropertyMock(side_effect=closed)
        type(self.server, ).connection = mocker.PropertyMock(
            side_effect=mock_connection, )

        self.mock_selector.return_value.select.side_effect = [
            [(
                selectors.SelectorKey(
                    fileobj=self._conn.fileno(),
                    fd=self._conn.fileno(),
                    events=selectors.EVENT_READ,
                    data=None,
                ),
                selectors.EVENT_READ,
            )],
            [(
                selectors.SelectorKey(
                    fileobj=self.client_ssl_connection.fileno(),
                    fd=self.client_ssl_connection.fileno(),
                    events=selectors.EVENT_READ,
                    data=None,
                ),
                selectors.EVENT_READ,
            )],
            [(
                selectors.SelectorKey(
                    fileobj=self.server_ssl_connection.fileno(),
                    fd=self.server_ssl_connection.fileno(),
                    events=selectors.EVENT_WRITE,
                    data=None,
                ),
                selectors.EVENT_WRITE,
            )],
            [(
                selectors.SelectorKey(
                    fileobj=self.server_ssl_connection.fileno(),
                    fd=self.server_ssl_connection.fileno(),
                    events=selectors.EVENT_READ,
                    data=None,
                ),
                selectors.EVENT_READ,
            )],
        ]

        # Connect
        def send(raw: bytes) -> int:
            return len(raw)

        self._conn.send.side_effect = send
        self._conn.recv.return_value = build_http_request(
            httpMethods.CONNECT,
            b'uni.corn:443',
            no_ua=True,
        )