public void testWritePartialMsg() throws Exception {
    assertEquals(0, SENT.size());
    assertEquals(0, STATS.getSent());

    Message m = q("reaalllllllllly long query");
    SINK.resize(m.getTotalLength() - 20);

    WRITER.send(m);
    assertEquals(1, STATS.getSent());
    assertTrue(WRITER.handleWrite()); // still stuff left to write.
    assertTrue(SINK.interested());
    assertEquals(
        1, SENT.size()); // it's sent, even though the other side didn't receive it fully yet.
    assertEquals(buffer(m), buffer(SENT.next()));

    ByteBuffer buffer = ByteBuffer.allocate(m.getTotalLength());
    buffer.put(SINK.getBuffer());
    SINK.resize(100000);

    assertFalse(WRITER.handleWrite());
    assertFalse(SINK.interested());
    buffer.put(SINK.getBuffer());
    Message in = read((ByteBuffer) buffer.flip());
    assertEquals(buffer(m), buffer(in));
  }
  public void testDroppingMessagesWhileSending() throws Exception {
    assertEquals(0, STATS.getSent());
    assertEquals(0, STATS.getSentDropped());

    Message m[] = new Message[10];
    for (int i = 0; i < m.length; i++) m[i] = g(i + 1);

    // Set queue to drop msgs (5 of'm) after the 3rd is added.
    for (int i = 0; i < m.length; i++) WRITER.send(m[i]);
    assertEquals(0, STATS.getSentDropped());
    assertEquals(10, STATS.getSent());

    QUEUE.setNumToDrop(4);
    QUEUE.setStartDropIn(3);
    assertFalse(WRITER.handleWrite());
    assertEquals(4, STATS.getSentDropped());

    ByteBuffer buffer = SINK.getBuffer();
    Message in[] = read(buffer, 6);
    assertFalse(buffer.hasRemaining());
    assertEquals(6, SENT.size());
    assertEquals(buffer(m[0]), buffer(in[0]));
    assertEquals(buffer(m[1]), buffer(in[1]));
    assertEquals(buffer(m[2]), buffer(in[2])); // started dropping now.
    assertEquals(buffer(m[7]), buffer(in[3])); // finished dropping here.
    assertEquals(buffer(m[8]), buffer(in[4]));
    assertEquals(buffer(m[9]), buffer(in[5]));
  }
  /** {@inheritDoc} */
  @Override
  public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
    writer.setBuffer(buf);

    if (!super.writeTo(buf, writer)) return false;

    if (!writer.isHeaderWritten()) {
      if (!writer.writeHeader(directType(), fieldsCount())) return false;

      writer.onHeaderWritten();
    }

    switch (writer.state()) {
      case 0:
        if (!writer.writeIgniteUuid("fileId", fileId)) return false;

        writer.incrementState();

      case 1:
        if (!writer.writeCollection(
            "fragmentRanges", fragmentRanges, MessageCollectionItemType.MSG)) return false;

        writer.incrementState();
    }

    return true;
  }
  public void testSimpleWrite() throws Exception {
    Message one, two, three;
    one = q("query one");
    two = g(7123);
    three = s(8134);

    assertEquals(0, STATS.getSent());
    assertFalse(SINK.interested());

    WRITER.send(one);
    WRITER.send(two);
    WRITER.send(three);
    assertEquals(3, STATS.getSent());

    assertTrue(SINK.interested());

    assertEquals(0, SENT.size());

    assertFalse(WRITER.handleWrite()); // nothing left to write.
    assertEquals(3, SENT.size());

    ByteBuffer buffer = SINK.getBuffer();
    assertEquals(
        one.getTotalLength() + two.getTotalLength() + three.getTotalLength(), buffer.limit());
    ByteArrayInputStream in = new ByteArrayInputStream(buffer.array(), 0, buffer.limit());
    Message in1, in2, in3;
    in1 = read(in);
    in2 = read(in);
    in3 = read(in);
    assertEquals(-1, in.read());

    assertEquals(buffer(one), buffer(in1));
    assertEquals(buffer(two), buffer(in2));
    assertEquals(buffer(three), buffer(in3));
    assertEquals(buffer(one), buffer(SENT.next()));
    assertEquals(buffer(two), buffer(SENT.next()));
    assertEquals(buffer(three), buffer(SENT.next()));

    assertFalse(SINK.interested());
    assertEquals(3, STATS.getSent());
  }
  public void testWritePartialAndMore() throws Exception {
    Message out1 = q("first long query");
    Message out2 = q("second long query");
    Message out3 = q("third long query");
    assertEquals(0, STATS.getSent());

    SINK.resize(out1.getTotalLength() + 20);
    WRITER.send(out1);
    WRITER.send(out2);
    assertEquals(2, STATS.getSent());

    assertEquals(0, SENT.size());
    assertTrue(WRITER.handleWrite());
    assertTrue(SINK.interested());
    assertEquals(2, SENT.size()); // two were sent, one was received.
    assertEquals(buffer(out1), buffer(SENT.next()));
    assertEquals(buffer(out2), buffer(SENT.next()));

    ByteBuffer buffer = ByteBuffer.allocate(1000);
    buffer.put(SINK.getBuffer()).flip();
    SINK.resize(10000);

    Message in1 = read(buffer);
    assertTrue(buffer.hasRemaining());
    assertEquals(20, buffer.remaining());
    buffer.compact();

    WRITER.send(out3);
    assertEquals(3, STATS.getSent());
    assertFalse(WRITER.handleWrite());
    assertEquals(1, SENT.size());
    assertEquals(buffer(out3), buffer(SENT.next()));
    assertFalse(SINK.interested());
    buffer.put(SINK.getBuffer()).flip();

    Message in2 = read(buffer);
    Message in3 = read(buffer);
    assertTrue(!buffer.hasRemaining());
    assertEquals(buffer(out2), buffer(in2));
    assertEquals(buffer(out3), buffer(in3));
  }
  /** {@inheritDoc} */
  @Override
  public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
    writer.setBuffer(buf);

    if (!writer.isHeaderWritten()) {
      if (!writer.writeHeader(directType(), fieldsCount())) return false;

      writer.onHeaderWritten();
    }

    switch (writer.state()) {
      case 0:
        if (!writer.writeByteArray("val", val)) return false;

        writer.incrementState();
    }

    return true;
  }
  /** {@inheritDoc} */
  @Override
  public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
    writer.setBuffer(buf);

    if (!super.writeTo(buf, writer)) return false;

    if (!writer.isHeaderWritten()) {
      if (!writer.writeHeader(directType(), fieldsCount())) return false;

      writer.onHeaderWritten();
    }

    switch (writer.state()) {
      case 10:
        if (!writer.writeMessage("dhtVer", dhtVer)) return false;

        writer.incrementState();

      case 11:
        if (!writer.writeCollection(
            "filterFailedKeys", filterFailedKeys, MessageCollectionItemType.MSG)) return false;

        writer.incrementState();

      case 12:
        if (!writer.writeIgniteUuid("futId", futId)) return false;

        writer.incrementState();

      case 13:
        if (!writer.writeCollection("invalidParts", invalidParts, MessageCollectionItemType.INT))
          return false;

        writer.incrementState();

      case 14:
        if (!writer.writeIgniteUuid("miniId", miniId)) return false;

        writer.incrementState();

      case 15:
        if (!writer.writeCollection("ownedValKeys", ownedValKeys, MessageCollectionItemType.MSG))
          return false;

        writer.incrementState();

      case 16:
        if (!writer.writeCollection("ownedValVals", ownedValVals, MessageCollectionItemType.MSG))
          return false;

        writer.incrementState();

      case 17:
        if (!writer.writeCollection("pending", pending, MessageCollectionItemType.MSG))
          return false;

        writer.incrementState();

      case 18:
        if (!writer.writeMessage("retVal", retVal)) return false;

        writer.incrementState();
    }

    return true;
  }
  /** {@inheritDoc} */
  @Override
  public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
    writer.setBuffer(buf);

    if (!super.writeTo(buf, writer)) return false;

    if (!writer.isHeaderWritten()) {
      if (!writer.writeHeader(directType(), fieldsCount())) return false;

      writer.onHeaderWritten();
    }

    switch (writer.state()) {
      case 3:
        if (!writer.writeMessage("conflictExpireTimes", conflictExpireTimes)) return false;

        writer.incrementState();

      case 4:
        if (!writer.writeMessage("conflictTtls", conflictTtls)) return false;

        writer.incrementState();

      case 5:
        if (!writer.writeCollection("conflictVers", conflictVers, MessageCollectionItemType.MSG))
          return false;

        writer.incrementState();

      case 6:
        if (!writer.writeCollection(
            "entryProcessorsBytes", entryProcessorsBytes, MessageCollectionItemType.BYTE_ARR))
          return false;

        writer.incrementState();

      case 7:
        if (!writer.writeByteArray("expiryPlcBytes", expiryPlcBytes)) return false;

        writer.incrementState();

      case 8:
        if (!writer.writeBoolean("fastMap", fastMap)) return false;

        writer.incrementState();

      case 9:
        if (!writer.writeObjectArray("filter", filter, MessageCollectionItemType.MSG)) return false;

        writer.incrementState();

      case 10:
        if (!writer.writeMessage("futVer", futVer)) return false;

        writer.incrementState();

      case 11:
        if (!writer.writeBoolean("hasPrimary", hasPrimary)) return false;

        writer.incrementState();

      case 12:
        if (!writer.writeObjectArray(
            "invokeArgsBytes", invokeArgsBytes, MessageCollectionItemType.BYTE_ARR)) return false;

        writer.incrementState();

      case 13:
        if (!writer.writeCollection("keys", keys, MessageCollectionItemType.MSG)) return false;

        writer.incrementState();

      case 14:
        if (!writer.writeByte("op", op != null ? (byte) op.ordinal() : -1)) return false;

        writer.incrementState();

      case 15:
        if (!writer.writeBoolean("retval", retval)) return false;

        writer.incrementState();

      case 16:
        if (!writer.writeBoolean("skipStore", skipStore)) return false;

        writer.incrementState();

      case 17:
        if (!writer.writeUuid("subjId", subjId)) return false;

        writer.incrementState();

      case 18:
        if (!writer.writeByte("syncMode", syncMode != null ? (byte) syncMode.ordinal() : -1))
          return false;

        writer.incrementState();

      case 19:
        if (!writer.writeInt("taskNameHash", taskNameHash)) return false;

        writer.incrementState();

      case 20:
        if (!writer.writeMessage("topVer", topVer)) return false;

        writer.incrementState();

      case 21:
        if (!writer.writeMessage("updateVer", updateVer)) return false;

        writer.incrementState();

      case 22:
        if (!writer.writeCollection("vals", vals, MessageCollectionItemType.MSG)) return false;

        writer.incrementState();
    }

    return true;
  }
  /** {@inheritDoc} */
  @Override
  public boolean writeTo(ByteBuffer buf, MessageWriter writer) {
    writer.setBuffer(buf);

    if (!super.writeTo(buf, writer)) return false;

    if (!writer.isHeaderWritten()) {
      if (!writer.writeHeader(directType(), fieldsCount())) return false;

      writer.onHeaderWritten();
    }

    switch (writer.state()) {
      case 8:
        if (!writer.writeByte(
            "concurrency", concurrency != null ? (byte) concurrency.ordinal() : -1)) return false;

        writer.incrementState();

      case 9:
        if (!writer.writeCollection("dhtVerKeys", dhtVerKeys, MessageCollectionItemType.MSG))
          return false;

        writer.incrementState();

      case 10:
        if (!writer.writeCollection("dhtVerVals", dhtVerVals, MessageCollectionItemType.MSG))
          return false;

        writer.incrementState();

      case 11:
        if (!writer.writeByteArray("grpLockKeyBytes", grpLockKeyBytes)) return false;

        writer.incrementState();

      case 12:
        if (!writer.writeBoolean("invalidate", invalidate)) return false;

        writer.incrementState();

      case 13:
        if (!writer.writeByte("isolation", isolation != null ? (byte) isolation.ordinal() : -1))
          return false;

        writer.incrementState();

      case 14:
        if (!writer.writeBoolean("onePhaseCommit", onePhaseCommit)) return false;

        writer.incrementState();

      case 15:
        if (!writer.writeBoolean("partLock", partLock)) return false;

        writer.incrementState();

      case 16:
        if (!writer.writeByte("plc", plc != null ? (byte) plc.ordinal() : -1)) return false;

        writer.incrementState();

      case 17:
        if (!writer.writeCollection("reads", reads, MessageCollectionItemType.MSG)) return false;

        writer.incrementState();

      case 18:
        if (!writer.writeBoolean("sys", sys)) return false;

        writer.incrementState();

      case 19:
        if (!writer.writeLong("threadId", threadId)) return false;

        writer.incrementState();

      case 20:
        if (!writer.writeLong("timeout", timeout)) return false;

        writer.incrementState();

      case 21:
        if (!writer.writeByteArray("txNodesBytes", txNodesBytes)) return false;

        writer.incrementState();

      case 22:
        if (!writer.writeInt("txSize", txSize)) return false;

        writer.incrementState();

      case 23:
        if (!writer.writeMessage("writeVer", writeVer)) return false;

        writer.incrementState();

      case 24:
        if (!writer.writeCollection("writes", writes, MessageCollectionItemType.MSG)) return false;

        writer.incrementState();
    }

    return true;
  }