@Test public void testBufferCopy() throws Exception { MessageEncoder<Record> encoder = new BinaryMessageEncoder<>(GenericData.get(), SCHEMA_V1); ByteBuffer b0 = encoder.encode(V1_RECORDS.get(0)); ByteBuffer b1 = encoder.encode(V1_RECORDS.get(1)); Assert.assertNotEquals(b0.array(), b1.array()); MessageDecoder<Record> decoder = new BinaryMessageDecoder<>(GenericData.get(), SCHEMA_V1); // bytes are not changed by reusing the encoder Assert.assertEquals("Buffer was copied, decode(b0) should be record 0", V1_RECORDS.get(0), decoder.decode(b0)); }
@Test(expected = BadHeaderException.class) public void testByteBufferMissingFullHeader() throws Exception { MessageEncoder<Record> encoder = new BinaryMessageEncoder<>(GenericData.get(), SCHEMA_V2); MessageDecoder<Record> decoder = new BinaryMessageDecoder<>(GenericData.get(), SCHEMA_V2); ByteBuffer buffer = encoder.encode(V2_RECORDS.get(0)); buffer.limit(8); decoder.decode(buffer); }
@Test(expected = BadHeaderException.class) public void testByteBufferBadVersionByte() throws Exception { MessageEncoder<Record> encoder = new BinaryMessageEncoder<>(GenericData.get(), SCHEMA_V2); MessageDecoder<Record> decoder = new BinaryMessageDecoder<>(GenericData.get(), SCHEMA_V2); ByteBuffer buffer = encoder.encode(V2_RECORDS.get(0)); buffer.array()[1] = 0x00; decoder.decode(buffer); }
@Test public void testBufferReuse() throws Exception { // This test depends on the serialized version of record 1 being smaller or // the same size as record 0 so that the reused ByteArrayOutputStream won't // expand its internal buffer. MessageEncoder<Record> encoder = new BinaryMessageEncoder<>(GenericData.get(), SCHEMA_V1, false); ByteBuffer b0 = encoder.encode(V1_RECORDS.get(0)); ByteBuffer b1 = encoder.encode(V1_RECORDS.get(1)); Assert.assertEquals(b0.array(), b1.array()); MessageDecoder<Record> decoder = new BinaryMessageDecoder<>(GenericData.get(), SCHEMA_V1); Assert.assertEquals("Buffer was reused, decode(b0) should be record 1", V1_RECORDS.get(1), decoder.decode(b0)); }
@Test(expected = BadHeaderException.class) public void testByteBufferBadMarkerByte() throws Exception { MessageEncoder<Record> encoder = new BinaryMessageEncoder<>(GenericData.get(), SCHEMA_V2); MessageDecoder<Record> decoder = new BinaryMessageDecoder<>(GenericData.get(), SCHEMA_V2); ByteBuffer buffer = encoder.encode(V2_RECORDS.get(0)); buffer.array()[0] = 0x00; decoder.decode(buffer); }
@Test(expected = AvroRuntimeException.class) public void testByteBufferMissingPayload() throws Exception { MessageEncoder<Record> encoder = new BinaryMessageEncoder<>(GenericData.get(), SCHEMA_V2); MessageDecoder<Record> decoder = new BinaryMessageDecoder<>(GenericData.get(), SCHEMA_V2); ByteBuffer buffer = encoder.encode(V2_RECORDS.get(0)); buffer.limit(12); decoder.decode(buffer); }
@Test(expected = MissingSchemaException.class) public void testByteBufferUnknownSchema() throws Exception { MessageEncoder<Record> encoder = new BinaryMessageEncoder<>(GenericData.get(), SCHEMA_V2); MessageDecoder<Record> decoder = new BinaryMessageDecoder<>(GenericData.get(), SCHEMA_V2); ByteBuffer buffer = encoder.encode(V2_RECORDS.get(0)); buffer.array()[4] = 0x00; decoder.decode(buffer); } }
@Test public void testByteBufferRoundTrip() throws Exception { MessageEncoder<Record> encoder = new BinaryMessageEncoder<>(GenericData.get(), SCHEMA_V2); MessageDecoder<Record> decoder = new BinaryMessageDecoder<>(GenericData.get(), SCHEMA_V2); Record copy = decoder.decode(encoder.encode(V2_RECORDS.get(0))); Assert.assertNotSame("Copy should not be the same object", copy, V2_RECORDS.get(0)); Assert.assertEquals("Record should be identical after round-trip", V2_RECORDS.get(0), copy); }
@Test(expected = BadHeaderException.class) public void testByteBufferMissingFullHeader() throws Exception { MessageEncoder<Record> encoder = new IcebergEncoder<>(SCHEMA_V2); MessageDecoder<Record> decoder = new IcebergDecoder<>(SCHEMA_V2); ByteBuffer buffer = encoder.encode(V2_RECORDS.get(0)); buffer.limit(8); decoder.decode(buffer); }
@Test(expected = MissingSchemaException.class) public void testByteBufferUnknownSchema() throws Exception { MessageEncoder<Record> encoder = new IcebergEncoder<>(SCHEMA_V2); MessageDecoder<Record> decoder = new IcebergDecoder<>(SCHEMA_V2); ByteBuffer buffer = encoder.encode(V2_RECORDS.get(0)); buffer.array()[4] = 0x00; decoder.decode(buffer); } }
@Test(expected = AvroRuntimeException.class) public void testByteBufferMissingPayload() throws Exception { MessageEncoder<Record> encoder = new IcebergEncoder<>(SCHEMA_V2); MessageDecoder<Record> decoder = new IcebergDecoder<>(SCHEMA_V2); ByteBuffer buffer = encoder.encode(V2_RECORDS.get(0)); buffer.limit(12); decoder.decode(buffer); }
@Test(expected = BadHeaderException.class) public void testByteBufferBadMarkerByte() throws Exception { MessageEncoder<Record> encoder = new IcebergEncoder<>(SCHEMA_V2); MessageDecoder<Record> decoder = new IcebergDecoder<>(SCHEMA_V2); ByteBuffer buffer = encoder.encode(V2_RECORDS.get(0)); buffer.array()[0] = 0x00; decoder.decode(buffer); }
@Test(expected = BadHeaderException.class) public void testByteBufferBadVersionByte() throws Exception { MessageEncoder<Record> encoder = new IcebergEncoder<>(SCHEMA_V2); MessageDecoder<Record> decoder = new IcebergDecoder<>(SCHEMA_V2); ByteBuffer buffer = encoder.encode(V2_RECORDS.get(0)); buffer.array()[1] = 0x00; decoder.decode(buffer); }
@Test public void testBufferCopy() throws Exception { MessageEncoder<Record> encoder = new IcebergEncoder<>(SCHEMA_V1); ByteBuffer b0 = encoder.encode(V1_RECORDS.get(0)); ByteBuffer b1 = encoder.encode(V1_RECORDS.get(1)); Assert.assertNotEquals(b0.array(), b1.array()); MessageDecoder<Record> decoder = new IcebergDecoder<>(SCHEMA_V1); // bytes are not changed by reusing the encoder Assert.assertEquals("Buffer was copied, decode(b0) should be record 0", V1_RECORDS.get(0), decoder.decode(b0)); }
@Test public void testBufferReuse() throws Exception { // This test depends on the serialized version of record 1 being smaller or // the same size as record 0 so that the reused ByteArrayOutputStream won't // expand its internal buffer. MessageEncoder<Record> encoder = new IcebergEncoder<>(SCHEMA_V1, false); ByteBuffer b0 = encoder.encode(V1_RECORDS.get(0)); ByteBuffer b1 = encoder.encode(V1_RECORDS.get(1)); Assert.assertEquals(b0.array(), b1.array()); MessageDecoder<Record> decoder = new IcebergDecoder<>(SCHEMA_V1); Assert.assertEquals("Buffer was reused, decode(b0) should be record 1", V1_RECORDS.get(1), decoder.decode(b0)); }
@Test public void testByteBufferRoundTrip() throws Exception { MessageEncoder<Record> encoder = new IcebergEncoder<>(SCHEMA_V2); MessageDecoder<Record> decoder = new IcebergDecoder<>(SCHEMA_V2); Record copy = decoder.decode(encoder.encode(V2_RECORDS.get(0))); Assert.assertTrue("Copy should not be the same object", copy != V2_RECORDS.get(0)); Assert.assertEquals("Record should be identical after round-trip", V2_RECORDS.get(0), copy); }
@Test(expected = MissingSchemaException.class) public void testCompatibleReadFailsWithoutSchema() throws Exception { MessageEncoder<Record> v1Encoder = new IcebergEncoder<>(SCHEMA_V1); MessageDecoder<Record> v2Decoder = new IcebergDecoder<>(SCHEMA_V2); ByteBuffer v1Buffer = v1Encoder.encode(V1_RECORDS.get(3)); v2Decoder.decode(v1Buffer); }