public void testDefaults() throws Exception {
    ConnectionFactory f = b.build();
    assertEquals(DefaultConnectionFactory.DEFAULT_OPERATION_TIMEOUT, f.getOperationTimeout());
    assertEquals(DefaultConnectionFactory.DEFAULT_READ_BUFFER_SIZE, f.getReadBufSize());
    assertSame(DefaultConnectionFactory.DEFAULT_HASH, f.getHashAlg());
    assertTrue(f.getDefaultTranscoder() instanceof SerializingTranscoder);
    assertSame(DefaultConnectionFactory.DEFAULT_FAILURE_MODE, f.getFailureMode());
    assertEquals(0, f.getInitialObservers().size());
    assertTrue(f.getOperationFactory() instanceof AsciiOperationFactory);

    BlockingQueue<Operation> opQueue = f.createOperationQueue();
    assertTrue(opQueue instanceof ArrayBlockingQueue<?>);
    assertEquals(DefaultConnectionFactory.DEFAULT_OP_QUEUE_LEN, opQueue.remainingCapacity());

    BlockingQueue<Operation> readOpQueue = f.createReadOperationQueue();
    assertTrue(readOpQueue instanceof LinkedBlockingQueue<?>);

    BlockingQueue<Operation> writeOpQueue = f.createWriteOperationQueue();
    assertTrue(writeOpQueue instanceof LinkedBlockingQueue<?>);

    MemcachedNode n = (MemcachedNode) mock(MemcachedNode.class).proxy();
    assertTrue(f.createLocator(Collections.singletonList(n)) instanceof ArrayModNodeLocator);

    final MemcachedNode testNode =
        f.createMemcachedNode(
            InetSocketAddress.createUnresolved("localhost", TestConfig.PORT_NUMBER), 1);
    try {
      assertTrue(testNode instanceof AsciiMemcachedNodeImpl);
    } finally {
      testNode.getChannel().close();
    }

    assertFalse(f.isDaemon());
    assertFalse(f.shouldOptimize());
    assertFalse(f.useNagleAlgorithm());
    assertEquals(
        f.getOpQueueMaxBlockTime(), DefaultConnectionFactory.DEFAULT_OP_QUEUE_MAX_BLOCK_TIME);
  }
  public void testModifications() throws Exception {
    ConnectionObserver testObserver =
        new ConnectionObserver() {
          public void connectionLost(SocketAddress sa) {
            // none
          }

          public void connectionEstablished(SocketAddress sa, int reconnectCount) {
            // none
          }
        };
    BlockingQueue<Operation> oQueue = new LinkedBlockingQueue<Operation>();
    BlockingQueue<Operation> rQueue = new LinkedBlockingQueue<Operation>();
    BlockingQueue<Operation> wQueue = new LinkedBlockingQueue<Operation>();

    OperationQueueFactory opQueueFactory = new DirectFactory(oQueue);
    OperationQueueFactory rQueueFactory = new DirectFactory(rQueue);
    OperationQueueFactory wQueueFactory = new DirectFactory(wQueue);
    AuthDescriptor anAuthDescriptor =
        new AuthDescriptor(
            new String[] {"PLAIN"}, new PlainCallbackHandler("username", "password"));

    ConnectionFactory f =
        b.setDaemon(true)
            .setShouldOptimize(false)
            .setFailureMode(FailureMode.Redistribute)
            .setHashAlg(DefaultHashAlgorithm.KETAMA_HASH)
            .setInitialObservers(Collections.singleton(testObserver))
            .setOpFact(new BinaryOperationFactory())
            .setOpTimeout(4225)
            .setOpQueueFactory(opQueueFactory)
            .setReadOpQueueFactory(rQueueFactory)
            .setWriteOpQueueFactory(wQueueFactory)
            .setReadBufferSize(19)
            .setTranscoder(new WhalinTranscoder())
            .setUseNagleAlgorithm(true)
            .setLocatorType(Locator.CONSISTENT)
            .setOpQueueMaxBlockTime(19)
            .setAuthDescriptor(anAuthDescriptor)
            .build();

    assertEquals(4225, f.getOperationTimeout());
    assertEquals(19, f.getReadBufSize());
    assertSame(DefaultHashAlgorithm.KETAMA_HASH, f.getHashAlg());
    assertTrue(f.getDefaultTranscoder() instanceof WhalinTranscoder);
    assertSame(FailureMode.Redistribute, f.getFailureMode());
    assertEquals(1, f.getInitialObservers().size());
    assertSame(testObserver, f.getInitialObservers().iterator().next());
    assertTrue(f.getOperationFactory() instanceof BinaryOperationFactory);
    assertSame(oQueue, f.createOperationQueue());
    assertSame(rQueue, f.createReadOperationQueue());
    assertSame(wQueue, f.createWriteOperationQueue());
    assertTrue(f.isDaemon());
    assertFalse(f.shouldOptimize());
    assertTrue(f.useNagleAlgorithm());
    assertEquals(f.getOpQueueMaxBlockTime(), 19);
    assertSame(anAuthDescriptor, f.getAuthDescriptor());

    MemcachedNode n =
        new MockMemcachedNode(
            InetSocketAddress.createUnresolved("localhost", TestConfig.PORT_NUMBER));
    assertTrue(f.createLocator(Collections.singletonList(n)) instanceof KetamaNodeLocator);

    final MemcachedNode testNode =
        f.createMemcachedNode(
            InetSocketAddress.createUnresolved("localhost", TestConfig.PORT_NUMBER), 1);
    try {
      assertTrue(testNode instanceof BinaryMemcachedNodeImpl);
    } finally {
      testNode.getChannel().close();
    }
  }