use of com.github.ambry.utils.ByteBufferInputStream in project ambry by linkedin.
the class MessageFormatInputStreamTest method messageFormatPutNoArgReadTest.
/**
* Test calling the no-arg read method
* @throws IOException
* @throws MessageFormatException
*/
@Test
public void messageFormatPutNoArgReadTest() throws Exception, MessageFormatException {
StoreKey key = new MockId("id1");
StoreKeyFactory keyFactory = new MockIdFactory();
short accountId = Utils.getRandomShort(TestUtils.RANDOM);
short containerId = Utils.getRandomShort(TestUtils.RANDOM);
BlobProperties prop = new BlobProperties(10, "servid", accountId, containerId, false);
byte[] encryptionKey = new byte[100];
new Random().nextBytes(encryptionKey);
byte[] usermetadata = new byte[1000];
new Random().nextBytes(usermetadata);
int blobContentSize = 2000;
byte[] data = new byte[blobContentSize];
new Random().nextBytes(data);
ByteBufferInputStream stream = new ByteBufferInputStream(ByteBuffer.wrap(data));
MessageFormatInputStream messageFormatStream = new PutMessageFormatInputStream(key, ByteBuffer.wrap(encryptionKey), prop, ByteBuffer.wrap(usermetadata), stream, blobContentSize, BlobType.DataBlob);
TestUtils.validateInputStreamContract(messageFormatStream);
TestUtils.readInputStreamAndValidateSize(messageFormatStream, messageFormatStream.getSize());
}
use of com.github.ambry.utils.ByteBufferInputStream in project ambry by linkedin.
the class ValidatingKeyConvertingTransformer method testDeprecatedMsg.
private void testDeprecatedMsg(short blobVersion, BlobType blobType, short headerVersionToUse) throws Exception {
MessageFormatRecord.headerVersionToUse = headerVersionToUse;
// MessageSievingInputStream contains put records for 2 valid blobs and 1 deprecated blob
// id1(put record for valid blob), id2(deprecated) and id3(put record for valid blob)
// create message stream for blob 1
StoreKey key1 = new MockId("id1");
short accountId1 = Utils.getRandomShort(RANDOM);
short containerId1 = Utils.getRandomShort(RANDOM);
BlobProperties prop1 = new BlobProperties(10, "servid1", accountId1, containerId1, false);
byte[] encryptionKey1 = new byte[100];
RANDOM.nextBytes(encryptionKey1);
byte[] usermetadata1 = new byte[1000];
RANDOM.nextBytes(usermetadata1);
int blobContentSize = 2000;
byte[] data1 = new byte[blobContentSize];
RANDOM.nextBytes(data1);
long blobSize = -1;
if (blobType == BlobType.DataBlob) {
blobSize = (int) Blob_Format_V2.getBlobRecordSize(blobContentSize);
} else {
ByteBuffer byteBufferBlob = MessageFormatTestUtils.getBlobContentForMetadataBlob(blobContentSize);
data1 = byteBufferBlob.array();
blobContentSize = data1.length;
blobSize = (int) Blob_Format_V2.getBlobRecordSize(blobContentSize);
}
ByteBufferInputStream stream1 = new ByteBufferInputStream(ByteBuffer.wrap(data1));
MessageFormatInputStream messageFormatStream1 = (blobVersion == Blob_Version_V2) ? new PutMessageFormatInputStream(key1, ByteBuffer.wrap(encryptionKey1), prop1, ByteBuffer.wrap(usermetadata1), stream1, blobContentSize, blobType) : new PutMessageFormatBlobV1InputStream(key1, prop1, ByteBuffer.wrap(usermetadata1), stream1, blobContentSize, blobType);
MessageInfo msgInfo1 = new MessageInfo(key1, messageFormatStream1.getSize(), accountId1, containerId1, prop1.getCreationTimeInMs());
// create message stream for blob 2
StoreKey key2 = new MockId("id2");
short accountId2 = Utils.getRandomShort(RANDOM);
short containerId2 = Utils.getRandomShort(RANDOM);
BlobProperties prop2 = new BlobProperties(10, "servid2", accountId2, containerId2, false);
byte[] encryptionKey2 = new byte[100];
RANDOM.nextBytes(encryptionKey2);
byte[] usermetadata2 = new byte[1000];
RANDOM.nextBytes(usermetadata2);
blobContentSize = 2000;
byte[] data2 = new byte[blobContentSize];
RANDOM.nextBytes(data2);
if (blobVersion == Blob_Version_V2 && blobType == BlobType.MetadataBlob) {
ByteBuffer byteBufferBlob = MessageFormatTestUtils.getBlobContentForMetadataBlob(blobContentSize);
data2 = byteBufferBlob.array();
blobContentSize = data2.length;
}
ByteBufferInputStream stream2 = new ByteBufferInputStream(ByteBuffer.wrap(data2));
MessageFormatInputStream messageFormatStream2 = (blobVersion == Blob_Version_V2) ? new PutMessageFormatInputStream(key2, ByteBuffer.wrap(encryptionKey2), prop2, ByteBuffer.wrap(usermetadata2), stream2, blobContentSize, blobType) : new PutMessageFormatBlobV1InputStream(key2, prop2, ByteBuffer.wrap(usermetadata2), stream2, blobContentSize, blobType);
MessageInfo msgInfo2 = new MessageInfo(key2, messageFormatStream2.getSize(), accountId2, containerId2, prop2.getCreationTimeInMs());
// Add the key for the second message to the discardable ones.
randomKeyConverter.addInvalids(Collections.singletonList(key2));
// create message stream for blob 3
StoreKey key3 = new MockId("id3");
short accountId3 = Utils.getRandomShort(RANDOM);
short containerId3 = Utils.getRandomShort(RANDOM);
BlobProperties prop3 = new BlobProperties(10, "servid3", accountId3, containerId3, false);
byte[] encryptionKey3 = new byte[100];
RANDOM.nextBytes(encryptionKey3);
byte[] usermetadata3 = new byte[1000];
RANDOM.nextBytes(usermetadata3);
blobContentSize = 2000;
byte[] data3 = new byte[blobContentSize];
RANDOM.nextBytes(data3);
if (blobVersion == Blob_Version_V2 && blobType == BlobType.MetadataBlob) {
ByteBuffer byteBufferBlob = MessageFormatTestUtils.getBlobContentForMetadataBlob(blobContentSize);
data3 = byteBufferBlob.array();
blobContentSize = data3.length;
}
ByteBufferInputStream stream3 = new ByteBufferInputStream(ByteBuffer.wrap(data3));
MessageFormatInputStream messageFormatStream3 = (blobVersion == Blob_Version_V2) ? new PutMessageFormatInputStream(key3, ByteBuffer.wrap(encryptionKey3), prop3, ByteBuffer.wrap(usermetadata3), stream3, blobContentSize, blobType) : new PutMessageFormatBlobV1InputStream(key3, prop3, ByteBuffer.wrap(usermetadata3), stream3, blobContentSize, blobType);
MessageInfo msgInfo3 = new MessageInfo(key3, messageFormatStream3.getSize(), accountId3, containerId3, prop3.getCreationTimeInMs());
// create input stream for all blob messages together
byte[] totalMessageStreamContent = new byte[(int) messageFormatStream1.getSize() + (int) messageFormatStream2.getSize() + (int) messageFormatStream3.getSize()];
messageFormatStream1.read(totalMessageStreamContent, 0, (int) messageFormatStream1.getSize());
messageFormatStream2.read(totalMessageStreamContent, (int) messageFormatStream1.getSize(), (int) messageFormatStream2.getSize());
messageFormatStream3.read(totalMessageStreamContent, (int) messageFormatStream1.getSize() + (int) messageFormatStream2.getSize(), (int) messageFormatStream3.getSize());
InputStream inputStream = new ByteBufferInputStream(ByteBuffer.wrap(totalMessageStreamContent));
List<MessageInfo> msgInfoList = new ArrayList<>();
msgInfoList.add(msgInfo1);
msgInfoList.add(msgInfo2);
msgInfoList.add(msgInfo3);
MessageSievingInputStream sievedStream = new MessageSievingInputStream(inputStream, msgInfoList, transformers, new MetricRegistry());
Map<StoreKey, StoreKey> convertedMap = randomKeyConverter.convert(Arrays.asList(key1, key2, key3));
int headerSize = MessageFormatRecord.getHeaderSizeForVersion(headerVersionToUse);
int blobPropertiesRecordSize = BlobProperties_Format_V1.getBlobPropertiesRecordSize(prop1);
int userMetadataSize = UserMetadata_Format_V1.getUserMetadataSize(ByteBuffer.wrap(usermetadata1));
int totalHeadSize = (options.contains(TransformerOptions.KeyConvert) ? 2 : 3) * headerSize;
int totalBlobPropertiesSize = (options.contains(TransformerOptions.KeyConvert) ? 2 : 3) * blobPropertiesRecordSize;
int totalUserMetadataSize = (options.contains(TransformerOptions.KeyConvert) ? 2 : 3) * userMetadataSize;
int totalBlobSize = (options.contains(TransformerOptions.KeyConvert) ? 2 : 3) * (int) blobSize;
int totalKeySize = options.contains(TransformerOptions.KeyConvert) ? convertedMap.get(key1).sizeInBytes() + convertedMap.get(key3).sizeInBytes() : key1.sizeInBytes() + key2.sizeInBytes() + key3.sizeInBytes();
int totalEncryptionRecordSize = blobVersion > Blob_Version_V1 ? BlobEncryptionKey_Format_V1.getBlobEncryptionKeyRecordSize(ByteBuffer.wrap(encryptionKey1)) + (options.contains(TransformerOptions.KeyConvert) ? 0 : BlobEncryptionKey_Format_V1.getBlobEncryptionKeyRecordSize(ByteBuffer.wrap(encryptionKey2))) + BlobEncryptionKey_Format_V1.getBlobEncryptionKeyRecordSize(ByteBuffer.wrap(encryptionKey3)) : 0;
if (!options.isEmpty()) {
if (options.contains(TransformerOptions.KeyConvert)) {
Assert.assertTrue(sievedStream.hasDeprecatedMessages());
}
Assert.assertEquals((int) sievedStream.getValidMessageInfoList().stream().mapToLong(MessageInfo::getSize).sum(), sievedStream.getSize());
Assert.assertEquals(options.isEmpty() ? totalMessageStreamContent.length : totalHeadSize + totalBlobPropertiesSize + totalUserMetadataSize + totalBlobSize + totalKeySize + totalEncryptionRecordSize, sievedStream.getSize());
verifySievedTransformedMessage(sievedStream, options.contains(TransformerOptions.KeyConvert) ? convertedMap.get(key1) : key1, "servid1", accountId1, containerId1, blobVersion > Blob_Version_V1 ? encryptionKey1 : null, usermetadata1, data1, blobVersion, blobType);
if (!options.contains(TransformerOptions.KeyConvert)) {
verifySievedTransformedMessage(sievedStream, key2, "servid2", accountId2, containerId2, blobVersion > Blob_Version_V1 ? encryptionKey2 : null, usermetadata2, data2, blobVersion, blobType);
}
verifySievedTransformedMessage(sievedStream, options.contains(TransformerOptions.KeyConvert) ? convertedMap.get(key3) : key3, "servid3", accountId3, containerId3, blobVersion > Blob_Version_V1 ? encryptionKey3 : null, usermetadata3, data3, blobVersion, blobType);
} else {
Assert.assertEquals(totalMessageStreamContent.length, sievedStream.getSize());
byte[] sievedBytes = Utils.readBytesFromStream(sievedStream, sievedStream.getSize());
Assert.assertArrayEquals(totalMessageStreamContent, sievedBytes);
}
Assert.assertEquals(-1, sievedStream.read());
}
use of com.github.ambry.utils.ByteBufferInputStream in project ambry by linkedin.
the class MessageFormatRecordTest method testBlobPropertyV1.
/**
* Tests {@link MessageFormatRecord#BlobProperties_Version_V1} for different versions of {@link BlobPropertiesSerDe}
* @throws IOException
* @throws MessageFormatException
*/
@Test
public void testBlobPropertyV1() throws IOException, MessageFormatException {
// Test Blob property Format V1 for all versions of BlobPropertiesSerDe
short[] versions = new short[] { VERSION_1, VERSION_2, VERSION_3, VERSION_4 };
for (short version : versions) {
BlobProperties properties;
long blobSize = TestUtils.RANDOM.nextLong();
long ttl = TestUtils.RANDOM.nextInt();
boolean isEncrypted = TestUtils.RANDOM.nextBoolean();
if (version == VERSION_1) {
properties = new BlobProperties(blobSize, "id", "member", "test", true, ttl, Account.UNKNOWN_ACCOUNT_ID, Container.UNKNOWN_CONTAINER_ID, isEncrypted, null, null, null);
} else {
short accountId = Utils.getRandomShort(TestUtils.RANDOM);
short containerId = Utils.getRandomShort(TestUtils.RANDOM);
properties = new BlobProperties(blobSize, "id", "member", "test", true, ttl, accountId, containerId, isEncrypted, null, "gzip", "filename");
}
ByteBuffer stream;
if (version == VERSION_1) {
stream = ByteBuffer.allocate(getBlobPropertiesV1RecordSize(properties));
serializeBlobPropertiesV1Record(stream, properties);
} else if (version == VERSION_2) {
stream = ByteBuffer.allocate(getBlobPropertiesV2RecordSize(properties));
serializeBlobPropertiesV2Record(stream, properties);
} else if (version == VERSION_3) {
stream = ByteBuffer.allocate(getBlobPropertiesV3RecordSize(properties));
serializeBlobPropertiesV3Record(stream, properties);
} else {
stream = ByteBuffer.allocate(getBlobPropertiesRecordSize(properties));
MessageFormatRecord.BlobProperties_Format_V1.serializeBlobPropertiesRecord(stream, properties);
}
stream.flip();
BlobProperties result = MessageFormatRecord.deserializeBlobProperties(new ByteBufferInputStream(stream));
Assert.assertEquals(properties.getBlobSize(), result.getBlobSize());
Assert.assertEquals(properties.getContentType(), result.getContentType());
Assert.assertEquals(properties.getCreationTimeInMs(), result.getCreationTimeInMs());
Assert.assertEquals(properties.getOwnerId(), result.getOwnerId());
Assert.assertEquals(properties.getServiceId(), result.getServiceId());
Assert.assertEquals(properties.getAccountId(), result.getAccountId());
Assert.assertEquals(properties.getContainerId(), result.getContainerId());
if (version > VERSION_2) {
Assert.assertEquals(properties.isEncrypted(), result.isEncrypted());
}
if (version > VERSION_3) {
Assert.assertEquals(properties.getContentEncoding(), result.getContentEncoding());
Assert.assertEquals(properties.getFilename(), result.getFilename());
}
// corrupt blob property V1 record
stream.flip();
stream.put(10, (byte) (stream.get(10) + 1));
try {
MessageFormatRecord.deserializeBlobProperties(new ByteBufferInputStream(stream));
fail("Deserialization of BlobProperties should have failed ");
} catch (MessageFormatException e) {
Assert.assertEquals(e.getErrorCode(), MessageFormatErrorCodes.Data_Corrupt);
}
}
// failure case
BlobProperties properties = new BlobProperties(1000, "id", "member", "test", true, Utils.Infinite_Time, Account.UNKNOWN_ACCOUNT_ID, Container.UNKNOWN_CONTAINER_ID, false, null, "gzip", "filename");
ByteBuffer stream = ByteBuffer.allocate(getBlobPropertiesRecordSize(properties) - 10);
try {
MessageFormatRecord.BlobProperties_Format_V1.serializeBlobPropertiesRecord(stream, properties);
Assert.fail("Serialization of BlobProperties should have failed since the buffer does not have sufficient space");
} catch (IllegalArgumentException e) {
}
}
use of com.github.ambry.utils.ByteBufferInputStream in project ambry by linkedin.
the class BlobPropertiesTest method basicTest.
@Test
public void basicTest() throws IOException {
int blobSize = 100;
String serviceId = "ServiceId";
String ownerId = "OwnerId";
String contentType = "ContentType";
String externalAssetTag = "some-external-asset-tag";
String contentEncoding = version == BlobPropertiesSerDe.VERSION_4 ? "gzip" : null;
String filename = version == BlobPropertiesSerDe.VERSION_4 ? "filename" : null;
int timeToLiveInSeconds = 144;
short accountId = Utils.getRandomShort(TestUtils.RANDOM);
short containerId = Utils.getRandomShort(TestUtils.RANDOM);
boolean isEncrypted = TestUtils.RANDOM.nextBoolean();
short accountIdToExpect = version == BlobPropertiesSerDe.VERSION_1 ? UNKNOWN_ACCOUNT_ID : accountId;
short containerIdToExpect = version == BlobPropertiesSerDe.VERSION_1 ? UNKNOWN_CONTAINER_ID : containerId;
boolean encryptFlagToExpect = version >= BlobPropertiesSerDe.VERSION_3 && isEncrypted;
String contentEncodingToExpect = contentEncoding;
String filenameToExpect = filename;
BlobProperties blobProperties = new BlobProperties(blobSize, serviceId, null, null, false, Utils.Infinite_Time, SystemTime.getInstance().milliseconds(), accountId, containerId, isEncrypted, externalAssetTag, null, null);
// Provide example of BlobProperties.toString()
System.out.println(blobProperties.toString());
ByteBuffer serializedBuffer = serializeBlobPropertiesInVersion(blobProperties);
blobProperties = BlobPropertiesSerDe.getBlobPropertiesFromStream(new DataInputStream(new ByteBufferInputStream(serializedBuffer)));
verifyBlobProperties(blobProperties, blobSize, serviceId, "", "", false, Utils.Infinite_Time, accountIdToExpect, containerIdToExpect, encryptFlagToExpect, null, null, null);
blobProperties = new BlobProperties(blobSize, serviceId, null, null, false, Utils.Infinite_Time, SystemTime.getInstance().milliseconds(), accountId, containerId, isEncrypted, externalAssetTag, contentEncoding, filename);
// Provide example of BlobProperties.toString()
System.out.println(blobProperties.toString());
serializedBuffer = serializeBlobPropertiesInVersion(blobProperties);
blobProperties = BlobPropertiesSerDe.getBlobPropertiesFromStream(new DataInputStream(new ByteBufferInputStream(serializedBuffer)));
verifyBlobProperties(blobProperties, blobSize, serviceId, "", "", false, Utils.Infinite_Time, accountIdToExpect, containerIdToExpect, encryptFlagToExpect, null, contentEncodingToExpect, filenameToExpect);
assertTrue(blobProperties.getCreationTimeInMs() > 0);
assertTrue(blobProperties.getCreationTimeInMs() <= System.currentTimeMillis());
blobProperties = new BlobProperties(blobSize, serviceId, null, null, false, Utils.Infinite_Time, SystemTime.getInstance().milliseconds(), accountId, containerId, isEncrypted, externalAssetTag, contentEncoding, filename);
serializedBuffer = serializeBlobPropertiesInVersion(blobProperties);
blobProperties = BlobPropertiesSerDe.getBlobPropertiesFromStream(new DataInputStream(new ByteBufferInputStream(serializedBuffer)));
verifyBlobProperties(blobProperties, blobSize, serviceId, "", "", false, Utils.Infinite_Time, accountIdToExpect, containerIdToExpect, encryptFlagToExpect, null, contentEncodingToExpect, filenameToExpect);
blobProperties = new BlobProperties(blobSize, serviceId, ownerId, contentType, true, timeToLiveInSeconds, accountId, containerId, isEncrypted, externalAssetTag, contentEncoding, filename);
// Provide example of BlobProperties.toString()
System.out.println(blobProperties.toString());
serializedBuffer = serializeBlobPropertiesInVersion(blobProperties);
blobProperties = BlobPropertiesSerDe.getBlobPropertiesFromStream(new DataInputStream(new ByteBufferInputStream(serializedBuffer)));
verifyBlobProperties(blobProperties, blobSize, serviceId, ownerId, contentType, true, timeToLiveInSeconds, accountIdToExpect, containerIdToExpect, encryptFlagToExpect, null, contentEncodingToExpect, filenameToExpect);
assertTrue(blobProperties.getCreationTimeInMs() > 0);
assertTrue(blobProperties.getCreationTimeInMs() <= System.currentTimeMillis());
long creationTimeMs = SystemTime.getInstance().milliseconds();
blobProperties = new BlobProperties(blobSize, serviceId, ownerId, contentType, true, timeToLiveInSeconds, creationTimeMs, accountId, containerId, isEncrypted, "some-external-asset-tag", contentEncoding, filename);
// Provide example of BlobProperties.toString()
System.out.println(blobProperties.toString());
serializedBuffer = serializeBlobPropertiesInVersion(blobProperties);
blobProperties = BlobPropertiesSerDe.getBlobPropertiesFromStream(new DataInputStream(new ByteBufferInputStream(serializedBuffer)));
verifyBlobProperties(blobProperties, blobSize, serviceId, ownerId, contentType, true, timeToLiveInSeconds, accountIdToExpect, containerIdToExpect, encryptFlagToExpect, null, contentEncodingToExpect, filenameToExpect);
assertEquals(blobProperties.getCreationTimeInMs(), creationTimeMs);
long creationTimeInSecs = TimeUnit.MILLISECONDS.toSeconds(creationTimeMs);
// valid TTLs
long[] validTTLs = new long[] { TimeUnit.HOURS.toSeconds(1), TimeUnit.HOURS.toSeconds(10), TimeUnit.HOURS.toSeconds(100), TimeUnit.DAYS.toSeconds(1), TimeUnit.DAYS.toSeconds(10), TimeUnit.DAYS.toSeconds(100), TimeUnit.DAYS.toSeconds(30 * 12), TimeUnit.DAYS.toSeconds(30 * 12 * 10), Integer.MAX_VALUE - creationTimeInSecs - 1, Integer.MAX_VALUE - creationTimeInSecs, Integer.MAX_VALUE - creationTimeInSecs + 1, Integer.MAX_VALUE - creationTimeInSecs + 100, Integer.MAX_VALUE - creationTimeInSecs + 10000 };
for (long ttl : validTTLs) {
blobProperties = new BlobProperties(blobSize, serviceId, ownerId, contentType, true, ttl, creationTimeMs, accountId, containerId, isEncrypted, null, contentEncoding, filename);
serializedBuffer = serializeBlobPropertiesInVersion(blobProperties);
blobProperties = BlobPropertiesSerDe.getBlobPropertiesFromStream(new DataInputStream(new ByteBufferInputStream(serializedBuffer)));
verifyBlobProperties(blobProperties, blobSize, serviceId, ownerId, contentType, true, ttl, accountIdToExpect, containerIdToExpect, encryptFlagToExpect, null, contentEncodingToExpect, filenameToExpect);
}
blobProperties = new BlobProperties(blobSize, serviceId, null, null, false, timeToLiveInSeconds, creationTimeMs, accountId, containerId, isEncrypted, externalAssetTag, contentEncoding, filename);
verifyBlobProperties(blobProperties, blobSize, serviceId, null, null, false, timeToLiveInSeconds, accountId, containerId, isEncrypted, externalAssetTag, contentEncodingToExpect, filenameToExpect);
blobProperties.setTimeToLiveInSeconds(timeToLiveInSeconds + 1);
verifyBlobProperties(blobProperties, blobSize, serviceId, null, null, false, timeToLiveInSeconds + 1, accountId, containerId, isEncrypted, externalAssetTag, contentEncodingToExpect, filenameToExpect);
serializedBuffer = serializeBlobPropertiesInVersion(blobProperties);
blobProperties = BlobPropertiesSerDe.getBlobPropertiesFromStream(new DataInputStream(new ByteBufferInputStream(serializedBuffer)));
verifyBlobProperties(blobProperties, blobSize, serviceId, "", "", false, timeToLiveInSeconds + 1, accountIdToExpect, containerIdToExpect, encryptFlagToExpect, null, contentEncodingToExpect, filenameToExpect);
blobProperties.setBlobSize(blobSize + 1);
verifyBlobProperties(blobProperties, blobSize + 1, serviceId, "", "", false, timeToLiveInSeconds + 1, accountIdToExpect, containerIdToExpect, encryptFlagToExpect, null, contentEncodingToExpect, filenameToExpect);
serializedBuffer = serializeBlobPropertiesInVersion(blobProperties);
blobProperties = BlobPropertiesSerDe.getBlobPropertiesFromStream(new DataInputStream(new ByteBufferInputStream(serializedBuffer)));
verifyBlobProperties(blobProperties, blobSize + 1, serviceId, "", "", false, timeToLiveInSeconds + 1, accountIdToExpect, containerIdToExpect, encryptFlagToExpect, null, contentEncodingToExpect, filenameToExpect);
}
use of com.github.ambry.utils.ByteBufferInputStream in project ambry by linkedin.
the class MessageFormatRecordTest method testUpdateRecordV2.
/**
* Tests UpdateRecord V2 for serialization and deserialization
* @throws IOException
* @throws MessageFormatException
*/
@Test
public void testUpdateRecordV2() throws IOException, MessageFormatException {
// Test update V2 record
ByteBuffer updateRecord = ByteBuffer.allocate(Update_Format_V2.getRecordSize());
short accountId = Utils.getRandomShort(TestUtils.RANDOM);
short containerId = Utils.getRandomShort(TestUtils.RANDOM);
long updateTimeMs = SystemTime.getInstance().milliseconds() + TestUtils.RANDOM.nextInt();
Update_Format_V2.serialize(updateRecord, new UpdateRecord(accountId, containerId, updateTimeMs, new DeleteSubRecord()));
updateRecord.flip();
UpdateRecord deserializeUpdateRecord = MessageFormatRecord.deserializeUpdateRecord(new ByteBufferInputStream(updateRecord));
Assert.assertEquals("AccountId mismatch ", accountId, deserializeUpdateRecord.getAccountId());
Assert.assertEquals("ContainerId mismatch ", containerId, deserializeUpdateRecord.getContainerId());
Assert.assertEquals("DeletionTime mismatch ", updateTimeMs, deserializeUpdateRecord.getUpdateTimeInMs());
Assert.assertEquals("Type of update record incorrect", SubRecord.Type.DELETE, deserializeUpdateRecord.getType());
Assert.assertNotNull("DeleteSubRecord is null", deserializeUpdateRecord.getDeleteSubRecord());
// corrupt update V2 record
updateRecord.flip();
byte toCorrupt = updateRecord.get(10);
updateRecord.put(10, (byte) (toCorrupt + 1));
try {
MessageFormatRecord.deserializeUpdateRecord(new ByteBufferInputStream(updateRecord));
fail("Deserialization of a corrupt update record V2 should have failed ");
} catch (MessageFormatException e) {
Assert.assertEquals(e.getErrorCode(), MessageFormatErrorCodes.Data_Corrupt);
}
}
Aggregations