/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.kafka.common.record; import org.apache.kafka.common.utils.ByteBufferOutputStream; import org.apache.kafka.common.utils.Utils; import org.junit.Test; import java.io.DataOutputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import static org.junit.Assert.assertFalse; import static org.junit.Assert.fail; public class SimpleLegacyRecordTest { @Test(expected = InvalidRecordException.class) public void testCompressedIterationWithNullValue() throws Exception { ByteBuffer buffer = ByteBuffer.allocate(128); DataOutputStream out = new DataOutputStream(new ByteBufferOutputStream(buffer)); AbstractLegacyRecordBatch.writeHeader(out, 0L, LegacyRecord.RECORD_OVERHEAD_V1); LegacyRecord.write(out, RecordBatch.MAGIC_VALUE_V1, 1L, (byte[]) null, null, CompressionType.GZIP, TimestampType.CREATE_TIME); buffer.flip(); MemoryRecords records = MemoryRecords.readableRecords(buffer); if (records.records().iterator().hasNext()) fail("Iteration should have caused invalid record error"); } @Test(expected = InvalidRecordException.class) public void testCompressedIterationWithEmptyRecords() throws Exception { ByteBuffer emptyCompressedValue = ByteBuffer.allocate(64); OutputStream gzipOutput = CompressionType.GZIP.wrapForOutput(new ByteBufferOutputStream(emptyCompressedValue), RecordBatch.MAGIC_VALUE_V1, 64); gzipOutput.close(); emptyCompressedValue.flip(); ByteBuffer buffer = ByteBuffer.allocate(128); DataOutputStream out = new DataOutputStream(new ByteBufferOutputStream(buffer)); AbstractLegacyRecordBatch.writeHeader(out, 0L, LegacyRecord.RECORD_OVERHEAD_V1 + emptyCompressedValue.remaining()); LegacyRecord.write(out, RecordBatch.MAGIC_VALUE_V1, 1L, null, Utils.toArray(emptyCompressedValue), CompressionType.GZIP, TimestampType.CREATE_TIME); buffer.flip(); MemoryRecords records = MemoryRecords.readableRecords(buffer); if (records.records().iterator().hasNext()) fail("Iteration should have caused invalid record error"); } /* This scenario can happen if the record size field is corrupt and we end up allocating a buffer that is too small */ @Test(expected = InvalidRecordException.class) public void testIsValidWithTooSmallBuffer() { ByteBuffer buffer = ByteBuffer.allocate(2); LegacyRecord record = new LegacyRecord(buffer); assertFalse(record.isValid()); record.ensureValid(); } @Test(expected = InvalidRecordException.class) public void testIsValidWithChecksumMismatch() { ByteBuffer buffer = ByteBuffer.allocate(4); // set checksum buffer.putInt(2); LegacyRecord record = new LegacyRecord(buffer); assertFalse(record.isValid()); record.ensureValid(); } }