blob: fe365200b06c7e83c2d7f2df79c5e3117c898f90 [file] [log] [blame]
/**
* 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.crunch.types.avro;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericData;
import org.apache.avro.io.DatumReader;
import org.apache.avro.io.DatumWriter;
import org.apache.avro.reflect.ReflectData;
import org.apache.avro.specific.SpecificData;
import org.apache.crunch.io.FormatBundle;
import org.apache.hadoop.conf.Configuration;
import org.junit.Test;
public class AvroModeTest {
@Test
public void customWithFactory(){
ReaderWriterFactory fakeFactory = new FakeReaderWriterFactory();
AvroMode mode = AvroMode.SPECIFIC.withFactory(fakeFactory);
assertThat(mode.getFactory(), is(fakeFactory));
//assert that the original is unchanged
assertThat(mode, is(not(AvroMode.SPECIFIC)));
assertThat(AvroMode.SPECIFIC.getFactory(), is((ReaderWriterFactory) AvroMode.SPECIFIC));
}
@Test
public void sameWithFactory(){
AvroMode mode = AvroMode.SPECIFIC.withFactory(AvroMode.SPECIFIC);
assertThat(mode.getFactory(), is( (ReaderWriterFactory) AvroMode.SPECIFIC));
}
@Test
public void getDataSpecific(){
assertThat(AvroMode.SPECIFIC.getData(), is(instanceOf(SpecificData.class)));
}
@Test
public void getDataGeneric(){
assertThat(AvroMode.GENERIC.getData(), is(instanceOf(GenericData.class)));
}
@Test
public void getDataReflect(){
assertThat(AvroMode.REFLECT.getData(), is(instanceOf(ReflectData.class)));
}
@Test
public void configureAndRetrieveSpecific(){
Configuration conf = new Configuration();
AvroMode.SPECIFIC.configure(conf);
AvroMode returnedMode = AvroMode.fromConfiguration(conf);
assertThat(returnedMode, is(AvroMode.SPECIFIC));
}
@Test
public void configureAndRetrieveGeneric(){
Configuration conf = new Configuration();
AvroMode.GENERIC.configure(conf);
AvroMode returnedMode = AvroMode.fromConfiguration(conf);
assertThat(returnedMode, is(AvroMode.GENERIC));
}
@Test
public void configureShuffleAndRetrieveSpecific(){
Configuration conf = new Configuration();
AvroMode.SPECIFIC.configureShuffle(conf);
AvroMode returnedMode = AvroMode.fromShuffleConfiguration(conf);
assertThat(returnedMode, is(AvroMode.SPECIFIC));
}
@Test
public void configureShuffleAndRetrieveGeneric(){
Configuration conf = new Configuration();
AvroMode.GENERIC.configureShuffle(conf);
AvroMode returnedMode = AvroMode.fromShuffleConfiguration(conf);
assertThat(returnedMode, is(AvroMode.GENERIC));
}
@Test
public void configureBundleSpecific(){
FormatBundle bundle = FormatBundle.forInput(AvroInputFormat.class);
Configuration config = new Configuration();
AvroMode.SPECIFIC.configure(bundle);
bundle.configure(config);
AvroMode returnedMode = AvroMode.fromConfiguration(config);
assertThat(returnedMode.getData(), is(instanceOf(SpecificData.class)));
}
@Test
public void configureBundleGeneric(){
FormatBundle bundle = FormatBundle.forInput(AvroInputFormat.class);
Configuration config = new Configuration();
AvroMode.GENERIC.configure(bundle);
bundle.configure(config);
AvroMode returnedMode = AvroMode.fromConfiguration(config);
assertThat(returnedMode.getData(), is(instanceOf(GenericData.class)));
}
@Test
public void configureBundleReflect(){
FormatBundle bundle = FormatBundle.forInput(AvroInputFormat.class);
Configuration config = new Configuration();
AvroMode.REFLECT.configure(bundle);
bundle.configure(config);
AvroMode returnedMode = AvroMode.fromConfiguration(config);
assertThat(returnedMode.getData(), is(instanceOf(ReflectData.class)));
}
@Test
public void configureBundleCustomWithFactory(){
ReaderWriterFactory fakeFactory = new FakeReaderWriterFactory();
AvroMode mode = AvroMode.SPECIFIC.withFactory(fakeFactory);
FormatBundle bundle = FormatBundle.forInput(AvroInputFormat.class);
Configuration config = new Configuration();
mode.configure(bundle);
bundle.configure(config);
AvroMode returnedMode = AvroMode.fromConfiguration(config);
assertThat(returnedMode.getFactory(), is(instanceOf(FakeReaderWriterFactory.class)));
}
@Test
public void configureCustomWithFactory(){
ReaderWriterFactory fakeFactory = new FakeReaderWriterFactory();
AvroMode mode = AvroMode.SPECIFIC.withFactory(fakeFactory);
Configuration config = new Configuration();
mode.configure(config);
AvroMode returnedMode = AvroMode.fromConfiguration(config);
assertThat(returnedMode.getFactory(), is(instanceOf(FakeReaderWriterFactory.class)));
}
@Test
public void testRegisterClassLoader() {
// First make sure things are in the default situation
AvroMode.setSpecificClassLoader(null);
ClassLoader classLoaderA = mock(ClassLoader.class);
ClassLoader classLoaderB = mock(ClassLoader.class);
// Basic sanity check to ensure that the class loader was really nulled out
assertNull(AvroMode.getSpecificClassLoader());
// Do an internal registration of a class loader. Because there is currently no internal class loader set,
// this should set the internal specific class loader
AvroMode.registerSpecificClassLoaderInternal(classLoaderA);
assertEquals(classLoaderA, AvroMode.getSpecificClassLoader());
// Now we do an internal register of another class loader. Because there already is an internal specific class
// loader set, this should have no impact (as opposed to calling setSpecificClassLoader)
AvroMode.registerSpecificClassLoaderInternal(classLoaderB);
assertEquals(classLoaderA, AvroMode.getSpecificClassLoader());
}
private static class FakeReaderWriterFactory implements ReaderWriterFactory{
@Override
public GenericData getData() {
return null;
}
@Override
public <D> DatumReader<D> getReader(Schema schema) {
return null;
}
@Override
public <D> DatumWriter<D> getWriter(Schema schema) {
return null;
}
}
}