/* * Copyright 2014 Cloudera, Inc. * * 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.kitesdk.data.spi; import org.apache.avro.Schema; import org.apache.avro.SchemaBuilder; import org.apache.avro.generic.GenericData; import org.apache.avro.generic.GenericDatumReader; import org.apache.avro.io.DatumReader; import org.apache.avro.reflect.ReflectData; import org.apache.avro.reflect.ReflectDatumReader; import org.apache.avro.specific.SpecificData; import org.apache.avro.specific.SpecificDatumReader; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import org.junit.Test; import org.kitesdk.data.event.ReflectSmallEvent; import org.kitesdk.data.event.ReflectStandardEvent; import org.kitesdk.data.event.SmallEvent; import org.kitesdk.data.event.StandardEvent; import org.kitesdk.data.spi.filesystem.TestGenericRecord; public class TestDataModelUtil { @Test public void testDataModelForGenericType() { Class<GenericData.Record> type = GenericData.Record.class; GenericData result = DataModelUtil.getDataModelForType(type); assertEquals(GenericData.class, result.getClass()); } @Test public void testDataModelForSpecificType() { Class<StandardEvent> type = StandardEvent.class; GenericData result = DataModelUtil.getDataModelForType(type); assertEquals(SpecificData.class, result.getClass()); } @Test public void testDataModelForReflectType() { Class<String> type = String.class; GenericData result = DataModelUtil.getDataModelForType(type); assertEquals(DataModelUtil.AllowNulls.class, result.getClass()); } @Test public void testGetDatumReaderForGenericType() { Class<GenericData.Record> type = GenericData.Record.class; Schema writerSchema = StandardEvent.getClassSchema(); DatumReader result = DataModelUtil.getDatumReaderForType(type, writerSchema); assertEquals(GenericDatumReader.class, result.getClass()); } @Test public void testGetDatumReaderForSpecificType() { Class<StandardEvent> type = StandardEvent.class; Schema writerSchema = StandardEvent.getClassSchema(); DatumReader result = DataModelUtil.getDatumReaderForType(type, writerSchema); assertEquals(SpecificDatumReader.class, result.getClass()); } @Test public void testGetDatumReaderForReflectType() { Class<String> type = String.class; Schema writerSchema = Schema.create(Schema.Type.STRING); DatumReader result = DataModelUtil.getDatumReaderForType(type, writerSchema); assertEquals(ReflectDatumReader.class, result.getClass()); } @Test public void testResolveTypeGenericToGeneric() { Class<GenericData.Record> type = GenericData.Record.class; Schema schema = StandardEvent.getClassSchema(); Class expResult = type; Class result = DataModelUtil.resolveType(type, schema); assertEquals(expResult, result); } @Test public void testResolveTypeSpecifcToSpecifc() { Class<StandardEvent> type = StandardEvent.class; Schema schema = StandardEvent.getClassSchema(); Class expResult = type; Class result = DataModelUtil.resolveType(type, schema); assertEquals(expResult, result); } @Test public void testResolveTypeReflectToReflect() { Class<String> type = String.class; Schema schema = Schema.create(Schema.Type.STRING); Class expResult = type; Class result = DataModelUtil.resolveType(type, schema); assertEquals(expResult, result); } @Test public void testResolveTypeObjectToSpecifc() { Class<Object> type = Object.class; Schema schema = StandardEvent.getClassSchema(); Class expResult = StandardEvent.class; Class result = DataModelUtil.resolveType(type, schema); assertEquals(expResult, result); } @Test public void testResolveTypeObjectToGeneric() { Class<Object> type = Object.class; Schema schema = SchemaBuilder.record("User").fields() .requiredString("name") .requiredString("color") .endRecord(); Class expResult = GenericData.Record.class; Class result = DataModelUtil.resolveType(type, schema); assertEquals(expResult, result); } @Test public void testResolveTypeObjectToReflect() { Class<Object> type = Object.class; Schema schema = ReflectData.get().getSchema(String.class); Class expResult = String.class; Class result = DataModelUtil.resolveType(type, schema); assertEquals(expResult, result); } @Test public void testGetReaderSchemaForGeneric() { Class<GenericData.Record> type = GenericData.Record.class; Schema writerSchema = StandardEvent.getClassSchema(); Schema expResult = writerSchema; Schema result = DataModelUtil.getReaderSchema(type, writerSchema); assertEquals(expResult, result); } @Test public void testGetReaderSchemaForSpecific() { Class<StandardEvent> type = StandardEvent.class; Schema writerSchema = StandardEvent.getClassSchema(); Schema expResult = writerSchema; Schema result = DataModelUtil.getReaderSchema(type, writerSchema); assertEquals(expResult, result); } @Test public void testGetReaderSchemaForReflect() { Class<String> type = String.class; Schema writerSchema = ReflectData.get().getSchema(String.class); Schema expResult = writerSchema; Schema result = DataModelUtil.getReaderSchema(type, writerSchema); assertEquals(expResult, result); } @Test public void testGetReaderSchemaForCompatibleSpecific() { Class<SmallEvent> type = SmallEvent.class; Schema writerSchema = StandardEvent.getClassSchema(); Schema expResult = SmallEvent.getClassSchema(); Schema result = DataModelUtil.getReaderSchema(type, writerSchema); assertEquals(expResult, result); } @Test public void testGetReaderSchemaForCompatibleReflect() { Class<ReflectSmallEvent> type = ReflectSmallEvent.class; Schema writerSchema = ReflectData.get().getSchema(ReflectStandardEvent.class); Schema expResult = DataModelUtil.AllowNulls.get().getSchema(ReflectSmallEvent.class); Schema result = DataModelUtil.getReaderSchema(type, writerSchema); assertEquals(expResult, result); } @Test public void testCreateRecord() { assertNull("createRecord should not create Specific instances", DataModelUtil.createRecord(StandardEvent.class, StandardEvent.getClassSchema())); assertNull("createRecord should not create Reflect instances", DataModelUtil.createRecord(ReflectStandardEvent.class, ReflectData.get().getSchema(ReflectStandardEvent.class))); assertNotNull("createRecord should create Generic instances", DataModelUtil.createRecord(GenericData.Record.class, StandardEvent.getClassSchema())); assertEquals("createRecord did not return the expected class", TestGenericRecord.class, DataModelUtil.createRecord(TestGenericRecord.class, StandardEvent.getClassSchema()).getClass()); } }