@Test
 public void testConnectFailure() throws Exception {
   final CountDownLatch done = new CountDownLatch(1);
   final AtomicBoolean success = new AtomicBoolean();
   final AtomicReference<Throwable> failure = new AtomicReference<>();
   Promise<RedisClientBase> connect = RedisClientBase.connect("localhost", 6380);
   connect
       .onSuccess(
           new Block<RedisClientBase>() {
             @Override
             public void apply(RedisClientBase redisClientBase) {
               success.set(true);
               done.countDown();
             }
           })
       .onFailure(
           new Block<Throwable>() {
             @Override
             public void apply(Throwable throwable) {
               success.set(false);
               failure.set(throwable);
               done.countDown();
             }
           });
   done.await(5000, TimeUnit.MILLISECONDS);
   assertFalse(success.get());
   assertEquals("Connection refused", failure.get().getMessage());
 }
 @Test
 public void testConnect() throws Exception {
   final CountDownLatch done = new CountDownLatch(1);
   final AtomicBoolean success = new AtomicBoolean();
   final AtomicReference<RedisClientBase> client = new AtomicReference<>();
   Promise<RedisClientBase> connect = RedisClientBase.connect("localhost", 6379);
   connect
       .onSuccess(
           new Block<RedisClientBase>() {
             @Override
             public void apply(RedisClientBase redisClientBase) {
               success.set(true);
               client.set(redisClientBase);
               done.countDown();
             }
           })
       .onFailure(
           new Block<Throwable>() {
             @Override
             public void apply(Throwable throwable) {
               success.set(false);
               done.countDown();
             }
           });
   done.await(5000, TimeUnit.MILLISECONDS);
   final CountDownLatch done2 = new CountDownLatch(1);
   assertTrue(success.get());
   client
       .get()
       .close()
       .onSuccess(
           new Block<Void>() {
             @Override
             public void apply(Void aVoid) {
               success.set(true);
               done2.countDown();
             }
           })
       .onFailure(
           new Block<Throwable>() {
             @Override
             public void apply(Throwable throwable) {
               success.set(false);
               done2.countDown();
             }
           });
   done2.await(5000, TimeUnit.MILLISECONDS);
   assertTrue(success.get());
 }
 @Test
 public void testExecute() throws Exception {
   final CountDownLatch done = new CountDownLatch(1);
   final AtomicBoolean success = new AtomicBoolean();
   RedisClientBase.connect("localhost", 6379)
       .onSuccess(
           new Block<RedisClientBase>() {
             @Override
             public void apply(final RedisClientBase redisClientBase) {
               redisClientBase
                   .execute(StatusReply.class, new Command("set", "test", "test"))
                   .onSuccess(
                       new Block<StatusReply>() {
                         @Override
                         public void apply(StatusReply reply) {
                           if (reply.data().equals("OK")) {
                             redisClientBase
                                 .execute(BulkReply.class, new Command("get", "test"))
                                 .onSuccess(
                                     new Block<BulkReply>() {
                                       @Override
                                       public void apply(BulkReply reply) {
                                         if (reply.asAsciiString().equals("test")) {
                                           success.set(true);
                                         }
                                         done.countDown();
                                         redisClientBase.close();
                                       }
                                     });
                           } else {
                             done.countDown();
                             redisClientBase.close();
                           }
                         }
                       });
             }
           });
   done.await(5000, TimeUnit.MILLISECONDS);
   assertTrue(success.get());
 }