@Test
public void testChangeMemberVotingStatesForAllShards() throws Exception {

    String name = "testChangeMemberVotingStatesForAllShards";
    String moduleShardsConfig = "module-shards-member1-and-2-and-3.conf";
    final MemberNode leaderNode1 = MemberNode.builder(memberNodes).akkaConfig("Member1").testName(name)
            .moduleShardsConfig(moduleShardsConfig).datastoreContextBuilder(
                    DatastoreContext.newBuilder().shardHeartbeatIntervalInMillis(300).shardElectionTimeoutFactor(1))
            .build();
    final MemberNode replicaNode2 = MemberNode.builder(memberNodes).akkaConfig("Member2").testName(name)
            .moduleShardsConfig(moduleShardsConfig).build();
    final MemberNode replicaNode3 = MemberNode.builder(memberNodes).akkaConfig("Member3").testName(name)
            .moduleShardsConfig(moduleShardsConfig).build();
    leaderNode1.configDataStore().waitTillReady();
    leaderNode1.operDataStore().waitTillReady();
    replicaNode3.configDataStore().waitTillReady();
    replicaNode3.operDataStore().waitTillReady();
    verifyRaftPeersPresent(leaderNode1.configDataStore(), "cars", "member-2", "member-3");
    verifyRaftPeersPresent(replicaNode2.configDataStore(), "cars", "member-1", "member-3");
    verifyRaftPeersPresent(replicaNode3.configDataStore(), "cars", "member-1", "member-2");
    // Invoke RPC service on member-3 to change voting status
    ClusterAdminRpcService service3 = new ClusterAdminRpcService(replicaNode3.configDataStore(),
            replicaNode3.operDataStore(), null);
    RpcResult<ChangeMemberVotingStatesForAllShardsOutput> rpcResult = service3.changeMemberVotingStatesForAllShards(
            new ChangeMemberVotingStatesForAllShardsInputBuilder().setMemberVotingState(ImmutableList.of(
                    new MemberVotingStateBuilder().setMemberName("member-2").setVoting(FALSE).build(),
                    new MemberVotingStateBuilder().setMemberName("member-3").setVoting(FALSE).build())).build())
            .get(10, TimeUnit.SECONDS);
    ChangeMemberVotingStatesForAllShardsOutput result = verifySuccessfulRpcResult(rpcResult);
    verifyShardResults(result.getShardResult(), successShardResult("cars", DataStoreType.Config),
            successShardResult("people", DataStoreType.Config),
            successShardResult("cars", DataStoreType.Operational),
            successShardResult("people", DataStoreType.Operational));
    verifyVotingStates(new AbstractDataStore[]{leaderNode1.configDataStore(), leaderNode1.operDataStore(),
            replicaNode2.configDataStore(), replicaNode2.operDataStore(),
            replicaNode3.configDataStore(), replicaNode3.operDataStore()},
            new String[]{"cars", "people"}, new SimpleEntry<>("member-1", TRUE),
            new SimpleEntry<>("member-2", FALSE), new SimpleEntry<>("member-3", FALSE));
}