/* * Hibernate Validator, declare and validate application constraints * * License: Apache License, Version 2.0 * See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>. */ package org.hibernate.validator.performance.statistical; import static org.assertj.core.api.Assertions.assertThat; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Threads; import org.openjdk.jmh.annotations.Warmup; import org.openjdk.jmh.infra.Blackhole; import javax.validation.Configuration; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.IntStream; /** * @author Hardy Ferentschik */ public class StatisticalValidation { private static final int NUMBER_OF_TEST_ENTITIES = 100; @State(Scope.Benchmark) public static class StatisticalValidationState { private volatile Validator validator; private volatile List<TestEntity> entitiesUnderTest; public StatisticalValidationState() { ValidatorFactory factory = null; final Configuration<?> configuration = Validation.byDefaultProvider().configure(); try ( InputStream mappingStream = StatisticalValidation.class.getResourceAsStream( "mapping.xml" ) ) { configuration.addMapping( mappingStream ); factory = configuration.buildValidatorFactory(); assertThat( factory ).isNotNull(); } catch (IOException e) { throw new IllegalStateException( "Mappings cannot be read. Validation factory cannot be configured correctly.", e ); } validator = factory.getValidator(); entitiesUnderTest = IntStream.rangeClosed( 0, NUMBER_OF_TEST_ENTITIES ) .mapToObj( index -> new TestEntity( index % 10 ) ) .collect( Collectors.toList() ); } } @Benchmark @BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MILLISECONDS) @Fork(value = 1) @Threads(100) @Warmup(iterations = 10) @Measurement(iterations = 10) public void testValidationWithStatisticalGraphDepthAndConstraintValidator(StatisticalValidationState state, Blackhole bh) throws Exception { state.entitiesUnderTest.forEach( testEntity -> { Set<ConstraintViolation<TestEntity>> violations = state.validator.validate( testEntity ); assertThat( violations ).hasSize( StatisticalConstraintValidator.threadLocalCounter.get().getFailures() ); bh.consume( violations ); StatisticalConstraintValidator.threadLocalCounter.get().reset(); } ); } }