/* * Copyright (c) 2011-2013 The original author or authors * ------------------------------------------------------ * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php * * You may elect to redistribute this code under either of these licenses. */ package io.vertx.core.impl.launcher.commands; import io.vertx.core.Vertx; import io.vertx.core.impl.launcher.VertxCommandLauncher; import io.vertx.core.logging.JULLogDelegateFactory; import org.junit.After; import org.junit.Before; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.function.BooleanSupplier; import java.util.logging.LogManager; import static org.assertj.core.api.Assertions.assertThat; public class CommandTestBase { protected static final PrintStream originalOutputPrintStream = System.out; protected static final PrintStream originalErrorPrintStream = System.err; protected ByteArrayOutputStream output; protected ByteArrayOutputStream error; protected PrintStream os; protected PrintStream err; protected VertxCommandLauncher cli; @Before public void setUp() throws IOException { cli = new VertxCommandLauncher(); output = new ByteArrayOutputStream(); error = new ByteArrayOutputStream(); // We need to reset the log configuration to recreate the logger // Indeed print stream may have been cached. LogManager.getLogManager().reset(); JULLogDelegateFactory.loadConfig(); } @After public void tearDown() throws InterruptedException { stop(); if (os != null) { os.close(); } if (err != null) { err.close(); } try { output.close(); } catch (IOException e) { // Ignore it. } try { error.close(); } catch (IOException e) { // Ignore it. } } public void record() { os = new PrintStream(output); err = new PrintStream(error); System.setOut(os); System.setErr(err); } public void stop() { if (System.out != originalOutputPrintStream) { System.setOut(originalOutputPrintStream); } if (System.err != originalErrorPrintStream) { System.setErr(originalErrorPrintStream); } } protected void waitUntil(BooleanSupplier supplier) { waitUntil(supplier, 20000); } protected void waitUntil(BooleanSupplier supplier, long timeout) { long start = System.currentTimeMillis(); while (true) { if (supplier.getAsBoolean()) { break; } try { Thread.sleep(10); } catch (InterruptedException ignore) { Thread.currentThread().interrupt(); } long now = System.currentTimeMillis(); if (now - start > timeout) { throw new IllegalStateException("Timed out"); } } } protected void awaitLatch(CountDownLatch latch) throws InterruptedException { assertThat(latch.await(10, TimeUnit.SECONDS)).isTrue(); } protected void close(Vertx vertx) throws InterruptedException { if (vertx == null) { return; } CountDownLatch latch = new CountDownLatch(1); vertx.close(ar -> { latch.countDown(); }); awaitLatch(latch); } }