|
90 | 90 | import static org.hamcrest.MatcherAssert.assertThat; |
91 | 91 | import static org.hamcrest.Matchers.contains; |
92 | 92 | import static org.hamcrest.Matchers.containsInAnyOrder; |
| 93 | +import static org.hamcrest.Matchers.not; |
93 | 94 | import static org.junit.Assert.assertEquals; |
94 | 95 | import static org.junit.Assert.assertTrue; |
95 | 96 |
|
@@ -510,20 +511,7 @@ public void testInputFairness() throws Exception { |
510 | 511 | @Test |
511 | 512 | public void testWatermark() throws Exception { |
512 | 513 | try (StreamTaskMailboxTestHarness<String> testHarness = |
513 | | - new StreamTaskMailboxTestHarnessBuilder<>( |
514 | | - MultipleInputStreamTask::new, BasicTypeInfo.STRING_TYPE_INFO) |
515 | | - .modifyExecutionConfig(config -> config.enableObjectReuse()) |
516 | | - .addInput(BasicTypeInfo.STRING_TYPE_INFO, 2) |
517 | | - .addSourceInput( |
518 | | - new SourceOperatorFactory<>( |
519 | | - new MockSource( |
520 | | - Boundedness.CONTINUOUS_UNBOUNDED, 2, true, false), |
521 | | - WatermarkStrategy.forGenerator( |
522 | | - ctx -> new RecordToWatermarkGenerator()))) |
523 | | - .addInput(BasicTypeInfo.DOUBLE_TYPE_INFO, 2) |
524 | | - .setupOutputForSingletonOperatorChain( |
525 | | - new MapToStringMultipleInputOperatorFactory(3)) |
526 | | - .build()) { |
| 514 | + buildWatermarkTestHarness(2, false)) { |
527 | 515 | ArrayDeque<Object> expectedOutput = new ArrayDeque<>(); |
528 | 516 |
|
529 | 517 | int initialTime = 0; |
@@ -600,20 +588,7 @@ public void testWatermark() throws Exception { |
600 | 588 | @Test |
601 | 589 | public void testWatermarkAndStreamStatusForwarding() throws Exception { |
602 | 590 | try (StreamTaskMailboxTestHarness<String> testHarness = |
603 | | - new StreamTaskMailboxTestHarnessBuilder<>( |
604 | | - MultipleInputStreamTask::new, BasicTypeInfo.STRING_TYPE_INFO) |
605 | | - .modifyExecutionConfig(config -> config.enableObjectReuse()) |
606 | | - .addInput(BasicTypeInfo.STRING_TYPE_INFO, 2) |
607 | | - .addSourceInput( |
608 | | - new SourceOperatorFactory<>( |
609 | | - new MockSource( |
610 | | - Boundedness.CONTINUOUS_UNBOUNDED, 2, true, true), |
611 | | - WatermarkStrategy.forGenerator( |
612 | | - ctx -> new RecordToWatermarkGenerator()))) |
613 | | - .addInput(BasicTypeInfo.DOUBLE_TYPE_INFO, 2) |
614 | | - .setupOutputForSingletonOperatorChain( |
615 | | - new MapToStringMultipleInputOperatorFactory(3)) |
616 | | - .build()) { |
| 591 | + buildWatermarkTestHarness(2, true)) { |
617 | 592 | ArrayDeque<Object> expectedOutput = new ArrayDeque<>(); |
618 | 593 |
|
619 | 594 | int initialTime = 0; |
@@ -676,6 +651,24 @@ public void testWatermarkAndStreamStatusForwarding() throws Exception { |
676 | 651 | } |
677 | 652 | } |
678 | 653 |
|
| 654 | + @Test |
| 655 | + public void testAdvanceToEndOfEventTime() throws Exception { |
| 656 | + try (StreamTaskMailboxTestHarness<String> testHarness = |
| 657 | + buildWatermarkTestHarness(2, false)) { |
| 658 | + testHarness.processElement(Watermark.MAX_WATERMARK, 0, 0); |
| 659 | + testHarness.processElement(Watermark.MAX_WATERMARK, 0, 1); |
| 660 | + |
| 661 | + testHarness.getStreamTask().advanceToEndOfEventTime(); |
| 662 | + |
| 663 | + testHarness.processElement(Watermark.MAX_WATERMARK, 1, 0); |
| 664 | + |
| 665 | + assertThat(testHarness.getOutput(), not(contains(Watermark.MAX_WATERMARK))); |
| 666 | + |
| 667 | + testHarness.processElement(Watermark.MAX_WATERMARK, 1, 1); |
| 668 | + assertThat(testHarness.getOutput(), contains(Watermark.MAX_WATERMARK)); |
| 669 | + } |
| 670 | + } |
| 671 | + |
679 | 672 | @Test |
680 | 673 | @SuppressWarnings("unchecked") |
681 | 674 | public void testWatermarkMetrics() throws Exception { |
@@ -1026,6 +1019,27 @@ static void addSourceRecords( |
1026 | 1019 | .dispatchOperatorEvent(sourceOperatorID, new SerializedValue<>(addSplitEvent)); |
1027 | 1020 | } |
1028 | 1021 |
|
| 1022 | + private static StreamTaskMailboxTestHarness<String> buildWatermarkTestHarness( |
| 1023 | + int inputChannels, boolean readerMarkIdleOnNoSplits) throws Exception { |
| 1024 | + return new StreamTaskMailboxTestHarnessBuilder<>( |
| 1025 | + MultipleInputStreamTask::new, BasicTypeInfo.STRING_TYPE_INFO) |
| 1026 | + .modifyExecutionConfig(config -> config.enableObjectReuse()) |
| 1027 | + .addInput(BasicTypeInfo.STRING_TYPE_INFO, inputChannels) |
| 1028 | + .addSourceInput( |
| 1029 | + new SourceOperatorFactory<>( |
| 1030 | + new MockSource( |
| 1031 | + Boundedness.CONTINUOUS_UNBOUNDED, |
| 1032 | + 2, |
| 1033 | + true, |
| 1034 | + readerMarkIdleOnNoSplits), |
| 1035 | + WatermarkStrategy.forGenerator( |
| 1036 | + ctx -> new RecordToWatermarkGenerator()))) |
| 1037 | + .addInput(BasicTypeInfo.DOUBLE_TYPE_INFO, inputChannels) |
| 1038 | + .setupOutputForSingletonOperatorChain( |
| 1039 | + new MapToStringMultipleInputOperatorFactory(3)) |
| 1040 | + .build(); |
| 1041 | + } |
| 1042 | + |
1029 | 1043 | private static OperatorID getSourceOperatorID( |
1030 | 1044 | StreamTaskMailboxTestHarness<String> testHarness, int sourceId) { |
1031 | 1045 | StreamConfig.InputConfig[] inputs = |
|
0 commit comments