@Override
  protected <T> void roundTrip(T message, Schema<T> schema, Pipe.Schema<T> pipeSchema)
      throws Exception {
    byte[] smile = SmileIOUtil.toByteArray(message, schema, false);

    ByteArrayInputStream smileStream = new ByteArrayInputStream(smile);

    byte[] protostuff =
        ProtostuffIOUtil.toByteArray(
            SmileIOUtil.newPipe(smile, 0, smile.length, false), pipeSchema, buf());

    byte[] protostuffFromStream =
        ProtostuffIOUtil.toByteArray(SmileIOUtil.newPipe(smileStream, false), pipeSchema, buf());

    assertTrue(Arrays.equals(protostuff, protostuffFromStream));

    T parsedMessage = schema.newMessage();
    ProtostuffIOUtil.mergeFrom(protostuff, parsedMessage, schema);
    SerializableObjects.assertEquals(message, parsedMessage);

    ByteArrayInputStream protostuffStream = new ByteArrayInputStream(protostuff);

    byte[] smileRoundTrip =
        SmileIOUtil.toByteArray(
            ProtostuffIOUtil.newPipe(protostuff, 0, protostuff.length), pipeSchema, false);

    byte[] smileRoundTripFromStream =
        SmileIOUtil.toByteArray(ProtostuffIOUtil.newPipe(protostuffStream), pipeSchema, false);

    assertTrue(Arrays.equals(smileRoundTrip, smileRoundTripFromStream));

    assertTrue(smileRoundTrip.length == smile.length);

    // comment out since smile encodes strings differently when using direct
    // SmileGenerator.writeUTF8String() ... (w/c is only used when the pipe source
    // is binary and the utf8 is intact (e.g protostuff,protobuf)

    // THE reason is that even if the string provided is ascii, smile encodes it
    // as unicode. See line 1043 of SmileGenerator.
    // assertEquals(strSmileRoundTrip, STRING.deser(smile));

    // This will fail on some messages.
    T messageSmile = schema.newMessage();
    SmileIOUtil.mergeFrom(smile, messageSmile, schema, false);
    T messageSmileRoundTrip = schema.newMessage();
    SmileIOUtil.mergeFrom(smileRoundTrip, messageSmileRoundTrip, schema, false);

    assertEquals(messageSmile, messageSmileRoundTrip);
  }
  public static void roundTrip(Message message, Schema schema, Pipe.Schema pipeSchema)
      throws Exception {
    byte[] protobuf = ProtobufIOUtil.toByteArray(message, schema, buf());

    ByteArrayInputStream protobufStream = new ByteArrayInputStream(protobuf);

    byte[] protostuff =
        ProtostuffIOUtil.toByteArray(
            ProtobufIOUtil.newPipe(protobuf, 0, protobuf.length), pipeSchema, buf());

    byte[] protostuffFromStream =
        ProtostuffIOUtil.toByteArray(ProtobufIOUtil.newPipe(protobufStream), pipeSchema, buf());

    assertTrue(protostuff.length == protostuffFromStream.length);
    assertEquals(
        StringSerializer.STRING.deser(protostuff),
        StringSerializer.STRING.deser(protostuffFromStream));

    Message parsedMessage = (Message) schema.newMessage();
    ProtostuffIOUtil.mergeFrom(protostuff, parsedMessage, schema);
    SerializableObjects.assertEquals(message, parsedMessage);

    ByteArrayInputStream protostuffStream = new ByteArrayInputStream(protostuff);

    byte[] protobufRoundTrip =
        ProtobufIOUtil.toByteArray(
            ProtostuffIOUtil.newPipe(protostuff, 0, protostuff.length), pipeSchema, buf());

    byte[] protobufRoundTripFromStream =
        ProtobufIOUtil.toByteArray(ProtostuffIOUtil.newPipe(protostuffStream), pipeSchema, buf());

    assertTrue(protobufRoundTrip.length == protobufRoundTripFromStream.length);

    String strProtobufRoundTrip = StringSerializer.STRING.deser(protobufRoundTrip);

    assertEquals(strProtobufRoundTrip, StringSerializer.STRING.deser(protobufRoundTripFromStream));

    assertTrue(protobufRoundTrip.length == protobuf.length);

    assertEquals(strProtobufRoundTrip, StringSerializer.STRING.deser(protobuf));
  }