// Path: src/main/java/com/behase/relumin/exception/InvalidParameterException.java
// public class InvalidParameterException extends ApiException {
//     private static final long serialVersionUID = -6416726302671334601L;
// 
//     public InvalidParameterException(String message) {
//         super(Constants.ERR_CODE_INVALID_PARAMETER, String.format("Invalid parameter. %s", message), HttpStatus.BAD_REQUEST);
//     }
// }
// 
// Path: src/main/java/com/behase/relumin/model/ClusterNode.java
// @Data
// @Builder
// @NoArgsConstructor
// @AllArgsConstructor
// public class ClusterNode {
//     private String nodeId;
//     private String hostAndPort;
//     private Set<String> flags = Sets.newLinkedHashSet();
//     private String masterNodeId;
//     private long pingSent;
//     private long pongReceived;
//     private long configEpoch;
//     private boolean connect;
//     private Map<Integer, String> migrating = Maps.newLinkedHashMap();
//     private Map<Integer, String> importing = Maps.newLinkedHashMap();
// 
//     @JsonIgnore
//     private Set<Integer> servedSlotsSet = Sets.newTreeSet();
// 
//     public boolean hasFlag(String flag) {
//         if (flags == null || flags.isEmpty()) {
//             return false;
//         }
//         return flags.contains(flag);
//     }
// 
//     public String getServedSlots() {
//         return new JedisSupport().slotsDisplay(servedSlotsSet);
//     }
// 
//     public int getSlotCount() {
//         if (servedSlotsSet == null) {
//             return 0;
//         }
//         return servedSlotsSet.size();
//     }
// 
//     @JsonIgnore
//     public String getHost() {
//         return StringUtils.split(hostAndPort, ":")[0];
//     }
// 
//     @JsonIgnore
//     public int getPort() {
//         return Integer.valueOf(StringUtils.split(hostAndPort, ":")[1]);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (obj == null) {
//             return false;
//         }
//         if (getClass() != obj.getClass()) {
//             return false;
//         }
// 
//         ClusterNode other = (ClusterNode) obj;
//         return StringUtils.equalsIgnoreCase(nodeId, other.nodeId);
//     }
// }


import com.behase.relumin.exception.InvalidParameterException;
import com.behase.relumin.model.ClusterNode;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.internal.util.reflection.Whitebox;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.boot.test.OutputCapture;
import redis.clients.jedis.Jedis;
import java.util.List;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.Matchers.not;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.*;
        List<ClusterNode> nodes = Lists.newArrayList(
                ClusterNode.builder()
                        .nodeId("nodeId1")
                        .hostAndPort("localhost:10000")
                        .flags(Sets.newHashSet("myself"))
                        .build(),
                ClusterNode.builder()
                        .nodeId("nodeId2")
                        .hostAndPort("localhost:10001")
                        .flags(Sets.newHashSet())
                        .build()
        );

        initConnect();
        doReturn(nodes).when(jedisSupport).parseClusterNodesResult(anyString(), anyString());
        doReturn(ImmutableMap.of("cluster_state", "ok")).when(jedisSupport).parseClusterInfoResult(anyString());

        // when
        tested.loadInfo(true);

        // then
        assertThat(tested.getNodeInfo().getNodeId(), is("nodeId1"));
        assertThat(tested.getFriends().get(0).getNodeId(), is("nodeId2"));
        assertThat(tested.getClusterInfo(), hasEntry("cluster_state", "ok"));
    }

    @Test
    public void loadInfo_getFriends_false() {
        // given
        List<ClusterNode> nodes = Lists.newArrayList(
// Path: src/main/java/com/behase/relumin/exception/InvalidParameterException.java
// public class InvalidParameterException extends ApiException {
//     private static final long serialVersionUID = -6416726302671334601L;
// 
//     public InvalidParameterException(String message) {
//         super(Constants.ERR_CODE_INVALID_PARAMETER, String.format("Invalid parameter. %s", message), HttpStatus.BAD_REQUEST);
//     }
// }
// 
// Path: src/main/java/com/behase/relumin/model/ClusterNode.java
// @Data
// @Builder
// @NoArgsConstructor
// @AllArgsConstructor
// public class ClusterNode {
//     private String nodeId;
//     private String hostAndPort;
//     private Set<String> flags = Sets.newLinkedHashSet();
//     private String masterNodeId;
//     private long pingSent;
//     private long pongReceived;
//     private long configEpoch;
//     private boolean connect;
//     private Map<Integer, String> migrating = Maps.newLinkedHashMap();
//     private Map<Integer, String> importing = Maps.newLinkedHashMap();
// 
//     @JsonIgnore
//     private Set<Integer> servedSlotsSet = Sets.newTreeSet();
// 
//     public boolean hasFlag(String flag) {
//         if (flags == null || flags.isEmpty()) {
//             return false;
//         }
//         return flags.contains(flag);
//     }
// 
//     public String getServedSlots() {
//         return new JedisSupport().slotsDisplay(servedSlotsSet);
//     }
// 
//     public int getSlotCount() {
//         if (servedSlotsSet == null) {
//             return 0;
//         }
//         return servedSlotsSet.size();
//     }
// 
//     @JsonIgnore
//     public String getHost() {
//         return StringUtils.split(hostAndPort, ":")[0];
//     }
// 
//     @JsonIgnore
//     public int getPort() {
//         return Integer.valueOf(StringUtils.split(hostAndPort, ":")[1]);
//     }
// 
//     @Override
//     public boolean equals(Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (obj == null) {
//             return false;
//         }
//         if (getClass() != obj.getClass()) {
//             return false;
//         }
// 
//         ClusterNode other = (ClusterNode) obj;
//         return StringUtils.equalsIgnoreCase(nodeId, other.nodeId);
//     }
// }


// Path: src/test/java/com/behase/relumin/support/TribClusterNodeTest.java
import com.behase.relumin.exception.InvalidParameterException;
import com.behase.relumin.model.ClusterNode;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.internal.util.reflection.Whitebox;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.boot.test.OutputCapture;
import redis.clients.jedis.Jedis;
import java.util.List;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.Matchers.not;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.*;

        List<ClusterNode> nodes = Lists.newArrayList(
                ClusterNode.builder()
                        .nodeId("nodeId1")
                        .hostAndPort("localhost:10000")
                        .flags(Sets.newHashSet("myself"))
                        .build(),
                ClusterNode.builder()
                        .nodeId("nodeId2")
                        .hostAndPort("localhost:10001")
                        .flags(Sets.newHashSet())
                        .build()
        );

        initConnect();
        doReturn(nodes).when(jedisSupport).parseClusterNodesResult(anyString(), anyString());
        doReturn(ImmutableMap.of("cluster_state", "ok")).when(jedisSupport).parseClusterInfoResult(anyString());

        // when
        tested.loadInfo(true);

        // then
        assertThat(tested.getNodeInfo().getNodeId(), is("nodeId1"));
        assertThat(tested.getFriends().get(0).getNodeId(), is("nodeId2"));
        assertThat(tested.getClusterInfo(), hasEntry("cluster_state", "ok"));
    }

    @Test
    public void loadInfo_getFriends_false() {
        // given
        List<ClusterNode> nodes = Lists.newArrayList(
                ClusterNode.builder()