/*
* Copyright 2012 NGDATA nv
*
* Licensed 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.lilyproject.util.repo.test;
import java.io.IOException;
import java.util.List;
import java.util.UUID;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Before;
import org.junit.Test;
import org.lilyproject.repository.api.IdGenerator;
import org.lilyproject.repository.api.SchemaId;
import org.lilyproject.repository.impl.id.IdGeneratorImpl;
import org.lilyproject.repository.impl.id.SchemaIdImpl;
import org.lilyproject.util.repo.RecordEvent;
import org.lilyproject.util.repo.RecordEvent.FieldChange;
import org.lilyproject.util.repo.RecordEvent.IndexRecordFilterData;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
public class RecordEventTest {
private IdGenerator idGenerator;
@Before
public void setUp() {
this.idGenerator = new IdGeneratorImpl();
}
@Test
public void testRecordEvent_JsonRoundTrip() throws Exception {
RecordEvent event = new RecordEvent();
byte[] json = event.toJsonBytes();
event = new RecordEvent(json, idGenerator);
assertNull(event.getIndexRecordFilterData());
SchemaId oldRtId = idGenerator.getSchemaId(UUID.randomUUID());
SchemaId newRtId = idGenerator.getSchemaId(UUID.randomUUID());
RecordEvent.IndexRecordFilterData idxSel = new RecordEvent.IndexRecordFilterData();
event.setIndexRecordFilterData(idxSel);
idxSel.setOldRecordType(oldRtId);
idxSel.setNewRecordType(newRtId);
json = event.toJsonBytes();
event = new RecordEvent(json, idGenerator);
assertNotNull(event.getIndexRecordFilterData());
assertEquals(oldRtId, event.getIndexRecordFilterData().getOldRecordType());
assertEquals(newRtId, event.getIndexRecordFilterData().getNewRecordType());
assertNull(event.getIndexRecordFilterData().getFieldChanges());
SchemaId field1Id = idGenerator.getSchemaId(UUID.randomUUID());
SchemaId field2Id = idGenerator.getSchemaId(UUID.randomUUID());
SchemaId field3Id = idGenerator.getSchemaId(UUID.randomUUID());
SchemaId field4Id = idGenerator.getSchemaId(UUID.randomUUID());
event = new RecordEvent();
idxSel = new RecordEvent.IndexRecordFilterData();
event.setIndexRecordFilterData(idxSel);
idxSel.addChangedField(field1Id, null, null);
idxSel.addChangedField(field2Id, Bytes.toBytes("foo1"), Bytes.toBytes("foo2"));
idxSel.addChangedField(field3Id, Bytes.toBytes("foo3"), null);
idxSel.addChangedField(field4Id, null, Bytes.toBytes("foo4"));
json = event.toJsonBytes();
event = new RecordEvent(json, idGenerator);
List<RecordEvent.FieldChange> fieldChanges = event.getIndexRecordFilterData().getFieldChanges();
assertEquals(4, fieldChanges.size());
assertEquals(field1Id, fieldChanges.get(0).getId());
assertNull(fieldChanges.get(0).getOldValue());
assertNull(fieldChanges.get(0).getNewValue());
assertEquals(field2Id, fieldChanges.get(1).getId());
assertArrayEquals(Bytes.toBytes("foo1"), fieldChanges.get(1).getOldValue());
assertArrayEquals(Bytes.toBytes("foo2"), fieldChanges.get(1).getNewValue());
assertEquals(field3Id, fieldChanges.get(2).getId());
assertArrayEquals(Bytes.toBytes("foo3"), fieldChanges.get(2).getOldValue());
assertNull(null, fieldChanges.get(2).getNewValue());
assertEquals(field4Id, fieldChanges.get(3).getId());
assertNull(fieldChanges.get(3).getOldValue());
assertArrayEquals(Bytes.toBytes("foo4"), fieldChanges.get(3).getNewValue());
}
@Test
public void testRecordEvent_JsonRoundtrip_TableName() throws IOException {
final String tableName = "_table_name_";
RecordEvent recordEvent = new RecordEvent();
recordEvent.setTableName(tableName);
byte[] jsonBytes = recordEvent.toJsonBytes();
RecordEvent deserialized = new RecordEvent(jsonBytes, idGenerator);
assertEquals(tableName, deserialized.getTableName());
}
@Test
public void testIndexRecordFilterData_JsonRoundtrip() {
IndexRecordFilterData recordFilterData = new IndexRecordFilterData();
SchemaId newTypeSchemaId = new SchemaIdImpl("newtype".getBytes());
SchemaId oldTypeSchemaId = new SchemaIdImpl("oldtype".getBytes());
SchemaId changedFieldId = new SchemaIdImpl("changedfield".getBytes());
byte[] oldFieldValue = new byte[] { 1 };
byte[] newFieldValue = new byte[] { 2 };
recordFilterData.setNewRecordExists(true);
recordFilterData.setOldRecordExists(true);
recordFilterData.setNewRecordType(newTypeSchemaId);
recordFilterData.setOldRecordType(oldTypeSchemaId);
recordFilterData.addChangedField(changedFieldId, oldFieldValue, newFieldValue);
IndexRecordFilterData deserialized = doJsonRoundtrip(recordFilterData);
assertTrue(deserialized.getNewRecordExists());
assertTrue(deserialized.getOldRecordExists());
assertEquals(newTypeSchemaId, deserialized.getNewRecordType());
assertEquals(oldTypeSchemaId, deserialized.getOldRecordType());
List<FieldChange> fieldChanges = deserialized.getFieldChanges();
assertEquals(1, fieldChanges.size());
FieldChange fieldChange = fieldChanges.get(0);
assertEquals(changedFieldId, fieldChange.getId());
assertArrayEquals(oldFieldValue, fieldChange.getOldValue());
assertArrayEquals(newFieldValue, fieldChange.getNewValue());
assertEquals(recordFilterData, deserialized);
}
@Test
public void testIndexRecordFilterData_JsonRoundtrip_IncludeIndexes() {
IndexRecordFilterData filterData = new IndexRecordFilterData();
filterData.setSubscriptionInclusions(Sets.newHashSet("indexA", "indexB"));
assertEquals(filterData, doJsonRoundtrip(filterData));
}
@Test
public void testIndexRecordFilterData_JsonRoundtrip_ExcludeIndexes() {
IndexRecordFilterData filterData = new IndexRecordFilterData();
filterData.setSubscriptionExclusions(Sets.newHashSet("indexA", "indexB"));
assertEquals(filterData, doJsonRoundtrip(filterData));
}
@Test
public void testAppliesToSubscription_DefaultCase() {
IndexRecordFilterData filterData = new IndexRecordFilterData();
assertTrue(filterData.appliesToSubscription("indexname"));
}
@Test
public void testAppliesToSubscription_AllInclusive() {
IndexRecordFilterData filterData = new IndexRecordFilterData();
filterData.setSubscriptionInclusions(IndexRecordFilterData.ALL_INDEX_SUBSCRIPTIONS);
assertTrue(filterData.appliesToSubscription("indexname"));
}
@Test
public void testAppliesToSubscription_AllExclusive() {
IndexRecordFilterData filterData = new IndexRecordFilterData();
filterData.setSubscriptionExclusions(IndexRecordFilterData.ALL_INDEX_SUBSCRIPTIONS);
assertFalse(filterData.appliesToSubscription("indexname"));
}
@Test
public void testAppliesToSubscription_Included() {
IndexRecordFilterData filterData = new IndexRecordFilterData();
filterData.setSubscriptionInclusions(ImmutableSet.of("to_include"));
assertTrue(filterData.appliesToSubscription("to_include"));
}
@Test
public void testAppliesToSubscription_Excluded() {
IndexRecordFilterData filterData = new IndexRecordFilterData();
filterData.setSubscriptionExclusions(ImmutableSet.of("to_exclude"));
assertFalse(filterData.appliesToSubscription("to_exclude"));
}
@Test
public void testAppliesToSubcription_NotExcluded() {
IndexRecordFilterData filterData = new IndexRecordFilterData();
filterData.setSubscriptionExclusions(ImmutableSet.of("to_exclude"));
assertTrue(filterData.appliesToSubscription("not_excluded"));
}
@Test
public void testAppliesToSubscription_NotIncluded() {
IndexRecordFilterData filterData = new IndexRecordFilterData();
filterData.setSubscriptionInclusions(ImmutableSet.of("to_include"));
assertFalse(filterData.appliesToSubscription("not_included"));
}
private IndexRecordFilterData doJsonRoundtrip(IndexRecordFilterData recordFilterData) {
RecordEvent recordEvent = new RecordEvent();
recordEvent.setIndexRecordFilterData(recordFilterData);
RecordEvent deserializedEvent;
try {
deserializedEvent = new RecordEvent(recordEvent.toJsonBytes(), idGenerator);
} catch (IOException e) {
throw new RuntimeException(e);
}
return deserializedEvent.getIndexRecordFilterData();
}
}