1e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/*******************************************************************************
2b9d1b54e300318b470d9fedccc69d75187016444Evgeny Mandrikov * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors
3e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * All rights reserved. This program and the accompanying materials
4e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * are made available under the terms of the Eclipse Public License v1.0
5e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * which accompanies this distribution, and is available at
6e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * http://www.eclipse.org/legal/epl-v10.html
7e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *
8e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Contributors:
9e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *    Marc R. Hoffmann - initial API and implementation
10e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *
11e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov *******************************************************************************/
12e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpackage org.jacoco.core.test.perf;
13e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
14ac07e252571819685d3f74cb69c90c23abd340a0Marc R. Hoffmannimport java.util.concurrent.Callable;
15ac07e252571819685d3f74cb69c90c23abd340a0Marc R. Hoffmann
16e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.core.analysis.Analyzer;
17e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.core.analysis.IClassCoverage;
18e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.core.analysis.ICoverageVisitor;
19e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.core.data.ExecutionDataStore;
20e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovimport org.jacoco.core.test.TargetLoader;
21e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
22e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov/**
23e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov * Scenario to measure the time taken by the instrumentation process itself.
24e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov */
25e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikovpublic class AnalysisTimeScenario extends TimedScenario {
26e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
27e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	private final Class<?> target;
28e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
29e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	private final int count;
30e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
31e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	protected AnalysisTimeScenario(Class<?> target, int count) {
32e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		super(String.format("analysing %s classes", Integer.valueOf(count)));
33e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		this.target = target;
34e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		this.count = count;
35e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
36e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov
37e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	@Override
38ac07e252571819685d3f74cb69c90c23abd340a0Marc R. Hoffmann	protected Callable<Void> getInstrumentedCallable() throws Exception {
39e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		final byte[] bytes = TargetLoader.getClassDataAsBytes(target);
40e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		final ExecutionDataStore executionData = new ExecutionDataStore();
41e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		ICoverageVisitor visitor = new ICoverageVisitor() {
42e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			public void visitCoverage(IClassCoverage coverage) {
43e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			}
44e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		};
45e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		final Analyzer analyzer = new Analyzer(executionData, visitor);
46ac07e252571819685d3f74cb69c90c23abd340a0Marc R. Hoffmann		return new Callable<Void>() {
47ac07e252571819685d3f74cb69c90c23abd340a0Marc R. Hoffmann			public Void call() throws Exception {
48e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov				for (int i = 0; i < count; i++) {
49ac07e252571819685d3f74cb69c90c23abd340a0Marc R. Hoffmann					analyzer.analyzeClass(bytes, target.getName());
50e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov				}
51ac07e252571819685d3f74cb69c90c23abd340a0Marc R. Hoffmann				return null;
52e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov			}
53e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov		};
54e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov	}
55e69ba4dbb015949c5d84ba7bbb0b53efac28bb23Evgeny Mandrikov}
56