From 1b941a951f84650bc67fc0053422ca11cb7bc5cb Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Fri, 1 Jul 2016 19:38:11 +0300 Subject: [PATCH] Don't request packages multiple times to get installed test frameworks It's not only redundant but also causes three identical errors with stacktraces in the log if we didn't manage to successfully run packaging_tool.py for some reason. Now we check status of all test frameworks in one pass. --- .../testing/VFSTestFrameworkListener.java | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/python/src/com/jetbrains/python/testing/VFSTestFrameworkListener.java b/python/src/com/jetbrains/python/testing/VFSTestFrameworkListener.java index 98fa61101ef8..3f655edde3da 100644 --- a/python/src/com/jetbrains/python/testing/VFSTestFrameworkListener.java +++ b/python/src/com/jetbrains/python/testing/VFSTestFrameworkListener.java @@ -42,7 +42,9 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -102,9 +104,16 @@ public class VFSTestFrameworkListener { } public void updateAllTestFrameworks(@NotNull Sdk sdk) { - checkFrameworkInstalledAndUpdateSettings(sdk, PyNames.PY_TEST); - checkFrameworkInstalledAndUpdateSettings(sdk, PyNames.NOSE_TEST); - checkFrameworkInstalledAndUpdateSettings(sdk, PyNames.AT_TEST); + final Map whichInstalled = checkTestFrameworksInstalled(sdk, PyNames.PY_TEST, PyNames.NOSE_TEST, PyNames.AT_TEST); + ApplicationManager.getApplication().invokeLater(() -> { + for (Map.Entry entry : whichInstalled.entrySet()) { + final Boolean installed = entry.getValue(); + if (installed != null) { + //noinspection ConstantConditions + setTestFrameworkInstalled(installed, sdk.getHomePath(), entry.getKey()); + } + } + }); } private void scheduleTestFrameworkCheck(@NotNull Sdk sdk, @NotNull String testPackageName) { @@ -129,19 +138,27 @@ public class VFSTestFrameworkListener { */ @Contract("null, _ -> null") private Boolean checkTestFrameworkInstalled(@Nullable Sdk sdk, @NotNull String testPackageName) { + return checkTestFrameworksInstalled(sdk, testPackageName).get(testPackageName); + } + + @NotNull + private Map checkTestFrameworksInstalled(@Nullable Sdk sdk, @NotNull String... testPackageNames) { + final Map result = new HashMap<>(); if (sdk == null || StringUtil.isEmptyOrSpaces(sdk.getHomePath())) { LOG.info("Searching test runner in empty sdk"); - return null; + return result; } final PyPackageManager manager = PyPackageManager.getInstance(sdk); final boolean refreshed = PyPackageUtil.updatePackagesSynchronouslyWithGuard(manager, myIsUpdating); if (refreshed) { final List packages = manager.getPackages(); if (packages != null) { - return PyPackageUtil.findPackage(packages, testPackageName) != null; + for (String name : testPackageNames) { + result.put(name, PyPackageUtil.findPackage(packages, name) != null); + } } } - return null; + return result; } private void setPyTestInstalled(boolean installed, @NotNull String sdkHome) {