@Override
    public CompletableFuture<ClusterInfo> getBrokerClusterInfo(String address, long timeoutMillis) {
        CompletableFuture<ClusterInfo> future = new CompletableFuture<>();
        RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.GET_BROKER_CLUSTER_INFO, null);
        remotingClient.invoke(address, request, timeoutMillis).thenAccept(response -> {
            if (response.getCode() == ResponseCode.SUCCESS) {
                ClusterInfo clusterInfo = ClusterInfo.decode(response.getBody(), ClusterInfo.class);
                future.complete(clusterInfo);
            } else {
                log.warn("getBrokerClusterInfo getResponseCommand failed, {} {}", response.getCode(), response.getRemark());
                future.completeExceptionally(new MQClientException(response.getCode(), response.getRemark()));
            }
        });
        return future;
    }
@Test
    public void assertGetBrokerClusterInfoWithError() {
        setResponseError();
        CompletableFuture<ClusterInfo> actual = mqClientAdminImpl.getBrokerClusterInfo(defaultBrokerAddr, defaultTimeout);
        Throwable thrown = assertThrows(ExecutionException.class, actual::get);
        assertTrue(thrown.getCause() instanceof MQClientException);
        MQClientException mqException = (MQClientException) thrown.getCause();
        assertEquals(ResponseCode.SYSTEM_ERROR, mqException.getResponseCode());
        assertTrue(mqException.getMessage().contains("CODE: 1  DESC: null"));
    }