blob: ce1d94c73ced0ab26b834632620516515fdac44b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 EfficiOS Inc., Michael Jeanson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.analysis.lami.core.tests.shared.analysis;
import static org.junit.Assert.fail;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.analysis.lami.core.tests.Activator;
import org.eclipse.tracecompass.internal.provisional.analysis.lami.core.module.LamiAnalysis;
import org.eclipse.tracecompass.internal.provisional.analysis.lami.core.module.LamiChartModel;
import org.eclipse.tracecompass.internal.provisional.analysis.lami.core.module.LamiResultTable;
import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;
/**
* Extension of {@link LamiAnalysis} used for tests.
*/
public class LamiAnalysisStub extends LamiAnalysis {
private final @NonNull String fMetaDatafilename;
private final @NonNull String fResultFilename;
private @Nullable List<LamiResultTable> fResults = null;
/**
* Constructor.
*
* @param name
* The name of this analysis
* @param metaDatafilename
* Filename of the JSON metadata file.
* @param resultFilename
* Filename of the JSON results file.
*/
public LamiAnalysisStub(@NonNull String name, @NonNull String metaDatafilename, @NonNull String resultFilename) {
super(name, false, o -> true, Collections.singletonList("StubExecutable"));
fMetaDatafilename = metaDatafilename;
fResultFilename = resultFilename;
}
@Override
public @NonNull String getName() {
return fResultFilename;
}
@Override
protected @NonNull Multimap<@NonNull String, @NonNull LamiChartModel> getPredefinedCharts() {
return ImmutableMultimap.of();
}
@Override
protected String getResultsFromCommand(List<String> command, IProgressMonitor monitor)
throws CoreException {
return readLamiFile(fResultFilename);
}
@Override
protected @Nullable String getOutputFromCommand(List<String> command) {
return readLamiFile(fMetaDatafilename);
}
@Override
public boolean canExecute(ITmfTrace trace) {
initialize();
return true;
}
@Override
protected synchronized void initialize() {
checkMetadata();
}
/**
* Get the result table at a specified index for the last trace the analysis
* was run on.
*
* @param index
* The index of the table to get
* @return The result table
*/
public LamiResultTable getResultTable(int index) {
List<LamiResultTable> results = fResults;
if (results == null) {
throw new NullPointerException("Results are null. The analysis hasn't been run yet?");
}
return results.get(index);
}
private static @NonNull String readLamiFile(String filename) {
String fileContent = "";
try {
Activator plugin = Activator.instance();
if (plugin == null) {
/*
* Shouldn't happen but at least throw something to get the test to
* fail early
*/
throw new IllegalStateException();
}
URL url = FileLocator.find(plugin.getBundle(), new Path("testfiles/" + filename), null);
if (url == null) {
throw new IllegalArgumentException("lami file " + filename + " cannot be found");
}
try (InputStream inputStream = url.openConnection().getInputStream()) {
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
fileContent = in.lines().collect(Collectors.joining());
if (fileContent == null) {
fileContent = "";
}
}
} catch (IOException e) {
fail(e.getMessage());
}
return fileContent;
}
@Override
public @NonNull List<@NonNull LamiResultTable> execute(@NonNull ITmfTrace trace, @Nullable TmfTimeRange timeRange, @NonNull String extraParamsString, @NonNull IProgressMonitor monitor) throws CoreException {
// Cache the results of the analysis
@NonNull List<@NonNull LamiResultTable> results = super.execute(trace, timeRange, extraParamsString, monitor);
fResults = results;
return results;
}
}