@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); }
@Override protected <T> byte[] toByteArray(T message, Schema<T> schema) { return SmileIOUtil.toByteArray(message, schema, false); }