/**
* 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.camel.component.flink;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import com.google.common.truth.Truth;
import org.apache.camel.component.flink.annotations.AnnotatedDataSetCallback;
import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.apache.flink.api.java.DataSet;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.junit.Test;
public class FlinkProducerTest extends CamelTestSupport {
static ExecutionEnvironment executionEnvironment = Flinks.createExecutionEnvironment();
static StreamExecutionEnvironment streamExecutionEnvironment = Flinks.createStreamExecutionEnvironment();
String flinkDataSetUri = "flink:dataSet?dataSet=#myDataSet";
String flinkDataStreamUri = "flink:dataStream?dataStream=#myDataStream";
int numberOfLinesInTestFile = 19;
@Override
protected JndiRegistry createRegistry() throws Exception {
JndiRegistry registry = super.createRegistry();
registry.bind("myDataSet", executionEnvironment.readTextFile("src/test/resources/testds.txt"));
registry.bind("myDataStream", streamExecutionEnvironment.readTextFile("src/test/resources/testds.txt"));
registry.bind("countLinesContaining", new DataSetCallback() {
@Override
public Object onDataSet(DataSet ds, Object... payloads) {
try {
return ds.count();
} catch (Exception e) {
return null;
}
}
});
return registry;
}
@Test
public void shouldExecuteDataSetCallback() {
Long linesCount = template.requestBodyAndHeader(flinkDataSetUri, null, FlinkConstants.FLINK_DATASET_CALLBACK_HEADER, new DataSetCallback() {
@Override
public Object onDataSet(DataSet ds, Object... payloads) {
try {
return ds.count();
} catch (Exception e) {
return null;
}
}
}, Long.class);
Truth.assertThat(linesCount).isEqualTo(numberOfLinesInTestFile);
}
@Test
public void shouldExecuteDataSetCallbackWithSinglePayload() {
Long linesCount = template.requestBodyAndHeader(flinkDataSetUri, 10, FlinkConstants.FLINK_DATASET_CALLBACK_HEADER, new DataSetCallback() {
@Override
public Object onDataSet(DataSet ds, Object... payloads) {
try {
return ds.count() * (int) payloads[0];
} catch (Exception e) {
return null;
}
}
}, Long.class);
Truth.assertThat(linesCount).isEqualTo(numberOfLinesInTestFile * 10);
}
@Test
public void shouldExecuteDataSetCallbackWithPayloads() {
Long linesCount = template.requestBodyAndHeader(flinkDataSetUri, Arrays.<Integer>asList(10, 10), FlinkConstants.FLINK_DATASET_CALLBACK_HEADER, new DataSetCallback() {
@Override
public Object onDataSet(DataSet ds, Object... payloads) {
try {
return ds.count() * (int) payloads[0] * (int) payloads[1];
} catch (Exception e) {
return null;
}
}
}, Long.class);
Truth.assertThat(linesCount).isEqualTo(numberOfLinesInTestFile * 10 * 10);
}
@Test
public void shouldUseTransformationFromRegistry() {
Long linesCount = template.requestBody(flinkDataSetUri + "&dataSetCallback=#countLinesContaining", null, Long.class);
Truth.assertThat(linesCount).isGreaterThan(0L);
}
@Test
public void shouldExecuteVoidCallback() throws IOException {
final File output = File.createTempFile("camel", "flink");
output.delete();
template.sendBodyAndHeader(flinkDataSetUri, null, FlinkConstants.FLINK_DATASET_CALLBACK_HEADER, new VoidDataSetCallback() {
@Override
public void doOnDataSet(DataSet ds, Object... payloads) {
ds.writeAsText(output.getAbsolutePath());
}
});
Truth.assertThat(output.length()).isAtLeast(0L);
}
@Test
public void shouldExecuteAnnotatedCallback() {
DataSetCallback dataSetCallback = new AnnotatedDataSetCallback(new Object() {
@org.apache.camel.component.flink.annotations.DataSetCallback
Long countLines(DataSet<String> textFile) {
try {
return textFile.count();
} catch (Exception e) {
return null;
}
}
});
long pomLinesCount = template.requestBodyAndHeader(flinkDataSetUri, null, FlinkConstants.FLINK_DATASET_CALLBACK_HEADER, dataSetCallback, Long.class);
Truth.assertThat(pomLinesCount).isEqualTo(19);
}
@Test
public void shouldExecuteAnnotatedVoidCallback() throws IOException {
final File output = File.createTempFile("camel", "flink");
output.delete();
DataSetCallback dataSetCallback = new AnnotatedDataSetCallback(new Object() {
@org.apache.camel.component.flink.annotations.DataSetCallback
void countLines(DataSet<String> textFile) {
textFile.writeAsText(output.getAbsolutePath());
}
});
template.sendBodyAndHeader(flinkDataSetUri, null, FlinkConstants.FLINK_DATASET_CALLBACK_HEADER, dataSetCallback);
Truth.assertThat(output.length()).isAtLeast(0L);
}
@Test
public void shouldExecuteAnnotatedCallbackWithParameters() {
DataSetCallback dataSetCallback = new AnnotatedDataSetCallback(new Object() {
@org.apache.camel.component.flink.annotations.DataSetCallback
Long countLines(DataSet<String> textFile, int first, int second) {
try {
return textFile.count() * first * second;
} catch (Exception e) {
return null;
}
}
});
long pomLinesCount = template.requestBodyAndHeader(flinkDataSetUri, Arrays.<Integer>asList(10, 10), FlinkConstants.FLINK_DATASET_CALLBACK_HEADER, dataSetCallback, Long.class);
Truth.assertThat(pomLinesCount).isEqualTo(numberOfLinesInTestFile * 10 * 10);
}
@Test
public void shouldExecuteVoidDataStreamCallback() throws IOException {
final File output = File.createTempFile("camel", "flink");
output.delete();
template.sendBodyAndHeader(flinkDataStreamUri, null, FlinkConstants.FLINK_DATASTREAM_CALLBACK_HEADER, new VoidDataStreamCallback() {
@Override
public void doOnDataStream(DataStream ds, Object... payloads) throws Exception {
ds.writeAsText(output.getAbsolutePath());
}
});
Truth.assertThat(output.length()).isAtLeast(0L);
}
}