Package net.rubyeye.xmemcached.test.unittest

Source Code of net.rubyeye.xmemcached.test.unittest.XMemcachedClientTest

package net.rubyeye.xmemcached.test.unittest;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import junit.framework.Assert;
import junit.framework.TestCase;
import net.rubyeye.xmemcached.CASOperation;
import net.rubyeye.xmemcached.Counter;
import net.rubyeye.xmemcached.GetsResponse;
import net.rubyeye.xmemcached.KeyIterator;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.MemcachedClientCallable;
import net.rubyeye.xmemcached.XMemcachedClient;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.command.Command;
import net.rubyeye.xmemcached.command.CommandType;
import net.rubyeye.xmemcached.command.binary.OpCode;
import net.rubyeye.xmemcached.exception.MemcachedException;
import net.rubyeye.xmemcached.exception.UnknownCommandException;
import net.rubyeye.xmemcached.helper.BlankKeyChecker;
import net.rubyeye.xmemcached.helper.InValidKeyChecker;
import net.rubyeye.xmemcached.helper.MockTranscoder;
import net.rubyeye.xmemcached.helper.TooLongKeyChecker;
import net.rubyeye.xmemcached.helper.TranscoderChecker;
import net.rubyeye.xmemcached.impl.MemcachedTCPSession;
import net.rubyeye.xmemcached.test.unittest.mock.MockDecodeTimeoutBinaryGetOneCommand;
import net.rubyeye.xmemcached.test.unittest.mock.MockDecodeTimeoutTextGetOneCommand;
import net.rubyeye.xmemcached.test.unittest.mock.MockEncodeTimeoutBinaryGetCommand;
import net.rubyeye.xmemcached.test.unittest.mock.MockEncodeTimeoutTextGetOneCommand;
import net.rubyeye.xmemcached.test.unittest.mock.MockErrorBinaryGetOneCommand;
import net.rubyeye.xmemcached.test.unittest.mock.MockErrorCommand;
import net.rubyeye.xmemcached.test.unittest.mock.MockErrorTextGetOneCommand;
import net.rubyeye.xmemcached.transcoders.IntegerTranscoder;
import net.rubyeye.xmemcached.transcoders.StringTranscoder;
import net.rubyeye.xmemcached.utils.AddrUtil;
import net.rubyeye.xmemcached.utils.ByteUtils;
import net.rubyeye.xmemcached.utils.Protocol;

import com.google.code.yanf4j.buffer.IoBuffer;
import com.google.code.yanf4j.util.ResourcesUtils;

public abstract class XMemcachedClientTest extends TestCase {
  protected MemcachedClient memcachedClient;
  Properties properties;
  private MockTranscoder mockTranscoder;

  @Override
  public void setUp() throws Exception {
    createClients();
    mockTranscoder = new MockTranscoder();
  }

  public void testCreateClientWithEmptyServers() throws Exception {
    MemcachedClient client = new XMemcachedClient();
    assertFalse(client.isShutdown());
    client.shutdown();
    assertTrue(client.isShutdown());

    MemcachedClientBuilder builder = new XMemcachedClientBuilder();
    client = builder.build();
    assertFalse(client.isShutdown());
    client.shutdown();
    assertTrue(client.isShutdown());
  }

  protected void createClients() throws IOException, Exception,
      TimeoutException, InterruptedException, MemcachedException {
    properties = ResourcesUtils.getResourceAsProperties("test.properties");

    MemcachedClientBuilder builder = createBuilder();
    builder.getConfiguration().setStatisticsServer(true);
    memcachedClient = builder.build();
    memcachedClient.flushAll();
  }

  public MemcachedClientBuilder createBuilder() throws Exception {
    return null;
  }

  public MemcachedClientBuilder createWeightedBuilder() throws Exception {
    return null;
  }

  public void testGet() throws Exception {
    assertNull(memcachedClient.get("name"));

    memcachedClient.set("name", 1, "dennis", new StringTranscoder(), 1000);

    assertEquals("dennis",
        memcachedClient.get("name", new StringTranscoder()));
    new TranscoderChecker(mockTranscoder, 1) {
      @Override
      public void call() throws Exception {
        assertEquals("dennis",
            memcachedClient.get("name", mockTranscoder));
      }

    }.check();
    Thread.sleep(2000);
    // expire
    assertNull(memcachedClient.get("name"));
    // blank key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.get("");
      }
    }.check();
    // null key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.get((String) null);
      }
    }.check();

    // invalid key
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.get("test\r\n");
      }
    }.check();
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.get("test test2");
      }
    }.check();

    // key is too long
    new TooLongKeyChecker(memcachedClient) {
      @Override
      public void call() throws Exception {
        int keyLength = memcachedClient.getProtocol() == Protocol.Text ? 256
            : 65536;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keyLength; i++) {
          sb.append(i);
        }
        memcachedClient.get(sb.toString());
      }
    }.check();

    // client is shutdown
    try {
      memcachedClient.shutdown();
      memcachedClient.get("name");
      fail();
    } catch (MemcachedException e) {
      assertEquals("Xmemcached is stopped", e.getMessage());
    }
  }

  public void testAppendPrepend() throws Exception {
    // append,prepend
    assertTrue(memcachedClient.set("name", 0, "dennis",
        new StringTranscoder(), 1000));
    assertTrue(memcachedClient.prepend("name", "hello "));
    assertEquals("hello dennis", memcachedClient.get("name"));
    assertTrue(memcachedClient.append("name", " zhuang"));
    assertEquals("hello dennis zhuang", memcachedClient.get("name"));
    memcachedClient.delete("name");
    assertFalse(memcachedClient.prepend("name", "hello ", 2000));
    assertFalse(memcachedClient.append("name", " zhuang", 2000));
    // append test
    // blank key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.append("", 0, 1);
      }
    }.check();
    // null key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.append((String) null, 0, 1);
      }
    }.check();

    // invalid key
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.append("test\r\n", 0, 1);
      }
    }.check();
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.append("test test2", 0, 1);
      }
    }.check();

    // key is too long
    new TooLongKeyChecker(memcachedClient) {
      @Override
      public void call() throws Exception {
        int keyLength = memcachedClient.getProtocol() == Protocol.Text ? 256
            : 65536;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keyLength; i++) {
          sb.append(i);
        }
        memcachedClient.append(sb.toString(), 0, 1);
      }
    }.check();

    // prepend test
    // blank key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.prepend("", 0, 1);
      }
    }.check();
    // null key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.prepend((String) null, 0, 1);
      }
    }.check();

    // invalid key
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.prepend("test\r\n", 0, 1);
      }
    }.check();
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.prepend("test test2", 0, 1);
      }
    }.check();

    // key is too long
    new TooLongKeyChecker(memcachedClient) {
      @Override
      public void call() throws Exception {
        int keyLength = memcachedClient.getProtocol() == Protocol.Text ? 256
            : 65536;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keyLength; i++) {
          sb.append(i);
        }
        memcachedClient.prepend(sb.toString(), 0, 1);
      }
    }.check();

  }

  public void testStoreCollection() throws TimeoutException,
      InterruptedException, MemcachedException {
    // store list
    List<String> list = new ArrayList<String>();
    for (int i = 0; i < 100; i++) {
      list.add(String.valueOf(i));
    }
    assertTrue(memcachedClient.add("list", 0, list));
    List<String> listFromCache = memcachedClient.get("list");
    assertEquals(100, listFromCache.size());

    for (int i = 0; i < listFromCache.size(); i++) {
      assertEquals(list.get(i), listFromCache.get(i));
    }
    // store map
    Map<String, Integer> map = new HashMap<String, Integer>();

    for (int i = 0; i < 100; i++) {
      map.put(String.valueOf(i), i);
    }
    assertTrue(memcachedClient.add("map", 0, map));
    Map<String, Integer> mapFromCache = memcachedClient.get("map");
    assertEquals(100, listFromCache.size());

    for (int i = 0; i < listFromCache.size(); i++) {
      assertEquals(mapFromCache.get(i), map.get(i));
    }

  }

  public void testSet() throws Exception {
    assertTrue(memcachedClient.set("name", 0, "dennis"));
    assertEquals("dennis", memcachedClient.get("name", 2000));

    assertTrue(memcachedClient.set("name", 1, "zhuang",
        new StringTranscoder()));
    assertEquals("zhuang", memcachedClient.get("name", 2000));
    Thread.sleep(2000);
    // expired
    assertNull(memcachedClient.get("zhuang"));

    // blank key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.set("", 0, 1);
      }
    }.check();
    // null key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.set((String) null, 0, 1);
      }
    }.check();

    // invalid key
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.set("test\r\n", 0, 1);
      }
    }.check();
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.set("test test2", 0, 1);
      }
    }.check();

    // key is too long
    new TooLongKeyChecker(memcachedClient) {
      @Override
      public void call() throws Exception {
        int keyLength = memcachedClient.getProtocol() == Protocol.Text ? 256
            : 65536;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keyLength; i++) {
          sb.append(i);
        }
        memcachedClient.set(sb.toString(), 0, 1);
      }
    }.check();

    // Transcoder
    new TranscoderChecker(mockTranscoder, 2) {
      @Override
      public void call() throws Exception {
        memcachedClient.set("name", 0, "xmemcached", mockTranscoder);
        assertEquals("xmemcached",
            memcachedClient.get("name", mockTranscoder));

      }
    }.check();
  }

  public void testReplace() throws Exception {
    assertTrue(memcachedClient.add("name", 0, "dennis"));
    assertFalse(memcachedClient.replace("unknownKey", 0, "test"));
    assertTrue(memcachedClient.replace("name", 1, "zhuang"));
    assertEquals("zhuang", memcachedClient.get("name", 2000));
    Thread.sleep(2000);
    // expire
    assertNull(memcachedClient.get("name"));

    // blank key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.replace("", 0, 1);
      }
    }.check();
    // null key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.replace((String) null, 0, 1);
      }
    }.check();

    // invalid key
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.replace("test\r\n", 0, 1);
      }
    }.check();
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.replace("test test2", 0, 1);
      }
    }.check();

    // key is too long
    new TooLongKeyChecker(memcachedClient) {
      @Override
      public void call() throws Exception {
        int keyLength = memcachedClient.getProtocol() == Protocol.Text ? 256
            : 65536;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keyLength; i++) {
          sb.append(i);
        }
        memcachedClient.replace(sb.toString(), 0, 1);
      }
    }.check();

    // timeout
    // new TimeoutChecker(0) {
    // @Override
    // public void call() throws Exception {
    // XMemcachedClientTest.this.memcachedClient.replace("0", 0, 1, 0);
    // }
    // }.check();

    // Transcoder
    new TranscoderChecker(mockTranscoder, 2) {
      @Override
      public void call() throws Exception {
        memcachedClient.set("name", 0, 1);
        memcachedClient
            .replace("name", 0, "xmemcached", mockTranscoder);
        assertEquals("xmemcached",
            memcachedClient.get("name", mockTranscoder));

      }
    }.check();
  }

  public void testAdd() throws Exception {
    assertTrue(memcachedClient.add("name", 0, "dennis"));
    assertFalse(memcachedClient.add("name", 0, "dennis"));
    assertEquals("dennis", memcachedClient.get("name", 2000));

    // blank key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.add("", 0, 1);
      }
    }.check();
    // null key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.add((String) null, 0, 1);
      }
    }.check();

    // invalid key
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.add("test\r\n", 0, 1);
      }
    }.check();
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.add("test test2", 0, 1);
      }
    }.check();

    // key is too long
    new TooLongKeyChecker(memcachedClient) {
      @Override
      public void call() throws Exception {
        int keyLength = memcachedClient.getProtocol() == Protocol.Text ? 256
            : 65536;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keyLength; i++) {
          sb.append(i);
        }
        memcachedClient.add(sb.toString(), 0, 1);
      }
    }.check();

    // Transcoder
    new TranscoderChecker(mockTranscoder, 2) {
      @Override
      public void call() throws Exception {
        memcachedClient.add("a", 0, 100, mockTranscoder);
        assertEquals(100, memcachedClient.get("a", mockTranscoder));

      }
    }.check();
  }

  public void testDelete() throws Exception {
    assertTrue(memcachedClient.set("name", 0, "dennis"));
    assertEquals("dennis", memcachedClient.get("name"));
    assertTrue(memcachedClient.delete("name"));
    assertNull(memcachedClient.get("name"));
    assertFalse(memcachedClient.delete("not_exists"));

    memcachedClient.set("name", 0, "dennis");
    assertEquals("dennis", memcachedClient.get("name"));
    assertTrue(memcachedClient.delete("name"));
    assertNull(memcachedClient.get("name"));
    memcachedClient.set("name", 0, "dennis");
    assertEquals("dennis", memcachedClient.get("name"));
    assertTrue(memcachedClient.delete("name", 2000L));
    assertNull(memcachedClient.get("name"));

    // add,replace success
    assertTrue(memcachedClient.add("name", 0, "zhuang"));
    assertTrue(memcachedClient.replace("name", 0, "zhuang"));
  }

  //
  public void testMultiGet() throws Exception {
    for (int i = 0; i < 50; i++) {
      assertTrue(memcachedClient.add(String.valueOf(i), 0, i));
    }

    List<String> keys = new ArrayList<String>();
    for (int i = 0; i < 100; i++) {
      keys.add(String.valueOf(i));
    }

    Map<String, Integer> result = memcachedClient.get(keys, 10000);
    assertEquals(50, result.size());

    for (int i = 0; i < 50; i++) {
      assertEquals((Integer) i, result.get(String.valueOf(i)));
    }

    // blank collection
    assertNull(memcachedClient.get((Collection) null));
    assertNull(memcachedClient.get(new HashSet<String>()));

  }

  public void testGets() throws Exception {
    memcachedClient.add("name", 0, "dennis");
    GetsResponse<String> getsResponse = memcachedClient.gets("name");
    GetsResponse<String> oldGetsResponse = getsResponse;
    assertEquals("dennis", getsResponse.getValue());
    long oldCas = getsResponse.getCas();
    getsResponse = memcachedClient.gets("name", 2000,
        new StringTranscoder());
    assertEquals("dennis", getsResponse.getValue());
    // check the same
    assertEquals(oldCas, getsResponse.getCas());
    assertEquals(oldGetsResponse, getsResponse);

    memcachedClient.set("name", 0, "zhuang");
    getsResponse = memcachedClient.gets("name", 2000);
    assertEquals("zhuang", getsResponse.getValue());
    assertFalse(oldCas == getsResponse.getCas());

    // blank key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.gets("");
      }
    }.check();
    // null key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.gets((String) null);
      }
    }.check();

    // invalid key
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.gets("test\r\n");
      }
    }.check();
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.gets("test test2");
      }
    }.check();

    // key is too long
    new TooLongKeyChecker(memcachedClient) {
      @Override
      public void call() throws Exception {
        int keyLength = memcachedClient.getProtocol() == Protocol.Text ? 256
            : 65536;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keyLength; i++) {
          sb.append(i);
        }
        memcachedClient.gets(sb.toString());
      }
    }.check();

    // client is shutdown
    try {
      memcachedClient.shutdown();
      memcachedClient.gets("name");
      fail();
    } catch (MemcachedException e) {
      assertEquals("Xmemcached is stopped", e.getMessage());
    }

  }

  public void testVersion() throws Exception {
    assertTrue(memcachedClient.getVersions(5000).size() > 0);
    System.out.println(memcachedClient.getVersions());
  }

  public void testStats() throws Exception {
    assertTrue(memcachedClient.getStats().size() > 0);
    System.out.println(memcachedClient.getStats());
    memcachedClient.set("a", 0, 1);
    assertTrue(memcachedClient.getStatsByItem("items").size() > 0);
    System.out.println(memcachedClient.getStatsByItem("items"));
  }

  public void testIssue126() throws Exception {
    Map<InetSocketAddress, Map<String, String>> result = this.memcachedClient
        .getStatsByItem("detail dump");
    assertNotNull(result);
  }

  public void testFlushAll() throws Exception {
    for (int i = 0; i < 50; i++) {
      assertTrue(memcachedClient.add(String.valueOf(i), 0, i));
    }
    List<String> keys = new ArrayList<String>();
    for (int i = 0; i < 100; i++) {
      keys.add(String.valueOf(i));
    }
    Map<String, Integer> result = memcachedClient.get(keys);
    assertEquals(50, result.size());
    for (int i = 0; i < 50; i++) {
      assertEquals((Integer) i, result.get(String.valueOf(i)));
    }
    memcachedClient.flushAll();
    result = memcachedClient.get(keys);
    assertTrue(result.isEmpty());
  }

  public void testSetLoggingLevelVerbosity() throws Exception {
    if (memcachedClient.getProtocol() == Protocol.Text
        || memcachedClient.getProtocol() == Protocol.Binary) {
      memcachedClient.setLoggingLevelVerbosity(
          AddrUtil.getAddresses(
              properties.getProperty("test.memcached.servers"))
              .get(0), 2);
      memcachedClient.setLoggingLevelVerbosityWithNoReply(
          AddrUtil.getAddresses(
              properties.getProperty("test.memcached.servers"))
              .get(0), 3);
      memcachedClient.setLoggingLevelVerbosityWithNoReply(
          AddrUtil.getAddresses(
              properties.getProperty("test.memcached.servers"))
              .get(0), 0);
    } else {
      // do nothing,binary protocol doesn't have verbosity protocol.
    }
  }

  public void testIssue150() throws Exception {
    memcachedClient.set("a", 0, 1);
    try {
      memcachedClient.incr("a", 1);
      fail();
    } catch (MemcachedException e) {
      // assertEquals("cannot increment or decrement non-numeric value",e.getMessage());
    }
    memcachedClient.set("a", 0, "1");
    assertEquals(3, memcachedClient.incr("a", 2));
  }

  public void testIncr() throws Exception {
    assertEquals(0, memcachedClient.incr("a", 5));
    assertTrue(memcachedClient.set("a", 0, "1"));
    assertEquals(6, memcachedClient.incr("a", 5));
    assertEquals(10, memcachedClient.incr("a", 4));

    // test incr with initValue
    memcachedClient.delete("a");
    assertEquals(1, memcachedClient.incr("a", 5, 1));
    assertEquals(6, memcachedClient.incr("a", 5));
    assertEquals(10, memcachedClient.incr("a", 4));

    // test incr with initValue and expire time
    memcachedClient.delete("a");
    assertEquals(1, memcachedClient.incr("a", 5, 1, 1000, 1));
    Thread.sleep(2000);
    assertNull(memcachedClient.get("a"));

    // key is chinese
    assertEquals(1, memcachedClient.incr("娴��", 5, 1, 1000, 0));
    assertEquals(6, memcachedClient.incr("娴��", 5));
    assertEquals(10, memcachedClient.incr("娴��", 4));

    // blank key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.incr("", 0, 1);
      }
    }.check();
    // null key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.incr((String) null, 0, 1);
      }
    }.check();

    // invalid key
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.incr("test\r\n", 0, 1);
      }
    }.check();
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.incr("test test2", 0, 1);
      }
    }.check();

    // key is too long
    new TooLongKeyChecker(memcachedClient) {
      @Override
      public void call() throws Exception {
        int keyLength = memcachedClient.getProtocol() == Protocol.Text ? 256
            : 65536;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keyLength; i++) {
          sb.append(i);
        }
        memcachedClient.incr(sb.toString(), 0, 1);
      }
    }.check();

  }

  public void testDecr() throws Exception {
    assertEquals(0, memcachedClient.decr("a", 5));

    assertTrue(memcachedClient.set("a", 0, "100"));
    assertEquals(50, memcachedClient.decr("a", 50));
    assertEquals(46, memcachedClient.decr("a", 4));

    // test decr with initValue
    memcachedClient.delete("a");
    assertEquals(100, memcachedClient.decr("a", 5, 100));
    assertEquals(50, memcachedClient.decr("a", 50));
    assertEquals(46, memcachedClient.decr("a", 4));

    // test decr with initValue and expire time
    memcachedClient.delete("a");
    assertEquals(1, memcachedClient.decr("a", 5, 1, 1000, 1));
    Thread.sleep(2000);
    assertNull(memcachedClient.get("a"));

    // blank key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.decr("", 0, 1);
      }
    }.check();
    // null key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.decr((String) null, 0, 1);
      }
    }.check();

    // invalid key
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.decr("test\r\n", 0, 1);
      }
    }.check();
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.decr("test test2", 0, 1);
      }
    }.check();

    // key is too long
    new TooLongKeyChecker(memcachedClient) {
      @Override
      public void call() throws Exception {
        int keyLength = memcachedClient.getProtocol() == Protocol.Text ? 256
            : 65536;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keyLength; i++) {
          sb.append(i);
        }
        memcachedClient.decr(sb.toString(), 0, 1);
      }
    }.check();

  }

  public void testCAS() throws Exception {
    memcachedClient.add("name", 0, "dennis");
    GetsResponse<String> getsResponse = memcachedClient.gets("name");
    assertEquals("dennis", getsResponse.getValue());
    final CASOperation<String> operation = new CASOperation<String>() {

      public int getMaxTries() {
        return 1;
      }

      public String getNewValue(long currentCAS, String currentValue) {
        return "zhuang";
      }

    };
    assertTrue(memcachedClient.cas("name", getsResponse, operation));
    assertEquals("zhuang", memcachedClient.get("name"));
    getsResponse = memcachedClient.gets("name");
    memcachedClient.set("name", 0, "dennis");
    // cas fail
    assertFalse(memcachedClient.cas("name", 0, "zhuang",
        getsResponse.getCas()));
    assertEquals("dennis", memcachedClient.get("name"));

    // blank key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.cas("", operation);
      }
    }.check();
    // null key
    new BlankKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.cas((String) null, operation);
      }
    }.check();

    // invalid key
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.cas("test\r\n", operation);
      }
    }.check();
    new InValidKeyChecker() {
      @Override
      public void call() throws Exception {
        memcachedClient.cas("test test2", operation);
      }
    }.check();

    // key is too long
    new TooLongKeyChecker(memcachedClient) {
      @Override
      public void call() throws Exception {
        int keyLength = memcachedClient.getProtocol() == Protocol.Text ? 256
            : 65536;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < keyLength; i++) {
          sb.append(i);
        }
        memcachedClient.cas(sb.toString(), operation);
      }
    }.check();

  }

  public void testAutoReconnect() throws Exception {
    final String key = "name";
    memcachedClient.set(key, 0, "dennis");
    assertEquals("dennis", memcachedClient.get(key));
    CountDownLatch latch = new CountDownLatch(1);
    int currentServerCount = memcachedClient.getAvaliableServers().size();
    MockErrorCommand errorCommand = null;
    if (memcachedClient.getProtocol() == Protocol.Text) {
      errorCommand = new MockErrorTextGetOneCommand(key, key.getBytes(),
          CommandType.GET_ONE, latch);
    } else {
      errorCommand = new MockErrorBinaryGetOneCommand(key,
          key.getBytes(), CommandType.GET_ONE, latch, OpCode.GET,
          false);
    }
    memcachedClient.getConnector().send((Command) errorCommand);
    latch.await(MemcachedClient.DEFAULT_OP_TIMEOUT, TimeUnit.MILLISECONDS);
    assertTrue(errorCommand.isDecoded());
    // wait for reconnecting
    Thread.sleep(2000 * 3);
    assertEquals(currentServerCount, memcachedClient.getAvaliableServers()
        .size());
    // It works
    assertEquals("dennis", memcachedClient.get(key));
  }

  public void testOperationDecodeTimeOut() throws Exception {
    memcachedClient.set("name", 0, "dennis");
    assertEquals("dennis", memcachedClient.get("name"));
    CountDownLatch latch = new CountDownLatch(1);
    Command errorCommand = null;
    if (memcachedClient.getProtocol() == Protocol.Text) {
      errorCommand = new MockDecodeTimeoutTextGetOneCommand("name",
          "name".getBytes(), CommandType.GET_ONE, latch, 1000);
    } else {
      errorCommand = new MockDecodeTimeoutBinaryGetOneCommand("name",
          "name".getBytes(), CommandType.GET_ONE, latch, OpCode.GET,
          false, 1000);
    }
    memcachedClient.getConnector().send(errorCommand);
    // wait 100 milliseconds,the operation will be timeout
    latch.await(100, TimeUnit.MILLISECONDS);
    assertNull(errorCommand.getResult());
    Thread.sleep(1000);
    // It works.
    assertNotNull(errorCommand.getResult());
    assertEquals("dennis", memcachedClient.get("name"));
  }

  public void _testOperationEncodeTimeout() throws Exception {
    memcachedClient.set("name", 0, "dennis");
    assertEquals("dennis", memcachedClient.get("name"));
    long writeMessageCount = memcachedClient.getConnector().getStatistics()
        .getWriteMessageCount();
    CountDownLatch latch = new CountDownLatch(1);
    Command errorCommand = null;
    if (memcachedClient.getProtocol() == Protocol.Text) {
      errorCommand = new MockEncodeTimeoutTextGetOneCommand("name",
          "name".getBytes(), CommandType.GET_ONE, latch, 1000);
    } else {
      errorCommand = new MockEncodeTimeoutBinaryGetCommand("name",
          "name".getBytes(), CommandType.GET_ONE, latch, OpCode.GET,
          false, 1000);
    }

    memcachedClient.getConnector().send(errorCommand);
    // Force write thread to encode command
    errorCommand.setIoBuffer(null);
    // wait 100 milliseconds,the operation will be timeout
    if (!latch.await(100, TimeUnit.MILLISECONDS)) {
      errorCommand.cancel();
    }
    Thread.sleep(1000);
    // It is not written to channel,because it is canceled.
    assertEquals(writeMessageCount, memcachedClient.getConnector()
        .getStatistics().getWriteMessageCount());
    // It works
    assertEquals("dennis", memcachedClient.get("name"));
  }

  public void testRemoveAndAddServer() throws Exception {
    String servers = properties.getProperty("test.memcached.servers");
    memcachedClient.set("name", 0, "dennis");
    assertEquals("dennis", memcachedClient.get("name"));
    memcachedClient.removeServer(servers);

    synchronized (this) {
      while (memcachedClient.getAvaliableServers().size() > 0) {
        wait(1000);
      }
    }
    assertEquals(0, memcachedClient.getAvaliableServers().size());
    try {
      memcachedClient.get("name");
      fail();
    } catch (MemcachedException e) {
      assertEquals("There is no available connection at this moment",
          e.getMessage());
    }

    memcachedClient.addServer(properties
        .getProperty("test.memcached.servers"));
    synchronized (this) {
      while (memcachedClient.getAvaliableServers().size() < AddrUtil
          .getAddresses(servers).size()) {
        wait(1000);
      }
    }
    Thread.sleep(5000);
    assertEquals("dennis", memcachedClient.get("name"));
  }

  public void testWeightedServers() throws Exception {
    // shutdown current client
    memcachedClient.shutdown();

    MemcachedClientBuilder builder = createWeightedBuilder();
    builder.getConfiguration().setStatisticsServer(true);
    memcachedClient = builder.build();
    memcachedClient.flushAll(5000);

    Map<InetSocketAddress, Map<String, String>> oldStats = memcachedClient
        .getStats();

    for (int i = 0; i < 100; i++) {
      assertTrue(memcachedClient.set(String.valueOf(i), 0, i));
    }
    for (int i = 0; i < 100; i++) {
      assertEquals(i, memcachedClient.get(String.valueOf(i)));
    }

    List<InetSocketAddress> addressList = AddrUtil.getAddresses(properties
        .getProperty("test.memcached.servers"));
    Map<InetSocketAddress, Map<String, String>> newStats = memcachedClient
        .getStats();
    for (InetSocketAddress address : addressList) {
      int oldSets = Integer
          .parseInt(oldStats.get(address).get("cmd_set"));
      int newSets = Integer
          .parseInt(newStats.get(address).get("cmd_set"));
      System.out.println("sets:" + (newSets - oldSets));
      int oldGets = Integer
          .parseInt(oldStats.get(address).get("cmd_get"));
      int newGets = Integer
          .parseInt(newStats.get(address).get("cmd_get"));
      System.out.println("gets:" + (newGets - oldGets));
    }
  }

  public void _testErrorCommand() throws Exception {
    Command nonexisCmd = new Command() {

      @Override
      public boolean decode(MemcachedTCPSession session, ByteBuffer buffer) {
        return decodeError(ByteUtils.nextLine(buffer));
      }

      @Override
      public void encode() {
        ioBuffer = IoBuffer
            .wrap(ByteBuffer.wrap("test\r\n".getBytes()));
      }

    };
    nonexisCmd.setKey("test");
    nonexisCmd.setLatch(new CountDownLatch(1));
    memcachedClient.getConnector().send(nonexisCmd);
    // this.memcachedClient.flushAll();
    nonexisCmd.getLatch().await();

    assertNotNull(nonexisCmd.getException());
    assertEquals("Nonexist command,check your memcached version please.",
        nonexisCmd.getException().getMessage());
    assertTrue(nonexisCmd.getException() instanceof UnknownCommandException);

    memcachedClient.set("name", 0, "dennis");
    assertEquals("dennis", memcachedClient.get("name"));
  }

  public void testGetAvaliableServers() {
    Collection<InetSocketAddress> servers = memcachedClient
        .getAvaliableServers();

    List<InetSocketAddress> serverList = AddrUtil.getAddresses(properties
        .getProperty("test.memcached.servers"));
    assertEquals(servers.size(), serverList.size());
    for (InetSocketAddress address : servers) {
      assertTrue(serverList.contains(address));
    }
  }

  public void testSanitizeKey() throws Exception {
    memcachedClient.setSanitizeKeys(true);

    String key = "The string 眉@foo-bar";
    assertTrue(memcachedClient.add(key, 0, 0));
    assertEquals(0, memcachedClient.get(key));

    assertTrue(memcachedClient.replace(key, 0, 1));
    assertEquals(1, memcachedClient.get(key, 2000));

    assertTrue(memcachedClient.set(key, 0, 2));
    assertEquals((Integer) 2,
        memcachedClient.get(key, 2000, new IntegerTranscoder()));

    assertTrue(memcachedClient.set(key, 0, "xmemcached",
        new StringTranscoder()));
    assertTrue(memcachedClient.append(key, " great"));
    assertTrue(memcachedClient.prepend(key, "hello "));

    assertEquals("hello xmemcached great", memcachedClient.get(key));

    // test bulk get
    List<String> keys = new ArrayList<String>();
    for (int i = 0; i < 100; i++) {
      memcachedClient.add(key + i, 0, i);
      keys.add(key + i);
    }

    Map<String, Integer> result = memcachedClient.get(keys, 5000);
    for (int i = 0; i < 100; i++) {
      assertEquals((Integer) i, result.get(key + i));
    }

    for (int i = 0; i < 100; i++) {
      assertTrue(memcachedClient.delete(key + i));
      assertNull(memcachedClient.get(key + i));
    }

    // test cas
    memcachedClient.set(key, 0, 1);
    memcachedClient.cas(key, new CASOperation<Integer>() {

      public int getMaxTries() {
        return 1;
      }

      public Integer getNewValue(long currentCAS, Integer currentValue) {
        return currentValue + 1;
      }

    });
    assertEquals((Integer) 2,
        memcachedClient.get(key, 2000, new IntegerTranscoder()));

  }

  @Override
  public void tearDown() throws Exception {
    memcachedClient.shutdown();
  }

  public void testCounter() throws Exception {
    Counter counter = memcachedClient.getCounter("a");
    Assert.assertEquals(0, counter.get());
    Assert.assertEquals(0, counter.get());

    Assert.assertEquals(1, counter.incrementAndGet());
    Assert.assertEquals(2, counter.incrementAndGet());
    Assert.assertEquals(3, counter.incrementAndGet());

    Assert.assertEquals(2, counter.decrementAndGet());
    Assert.assertEquals(1, counter.decrementAndGet());
    Assert.assertEquals(0, counter.decrementAndGet());
    Assert.assertEquals(0, counter.decrementAndGet());

    Assert.assertEquals(4, counter.addAndGet(4));
    Assert.assertEquals(7, counter.addAndGet(3));
    Assert.assertEquals(0, counter.addAndGet(-7));

    counter.set(1000);
    Assert.assertEquals(1000, counter.get());
    Assert.assertEquals(1001, counter.incrementAndGet());

    counter = memcachedClient.getCounter("b", 100);
    Assert.assertEquals(101, counter.incrementAndGet());
    Assert.assertEquals(102, counter.incrementAndGet());
    Assert.assertEquals(101, counter.decrementAndGet());

    // test issue 74
    counter = memcachedClient.getCounter("issue74", 0);
    for (int i = 0; i < 100; i++) {
      Assert.assertEquals(i + 1, counter.incrementAndGet());
    }
    for (int i = 0; i < 100; i++) {
      counter.decrementAndGet();
    }
    Assert.assertEquals(0, counter.get());
  }

  public void testIssue142() throws Exception {
    Counter counter = this.memcachedClient.getCounter("counter", 6);
    counter.get(); //
    counter.incrementAndGet(); // counter=7
    counter.decrementAndGet(); // counter=6
    counter.addAndGet(2);// counter=8
    assertEquals(8, counter.get()); // counter=8
    assertTrue(this.memcachedClient.delete("counter"));
  }

//  public void testKeyIterator() throws Exception {
//    if (memcachedClient.getProtocol() == Protocol.Text) {
//      Collection<InetSocketAddress> avaliableServers = memcachedClient
//          .getAvaliableServers();
//      InetSocketAddress address = avaliableServers.iterator().next();
//      KeyIterator it = memcachedClient.getKeyIterator(address);
//      while (it.hasNext()) {
//        memcachedClient.delete(it.next());
//      }
//      it = memcachedClient.getKeyIterator(address);
//      Assert.assertFalse(it.hasNext());
//      try {
//        it.next();
//        Assert.fail();
//      } catch (NoSuchElementException e) {
//        Assert.assertTrue(true);
//      }
//      for (int i = 0; i < 10; i++) {
//        memcachedClient.set(String.valueOf(i), 0, i);
//      }
//      it = memcachedClient.getKeyIterator(address);
//      Assert.assertTrue(it.hasNext());
//      Assert.assertEquals(address, it.getServerAddress());
//      while (it.hasNext()) {
//        String key = it.next();
//        Assert.assertEquals(Integer.parseInt(key),
//            memcachedClient.get(key));
//      }
//      Assert.assertFalse(it.hasNext());
//    } else {
//      // ignore
//    }
//
//  }

  public void testNamespace() throws Exception {
    String ns = "user-id";
    this.memcachedClient.withNamespace(ns,
        new MemcachedClientCallable<Void>() {

          public Void call(MemcachedClient client)
              throws MemcachedException, InterruptedException,
              TimeoutException {
            assertNull(client.get("a"));
            assertNull(client.get("b"));
            assertNull(client.get("c"));
            return null;
          }
        });

    this.memcachedClient.withNamespace(ns,
        new MemcachedClientCallable<Void>() {

          public Void call(MemcachedClient client)
              throws MemcachedException, InterruptedException,
              TimeoutException {
            assertTrue(client.set("a", 0, 1));
            assertTrue(client.set("b", 0, 2));
            assertTrue(client.set("c", 0, 3));
            return null;
          }
        });

    this.memcachedClient.withNamespace(ns,
        new MemcachedClientCallable<Void>() {

          public Void call(MemcachedClient client)
              throws MemcachedException, InterruptedException,
              TimeoutException {
            assertEquals(1, client.get("a"));
            assertEquals(2, client.get("b"));
            assertEquals(3, client.get("c"));
            return null;
          }
        });

    this.memcachedClient.invalidateNamespace(ns);
    this.memcachedClient.withNamespace(ns,
        new MemcachedClientCallable<Void>() {

          public Void call(MemcachedClient client)
              throws MemcachedException, InterruptedException,
              TimeoutException {
            assertNull(client.get("a"));
            assertNull(client.get("b"));
            assertNull(client.get("c"));
            return null;
          }
        });

  }
 
  public void testNamespaceWithGetMulti()throws Exception{
    String ns="user";
    this.memcachedClient.withNamespace(ns,
        new MemcachedClientCallable<Void>() {

          public Void call(MemcachedClient client)
              throws MemcachedException, InterruptedException,
              TimeoutException {
            client.set("a", 0, 1);
            client.set("b", 0, 2);
            client.set("c", 0, 3);
            Map<String, Object> values = client.get(Arrays.asList("a","b","c"));
            assertEquals(3,values.size());
            assertEquals(1,values.get("a"));
            assertEquals(2,values.get("b"));
            assertEquals(3,values.get("c"));
            return null;
          }
        });
  }

  public void testTouch() throws Exception {
    this.memcachedClient.set("x", 1, 0);
    assertEquals(0, this.memcachedClient.get("x"));
    assertTrue(this.memcachedClient.touch("x", 1));
    assertEquals(0, this.memcachedClient.get("x"));
    assertTrue(this.memcachedClient.touch("x", 1));
    Thread.sleep(1100);
    assertNull(this.memcachedClient.get("x"));
    if (memcachedClient.getProtocol() == Protocol.Binary) {
      this.memcachedClient.set("x", 1, 0);
      assertEquals(0, this.memcachedClient.getAndTouch("x", 1));
    }

    // touch not exists
    assertFalse(memcachedClient.touch("not_exists", 0));
  }

}
TOP

Related Classes of net.rubyeye.xmemcached.test.unittest.XMemcachedClientTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.