/* * 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.flink.api.java.typeutils.runtime; import java.util.ArrayList; import java.util.Random; import org.apache.flink.api.common.ExecutionConfig; import org.apache.flink.api.common.typeutils.TypeSerializer; import org.apache.flink.api.java.tuple.Tuple; import org.apache.flink.api.java.tuple.Tuple0; import org.apache.flink.api.java.tuple.Tuple1; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.api.java.tuple.Tuple5; import org.apache.flink.api.java.typeutils.runtime.AbstractGenericTypeSerializerTest.Book; import org.apache.flink.api.java.typeutils.runtime.AbstractGenericTypeSerializerTest.BookAuthor; import org.apache.flink.api.java.typeutils.runtime.AbstractGenericTypeSerializerTest.ComplexNestedObject1; import org.apache.flink.api.java.typeutils.runtime.AbstractGenericTypeSerializerTest.ComplexNestedObject2; import org.apache.flink.api.java.typeutils.runtime.AbstractGenericTypeSerializerTest.SimpleTypes; import org.apache.flink.api.java.typeutils.TupleTypeInfo; import org.apache.flink.api.java.typeutils.TypeExtractor; import org.apache.flink.util.StringUtils; import org.junit.Assert; import org.junit.Test; public class TupleSerializerTest { @Test public void testTuple0() { Tuple0[] testTuples = new Tuple0[] { Tuple0.INSTANCE, Tuple0.INSTANCE, Tuple0.INSTANCE }; runTests(1, testTuples); } @Test public void testTuple1Int() { @SuppressWarnings({"unchecked", "rawtypes"}) Tuple1<Integer>[] testTuples = new Tuple1[] { new Tuple1<Integer>(42), new Tuple1<Integer>(1), new Tuple1<Integer>(0), new Tuple1<Integer>(-1), new Tuple1<Integer>(Integer.MAX_VALUE), new Tuple1<Integer>(Integer.MIN_VALUE) }; runTests(4, testTuples); } @Test public void testTuple1String() { Random rnd = new Random(68761564135413L); @SuppressWarnings({"unchecked", "rawtypes"}) Tuple1<String>[] testTuples = new Tuple1[] { new Tuple1<String>(StringUtils.getRandomString(rnd, 10, 100)), new Tuple1<String>("abc"), new Tuple1<String>(""), new Tuple1<String>(StringUtils.getRandomString(rnd, 30, 170)), new Tuple1<String>(StringUtils.getRandomString(rnd, 15, 50)), new Tuple1<String>("") }; runTests(-1, testTuples); } @Test public void testTuple1StringArray() { Random rnd = new Random(289347567856686223L); String[] arr1 = new String[] {"abc", "", StringUtils.getRandomString(rnd, 10, 100), StringUtils.getRandomString(rnd, 15, 50), StringUtils.getRandomString(rnd, 30, 170), StringUtils.getRandomString(rnd, 14, 15), ""}; String[] arr2 = new String[] {"foo", "", StringUtils.getRandomString(rnd, 10, 100), StringUtils.getRandomString(rnd, 1000, 5000), StringUtils.getRandomString(rnd, 30000, 35000), StringUtils.getRandomString(rnd, 100*1024, 105*1024), "bar"}; @SuppressWarnings("unchecked") Tuple1<String[]>[] testTuples = new Tuple1[] { new Tuple1<String[]>(arr1), new Tuple1<String[]>(arr2) }; runTests(-1, testTuples); } @Test public void testTuple2StringDouble() { Random rnd = new Random(807346528946L); @SuppressWarnings("unchecked") Tuple2<String, Double>[] testTuples = new Tuple2[] { new Tuple2<String, Double>(StringUtils.getRandomString(rnd, 10, 100), rnd.nextDouble()), new Tuple2<String, Double>(StringUtils.getRandomString(rnd, 10, 100), rnd.nextDouble()), new Tuple2<String, Double>(StringUtils.getRandomString(rnd, 10, 100), rnd.nextDouble()), new Tuple2<String, Double>("", rnd.nextDouble()), new Tuple2<String, Double>(StringUtils.getRandomString(rnd, 10, 100), rnd.nextDouble()), new Tuple2<String, Double>(StringUtils.getRandomString(rnd, 10, 100), rnd.nextDouble()) }; runTests(-1, testTuples); } @Test public void testTuple2StringStringArray() { Random rnd = new Random(289347567856686223L); String[] arr1 = new String[] {"abc", "", StringUtils.getRandomString(rnd, 10, 100), StringUtils.getRandomString(rnd, 15, 50), StringUtils.getRandomString(rnd, 30, 170), StringUtils.getRandomString(rnd, 14, 15), ""}; String[] arr2 = new String[] {"foo", "", StringUtils.getRandomString(rnd, 10, 100), StringUtils.getRandomString(rnd, 1000, 5000), StringUtils.getRandomString(rnd, 30000, 35000), StringUtils.getRandomString(rnd, 100*1024, 105*1024), "bar"}; @SuppressWarnings("unchecked") Tuple2<String, String[]>[] testTuples = new Tuple2[] { new Tuple2<String, String[]>(StringUtils.getRandomString(rnd, 30, 170), arr1), new Tuple2<String, String[]>(StringUtils.getRandomString(rnd, 30, 170), arr2), new Tuple2<String, String[]>(StringUtils.getRandomString(rnd, 30, 170), arr1), new Tuple2<String, String[]>(StringUtils.getRandomString(rnd, 30, 170), arr2), new Tuple2<String, String[]>(StringUtils.getRandomString(rnd, 30, 170), arr2) }; runTests(-1, testTuples); } @Test public void testTuple5CustomObjects() { Random rnd = new Random(807346528946L); SimpleTypes a = new SimpleTypes(); SimpleTypes b = new SimpleTypes(rnd.nextInt(), rnd.nextLong(), (byte) rnd.nextInt(), StringUtils.getRandomString(rnd, 10, 100), (short) rnd.nextInt(), rnd.nextDouble()); SimpleTypes c = new SimpleTypes(rnd.nextInt(), rnd.nextLong(), (byte) rnd.nextInt(), StringUtils.getRandomString(rnd, 10, 100), (short) rnd.nextInt(), rnd.nextDouble()); SimpleTypes d = new SimpleTypes(rnd.nextInt(), rnd.nextLong(), (byte) rnd.nextInt(), StringUtils.getRandomString(rnd, 10, 100), (short) rnd.nextInt(), rnd.nextDouble()); SimpleTypes e = new SimpleTypes(rnd.nextInt(), rnd.nextLong(), (byte) rnd.nextInt(), StringUtils.getRandomString(rnd, 10, 100), (short) rnd.nextInt(), rnd.nextDouble()); SimpleTypes f = new SimpleTypes(rnd.nextInt(), rnd.nextLong(), (byte) rnd.nextInt(), StringUtils.getRandomString(rnd, 10, 100), (short) rnd.nextInt(), rnd.nextDouble()); SimpleTypes g = new SimpleTypes(rnd.nextInt(), rnd.nextLong(), (byte) rnd.nextInt(), StringUtils.getRandomString(rnd, 10, 100), (short) rnd.nextInt(), rnd.nextDouble()); ComplexNestedObject1 o1 = new ComplexNestedObject1(5626435); ComplexNestedObject1 o2 = new ComplexNestedObject1(76923); ComplexNestedObject1 o3 = new ComplexNestedObject1(-1100); ComplexNestedObject1 o4 = new ComplexNestedObject1(0); ComplexNestedObject1 o5 = new ComplexNestedObject1(44); ComplexNestedObject2 co1 = new ComplexNestedObject2(rnd); ComplexNestedObject2 co2 = new ComplexNestedObject2(); ComplexNestedObject2 co3 = new ComplexNestedObject2(rnd); ComplexNestedObject2 co4 = new ComplexNestedObject2(rnd); Book b1 = new Book(976243875L, "The Serialization Odysse", 42); Book b2 = new Book(0L, "Debugging byte streams", 1337); Book b3 = new Book(-1L, "Low level interfaces", 0xC0FFEE); Book b4 = new Book(Long.MAX_VALUE, "The joy of bits and bytes", 0xDEADBEEF); Book b5 = new Book(Long.MIN_VALUE, "Winnign a prize for creative test strings", 0xBADF00); Book b6 = new Book(-2L, "Distributed Systems", 0xABCDEF0123456789L); ArrayList<String> list = new ArrayList<String>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); list.add("E"); BookAuthor ba1 = new BookAuthor(976243875L, list, "Arno Nym"); ArrayList<String> list2 = new ArrayList<String>(); BookAuthor ba2 = new BookAuthor(987654321L, list2, "The Saurus"); @SuppressWarnings("unchecked") Tuple5<SimpleTypes, Book, ComplexNestedObject1, BookAuthor, ComplexNestedObject2>[] testTuples = new Tuple5[] { new Tuple5<SimpleTypes, Book, ComplexNestedObject1, BookAuthor, ComplexNestedObject2>(a, b1, o1, ba1, co1), new Tuple5<SimpleTypes, Book, ComplexNestedObject1, BookAuthor, ComplexNestedObject2>(b, b2, o2, ba2, co2), new Tuple5<SimpleTypes, Book, ComplexNestedObject1, BookAuthor, ComplexNestedObject2>(c, b3, o3, ba1, co3), new Tuple5<SimpleTypes, Book, ComplexNestedObject1, BookAuthor, ComplexNestedObject2>(d, b2, o4, ba1, co4), new Tuple5<SimpleTypes, Book, ComplexNestedObject1, BookAuthor, ComplexNestedObject2>(e, b4, o5, ba2, co4), new Tuple5<SimpleTypes, Book, ComplexNestedObject1, BookAuthor, ComplexNestedObject2>(f, b5, o1, ba2, co4), new Tuple5<SimpleTypes, Book, ComplexNestedObject1, BookAuthor, ComplexNestedObject2>(g, b6, o4, ba1, co2) }; runTests(-1, testTuples); } private <T extends Tuple> void runTests(int length, T... instances) { try { TupleTypeInfo<T> tupleTypeInfo = (TupleTypeInfo<T>) TypeExtractor.getForObject(instances[0]); TypeSerializer<T> serializer = tupleTypeInfo.createSerializer(new ExecutionConfig()); Class<T> tupleClass = tupleTypeInfo.getTypeClass(); if(tupleClass == Tuple0.class) { length = 1; } TupleSerializerTestInstance<T> test = new TupleSerializerTestInstance<T>(serializer, tupleClass, length, instances); test.testAll(); } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(); Assert.fail(e.getMessage()); } } }