mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
sm-runner: scope-based API for test locator
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2009 JetBrains s.r.o.
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -13,7 +13,6 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.intellij.testIntegration;
|
||||
|
||||
import com.intellij.execution.Location;
|
||||
@@ -23,14 +22,10 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Roman Chernyatchik
|
||||
*/
|
||||
/** @deprecated override SMTRunnerConsoleProperties.getTestLocator() instead (to be removed in IDEA 16) */
|
||||
public interface TestLocationProvider {
|
||||
ExtensionPointName<TestLocationProvider> EP_NAME = ExtensionPointName.create("com.intellij.testSrcLocator");
|
||||
@SuppressWarnings("deprecation") ExtensionPointName<TestLocationProvider> EP_NAME = ExtensionPointName.create("com.intellij.testSrcLocator");
|
||||
|
||||
@NotNull
|
||||
List<Location> getLocation(@NotNull final String protocolId,
|
||||
@NotNull final String locationData,
|
||||
final Project project);
|
||||
List<Location> getLocation(@NotNull String protocolId, @NotNull String locationData, Project project);
|
||||
}
|
||||
|
||||
@@ -714,9 +714,6 @@
|
||||
<projectService serviceInterface="com.intellij.openapi.graph.impl.builder.GraphEditModeFactory"
|
||||
serviceImplementation="com.intellij.openapi.graph.impl.builder.GraphEditModeFactoryImpl"/>
|
||||
|
||||
<!-- SM Test runner tests locations -->
|
||||
<testSrcLocator implementation="com.intellij.execution.testframework.sm.FileUrlProvider"/>
|
||||
|
||||
<dynamicContextProvider implementation="com.intellij.openapi.paths.GenericDynamicContextProvider"/>
|
||||
|
||||
<codeStyleSettingsProvider implementation="com.intellij.application.options.GeneralCodeStyleSettingsProvider"/>
|
||||
|
||||
+29
-16
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,46 +16,59 @@
|
||||
package com.intellij.execution.testframework.sm;
|
||||
|
||||
import com.intellij.execution.Location;
|
||||
import com.intellij.execution.testframework.sm.runner.SMTestLocator;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.openapi.project.DumbService;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.testIntegration.TestLocationProvider;
|
||||
import com.intellij.util.io.URLUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Sergey Simonchik
|
||||
*/
|
||||
public class CompositeTestLocationProvider implements TestLocationProvider {
|
||||
|
||||
private final TestLocationProvider myPrimaryLocator;
|
||||
/** to be removed in IDEA 16 */
|
||||
public class CompositeTestLocationProvider implements SMTestLocator {
|
||||
@SuppressWarnings("deprecation") private final TestLocationProvider myPrimaryLocator;
|
||||
@SuppressWarnings("deprecation") private final TestLocationProvider[] myLocators;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public CompositeTestLocationProvider(@Nullable TestLocationProvider primaryLocator) {
|
||||
myPrimaryLocator = primaryLocator;
|
||||
myLocators = Extensions.getExtensions(TestLocationProvider.EP_NAME);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public List<Location> getLocation(@NotNull String protocolId, @NotNull String locationData, Project project) {
|
||||
if (myPrimaryLocator != null) {
|
||||
List<Location> locations = myPrimaryLocator.getLocation(protocolId, locationData, project);
|
||||
public List<Location> getLocation(@NotNull String protocol, @NotNull String path, @NotNull Project project, @NotNull GlobalSearchScope scope) {
|
||||
boolean isDumbMode = DumbService.isDumb(project);
|
||||
|
||||
if (myPrimaryLocator != null && (!isDumbMode || myPrimaryLocator instanceof DumbAware)) {
|
||||
List<Location> locations = myPrimaryLocator.getLocation(protocol, path, project);
|
||||
if (!locations.isEmpty()) {
|
||||
return locations;
|
||||
}
|
||||
}
|
||||
final boolean isDumbMode = DumbService.isDumb(project);
|
||||
for (TestLocationProvider provider : Extensions.getExtensions(TestLocationProvider.EP_NAME)) {
|
||||
if (isDumbMode && !DumbService.isDumbAware(provider)) {
|
||||
continue;
|
||||
}
|
||||
final List<Location> locations = provider.getLocation(protocolId, locationData, project);
|
||||
|
||||
if (URLUtil.FILE_PROTOCOL.equals(protocol)) {
|
||||
List<Location> locations = FileUrlProvider.INSTANCE.getLocation(protocol, path, project, scope);
|
||||
if (!locations.isEmpty()) {
|
||||
return locations;
|
||||
}
|
||||
}
|
||||
|
||||
for (@SuppressWarnings("deprecation") TestLocationProvider provider : myLocators) {
|
||||
if (!isDumbMode || provider instanceof DumbAware) {
|
||||
List<Location> locations = provider.getLocation(protocol, path, project);
|
||||
if (!locations.isEmpty()) {
|
||||
return locations;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
+12
-13
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2009 JetBrains s.r.o.
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -17,6 +17,7 @@ package com.intellij.execution.testframework.sm;
|
||||
|
||||
import com.intellij.execution.Location;
|
||||
import com.intellij.execution.PsiLocation;
|
||||
import com.intellij.execution.testframework.sm.runner.SMTestLocator;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
@@ -24,8 +25,8 @@ import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.io.FileUtil;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.testIntegration.TestLocationProvider;
|
||||
import org.jetbrains.annotations.NonNls;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.util.io.URLUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -37,16 +38,15 @@ import java.util.List;
|
||||
/**
|
||||
* @author Roman Chernyatchik
|
||||
*/
|
||||
public class FileUrlProvider implements TestLocationProvider, DumbAware {
|
||||
public class FileUrlProvider implements SMTestLocator, DumbAware {
|
||||
private static final Logger LOG = Logger.getInstance(FileUrlProvider.class.getName());
|
||||
|
||||
@NonNls private static final String FILE_PROTOCOL_ID = "file";
|
||||
public static final FileUrlProvider INSTANCE = new FileUrlProvider();
|
||||
|
||||
@NotNull
|
||||
public List<Location> getLocation(@NotNull final String protocolId, @NotNull final String path,
|
||||
final Project project) {
|
||||
|
||||
if (!FILE_PROTOCOL_ID.equals(protocolId)) {
|
||||
@Override
|
||||
public List<Location> getLocation(@NotNull String protocol, @NotNull String path, @NotNull Project project, @NotNull GlobalSearchScope scope) {
|
||||
if (!URLUtil.FILE_PROTOCOL.equals(protocol)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ public class FileUrlProvider implements TestLocationProvider, DumbAware {
|
||||
try {
|
||||
lineNum = Integer.parseInt(lineNumStr);
|
||||
} catch (NumberFormatException e) {
|
||||
LOG.warn(protocolId + ": Malformed location path: " + path, e);
|
||||
LOG.warn(protocol + ": Malformed location path: " + path, e);
|
||||
}
|
||||
|
||||
filePath = normalizedPath.substring(0, lineNoSeparatorIndex);
|
||||
@@ -84,7 +84,7 @@ public class FileUrlProvider implements TestLocationProvider, DumbAware {
|
||||
if (lineNumber < 0) {
|
||||
LOG.warn("Tests location provider: line number should be >= 1. Path: " + path);
|
||||
}
|
||||
|
||||
|
||||
final List<Location> locations = new ArrayList<Location>(2);
|
||||
for (VirtualFile file : virtualFiles) {
|
||||
locations.add(createLocationFor(project, file, lineNumber < 1 ? 1 : lineNumber));
|
||||
@@ -93,8 +93,7 @@ public class FileUrlProvider implements TestLocationProvider, DumbAware {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static Location createLocationFor(final Project project,
|
||||
@NotNull final VirtualFile virtualFile, final int lineNum) {
|
||||
public static Location createLocationFor(Project project, @NotNull VirtualFile virtualFile, int lineNum) {
|
||||
assert lineNum > 0;
|
||||
|
||||
final PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile);
|
||||
|
||||
+52
-8
@@ -17,6 +17,7 @@ package com.intellij.execution.testframework.sm;
|
||||
|
||||
import com.intellij.execution.ExecutionException;
|
||||
import com.intellij.execution.Executor;
|
||||
import com.intellij.execution.Location;
|
||||
import com.intellij.execution.configurations.CommandLineState;
|
||||
import com.intellij.execution.configurations.ModuleRunConfiguration;
|
||||
import com.intellij.execution.process.ProcessAdapter;
|
||||
@@ -29,12 +30,20 @@ import com.intellij.execution.testframework.sm.runner.ui.*;
|
||||
import com.intellij.execution.testframework.sm.runner.ui.statistics.StatisticsPanel;
|
||||
import com.intellij.execution.testframework.ui.BaseTestsOutputConsoleView;
|
||||
import com.intellij.execution.ui.ConsoleView;
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.openapi.project.DumbService;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.testIntegration.TestLocationProvider;
|
||||
import com.intellij.util.io.URLUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Roman Chernyatchik
|
||||
*/
|
||||
@@ -98,15 +107,14 @@ public class SMTestRunnerConnectionUtil {
|
||||
public static BaseTestsOutputConsoleView createConsoleWithCustomLocator(@NotNull String testFrameworkName,
|
||||
@NotNull TestConsoleProperties consoleProperties,
|
||||
ExecutionEnvironment environment,
|
||||
@Nullable TestLocationProvider locator) {
|
||||
CompositeTestLocationProvider provider = new CompositeTestLocationProvider(locator);
|
||||
return createConsoleWithCustomLocator(testFrameworkName, consoleProperties, environment, provider, false, null);
|
||||
@SuppressWarnings("deprecation") @Nullable TestLocationProvider locator) {
|
||||
return createConsoleWithCustomLocator(testFrameworkName, consoleProperties, environment, locator, false, null);
|
||||
}
|
||||
|
||||
public static SMTRunnerConsoleView createConsoleWithCustomLocator(@NotNull String testFrameworkName,
|
||||
@NotNull TestConsoleProperties consoleProperties,
|
||||
ExecutionEnvironment environment,
|
||||
@Nullable TestLocationProvider locator,
|
||||
@SuppressWarnings("deprecation") @Nullable TestLocationProvider locator,
|
||||
boolean idBasedTreeConstruction,
|
||||
@Nullable TestProxyFilterProvider filterProvider) {
|
||||
String splitterPropertyName = getSplitterPropertyName(testFrameworkName);
|
||||
@@ -122,7 +130,7 @@ public class SMTestRunnerConnectionUtil {
|
||||
|
||||
public static void initConsoleView(@NotNull final SMTRunnerConsoleView consoleView,
|
||||
@NotNull final String testFrameworkName,
|
||||
@Nullable final TestLocationProvider locator,
|
||||
@SuppressWarnings("deprecation") @Nullable final TestLocationProvider locator,
|
||||
final boolean idBasedTreeConstruction,
|
||||
@Nullable final TestProxyFilterProvider filterProvider) {
|
||||
consoleView.addAttachToProcessListener(new AttachToProcessListener() {
|
||||
@@ -132,13 +140,27 @@ public class SMTestRunnerConnectionUtil {
|
||||
if (filterProvider != null) {
|
||||
printerProvider = new TestProxyPrinterProvider(consoleView, filterProvider);
|
||||
}
|
||||
|
||||
TestConsoleProperties properties = consoleView.getProperties();
|
||||
|
||||
SMTestLocator testLocator = null;
|
||||
if (properties instanceof SMTRunnerConsoleProperties) {
|
||||
testLocator = ((SMTRunnerConsoleProperties)properties).getTestLocator();
|
||||
}
|
||||
if (testLocator != null) {
|
||||
testLocator = new CombinedTestLocator(testLocator); // new API in action
|
||||
}
|
||||
else {
|
||||
testLocator = new CompositeTestLocationProvider(locator); // legacy mode
|
||||
}
|
||||
|
||||
SMTestRunnerResultsForm resultsForm = consoleView.getResultsViewer();
|
||||
attachEventsProcessors(consoleView.getProperties(),
|
||||
attachEventsProcessors(properties,
|
||||
resultsForm,
|
||||
resultsForm.getStatisticsPane(),
|
||||
processHandler,
|
||||
testFrameworkName,
|
||||
locator,
|
||||
testLocator,
|
||||
idBasedTreeConstruction,
|
||||
printerProvider);
|
||||
}
|
||||
@@ -163,7 +185,7 @@ public class SMTestRunnerConnectionUtil {
|
||||
StatisticsPanel statisticsPane,
|
||||
ProcessHandler processHandler,
|
||||
@NotNull String testFrameworkName,
|
||||
@Nullable TestLocationProvider locator,
|
||||
@Nullable SMTestLocator locator,
|
||||
boolean idBasedTreeConstruction,
|
||||
@Nullable TestProxyPrinterProvider printerProvider) {
|
||||
// build messages consumer
|
||||
@@ -232,6 +254,28 @@ public class SMTestRunnerConnectionUtil {
|
||||
return processHandler;
|
||||
}
|
||||
|
||||
private static class CombinedTestLocator implements SMTestLocator, DumbAware {
|
||||
private final SMTestLocator myLocator;
|
||||
|
||||
public CombinedTestLocator(SMTestLocator locator) {
|
||||
myLocator = locator;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public List<Location> getLocation(@NotNull String protocol, @NotNull String path, @NotNull Project project, @NotNull GlobalSearchScope scope) {
|
||||
if (URLUtil.FILE_PROTOCOL.equals(protocol)) {
|
||||
return FileUrlProvider.INSTANCE.getLocation(protocol, path, project, scope);
|
||||
}
|
||||
else if (!DumbService.isDumb(project) || DumbService.isDumbAware(myLocator)) {
|
||||
return myLocator.getLocation(protocol, path, project, scope);
|
||||
}
|
||||
else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** @deprecated use {@link #createAndAttachConsole(String, ProcessHandler, TestConsoleProperties, ExecutionEnvironment)} (to be removed in IDEA 16) */
|
||||
@SuppressWarnings("unused")
|
||||
public static ConsoleView createAndAttachConsole(@NotNull String testFrameworkName,
|
||||
|
||||
+7
-7
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -23,7 +23,6 @@ import com.intellij.openapi.application.Application;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.testIntegration.TestLocationProvider;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import gnu.trove.TIntObjectHashMap;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -44,20 +43,21 @@ public class GeneralIdBasedToSMTRunnerEventsConvertor extends GeneralTestEventsP
|
||||
private final SMTestProxy.SMRootTestProxy myTestsRootProxy;
|
||||
private final Node myTestsRootNode;
|
||||
private final String myTestFrameworkName;
|
||||
|
||||
private boolean myIsTestingFinished = false;
|
||||
private TestLocationProvider myLocator = null;
|
||||
private SMTestLocator myLocator = null;
|
||||
private TestProxyPrinterProvider myTestProxyPrinterProvider = null;
|
||||
|
||||
public GeneralIdBasedToSMTRunnerEventsConvertor(@NotNull SMTestProxy.SMRootTestProxy testsRootProxy,
|
||||
@NotNull String testFrameworkName) {
|
||||
public GeneralIdBasedToSMTRunnerEventsConvertor(@NotNull SMTestProxy.SMRootTestProxy testsRootProxy, @NotNull String testFrameworkName) {
|
||||
myTestsRootProxy = testsRootProxy;
|
||||
myTestsRootNode = new Node(0, null, testsRootProxy);
|
||||
myTestFrameworkName = testFrameworkName;
|
||||
myNodeByIdMap.put(myTestsRootNode.getId(), myTestsRootNode);
|
||||
}
|
||||
|
||||
public void setLocator(@NotNull TestLocationProvider customLocator) {
|
||||
myLocator = customLocator;
|
||||
@Override
|
||||
public void setLocator(@NotNull SMTestLocator locator) {
|
||||
myLocator = locator;
|
||||
}
|
||||
|
||||
public void addEventsListener(@NotNull SMTRunnerEventsListener listener) {
|
||||
|
||||
+13
-12
@@ -22,7 +22,6 @@ import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.util.Condition;
|
||||
import com.intellij.openapi.util.Conditions;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.testIntegration.TestLocationProvider;
|
||||
import com.intellij.util.Processor;
|
||||
import com.intellij.util.containers.TransferToEDTQueue;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
@@ -30,7 +29,6 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Processes events of test runner in general text-based form.
|
||||
@@ -49,6 +47,17 @@ public abstract class GeneralTestEventsProcessor implements Disposable {
|
||||
}
|
||||
}, getDisposedCondition(), 300);
|
||||
|
||||
|
||||
// tree construction events
|
||||
|
||||
public void onSuiteTreeNodeAdded(String testName, String locationHint) { }
|
||||
|
||||
public void onSuiteTreeStarted(String suiteName, String locationHint) { }
|
||||
|
||||
public void onSuiteTreeEnded(String suiteName) { }
|
||||
|
||||
// progress events
|
||||
|
||||
public abstract void onStartTesting();
|
||||
|
||||
public abstract void onTestsCountInSuite(final int count);
|
||||
@@ -73,7 +82,7 @@ public abstract class GeneralTestEventsProcessor implements Disposable {
|
||||
|
||||
public abstract void onFinishTesting();
|
||||
|
||||
// Custom progress statistics
|
||||
// custom progress statistics
|
||||
|
||||
/**
|
||||
* @param categoryName If isn't empty then progress statistics will use only custom start/failed events.
|
||||
@@ -90,7 +99,7 @@ public abstract class GeneralTestEventsProcessor implements Disposable {
|
||||
|
||||
public abstract void onTestsReporterAttached();
|
||||
|
||||
public abstract void setLocator(@NotNull TestLocationProvider locator);
|
||||
public abstract void setLocator(@NotNull SMTestLocator locator);
|
||||
|
||||
public abstract void addEventsListener(@NotNull SMTRunnerEventsListener viewer);
|
||||
|
||||
@@ -124,12 +133,4 @@ public abstract class GeneralTestEventsProcessor implements Disposable {
|
||||
myTransferToEDTQueue.offer(runnable);
|
||||
}
|
||||
}
|
||||
|
||||
//tree construction events
|
||||
|
||||
public void onSuiteTreeNodeAdded(String testName, String locationHint) {}
|
||||
|
||||
public void onSuiteTreeStarted(String suiteName, String locationHint) {}
|
||||
|
||||
public void onSuiteTreeEnded(String suiteName) {}
|
||||
}
|
||||
|
||||
+18
-16
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2009 JetBrains s.r.o.
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -25,7 +25,6 @@ import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.testIntegration.TestLocationProvider;
|
||||
import com.intellij.util.ObjectUtils;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -35,33 +34,32 @@ import org.jetbrains.annotations.TestOnly;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author: Roman Chernyatchik
|
||||
* This class fires events to SMTRunnerEventsListener in event dispatch thread.
|
||||
*
|
||||
* This class fires events to RTestUnitEventsListener in EventDispatch thread
|
||||
* @author: Roman Chernyatchik
|
||||
*/
|
||||
public class GeneralToSMTRunnerEventsConvertor extends GeneralTestEventsProcessor {
|
||||
private static final Logger LOG = Logger.getInstance(GeneralToSMTRunnerEventsConvertor.class.getName());
|
||||
|
||||
private final Map<String, SMTestProxy> myRunningTestsFullNameToProxy = new HashMap<String, SMTestProxy>();
|
||||
|
||||
private final Set<AbstractTestProxy> myFailedTestsSet = new HashSet<AbstractTestProxy>();
|
||||
|
||||
private final TestSuiteStack mySuitesStack = new TestSuiteStack();
|
||||
private final List<SMTRunnerEventsListener> myEventsListeners = ContainerUtil.createLockFreeCopyOnWriteList();
|
||||
private final SMTestProxy.SMRootTestProxy myTestsRootNode;
|
||||
private final String myTestFrameworkName;
|
||||
|
||||
private boolean myIsTestingFinished;
|
||||
private TestLocationProvider myLocator = null;
|
||||
private SMTestLocator myLocator = null;
|
||||
private boolean myTreeBuildBeforeStart = false;
|
||||
|
||||
public GeneralToSMTRunnerEventsConvertor(@NotNull final SMTestProxy.SMRootTestProxy testsRootNode,
|
||||
@NotNull final String testFrameworkName) {
|
||||
public GeneralToSMTRunnerEventsConvertor(@NotNull SMTestProxy.SMRootTestProxy testsRootNode, @NotNull String testFrameworkName) {
|
||||
myTestsRootNode = testsRootNode;
|
||||
myTestFrameworkName = testFrameworkName;
|
||||
}
|
||||
|
||||
public void setLocator(@NotNull TestLocationProvider customLocator) {
|
||||
myLocator = customLocator;
|
||||
@Override
|
||||
public void setLocator(@NotNull SMTestLocator locator) {
|
||||
myLocator = locator;
|
||||
}
|
||||
|
||||
public void addEventsListener(@NotNull final SMTRunnerEventsListener listener) {
|
||||
@@ -176,23 +174,24 @@ public class GeneralToSMTRunnerEventsConvertor extends GeneralTestEventsProcesso
|
||||
if (myRunningTestsFullNameToProxy.containsKey(fullName)) {
|
||||
//Duplicated event
|
||||
logProblem("Test [" + fullName + "] has been already started");
|
||||
|
||||
if (SMTestRunnerConnectionUtil.isInDebugMode()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
final SMTestProxy parentSuite = getCurrentSuite();
|
||||
SMTestProxy parentSuite = getCurrentSuite();
|
||||
SMTestProxy testProxy = findChildByName(parentSuite, fullName);
|
||||
if (testProxy == null) {
|
||||
// creates test
|
||||
|
||||
testProxy = new SMTestProxy(testName, false, locationUrl);
|
||||
|
||||
if (myLocator != null) {
|
||||
testProxy.setLocator(myLocator);
|
||||
}
|
||||
|
||||
parentSuite.addChild(testProxy);
|
||||
}
|
||||
|
||||
// adds to running tests map
|
||||
myRunningTestsFullNameToProxy.put(fullName, testProxy);
|
||||
|
||||
@@ -210,14 +209,17 @@ public class GeneralToSMTRunnerEventsConvertor extends GeneralTestEventsProcesso
|
||||
public void run() {
|
||||
final String suiteName = suiteStartedEvent.getName();
|
||||
final String locationUrl = suiteStartedEvent.getLocationUrl();
|
||||
final SMTestProxy parentSuite = getCurrentSuite();
|
||||
//new suite
|
||||
|
||||
SMTestProxy parentSuite = getCurrentSuite();
|
||||
SMTestProxy newSuite = findChildByName(parentSuite, suiteName);
|
||||
if (newSuite == null) {
|
||||
//new suite
|
||||
newSuite = new SMTestProxy(suiteName, true, locationUrl);
|
||||
|
||||
if (myLocator != null) {
|
||||
newSuite.setLocator(myLocator);
|
||||
}
|
||||
|
||||
parentSuite.addChild(newSuite);
|
||||
}
|
||||
|
||||
|
||||
+5
@@ -162,4 +162,9 @@ public class SMTRunnerConsoleProperties extends TestConsoleProperties implements
|
||||
public boolean fixEmptySuite() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public SMTestLocator getTestLocator() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed 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.
|
||||
*/
|
||||
package com.intellij.execution.testframework.sm.runner;
|
||||
|
||||
import com.intellij.execution.Location;
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.openapi.project.DumbService;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* A parser for location URLs reported by test runners.
|
||||
* See {@link SMTestProxy#getLocation(Project, GlobalSearchScope)} for details.
|
||||
*/
|
||||
public interface SMTestLocator {
|
||||
@NotNull
|
||||
List<Location> getLocation(@NotNull String protocol, @NotNull String path, @NotNull Project project, @NotNull GlobalSearchScope scope);
|
||||
|
||||
class Composite implements SMTestLocator, DumbAware {
|
||||
private final Map<String, ? extends SMTestLocator> myLocators;
|
||||
|
||||
public Composite(@NotNull Pair<String, ? extends SMTestLocator> first, @NotNull Pair<String, ? extends SMTestLocator>... rest) {
|
||||
myLocators = ContainerUtil.newHashMap(first, rest);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public List<Location> getLocation(@NotNull String protocol, @NotNull String path, @NotNull Project project, @NotNull GlobalSearchScope scope) {
|
||||
SMTestLocator locator = myLocators.get(protocol);
|
||||
|
||||
if (locator != null && (!DumbService.isDumb(project) || DumbService.isDumbAware(locator))) {
|
||||
return locator.getLocation(protocol, path, project, scope);
|
||||
}
|
||||
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
}
|
||||
+35
-13
@@ -25,6 +25,8 @@ import com.intellij.execution.ui.ConsoleViewContentType;
|
||||
import com.intellij.ide.util.EditSourceUtil;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.project.DumbService;
|
||||
import com.intellij.openapi.project.PossiblyDumbAware;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.vfs.VirtualFileManager;
|
||||
@@ -44,7 +46,7 @@ import java.util.List;
|
||||
* Represents a test result tree node.
|
||||
* Not thread-safe. All methods should be called in EDT only.
|
||||
*
|
||||
* @author: Roman Chernyatchik
|
||||
* @author Roman Chernyatchik
|
||||
*/
|
||||
public class SMTestProxy extends AbstractTestProxy {
|
||||
private static final Logger LOG = Logger.getInstance(SMTestProxy.class.getName());
|
||||
@@ -69,7 +71,7 @@ public class SMTestProxy extends AbstractTestProxy {
|
||||
|
||||
private boolean myIsEmptyIsCached = false; // is used for separating unknown and unset values
|
||||
private boolean myIsEmpty = true;
|
||||
private TestLocationProvider myLocator = null;
|
||||
private SMTestLocator myLocator = null;
|
||||
private Printer myPreferredPrinter = null;
|
||||
|
||||
public SMTestProxy(String testName, boolean isSuite, @Nullable String locationUrl) {
|
||||
@@ -83,8 +85,27 @@ public class SMTestProxy extends AbstractTestProxy {
|
||||
myPreservePresentableName = preservePresentableName;
|
||||
}
|
||||
|
||||
public void setLocator(@NotNull TestLocationProvider locator) {
|
||||
myLocator = locator;
|
||||
public void setLocator(@NotNull SMTestLocator testLocator) {
|
||||
myLocator = testLocator;
|
||||
}
|
||||
|
||||
/** @deprecated use {@link #setLocator(SMTestLocator)} (to be removed in IDEA 16) */
|
||||
@SuppressWarnings("deprecation")
|
||||
public void setLocator(@NotNull final TestLocationProvider locator) {
|
||||
class Adapter implements SMTestLocator, PossiblyDumbAware {
|
||||
@NotNull
|
||||
@Override
|
||||
public List<Location> getLocation(@NotNull String protocol, @NotNull String path, @NotNull Project project, @NotNull GlobalSearchScope scope) {
|
||||
return locator.getLocation(protocol, path, project);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDumbAware() {
|
||||
return DumbService.isDumbAware(locator);
|
||||
}
|
||||
}
|
||||
|
||||
myLocator = new Adapter();
|
||||
}
|
||||
|
||||
public void setPreferredPrinter(@NotNull Printer preferredPrinter) {
|
||||
@@ -105,7 +126,6 @@ public class SMTestProxy extends AbstractTestProxy {
|
||||
|
||||
public int getMagnitude() {
|
||||
// Is used by some of Tests Filters
|
||||
|
||||
//WARN: It is Hack, see PoolOfTestStates, API is necessary
|
||||
return getMagnitudeInfo().getValue();
|
||||
}
|
||||
@@ -244,15 +264,17 @@ public class SMTestProxy extends AbstractTestProxy {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Location getLocation(final Project project, GlobalSearchScope searchScope) {
|
||||
public Location getLocation(@NotNull Project project, @NotNull GlobalSearchScope searchScope) {
|
||||
//determines location of test proxy
|
||||
if (myLocationUrl != null && myLocator != null) {
|
||||
String protocolId = VirtualFileManager.extractProtocol(myLocationUrl);
|
||||
if (protocolId != null) {
|
||||
String path = VirtualFileManager.extractPath(myLocationUrl);
|
||||
List<Location> locations = myLocator.getLocation(protocolId, path, project);
|
||||
if (!locations.isEmpty()) {
|
||||
return locations.get(0);
|
||||
if (!DumbService.isDumb(project) || DumbService.isDumbAware(myLocator)) {
|
||||
List<Location> locations = myLocator.getLocation(protocolId, path, project, searchScope);
|
||||
if (!locations.isEmpty()) {
|
||||
return locations.get(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -261,14 +283,14 @@ public class SMTestProxy extends AbstractTestProxy {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Navigatable getDescriptor(final Location location, final TestConsoleProperties testConsoleProperties) {
|
||||
public Navigatable getDescriptor(@Nullable Location location, @NotNull TestConsoleProperties properties) {
|
||||
// by location gets navigatable element.
|
||||
// It can be file or place in file (e.g. when OPEN_FAILURE_LINE is enabled)
|
||||
if (location == null) return null;
|
||||
|
||||
final String stacktrace = myStacktrace;
|
||||
if (stacktrace != null && (testConsoleProperties instanceof SMStacktraceParser) && isLeaf()) {
|
||||
final Navigatable result = ((SMStacktraceParser)testConsoleProperties).getErrorNavigatable(location.getProject(), stacktrace);
|
||||
String stacktrace = myStacktrace;
|
||||
if (stacktrace != null && properties instanceof SMStacktraceParser && isLeaf()) {
|
||||
Navigatable result = ((SMStacktraceParser)properties).getErrorNavigatable(location.getProject(), stacktrace);
|
||||
if (result != null) {
|
||||
return result;
|
||||
}
|
||||
|
||||
+6
-10
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2009 JetBrains s.r.o.
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -29,7 +29,7 @@ public class FileUrlLocationTest extends SMLightFixtureTestCase {
|
||||
return LightProjectDescriptor.EMPTY_PROJECT_DESCRIPTOR;
|
||||
}
|
||||
|
||||
public void testSpecNavigation() throws Throwable {
|
||||
public void testSpecNavigation() {
|
||||
createAndAddFile("my_example_spec.xml",
|
||||
"\n" +
|
||||
"<describe>\n" +
|
||||
@@ -42,19 +42,15 @@ public class FileUrlLocationTest extends SMLightFixtureTestCase {
|
||||
doTest(16, "<", path, 3);
|
||||
}
|
||||
|
||||
private void doTest(final int expectedOffset, final String expectedStartsWith,
|
||||
final String filePath, final int lineNum) {
|
||||
final SMTestProxy testProxy =
|
||||
new SMTestProxy("myTest", false, "file://" + filePath + ":" + lineNum);
|
||||
testProxy.setLocator(new CompositeTestLocationProvider(null));
|
||||
private void doTest(int expectedOffset, String expectedStartsWith, String filePath, int lineNum) {
|
||||
final SMTestProxy testProxy = new SMTestProxy("myTest", false, "file://" + filePath + ":" + lineNum);
|
||||
testProxy.setLocator(FileUrlProvider.INSTANCE);
|
||||
|
||||
final Location location = testProxy.getLocation(getProject(), GlobalSearchScope.allScope(getProject()));
|
||||
assertNotNull(location);
|
||||
assertNotNull(location.getPsiElement());
|
||||
|
||||
//System.out.println(location.getPsiElement().getText());
|
||||
//System.out.println(location.getPsiElement().getTextOffset());
|
||||
assertEquals(expectedOffset, location.getPsiElement().getTextOffset());
|
||||
|
||||
final String element = location.getPsiElement().getText();
|
||||
assertTrue(element, element.startsWith(expectedStartsWith));
|
||||
}
|
||||
|
||||
+4
-13
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2009 JetBrains s.r.o.
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -27,13 +27,11 @@ import com.intellij.testFramework.fixtures.TestFixtureBuilder;
|
||||
import com.intellij.testFramework.fixtures.impl.LightTempDirTestFixtureImpl;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @author Roman.Chernyatchik
|
||||
*/
|
||||
public abstract class SMLightFixtureTestCase extends UsefulTestCase {
|
||||
|
||||
@SuppressWarnings("JUnitTestCaseWithNonTrivialConstructors")
|
||||
protected SMLightFixtureTestCase() {
|
||||
PlatformTestCase.initPlatformLangPrefix();
|
||||
}
|
||||
@@ -45,15 +43,11 @@ public abstract class SMLightFixtureTestCase extends UsefulTestCase {
|
||||
super.setUp();
|
||||
|
||||
final IdeaTestFixtureFactory factory = IdeaTestFixtureFactory.getFixtureFactory();
|
||||
final TestFixtureBuilder<IdeaProjectTestFixture> fixtureBuilder =
|
||||
factory.createLightFixtureBuilder(getProjectDescriptor());
|
||||
|
||||
final TestFixtureBuilder<IdeaProjectTestFixture> fixtureBuilder = factory.createLightFixtureBuilder(getProjectDescriptor());
|
||||
final IdeaProjectTestFixture fixture = fixtureBuilder.getFixture();
|
||||
final LightTempDirTestFixtureImpl tempDirTestFixture = new LightTempDirTestFixtureImpl(true);
|
||||
myFixture = IdeaTestFixtureFactory.getFixtureFactory().createCodeInsightFixture(fixture, tempDirTestFixture);
|
||||
myFixture.setUp();
|
||||
|
||||
setupFixtureWhenInitialized();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -64,9 +58,6 @@ public abstract class SMLightFixtureTestCase extends UsefulTestCase {
|
||||
super.tearDown();
|
||||
}
|
||||
|
||||
protected void setupFixtureWhenInitialized() throws IOException {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
protected LightProjectDescriptor getProjectDescriptor() {
|
||||
return null;
|
||||
@@ -76,7 +67,7 @@ public abstract class SMLightFixtureTestCase extends UsefulTestCase {
|
||||
return myFixture.getProject();
|
||||
}
|
||||
|
||||
protected void createAndAddFile(final String relativePath, final String text) throws IOException {
|
||||
protected void createAndAddFile(final String relativePath, final String text) {
|
||||
final PsiFile psiFile = myFixture.addFileToProject(relativePath, text);
|
||||
myFixture.configureFromExistingVirtualFile(psiFile.getVirtualFile());
|
||||
}
|
||||
|
||||
+2
-3
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2000-2011 JetBrains s.r.o.
|
||||
* Copyright 2000-2015 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -17,7 +17,6 @@ package com.intellij.execution.testframework.sm.runner;
|
||||
|
||||
import com.intellij.execution.testframework.sm.runner.events.*;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.testIntegration.TestLocationProvider;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -89,7 +88,7 @@ public class MockGeneralTestEventsProcessorAdapter extends GeneralTestEventsProc
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLocator(@NotNull TestLocationProvider locator) {
|
||||
public void setLocator(@NotNull SMTestLocator locator) {
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user