/* * 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 org.apache.flink.api.common.typeutils.SerializerTestInstance; import org.apache.flink.api.common.typeutils.TypeSerializer; import org.apache.flink.api.common.typeutils.base.GenericArraySerializer; import org.apache.flink.api.common.typeutils.base.StringSerializer; 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.util.StringUtils; import org.junit.Assert; import org.junit.Test; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Random; public abstract class AbstractGenericArraySerializerTest { private final Random rnd = new Random(349712539451944123L); @Test public void testString() { String[] arr1 = new String[] {"abc", "", StringUtils.getRandomString(new Random(289347567856686223L), 10, 100), StringUtils.getRandomString(new Random(289347567856686223L), 15, 50), StringUtils.getRandomString(new Random(289347567856686223L), 30, 170), StringUtils.getRandomString(new Random(289347567856686223L), 14, 15), ""}; String[] arr2 = new String[] {"foo", "", StringUtils.getRandomString(new Random(289347567856686223L), 10, 100), StringUtils.getRandomString(new Random(289347567856686223L), 1000, 5000), StringUtils.getRandomString(new Random(289347567856686223L), 30000, 35000), StringUtils.getRandomString(new Random(289347567856686223L), 100*1024, 105*1024), "bar"}; // run tests with the string serializer as the component serializer runTests(String.class, new StringSerializer(), arr1, arr2); // run the tests with the generic serializer as the component serializer runTests(arr1, arr2); } @Test public void testSimpleTypesObjects() { 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()); runTests(new SimpleTypes[] {a, b, c}, new SimpleTypes[] {d, e, f, g}); } @Test public void testCompositeObject() { 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); runTests(new ComplexNestedObject1[] {o1, o2}, new ComplexNestedObject1[] {o3}, new ComplexNestedObject1[] {o4, o5}); } @Test public void testNestedObjects() { ComplexNestedObject2 o1 = new ComplexNestedObject2(rnd); ComplexNestedObject2 o2 = new ComplexNestedObject2(); ComplexNestedObject2 o3 = new ComplexNestedObject2(rnd); ComplexNestedObject2 o4 = new ComplexNestedObject2(rnd); runTests( new ComplexNestedObject2[] {o1, o2, o3}, new ComplexNestedObject2[] {}, new ComplexNestedObject2[] {}, new ComplexNestedObject2[] {o4}, new ComplexNestedObject2[] {}); } @Test public void testBeanStyleObjects() { { Book b1 = new Book(976243875L, "The Serialization Odyssey", 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, "Winning a prize for creative test strings", 0xBADF00); Book b6 = new Book(-2L, "Distributed Systems", 0xABCDEF0123456789L); runTests( new Book[] {b1, b2}, new Book[] {}, new Book[] {}, new Book[] {}, new Book[] {}, new Book[] {b3, b4, b5, b6}); } // object with collection { ArrayList<String> list = new ArrayList<String>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); list.add("E"); BookAuthor b1 = new BookAuthor(976243875L, list, "Arno Nym"); ArrayList<String> list2 = new ArrayList<String>(); BookAuthor b2 = new BookAuthor(987654321L, list2, "The Saurus"); runTests(new BookAuthor[] {b1, b2}); } } @SafeVarargs private final <T> void runTests(T[]... instances) { try { @SuppressWarnings("unchecked") Class<T> type = (Class<T>) instances[0][0].getClass(); TypeSerializer<T> serializer = createComponentSerializer(type); runTests(type, serializer, instances); } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(); Assert.fail(e.getMessage()); } } @SafeVarargs private final <T> void runTests(Class<T> type, TypeSerializer<T> componentSerializer, T[]... instances) { try { if (type == null || componentSerializer == null || instances == null || instances.length == 0) { throw new IllegalArgumentException(); } @SuppressWarnings("unchecked") Class<T[]> arrayClass = (Class<T[]>) (Class<?>) Array.newInstance(type, 0).getClass(); GenericArraySerializer<T> serializer = createSerializer(type, componentSerializer); SerializerTestInstance<T[]> test = new SerializerTestInstance<T[]>(serializer, arrayClass, -1, instances); test.testAll(); } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(); Assert.fail(e.getMessage()); } } private <T> GenericArraySerializer<T> createSerializer(Class<T> type, TypeSerializer<T> componentSerializer) { return new GenericArraySerializer<T>(type, componentSerializer); } abstract protected <T> TypeSerializer<T> createComponentSerializer(Class<T> type); }