/* * 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.beam.runners.core.triggers; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** * Generalized tests for {@link FinishedTriggers} implementations. */ public class FinishedTriggersProperties { /** * Tests that for the provided trigger and {@link FinishedTriggers}, when the trigger is set * finished, it is correctly reported as finished. */ public static void verifyGetAfterSet( FinishedTriggers finishedSet, ExecutableTriggerStateMachine trigger) { assertFalse(finishedSet.isFinished(trigger)); finishedSet.setFinished(trigger, true); assertTrue(finishedSet.isFinished(trigger)); } /** * For a few arbitrary triggers, tests that when the trigger is set finished it is correctly * reported as finished. */ public static void verifyGetAfterSet(FinishedTriggers finishedSet) { ExecutableTriggerStateMachine trigger = ExecutableTriggerStateMachine.create( AfterAllStateMachine.of( AfterFirstStateMachine.of( AfterPaneStateMachine.elementCountAtLeast(3), AfterWatermarkStateMachine.pastEndOfWindow()), AfterAllStateMachine.of( AfterPaneStateMachine.elementCountAtLeast(10), AfterProcessingTimeStateMachine.pastFirstElementInPane()))); verifyGetAfterSet(finishedSet, trigger); verifyGetAfterSet(finishedSet, trigger.subTriggers().get(0).subTriggers().get(1)); verifyGetAfterSet(finishedSet, trigger.subTriggers().get(0)); verifyGetAfterSet(finishedSet, trigger.subTriggers().get(1)); verifyGetAfterSet(finishedSet, trigger.subTriggers().get(1).subTriggers().get(1)); verifyGetAfterSet(finishedSet, trigger.subTriggers().get(1).subTriggers().get(0)); } /** * Tests that clearing a trigger recursively clears all of that triggers subTriggers, but no * others. */ public static void verifyClearRecursively(FinishedTriggers finishedSet) { ExecutableTriggerStateMachine trigger = ExecutableTriggerStateMachine.create( AfterAllStateMachine.of( AfterFirstStateMachine.of( AfterPaneStateMachine.elementCountAtLeast(3), AfterWatermarkStateMachine.pastEndOfWindow()), AfterAllStateMachine.of( AfterPaneStateMachine.elementCountAtLeast(10), AfterProcessingTimeStateMachine.pastFirstElementInPane()))); // Set them all finished. This method is not on a trigger as it makes no sense outside tests. setFinishedRecursively(finishedSet, trigger); assertTrue(finishedSet.isFinished(trigger)); assertTrue(finishedSet.isFinished(trigger.subTriggers().get(0))); assertTrue(finishedSet.isFinished(trigger.subTriggers().get(0).subTriggers().get(0))); assertTrue(finishedSet.isFinished(trigger.subTriggers().get(0).subTriggers().get(1))); // Clear just the second AfterAll finishedSet.clearRecursively(trigger.subTriggers().get(1)); // Check that the first and all that are still finished assertTrue(finishedSet.isFinished(trigger)); verifyFinishedRecursively(finishedSet, trigger.subTriggers().get(0)); verifyUnfinishedRecursively(finishedSet, trigger.subTriggers().get(1)); } private static void setFinishedRecursively( FinishedTriggers finishedSet, ExecutableTriggerStateMachine trigger) { finishedSet.setFinished(trigger, true); for (ExecutableTriggerStateMachine subTrigger : trigger.subTriggers()) { setFinishedRecursively(finishedSet, subTrigger); } } private static void verifyFinishedRecursively( FinishedTriggers finishedSet, ExecutableTriggerStateMachine trigger) { assertTrue(finishedSet.isFinished(trigger)); for (ExecutableTriggerStateMachine subTrigger : trigger.subTriggers()) { verifyFinishedRecursively(finishedSet, subTrigger); } } private static void verifyUnfinishedRecursively( FinishedTriggers finishedSet, ExecutableTriggerStateMachine trigger) { assertFalse(finishedSet.isFinished(trigger)); for (ExecutableTriggerStateMachine subTrigger : trigger.subTriggers()) { verifyUnfinishedRecursively(finishedSet, subTrigger); } } }