You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by sr...@apache.org on 2018/11/12 16:45:23 UTC

[flink] 02/02: [FLINK-10827][tests] Add test for duplicate() to SerializerTestBase

This is an automated email from the ASF dual-hosted git repository.

srichter pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git

commit 2db59cf365a84bdbcd69f6f5e57bc6e639da4930
Author: Stefan Richter <s....@data-artisans.com>
AuthorDate: Thu Nov 8 14:44:08 2018 +0100

    [FLINK-10827][tests] Add test for duplicate() to SerializerTestBase
    
    This closes #7061.
---
 .../api/common/typeutils/SerializerTestBase.java   | 128 ++++++++++++++++++---
 1 file changed, 112 insertions(+), 16 deletions(-)

diff --git a/flink-core/src/test/java/org/apache/flink/api/common/typeutils/SerializerTestBase.java b/flink-core/src/test/java/org/apache/flink/api/common/typeutils/SerializerTestBase.java
index a4908f9..151dafb 100644
--- a/flink-core/src/test/java/org/apache/flink/api/common/typeutils/SerializerTestBase.java
+++ b/flink-core/src/test/java/org/apache/flink/api/common/typeutils/SerializerTestBase.java
@@ -18,32 +18,39 @@
 
 package org.apache.flink.api.common.typeutils;
 
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.Arrays;
-
 import org.apache.flink.api.java.typeutils.runtime.NullableSerializer;
+import org.apache.flink.core.memory.DataInputDeserializer;
+import org.apache.flink.core.memory.DataInputView;
 import org.apache.flink.core.memory.DataInputViewStreamWrapper;
+import org.apache.flink.core.memory.DataOutputSerializer;
+import org.apache.flink.core.memory.DataOutputView;
 import org.apache.flink.core.memory.DataOutputViewStreamWrapper;
 import org.apache.flink.util.InstantiationUtil;
+import org.apache.flink.util.Preconditions;
 import org.apache.flink.util.TestLogger;
-import org.junit.Assert;
 
 import org.apache.commons.lang3.SerializationException;
 import org.apache.commons.lang3.SerializationUtils;
-import org.apache.flink.core.memory.DataInputView;
-import org.apache.flink.core.memory.DataOutputView;
+import org.junit.Assert;
 import org.junit.Test;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.CyclicBarrier;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
 /**
  * Abstract test base for serializers.
  *
@@ -436,6 +443,33 @@ public abstract class SerializerTestBase<T> extends TestLogger {
 		}
 	}
 
+	@Test
+	public void testDuplicate() throws Exception {
+		final int numThreads = 10;
+		final TypeSerializer<T> serializer = getSerializer();
+		final CyclicBarrier startLatch = new CyclicBarrier(numThreads);
+		final List<SerializerRunner<T>> concurrentRunners = new ArrayList<>(numThreads);
+		Assert.assertEquals(serializer, serializer.duplicate());
+
+		T[] testData = getData();
+
+		for (int i = 0; i < numThreads; ++i) {
+			SerializerRunner<T> runner = new SerializerRunner<>(
+				startLatch,
+				serializer.duplicate(),
+				testData,
+				120L);
+
+			runner.start();
+			concurrentRunners.add(runner);
+		}
+
+		for (SerializerRunner<T> concurrentRunner : concurrentRunners) {
+			concurrentRunner.join();
+			concurrentRunner.checkResult();
+		}
+	}
+
 	// --------------------------------------------------------------------------------------------
 
 	protected void deepEquals(String message, T should, T is) {
@@ -526,6 +560,68 @@ public abstract class SerializerTestBase<T> extends TestLogger {
 		}
 	}
 
+	/**
+	 * Runner to test serializer duplication via concurrency.
+	 * @param <T> type of the test elements.
+	 */
+	static class SerializerRunner<T> extends Thread {
+		final CyclicBarrier allReadyBarrier;
+		final TypeSerializer<T> serializer;
+		final T[] testData;
+		final long durationLimitMillis;
+		Exception failure;
+
+		SerializerRunner(
+			CyclicBarrier allReadyBarrier,
+			TypeSerializer<T> serializer,
+			T[] testData,
+			long testTargetDurationMillis) {
+
+			this.allReadyBarrier = allReadyBarrier;
+			this.serializer = serializer;
+			this.testData = testData;
+			this.durationLimitMillis =  testTargetDurationMillis;
+			this.failure = null;
+		}
+
+		@Override
+		public void run() {
+			DataInputDeserializer dataInputDeserializer = new DataInputDeserializer();
+			DataOutputSerializer dataOutputSerializer = new DataOutputSerializer(128);
+			try {
+				allReadyBarrier.await();
+				final long endTimeNanos = System.nanoTime() + durationLimitMillis * 1_000_000L;
+				while (true) {
+					for (T testItem : testData) {
+						serializer.serialize(testItem, dataOutputSerializer);
+						dataInputDeserializer.setBuffer(
+							dataOutputSerializer.getSharedBuffer(),
+							0,
+							dataOutputSerializer.length());
+						T serdeTestItem = serializer.deserialize(dataInputDeserializer);
+						T copySerdeTestItem = serializer.copy(serdeTestItem);
+						dataOutputSerializer.clear();
+
+						Preconditions.checkState(Objects.deepEquals(testItem, copySerdeTestItem),
+							"Serialization/Deserialization cycle resulted in an object that are not equal to the original.");
+
+						// try to enforce some upper bound to the test time
+						if (System.nanoTime() >= endTimeNanos) {
+							return;
+						}
+					}
+				}
+			} catch (Exception ex) {
+				failure = ex;
+			}
+		}
+
+		void checkResult() throws Exception {
+			if (failure != null) {
+				throw failure;
+			}
+		}
+	}
 
 	private static final class TestInputView extends DataInputStream implements DataInputView {