voonhous commented on code in PR #19485: URL: https://github.com/apache/hudi/pull/19485#discussion_r3956285803
########## hudi-utilities/src/test/java/org/apache/hudi/utilities/deltastreamer/TestDeltaStreamerTestHelpers.java: ########## @@ -0,0 +1,200 @@ +/* + * 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.hudi.utilities.deltastreamer; + +import org.apache.hudi.common.testutils.JavaTestUtils; +import org.apache.hudi.utilities.streamer.NoNewDataTerminationStrategy; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Covers the deltastreamer test helpers every continuous-mode test runs on: the wait in + * {@code HoodieDeltaStreamerTestBase.TestHelpers} and the runner in {@code TestHoodieDeltaStreamer}. + * + * <p>The wait used to fail with a bare {@code TimeoutException} naming only the helper, with the + * condition's own error logged at debug and discarded, so a timeout said nothing about which assertion + * never held (HUDI-6843). + */ +class TestDeltaStreamerTestHelpers { + + /** A deltastreamer future that never finishes, as a continuous-mode job would be. */ + private static final Future<?> RUNNING = new CompletableFuture<>(); + + /** + * The helper polls every 2s, so the timeout has to leave room for at least one evaluation to be recorded. + * 5s is enough for that, and keeps the tests in this class from spending half a minute asleep in the + * shared utilities job. + */ + private static final int CONDITION_TIMEOUT_SECS = 5; + + /** For the cases that are not meant to time out: they finish long before this, so it is never reached. */ + private static final int NEVER_REACHED_TIMEOUT_SECS = 30; + + @Test + void timeoutFailureNamesTheLastConditionFailure() { + String assertionText = "assertAtleastNDeltaCommits: expected at least 3 delta commits but got 2"; + + AssertionError error = assertThrows(AssertionError.class, + () -> HoodieDeltaStreamerTestBase.TestHelpers.waitTillCondition( + ignored -> { + throw new AssertionError(assertionText); + }, RUNNING, CONDITION_TIMEOUT_SECS)); + + assertTrue(error.getMessage().contains("was not met within " + CONDITION_TIMEOUT_SECS + " seconds"), + () -> "The failure should say the condition timed out, but was: " + error.getMessage()); + assertTrue(error.getMessage().contains(assertionText), + () -> "The failure should carry the condition's own error, which is the only clue to why the " + + "wait timed out, but was: " + error.getMessage()); + assertTrue(error.getMessage().contains("evaluations completed"), + () -> "The failure should say how many evaluations completed, which separates a condition that " + + "kept failing from one that never finished an evaluation, but was: " + error.getMessage()); + } Review Comment: Fixed in `9f3cd75`, with `assertInstanceOf(TimeoutException.class, error.getSuppressed()[0], ...)` and the two imports it needs. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
