package org.apache.maven.surefire.its.jiras; /* * 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. */ import org.apache.maven.it.VerificationException; import org.apache.maven.surefire.its.fixture.OutputValidator; import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase; import org.apache.maven.surefire.its.fixture.SurefireLauncher; import org.junit.Before; import org.junit.Test; import java.text.Format; import java.text.NumberFormat; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; import static java.lang.String.format; import static java.math.RoundingMode.DOWN; import static java.util.Locale.ROOT; import static org.hamcrest.CoreMatchers.anyOf; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.endsWith; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; /** * @author Kristian Rosenvold */ public class Surefire747MethodParallelWithSuiteCountIT extends SurefireJUnit4IntegrationTestCase { // if you want to change his constant, change it in SuiteTest1.java and SuiteTest2.java as well private static final int PERFORMANCE_TEST_MULTIPLICATION_FACTOR = 4; private Format lowerScaleFormatter, noFractionalDigitsFormatter; private static Set<String> printTestLines( OutputValidator validator, String pattern ) throws VerificationException { Set<String> log = new TreeSet<String>( validator.loadLogLines() ); for ( Iterator<String> it = log.iterator(); it.hasNext(); ) { String line = it.next(); if ( !line.contains( pattern ) ) { it.remove(); } } return log; } private static long duration( String logLine ) { return Integer.decode( logLine.split( "=" )[1] ); } @Before public void init() { NumberFormat lowScaleFormatter = NumberFormat.getInstance( ROOT ); lowScaleFormatter.setRoundingMode( DOWN ); lowScaleFormatter.setMinimumFractionDigits( 1 ); lowScaleFormatter.setMaximumFractionDigits( 1 ); this.lowerScaleFormatter = lowScaleFormatter; NumberFormat noFractionalDigitsFormatter = NumberFormat.getInstance( ROOT ); noFractionalDigitsFormatter.setRoundingMode( DOWN ); noFractionalDigitsFormatter.setMinimumFractionDigits( 0 ); noFractionalDigitsFormatter.setMaximumFractionDigits( 0 ); this.noFractionalDigitsFormatter = noFractionalDigitsFormatter; } @Test public void testMethodsParallelWithSuite() throws VerificationException { OutputValidator validator = unpack().executeTest().verifyErrorFree( 6 ); Set<String> testLines = printTestLines( validator, "test finished after duration=" ); assertThat( testLines.size(), is( 2 ) ); for ( String testLine : testLines ) { long duration = duration( testLine ); long min = 250 * PERFORMANCE_TEST_MULTIPLICATION_FACTOR; long max = 750 * PERFORMANCE_TEST_MULTIPLICATION_FACTOR; assertTrue( format( "duration %d should be between %d and %d ms", duration, min, max ), duration > min && duration < max ); } Set<String> suiteLines = printTestLines( validator, "suite finished after duration=" ); assertThat( suiteLines.size(), is( 1 ) ); long duration = duration( suiteLines.iterator().next() ); long min = 750 * PERFORMANCE_TEST_MULTIPLICATION_FACTOR; long max = 1250 * PERFORMANCE_TEST_MULTIPLICATION_FACTOR; assertTrue( format( "duration %d should be between %d and %d ms", duration, min, max ), duration > min && duration < max ); String delayMin = lowerScaleFormatter.format( 0.98 * PERFORMANCE_TEST_MULTIPLICATION_FACTOR * 0.5 ); String delayMax = noFractionalDigitsFormatter.format( PERFORMANCE_TEST_MULTIPLICATION_FACTOR * 0.5 ) + "."; for ( String line : validator.loadLogLines() ) { if ( line.startsWith( "Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed:" ) ) { assertThat( line, anyOf( // 1.9xx to 2.xxx can vary depending on CI jobs containsString( "Time elapsed: " + delayMin ), containsString( "Time elapsed: " + delayMax ) ) ); assertThat( line, anyOf( endsWith( " s - in surefire747.SuiteTest1" ), endsWith( " s - in surefire747.SuiteTest2" ) ) ); } } } @Test public void testClassesParallelWithSuite() throws VerificationException { OutputValidator validator = unpack().parallelClasses().executeTest().verifyErrorFree( 6 ); Set<String> testLines = printTestLines( validator, "test finished after duration=" ); assertThat( testLines.size(), is( 2 ) ); for ( String testLine : testLines ) { long duration = duration( testLine ); long min = 1450 * PERFORMANCE_TEST_MULTIPLICATION_FACTOR; long max = 1750 * PERFORMANCE_TEST_MULTIPLICATION_FACTOR; assertTrue( format( "duration %d should be between %d and %d ms", duration, min, max ), duration > min && duration < max ); } Set<String> suiteLines = printTestLines( validator, "suite finished after duration=" ); assertThat( suiteLines.size(), is( 1 ) ); long duration = duration( suiteLines.iterator().next() ); long min = 1450 * PERFORMANCE_TEST_MULTIPLICATION_FACTOR; long max = 1750 * PERFORMANCE_TEST_MULTIPLICATION_FACTOR; assertTrue( format( "duration %d should be between %d and %d ms", duration, min, max ), duration > min && duration < max ); } public SurefireLauncher unpack() { return unpack( "junit47-parallel-with-suite" ); } }