package com.twitter.elephantbird.pig.util;
import java.nio.ByteBuffer;
import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import org.apache.pig.data.NonSpillableDataBag;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.TupleFactory;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TMemoryBuffer;
import org.junit.Test;
import com.twitter.elephantbird.thrift.test.Name;
import com.twitter.elephantbird.thrift.test.Person;
import com.twitter.elephantbird.thrift.test.PhoneNumber;
import com.twitter.elephantbird.thrift.test.PhoneType;
import com.twitter.elephantbird.pig.test.thrift.KeyEnum;
import com.twitter.elephantbird.pig.test.thrift.MapKeyTest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
/**
* Unit tests for {@link PigToThrift}.
*
* @author Andy Schlaikjer
*/
public class TestPigToThrift {
private static final TupleFactory TF = TupleFactory.getInstance();
private static Tuple tuple(Object... values) {
return TF.newTupleNoCopy(Lists.newArrayList(values));
}
private static Person personMessage(String name, int id, String email, String phoneNumber,
String phoneType) {
return new Person(new Name(name, null), id, email, Lists.newArrayList(new PhoneNumber(
phoneNumber).setType(PhoneType.valueOf(phoneType))));
}
private static Tuple personTuple(String name, int id, String email, String phoneNumber,
String phoneType) {
return tuple(tuple(name, null), id, email,
new NonSpillableDataBag(Lists.<Tuple>newArrayList(tuple(phoneNumber, phoneType))));
}
@Test
public void testPerson() {
Person expected = personMessage("Joe", 1, null, "123-456-7890", "HOME");
Person actual = PigToThrift.newInstance(Person.class).getThriftObject(
personTuple("Joe", 1, null, "123-456-7890", "HOME"));
assertNotNull(actual);
assertEquals(expected, actual);
}
@Test//(expected = RuntimeException.class)
public void testPersonBadEnumValue() {
PigToThrift.newInstance(Person.class).getThriftObject(
personTuple("Joe", 1, null, "123-456-7890", "ASDF"));
}
@Test
public void testSupportedMapKeyTypes() {
MapKeyTest expected = new MapKeyTest()
.setBooleans(ImmutableMap.of(true, 1))
.setBytes(ImmutableMap.of((byte) 1, 1))
.setShorts(ImmutableMap.of((short) 1, 1))
.setInts(ImmutableMap.of(1, 1))
.setLongs(ImmutableMap.of(1L, 1))
.setDoubles(ImmutableMap.of(1D, 1))
.setEnums(ImmutableMap.of(KeyEnum.A, 1))
.setStrings(ImmutableMap.of("a", 1))
.setBinaries(ImmutableMap.of(ByteBuffer.wrap("1".getBytes(Charsets.UTF_8)), 1));
MapKeyTest actual = PigToThrift.newInstance(MapKeyTest.class).getThriftObject(
tuple(
ImmutableMap.of("true", 1),
ImmutableMap.of("1", 1),
ImmutableMap.of("1", 1),
ImmutableMap.of("1", 1),
ImmutableMap.of("1", 1),
ImmutableMap.of("1.0", 1),
ImmutableMap.of(KeyEnum.A.name(), 1),
ImmutableMap.of("a", 1),
ImmutableMap.of("1", 1)
)
);
assertEquals(expected, actual);
}
@Test
public void testMapKeyConversionFailure() {
MapKeyTest fail = PigToThrift.newInstance(MapKeyTest.class).getThriftObject(
tuple(
null,
ImmutableMap.of("notabyte", 1)
)
);
assertNotNull(fail);
assertNull(fail.getBytes());
}
}