package water.udf; import org.apache.commons.lang.SerializationUtils; import org.junit.Test; import water.util.fp.Function; import water.util.fp.PureFunctions; import water.udf.specialized.Enums; import java.util.Arrays; import java.util.Date; import java.util.List; import static org.junit.Assert.*; import static water.udf.specialized.Doubles.*; import static water.udf.specialized.Dates.*; import static water.udf.specialized.Strings.*; /** * Test for UDF */ public class SerializabilityTest extends UdfTestBase { public int requiredCloudSize() { return 1; } @SuppressWarnings("unchecked") private <T> void checkSerialization(Column<T> c) { byte[] serialized = SerializationUtils.serialize(c); Object x = SerializationUtils.deserialize(serialized); Column<T> copy = (Column<T>)x; boolean eq = c.equals(copy); // for debugging assertEquals(c, copy); } @Test public void testDoubleColumnSerializable() throws Exception { Column<Double> c = someDoubles(); checkSerialization(c); } private DataColumn<Double> someDoubles() throws java.io.IOException { return willDrop(Doubles.newColumn(5, new Function<Long, Double>() { public Double apply(Long i) { return (i > 10 && i < 20) ? null : Math.sin(i); } })); } @Test @SuppressWarnings("unchecked") public void testDateColumnSerializable() throws Exception { Column<Date> c = willDrop(Dates.newColumn(7, new Function<Long, Date>() { public Date apply(Long i) { return new Date(i*3600000L*24); } })); checkSerialization(c); } @Test @SuppressWarnings("unchecked") public void testStringColumnSerializable() throws Exception { Column<String> c = willDrop(Strings.newColumn(7, new Function<Long, String>() { public String apply(Long i) { return "<<" + i + ">>"; } })); checkSerialization(c); } @Test @SuppressWarnings("unchecked") public void testEnumColumnSerializable() throws Exception { Column<Integer> c = willDrop(Enums.enums(new String[]{"Red", "White", "Blue"}).newColumn(7, new Function<Long, Integer>() { public Integer apply(Long i) { return (int)(i % 3); } })); checkSerialization(c); } @Test @SuppressWarnings("unchecked") public void tesFunColumnSerializable() throws Exception { Column<Double> source = someDoubles(); Column<Double> c = willDrop(new FunColumn<>(PureFunctions.SQUARE, source)); checkSerialization(c); } @Test @SuppressWarnings("unchecked") public void tesFun2ColumnSerializable() throws Exception { Column<Double> x = someDoubles(); Column<Double> c = willDrop(new Fun2Column<>(PureFunctions.PLUS, x, x)); checkSerialization(c); } @Test @SuppressWarnings("unchecked") public void tesFun3ColumnSerializable() throws Exception { Column<Double> x = someDoubles(); Column<Double> y = someDoubles(); Column<Double> c = willDrop(new Fun3Column<>(PureFunctions.X2_PLUS_Y2_PLUS_Z2, x, y, x)); checkSerialization(c); } @Test @SuppressWarnings("unchecked") public void tesFoldingSerializable() throws Exception { Column<Double> x = someDoubles(); Column<Double> y = someDoubles(); Column<Double> c = willDrop(new FoldingColumn<>(PureFunctions.SUM_OF_SQUARES, x, y, x)); checkSerialization(c); } @Test @SuppressWarnings("unchecked") public void testUnfoldingColumnSerializable() throws Exception { Column<String> source = willDrop(Strings.newColumn(Arrays.asList("line 1; line 2; lin 3".split("; ")))); // produce another (virtual) column that stores a list of strings as a row value Column<List<String>> c = new UnfoldingColumn<>(PureFunctions.splitBy(","), source, 10); checkSerialization(c); } }