/* * Copyright 2015-2017 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 which * accompanies this distribution and is available at * * http://www.eclipse.org/legal/epl-v10.html */ package org.junit.platform.console; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.platform.commons.meta.API.Usage.Internal; import static org.junit.platform.commons.util.StringUtils.isBlank; import static org.junit.platform.commons.util.StringUtils.isNotBlank; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.Optional; import org.junit.platform.commons.meta.API; import org.junit.platform.console.options.CommandLineOptionsParser; import org.junit.platform.console.options.JOptSimpleCommandLineOptionsParser; /** * @since 1.0 */ @API(Internal) public class ConsoleLauncherWrapper { private final Charset charset; private final ByteArrayOutputStream out = new ByteArrayOutputStream(); private final ByteArrayOutputStream err = new ByteArrayOutputStream(); private final ConsoleLauncher consoleLauncher; ConsoleLauncherWrapper() { this(StandardCharsets.UTF_8); } private ConsoleLauncherWrapper(Charset charset) { this(charset, new JOptSimpleCommandLineOptionsParser()); } private ConsoleLauncherWrapper(Charset charset, CommandLineOptionsParser parser) { this.charset = charset; try { PrintStream streamOut = new PrintStream(out, false, charset.name()); PrintStream streamErr = new PrintStream(err, false, charset.name()); this.consoleLauncher = new ConsoleLauncher(parser, streamOut, streamErr, charset); } catch (UnsupportedEncodingException exception) { throw new AssertionError("Charset instance created but unsupported?!", exception); } } public ConsoleLauncherWrapperResult execute(String... args) { return execute(0, args); } public ConsoleLauncherWrapperResult execute(int expectedExitCode, String... args) { return execute(Optional.of(expectedExitCode), args); } public ConsoleLauncherWrapperResult execute(Optional<Integer> expectedCode, String... args) { ConsoleLauncherExecutionResult result = consoleLauncher.execute(args); int code = result.getExitCode(); String outText = new String(out.toByteArray(), charset); String errText = new String(err.toByteArray(), charset); if (expectedCode.isPresent()) { int expectedValue = expectedCode.get(); assertAll("wrapped execution failed:\n" + outText + "\n", // () -> assertEquals(expectedValue, code, "ConsoleLauncher execute code mismatch!"), // () -> assertTrue(expectedValue == 0 ? isBlank(errText) : isNotBlank(errText)) // ); } return new ConsoleLauncherWrapperResult(args, charset, outText, errText, result); } }