mirror of https://github.com/hyperledger/besu
JSON RPC: Add permissioning account "allowlist" methods (#1095)
* add alternate account allowlist RPC endpoints * update rpc names in AT * added changelog entries for whitelist -> allowlist changes Signed-off-by: Sally MacFarlane <sally.macfarlane@consensys.net>pull/1098/head
parent
0fdff649b5
commit
dc4e2a8368
@ -0,0 +1,83 @@ |
||||
/* |
||||
* Copyright ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning; |
||||
|
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonRpcMethod; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; |
||||
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController; |
||||
import org.hyperledger.besu.ethereum.permissioning.AllowlistOperationResult; |
||||
|
||||
import java.util.List; |
||||
import java.util.Optional; |
||||
|
||||
public class PermAddAccountsToAllowlist implements JsonRpcMethod { |
||||
|
||||
private final Optional<AccountLocalConfigPermissioningController> whitelistController; |
||||
|
||||
public PermAddAccountsToAllowlist( |
||||
final Optional<AccountLocalConfigPermissioningController> whitelistController) { |
||||
this.whitelistController = whitelistController; |
||||
} |
||||
|
||||
@Override |
||||
public String getName() { |
||||
return RpcMethod.PERM_ADD_ACCOUNTS_TO_ALLOWLIST.getMethodName(); |
||||
} |
||||
|
||||
@Override |
||||
@SuppressWarnings("unchecked") |
||||
public JsonRpcResponse response(final JsonRpcRequestContext requestContext) { |
||||
final List<String> accountsList = requestContext.getRequiredParameter(0, List.class); |
||||
|
||||
if (whitelistController.isPresent()) { |
||||
final AllowlistOperationResult addResult = |
||||
whitelistController.get().addAccounts(accountsList); |
||||
|
||||
switch (addResult) { |
||||
case ERROR_EMPTY_ENTRY: |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_EMPTY_ENTRY); |
||||
case ERROR_INVALID_ENTRY: |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_INVALID_ENTRY); |
||||
case ERROR_EXISTING_ENTRY: |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_EXISTING_ENTRY); |
||||
case ERROR_DUPLICATED_ENTRY: |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_DUPLICATED_ENTRY); |
||||
case ERROR_WHITELIST_PERSIST_FAIL: |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.WHITELIST_PERSIST_FAILURE); |
||||
case ERROR_WHITELIST_FILE_SYNC: |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.WHITELIST_FILE_SYNC); |
||||
case SUCCESS: |
||||
return new JsonRpcSuccessResponse(requestContext.getRequest().getId()); |
||||
default: |
||||
throw new IllegalStateException( |
||||
"Unmapped result from AccountLocalConfigPermissioningController"); |
||||
} |
||||
} else { |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_NOT_ENABLED); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,52 @@ |
||||
/* |
||||
* Copyright ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning; |
||||
|
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonRpcMethod; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; |
||||
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController; |
||||
|
||||
import java.util.Optional; |
||||
|
||||
public class PermGetAccountsAllowlist implements JsonRpcMethod { |
||||
|
||||
private final Optional<AccountLocalConfigPermissioningController> whitelistController; |
||||
|
||||
public PermGetAccountsAllowlist( |
||||
final Optional<AccountLocalConfigPermissioningController> whitelistController) { |
||||
this.whitelistController = whitelistController; |
||||
} |
||||
|
||||
@Override |
||||
public String getName() { |
||||
return RpcMethod.PERM_GET_ACCOUNTS_ALLOWLIST.getMethodName(); |
||||
} |
||||
|
||||
@Override |
||||
public JsonRpcResponse response(final JsonRpcRequestContext requestContext) { |
||||
if (whitelistController.isPresent()) { |
||||
return new JsonRpcSuccessResponse( |
||||
requestContext.getRequest().getId(), whitelistController.get().getAccountWhitelist()); |
||||
} else { |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_NOT_ENABLED); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,83 @@ |
||||
/* |
||||
* Copyright ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning; |
||||
|
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.RpcMethod; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.JsonRpcMethod; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; |
||||
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController; |
||||
import org.hyperledger.besu.ethereum.permissioning.AllowlistOperationResult; |
||||
|
||||
import java.util.List; |
||||
import java.util.Optional; |
||||
|
||||
@Deprecated |
||||
public class PermRemoveAccountsFromWhitelist implements JsonRpcMethod { |
||||
|
||||
private final Optional<AccountLocalConfigPermissioningController> allowlistController; |
||||
|
||||
public PermRemoveAccountsFromWhitelist( |
||||
final Optional<AccountLocalConfigPermissioningController> allowlistController) { |
||||
this.allowlistController = allowlistController; |
||||
} |
||||
|
||||
@Override |
||||
public String getName() { |
||||
return RpcMethod.PERM_REMOVE_ACCOUNTS_FROM_WHITELIST.getMethodName(); |
||||
} |
||||
|
||||
@Override |
||||
@SuppressWarnings("unchecked") |
||||
public JsonRpcResponse response(final JsonRpcRequestContext requestContext) { |
||||
final List<String> accountsList = requestContext.getRequiredParameter(0, List.class); |
||||
if (allowlistController.isPresent()) { |
||||
final AllowlistOperationResult removeResult = |
||||
allowlistController.get().removeAccounts(accountsList); |
||||
|
||||
switch (removeResult) { |
||||
case ERROR_EMPTY_ENTRY: |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_EMPTY_ENTRY); |
||||
case ERROR_INVALID_ENTRY: |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_INVALID_ENTRY); |
||||
case ERROR_ABSENT_ENTRY: |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_ABSENT_ENTRY); |
||||
case ERROR_DUPLICATED_ENTRY: |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_DUPLICATED_ENTRY); |
||||
case ERROR_WHITELIST_PERSIST_FAIL: |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.WHITELIST_PERSIST_FAILURE); |
||||
case ERROR_WHITELIST_FILE_SYNC: |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.WHITELIST_FILE_SYNC); |
||||
case SUCCESS: |
||||
return new JsonRpcSuccessResponse(requestContext.getRequest().getId()); |
||||
default: |
||||
throw new IllegalStateException( |
||||
"Unmapped result from AccountLocalConfigPermissioningController"); |
||||
} |
||||
} else { |
||||
return new JsonRpcErrorResponse( |
||||
requestContext.getRequest().getId(), JsonRpcError.ACCOUNT_WHITELIST_NOT_ENABLED); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,136 @@ |
||||
/* |
||||
* Copyright ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
import static org.assertj.core.api.Assertions.catchThrowable; |
||||
import static org.mockito.ArgumentMatchers.any; |
||||
import static org.mockito.ArgumentMatchers.eq; |
||||
import static org.mockito.Mockito.when; |
||||
|
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.exception.InvalidJsonRpcParameters; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; |
||||
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController; |
||||
import org.hyperledger.besu.ethereum.permissioning.AllowlistOperationResult; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
import org.junit.runner.RunWith; |
||||
import org.mockito.Mock; |
||||
import org.mockito.junit.MockitoJUnitRunner; |
||||
|
||||
@RunWith(MockitoJUnitRunner.class) |
||||
public class PermAddAccountsToAllowlistTest { |
||||
|
||||
@Mock private AccountLocalConfigPermissioningController accountWhitelist; |
||||
private PermAddAccountsToAllowlist method; |
||||
|
||||
@Before |
||||
public void before() { |
||||
method = new PermAddAccountsToAllowlist(java.util.Optional.of(accountWhitelist)); |
||||
} |
||||
|
||||
@Test |
||||
public void getNameShouldReturnExpectedName() { |
||||
assertThat(method.getName()).isEqualTo("perm_addAccountsToAllowlist"); |
||||
} |
||||
|
||||
@Test |
||||
public void whenAccountsAreAddedToWhitelistShouldReturnSuccess() { |
||||
List<String> accounts = Arrays.asList("0x0", "0x1"); |
||||
JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null); |
||||
when(accountWhitelist.addAccounts(eq(accounts))).thenReturn(AllowlistOperationResult.SUCCESS); |
||||
|
||||
JsonRpcResponse actualResponse = method.response(request(accounts)); |
||||
|
||||
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse); |
||||
} |
||||
|
||||
@Test |
||||
public void whenAccountIsInvalidShouldReturnInvalidAccountErrorResponse() { |
||||
JsonRpcResponse expectedResponse = |
||||
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_INVALID_ENTRY); |
||||
when(accountWhitelist.addAccounts(any())) |
||||
.thenReturn(AllowlistOperationResult.ERROR_INVALID_ENTRY); |
||||
|
||||
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>())); |
||||
|
||||
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse); |
||||
} |
||||
|
||||
@Test |
||||
public void whenAccountExistsShouldReturnExistingEntryErrorResponse() { |
||||
JsonRpcResponse expectedResponse = |
||||
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_EXISTING_ENTRY); |
||||
when(accountWhitelist.addAccounts(any())) |
||||
.thenReturn(AllowlistOperationResult.ERROR_EXISTING_ENTRY); |
||||
|
||||
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>())); |
||||
|
||||
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse); |
||||
} |
||||
|
||||
@Test |
||||
public void whenInputHasDuplicatedAccountsShouldReturnDuplicatedEntryErrorResponse() { |
||||
JsonRpcResponse expectedResponse = |
||||
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_DUPLICATED_ENTRY); |
||||
when(accountWhitelist.addAccounts(any())) |
||||
.thenReturn(AllowlistOperationResult.ERROR_DUPLICATED_ENTRY); |
||||
|
||||
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>())); |
||||
|
||||
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse); |
||||
} |
||||
|
||||
@Test |
||||
public void whenEmptyListOnRequestShouldReturnEmptyEntryErrorResponse() { |
||||
JsonRpcResponse expectedResponse = |
||||
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_EMPTY_ENTRY); |
||||
|
||||
when(accountWhitelist.addAccounts(eq(new ArrayList<>()))) |
||||
.thenReturn(AllowlistOperationResult.ERROR_EMPTY_ENTRY); |
||||
|
||||
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>())); |
||||
|
||||
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse); |
||||
} |
||||
|
||||
@Test |
||||
public void whenEmptyParamOnRequestShouldThrowInvalidJsonRpcException() { |
||||
JsonRpcRequestContext request = |
||||
new JsonRpcRequestContext( |
||||
new JsonRpcRequest("2.0", "perm_addAccountsToAllowlist", new Object[] {})); |
||||
|
||||
final Throwable thrown = catchThrowable(() -> method.response(request)); |
||||
assertThat(thrown) |
||||
.hasNoCause() |
||||
.isInstanceOf(InvalidJsonRpcParameters.class) |
||||
.hasMessage("Missing required json rpc parameter at index 0"); |
||||
} |
||||
|
||||
private JsonRpcRequestContext request(final List<String> accounts) { |
||||
return new JsonRpcRequestContext( |
||||
new JsonRpcRequest("2.0", "perm_addAccountsToAllowlist", new Object[] {accounts})); |
||||
} |
||||
} |
@ -0,0 +1,76 @@ |
||||
/* |
||||
* Copyright ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
import static org.mockito.Mockito.when; |
||||
|
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; |
||||
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
import org.junit.runner.RunWith; |
||||
import org.mockito.Mock; |
||||
import org.mockito.junit.MockitoJUnitRunner; |
||||
|
||||
@RunWith(MockitoJUnitRunner.class) |
||||
public class PermGetAccountsAllowlistTest { |
||||
|
||||
private static final JsonRpcRequestContext request = |
||||
new JsonRpcRequestContext(new JsonRpcRequest("2.0", "perm_getAccountsAllowlist", null)); |
||||
|
||||
@Mock private AccountLocalConfigPermissioningController accountWhitelist; |
||||
private PermGetAccountsAllowlist method; |
||||
|
||||
@Before |
||||
public void before() { |
||||
method = new PermGetAccountsAllowlist(java.util.Optional.of(accountWhitelist)); |
||||
} |
||||
|
||||
@Test |
||||
public void getNameShouldReturnExpectedName() { |
||||
assertThat(method.getName()).isEqualTo("perm_getAccountsAllowlist"); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnExpectedListOfAccountsWhenWhitelistHasBeenSet() { |
||||
List<String> accountsList = Arrays.asList("0x0", "0x1"); |
||||
when(accountWhitelist.getAccountWhitelist()).thenReturn(accountsList); |
||||
JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, accountsList); |
||||
|
||||
JsonRpcResponse actualResponse = method.response(request); |
||||
|
||||
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse); |
||||
} |
||||
|
||||
@Test |
||||
public void shouldReturnEmptyListOfAccountsWhenWhitelistHasBeenSetAndIsEmpty() { |
||||
List<String> emptyAccountsList = new ArrayList<>(); |
||||
when(accountWhitelist.getAccountWhitelist()).thenReturn(emptyAccountsList); |
||||
JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null, emptyAccountsList); |
||||
|
||||
JsonRpcResponse actualResponse = method.response(request); |
||||
|
||||
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse); |
||||
} |
||||
} |
@ -0,0 +1,138 @@ |
||||
/* |
||||
* Copyright ConsenSys AG. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on |
||||
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
* specific language governing permissions and limitations under the License. |
||||
* |
||||
* SPDX-License-Identifier: Apache-2.0 |
||||
*/ |
||||
package org.hyperledger.besu.ethereum.api.jsonrpc.internal.methods.permissioning; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
import static org.assertj.core.api.Assertions.catchThrowable; |
||||
import static org.mockito.ArgumentMatchers.any; |
||||
import static org.mockito.ArgumentMatchers.eq; |
||||
import static org.mockito.Mockito.when; |
||||
|
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequest; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.JsonRpcRequestContext; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.exception.InvalidJsonRpcParameters; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcError; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcErrorResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcResponse; |
||||
import org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse; |
||||
import org.hyperledger.besu.ethereum.permissioning.AccountLocalConfigPermissioningController; |
||||
import org.hyperledger.besu.ethereum.permissioning.AllowlistOperationResult; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
import org.junit.runner.RunWith; |
||||
import org.mockito.Mock; |
||||
import org.mockito.junit.MockitoJUnitRunner; |
||||
|
||||
@Deprecated |
||||
@RunWith(MockitoJUnitRunner.class) |
||||
public class PermRemoveAccountsFromWhitelistTest { |
||||
|
||||
@Mock private AccountLocalConfigPermissioningController accountWhitelist; |
||||
private PermRemoveAccountsFromWhitelist method; |
||||
|
||||
@Before |
||||
public void before() { |
||||
method = new PermRemoveAccountsFromWhitelist(java.util.Optional.of(accountWhitelist)); |
||||
} |
||||
|
||||
@Test |
||||
public void getNameShouldReturnExpectedName() { |
||||
assertThat(method.getName()).isEqualTo("perm_removeAccountsFromWhitelist"); |
||||
} |
||||
|
||||
@Test |
||||
public void whenAccountsAreRemovedFromWhitelistShouldReturnSuccess() { |
||||
List<String> accounts = Arrays.asList("0x0", "0x1"); |
||||
JsonRpcResponse expectedResponse = new JsonRpcSuccessResponse(null); |
||||
when(accountWhitelist.removeAccounts(eq(accounts))) |
||||
.thenReturn(AllowlistOperationResult.SUCCESS); |
||||
|
||||
JsonRpcResponse actualResponse = method.response(request(accounts)); |
||||
|
||||
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse); |
||||
} |
||||
|
||||
@Test |
||||
public void whenAccountIsInvalidShouldReturnInvalidAccountErrorResponse() { |
||||
JsonRpcResponse expectedResponse = |
||||
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_INVALID_ENTRY); |
||||
when(accountWhitelist.removeAccounts(any())) |
||||
.thenReturn(AllowlistOperationResult.ERROR_INVALID_ENTRY); |
||||
|
||||
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>())); |
||||
|
||||
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse); |
||||
} |
||||
|
||||
@Test |
||||
public void whenAccountIsAbsentShouldReturnAbsentAccountErrorResponse() { |
||||
JsonRpcResponse expectedResponse = |
||||
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_ABSENT_ENTRY); |
||||
when(accountWhitelist.removeAccounts(any())) |
||||
.thenReturn(AllowlistOperationResult.ERROR_ABSENT_ENTRY); |
||||
|
||||
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>())); |
||||
|
||||
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse); |
||||
} |
||||
|
||||
@Test |
||||
public void whenInputHasDuplicatedAccountsShouldReturnDuplicatedEntryErrorResponse() { |
||||
JsonRpcResponse expectedResponse = |
||||
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_DUPLICATED_ENTRY); |
||||
when(accountWhitelist.removeAccounts(any())) |
||||
.thenReturn(AllowlistOperationResult.ERROR_DUPLICATED_ENTRY); |
||||
|
||||
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>())); |
||||
|
||||
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse); |
||||
} |
||||
|
||||
@Test |
||||
public void whenEmptyListOnRequestShouldReturnEmptyEntryErrorResponse() { |
||||
JsonRpcResponse expectedResponse = |
||||
new JsonRpcErrorResponse(null, JsonRpcError.ACCOUNT_WHITELIST_EMPTY_ENTRY); |
||||
|
||||
when(accountWhitelist.removeAccounts(eq(new ArrayList<>()))) |
||||
.thenReturn(AllowlistOperationResult.ERROR_EMPTY_ENTRY); |
||||
|
||||
JsonRpcResponse actualResponse = method.response(request(new ArrayList<>())); |
||||
|
||||
assertThat(actualResponse).isEqualToComparingFieldByField(expectedResponse); |
||||
} |
||||
|
||||
@Test |
||||
public void whenEmptyParamOnRequestShouldThrowInvalidJsonRpcException() { |
||||
JsonRpcRequestContext request = |
||||
new JsonRpcRequestContext( |
||||
new JsonRpcRequest("2.0", "perm_removeAccountsFromWhitelist", new Object[] {})); |
||||
|
||||
final Throwable thrown = catchThrowable(() -> method.response(request)); |
||||
assertThat(thrown) |
||||
.hasNoCause() |
||||
.isInstanceOf(InvalidJsonRpcParameters.class) |
||||
.hasMessage("Missing required json rpc parameter at index 0"); |
||||
} |
||||
|
||||
private JsonRpcRequestContext request(final List<String> accounts) { |
||||
return new JsonRpcRequestContext( |
||||
new JsonRpcRequest("2.0", "perm_removeAccountsFromWhitelist", new Object[] {accounts})); |
||||
} |
||||
} |
Loading…
Reference in new issue