// Path: src/main/java/com/officedrop/redis/failover/jedis/GenericJedisClientFactory.java
// public class GenericJedisClientFactory implements JedisClientFactory {
// 
//     public static final GenericJedisClientFactory INSTANCE = new GenericJedisClientFactory();
// 
//     @Override
//     public JedisClient create(final HostConfiguration configuration) {
//         return new GenericJedisClient(
//                 configuration.getHost(),
//                 configuration.getPort(),
//                 configuration.getTimeout(),
//                 configuration.getDatabase()
//                 );
//     }
// 
// }
// 
// Path: src/test/java/com/officedrop/redis/failover/redis/RedisServer.java
// public class RedisServer implements Closeable {
// 
//     private static final AtomicInteger PORT = new AtomicInteger(10000);
//     private static final Logger log = LoggerFactory.getLogger(RedisServer.class);
// 
//     private final String address;
//     private final int port;
//     private final ServerSocket server;
//     private final ConcurrentMap<String, String> map = new ConcurrentHashMap<String, String>();
//     private String masterHost;
//     private String masterPort;
//     private volatile boolean running;
//     private boolean alwaysTimeout;
//     private final List<RedisClientHandler> handlers = new CopyOnWriteArrayList<RedisClientHandler>();
// 
//     public RedisServer(String address, int port) {
//         try {
//             this.address = address;
//             this.port = port;
//             this.server = new ServerSocket();
//             this.server.bind(new InetSocketAddress(address, port));
//         } catch (Exception e) {
//             throw new IllegalStateException(e);
//         }
//     }
// 
//     public void set(String key, String value) {
//         this.map.put(key, value);
//     }
// 
//     public String get(String key) {
//         return this.map.get(key);
//     }
// 
//     public boolean isAlwaysTimeout() {
//         return this.alwaysTimeout;
//     }
// 
//     public String getAddress() {
//         return this.address;
//     }
// 
//     public int getPort() {
//         return this.port;
//     }
// 
//     public void setAlwaysTimeout(boolean value) {
//         this.alwaysTimeout = value;
//     }
// 
//     public String getMasterHost() {
//         return masterHost;
//     }
// 
//     public void setMasterHost(final String masterHost) {
//         this.masterHost = masterHost;
//     }
// 
//     public String getMasterPort() {
//         return masterPort;
//     }
// 
//     public void setMasterPort(final String masterPort) {
//         this.masterPort = masterPort;
//     }
// 
//     public void setMasterPort(final int masterPort) {
//         this.masterPort = String.valueOf(masterPort);
//     }
// 
//     public void start() {
// 
//         this.running = true;
// 
//         log.info("started server - {}:{}", this.getAddress(), this.getPort());
// 
//         Thread acceptor = new Thread(new Runnable() {
//             @Override
//             public void run() {
// 
//                 while (isRunning()) {
//                     try {
//                         final Socket socket = getServer().accept();
// 
//                         log.info("Accepted client {}:{}", socket.getInetAddress(), getPort());
// 
//                         RedisClientHandler handler = new RedisClientHandler(RedisServer.this, socket);
// 
//                         handlers.add(handler);
// 
//                         handler.start();
// 
//                     } catch (Exception e) {
//                         log.error("Failed to accept socket connection", e);
//                     }
//                 }
// 
//             }
//         });
// 
//         acceptor.start();
// 
//     }
// 
//     public ServerSocket getServer() {
//         return this.server;
//     }
// 
//     public boolean isRunning() {
//         return this.running;
//     }
// 
//     public void close() {
//         this.stop();
//     }
// 
//     public void stop() {
//         if (this.running) {
//             this.running = false;
//             try {
//                 getServer().close();
//             } catch (Exception e) {
//                 log.error("Failed to close socket server", e);
//                 throw new IllegalStateException(e);
//             }
//         }
//     }
// 
//     public HostConfiguration getHostConfiguration() {
//         return new HostConfiguration(this.address, this.port);
//     }
// 
//     public HostConfiguration getMasterConfiguration() {
//         return new HostConfiguration( this.masterHost, Integer.valueOf(this.masterPort) );
//     }
// 
//     public static void withServer(Action1<RedisServer> action) {
//         RedisServer server = new RedisServer("localhost", PORT.incrementAndGet());
// 
//         server.start();
// 
//         try {
//             action.apply(server);
//         } finally {
//             server.stop();
//         }
//     }
// 
// 
// }
// 
// Path: src/main/java/com/officedrop/redis/failover/utils/Action1.java
// public interface Action1<T> {
// 
//     public void apply(T parameter);
// 
// }
// 
// Path: src/test/java/com/officedrop/redis/failover/utils/ThreadPool.java
// public class ThreadPool {
// 
//     public static final ExecutorService POOL = Executors.newCachedThreadPool();
// 
//     public static void submit( Runnable r ) {
//         POOL.submit(r);
//     }
// 
// }


import com.officedrop.redis.failover.jedis.GenericJedisClientFactory;
import com.officedrop.redis.failover.redis.RedisServer;
import com.officedrop.redis.failover.utils.Action1;
import com.officedrop.redis.failover.utils.ThreadPool;
import junit.framework.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;
package com.officedrop.redis.failover;



/**
 * User: Maurício Linhares
 * Date: 1/3/13
 * Time: 9:23 AM
 */
public class NodeTest {

    private static final Logger log = LoggerFactory.getLogger(NodeTest.class);

    @Test
    public void testPingNode() {

// Path: src/main/java/com/officedrop/redis/failover/jedis/GenericJedisClientFactory.java
// public class GenericJedisClientFactory implements JedisClientFactory {
// 
//     public static final GenericJedisClientFactory INSTANCE = new GenericJedisClientFactory();
// 
//     @Override
//     public JedisClient create(final HostConfiguration configuration) {
//         return new GenericJedisClient(
//                 configuration.getHost(),
//                 configuration.getPort(),
//                 configuration.getTimeout(),
//                 configuration.getDatabase()
//                 );
//     }
// 
// }
// 
// Path: src/test/java/com/officedrop/redis/failover/redis/RedisServer.java
// public class RedisServer implements Closeable {
// 
//     private static final AtomicInteger PORT = new AtomicInteger(10000);
//     private static final Logger log = LoggerFactory.getLogger(RedisServer.class);
// 
//     private final String address;
//     private final int port;
//     private final ServerSocket server;
//     private final ConcurrentMap<String, String> map = new ConcurrentHashMap<String, String>();
//     private String masterHost;
//     private String masterPort;
//     private volatile boolean running;
//     private boolean alwaysTimeout;
//     private final List<RedisClientHandler> handlers = new CopyOnWriteArrayList<RedisClientHandler>();
// 
//     public RedisServer(String address, int port) {
//         try {
//             this.address = address;
//             this.port = port;
//             this.server = new ServerSocket();
//             this.server.bind(new InetSocketAddress(address, port));
//         } catch (Exception e) {
//             throw new IllegalStateException(e);
//         }
//     }
// 
//     public void set(String key, String value) {
//         this.map.put(key, value);
//     }
// 
//     public String get(String key) {
//         return this.map.get(key);
//     }
// 
//     public boolean isAlwaysTimeout() {
//         return this.alwaysTimeout;
//     }
// 
//     public String getAddress() {
//         return this.address;
//     }
// 
//     public int getPort() {
//         return this.port;
//     }
// 
//     public void setAlwaysTimeout(boolean value) {
//         this.alwaysTimeout = value;
//     }
// 
//     public String getMasterHost() {
//         return masterHost;
//     }
// 
//     public void setMasterHost(final String masterHost) {
//         this.masterHost = masterHost;
//     }
// 
//     public String getMasterPort() {
//         return masterPort;
//     }
// 
//     public void setMasterPort(final String masterPort) {
//         this.masterPort = masterPort;
//     }
// 
//     public void setMasterPort(final int masterPort) {
//         this.masterPort = String.valueOf(masterPort);
//     }
// 
//     public void start() {
// 
//         this.running = true;
// 
//         log.info("started server - {}:{}", this.getAddress(), this.getPort());
// 
//         Thread acceptor = new Thread(new Runnable() {
//             @Override
//             public void run() {
// 
//                 while (isRunning()) {
//                     try {
//                         final Socket socket = getServer().accept();
// 
//                         log.info("Accepted client {}:{}", socket.getInetAddress(), getPort());
// 
//                         RedisClientHandler handler = new RedisClientHandler(RedisServer.this, socket);
// 
//                         handlers.add(handler);
// 
//                         handler.start();
// 
//                     } catch (Exception e) {
//                         log.error("Failed to accept socket connection", e);
//                     }
//                 }
// 
//             }
//         });
// 
//         acceptor.start();
// 
//     }
// 
//     public ServerSocket getServer() {
//         return this.server;
//     }
// 
//     public boolean isRunning() {
//         return this.running;
//     }
// 
//     public void close() {
//         this.stop();
//     }
// 
//     public void stop() {
//         if (this.running) {
//             this.running = false;
//             try {
//                 getServer().close();
//             } catch (Exception e) {
//                 log.error("Failed to close socket server", e);
//                 throw new IllegalStateException(e);
//             }
//         }
//     }
// 
//     public HostConfiguration getHostConfiguration() {
//         return new HostConfiguration(this.address, this.port);
//     }
// 
//     public HostConfiguration getMasterConfiguration() {
//         return new HostConfiguration( this.masterHost, Integer.valueOf(this.masterPort) );
//     }
// 
//     public static void withServer(Action1<RedisServer> action) {
//         RedisServer server = new RedisServer("localhost", PORT.incrementAndGet());
// 
//         server.start();
// 
//         try {
//             action.apply(server);
//         } finally {
//             server.stop();
//         }
//     }
// 
// 
// }
// 
// Path: src/main/java/com/officedrop/redis/failover/utils/Action1.java
// public interface Action1<T> {
// 
//     public void apply(T parameter);
// 
// }
// 
// Path: src/test/java/com/officedrop/redis/failover/utils/ThreadPool.java
// public class ThreadPool {
// 
//     public static final ExecutorService POOL = Executors.newCachedThreadPool();
// 
//     public static void submit( Runnable r ) {
//         POOL.submit(r);
//     }
// 
// }


// Path: src/test/java/com/officedrop/redis/failover/NodeTest.java
import com.officedrop.redis.failover.jedis.GenericJedisClientFactory;
import com.officedrop.redis.failover.redis.RedisServer;
import com.officedrop.redis.failover.utils.Action1;
import com.officedrop.redis.failover.utils.ThreadPool;
import junit.framework.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;

package com.officedrop.redis.failover;



/**
 * User: Maurício Linhares
 * Date: 1/3/13
 * Time: 9:23 AM
 */
public class NodeTest {

    private static final Logger log = LoggerFactory.getLogger(NodeTest.class);

    @Test
    public void testPingNode() {

        RedisServer.withServer( new Action1<RedisServer>() {