From eee668187de9f10a37c49b0631c27789ef28e962 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Sun, 18 Sep 2022 12:49:33 +0300 Subject: [PATCH 01/24] Postpone request building until execution to catch errors --- clion-plugin/build.gradle.kts | 6 +- .../actions/AskServerToGenerateBuildDir.kt | 8 +- .../configure/ConfigureProjectAction.kt | 7 +- .../configure/ReconfigureProjectAction.kt | 5 +- .../generate/GenerateForAssertionAction.kt | 6 +- .../generate/GenerateForClassAction.kt | 6 +- .../actions/generate/GenerateForFileAction.kt | 5 +- .../generate/GenerateForFolderAction.kt | 17 +- .../generate/GenerateForFunctionAction.kt | 8 +- .../actions/generate/GenerateForLineAction.kt | 9 +- .../generate/GenerateForPredicateAction.kt | 15 +- .../generate/GenerateForProjectAction.kt | 4 +- .../generate/GenerateForSnippetAction.kt | 5 +- .../generate/RunAllTestsWithCoverageAction.kt | 9 +- .../actions/generate/RunWithCoverageAction.kt | 9 +- .../utbot/cpp/clion/plugin/client/Client.kt | 16 ++ .../client/channels/GTestLogChannelImpl.kt | 4 +- .../client/channels/ServerLogChannelImpl.kt | 4 +- .../handlers/ProjectConfigurationHandler.kt | 10 +- .../plugin/client/requests/BaseRequest.kt | 14 +- .../CheckProjectConfigurationRequest.kt | 9 +- .../requests/CreateBuildFolderRequest.kt | 12 +- .../requests/GenerateJsonFilesRequest.kt | 17 +- .../client/requests/ProjectTargetsRequest.kt | 5 +- .../RunAllTestsWithCoverageRequest.kt | 10 +- .../client/requests/RunWithCoverageRequest.kt | 5 +- .../client/requests/test/AssertionRequest.kt | 5 +- .../client/requests/test/BaseTestsRequest.kt | 12 +- .../client/requests/test/ClassRequest.kt | 5 +- .../client/requests/test/FileRequest.kt | 5 +- .../client/requests/test/FolderRequest.kt | 5 +- .../client/requests/test/FunctionRequest.kt | 5 +- .../test/FunctionReturnTypeRequest.kt | 5 +- .../client/requests/test/LineRequest.kt | 5 +- .../client/requests/test/PredicateRequest.kt | 5 +- .../client/requests/test/ProjectRequest.kt | 5 +- .../client/requests/test/SnippetRequest.kt | 5 +- .../clion/plugin/grpc/ActionsGrpcRequests.kt | 123 --------- .../plugin/grpc/ConfigurationGrpcRequests.kt | 26 +- .../grpc/CoverageAndResultGrpcRequests.kt | 33 --- .../clion/plugin/grpc/GrpcMessagingUtils.kt | 24 -- .../org/utbot/cpp/clion/plugin/grpc/Params.kt | 61 ++++ .../cpp/clion/plugin/grpc/ParamsBuilder.kt | 154 +++++++++++ .../utbot/cpp/clion/plugin/grpc/ParamsImpl.kt | 260 ++++++++++++++++++ .../UTBotTargetsController.kt | 4 +- .../cpp/clion/plugin/utils/ActionUtils.kt | 11 + .../cpp/clion/plugin/utils/ClientUtils.kt | 3 +- .../main/resources/messages/UTBot.properties | 15 + 48 files changed, 694 insertions(+), 307 deletions(-) delete mode 100644 clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ActionsGrpcRequests.kt delete mode 100644 clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/CoverageAndResultGrpcRequests.kt delete mode 100644 clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcMessagingUtils.kt create mode 100644 clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt create mode 100644 clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt create mode 100644 clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt diff --git a/clion-plugin/build.gradle.kts b/clion-plugin/build.gradle.kts index 390b0dc18..1672b7f72 100644 --- a/clion-plugin/build.gradle.kts +++ b/clion-plugin/build.gradle.kts @@ -46,7 +46,7 @@ plugins { kotlin("plugin.serialization") version "1.6.10" id("com.google.protobuf") version "0.8.15" // code style - id("io.gitlab.arturbosch.detekt").version("1.21.0") + // id("io.gitlab.arturbosch.detekt").version("1.21.0") idea application } @@ -86,10 +86,12 @@ sourceSets { } } +/* detekt { buildUponDefaultConfig = true // preconfigure defaults allRules = false // activate all available (even unstable) rules. } + */ //kotlin { // jvmToolchain { @@ -168,12 +170,14 @@ qodana { } tasks { + /** withType().configureEach { jvmTarget = "1.8" } withType().configureEach { jvmTarget = "1.8" } + */ // Set the JVM compatibility versions properties("javaVersion").let { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/AskServerToGenerateBuildDir.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/AskServerToGenerateBuildDir.kt index adf9fca84..cbf6f315b 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/AskServerToGenerateBuildDir.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/AskServerToGenerateBuildDir.kt @@ -3,10 +3,16 @@ package org.utbot.cpp.clion.plugin.actions import com.intellij.openapi.actionSystem.AnActionEvent import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.requests.CreateBuildDirRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.utils.activeProject +import testsgen.Testgen class AskServerToGenerateBuildDir : UTBotBaseAction(UTBot.message("projectConfigure.generate.buildDir")) { - override fun actionPerformed(e: AnActionEvent) = CreateBuildDirRequest(e).execute() + override fun actionPerformed(e: AnActionEvent) = CreateBuildDirRequest( + ParamsBuilder(e.activeProject()).buildProjectConfigRequestParams(Testgen.ConfigMode.CREATE_BUILD_DIR), + e.activeProject() + ).execute() override fun updateIfEnabled(e: AnActionEvent) { e.presentation.isEnabledAndVisible = e.project != null diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ConfigureProjectAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ConfigureProjectAction.kt index 24f8830fa..1fc4221af 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ConfigureProjectAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ConfigureProjectAction.kt @@ -4,11 +4,16 @@ import com.intellij.openapi.actionSystem.AnActionEvent import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.actions.UTBotBaseAction import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject +import testsgen.Testgen class ConfigureProjectAction : UTBotBaseAction(UTBot.message("projectConfigure.configure")) { - override fun actionPerformed(e: AnActionEvent) = CheckProjectConfigurationRequest(e.activeProject()).execute() + override fun actionPerformed(e: AnActionEvent) = CheckProjectConfigurationRequest( + ParamsBuilder(e.activeProject()).buildProjectConfigRequestParams(Testgen.ConfigMode.CHECK), + e.activeProject() + ).executeUsingCurrentClient() override fun updateIfEnabled(e: AnActionEvent) { e.presentation.isEnabledAndVisible = e.project != null diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ReconfigureProjectAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ReconfigureProjectAction.kt index 4597ba27c..0779d5ef6 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ReconfigureProjectAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ReconfigureProjectAction.kt @@ -2,9 +2,10 @@ package org.utbot.cpp.clion.plugin.actions.configure import com.intellij.openapi.actionSystem.AnActionEvent import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest import org.utbot.cpp.clion.plugin.actions.UTBotBaseAction import org.utbot.cpp.clion.plugin.grpc.getProjectConfigGrpcRequest -import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject import testsgen.Testgen @@ -13,7 +14,7 @@ class ReconfigureProjectAction: UTBotBaseAction(UTBot.message("projectConfigure. override fun actionPerformed(e: AnActionEvent) { val project = e.activeProject() CheckProjectConfigurationRequest( - getProjectConfigGrpcRequest(project, Testgen.ConfigMode.ALL), + ParamsBuilder(project).buildProjectConfigRequestParams(Testgen.ConfigMode.ALL), project, ).execute() } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForAssertionAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForAssertionAction.kt index 90fbf6908..b8cff70d6 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForAssertionAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForAssertionAction.kt @@ -3,13 +3,15 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.AssertionRequest -import org.utbot.cpp.clion.plugin.grpc.getAssertionGrpcRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject +import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe +import org.utbot.cpp.clion.plugin.utils.getLineNumberUnsafe class GenerateForAssertionAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) = AssertionRequest( - getAssertionGrpcRequest(e), + ParamsBuilder(e.activeProject()).buildAssertionRequestParams(e.getLineNumberUnsafe(), e.getFilePathUnsafe()), e.activeProject(), ).execute() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForClassAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForClassAction.kt index d3c62ba64..c46083657 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForClassAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForClassAction.kt @@ -3,14 +3,16 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.ClassRequest -import org.utbot.cpp.clion.plugin.grpc.getClassGrpcRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject +import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe +import org.utbot.cpp.clion.plugin.utils.getLineNumberUnsafe import org.utbot.cpp.clion.plugin.utils.isCPPFileName class GenerateForClassAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) = ClassRequest( - getClassGrpcRequest(e), + ParamsBuilder(e.activeProject()).buildClassRequestParams(e.getFilePathUnsafe(), e.getLineNumberUnsafe()), e.activeProject(), ).execute() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFileAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFileAction.kt index 5e83fd354..92d1ed9d4 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFileAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFileAction.kt @@ -3,14 +3,15 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.FileRequest -import org.utbot.cpp.clion.plugin.grpc.getFileGrpcRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject +import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe import org.utbot.cpp.clion.plugin.utils.isCPPorCFileName class GenerateForFileAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) = FileRequest( - getFileGrpcRequest(e), + ParamsBuilder(e.activeProject()).buildFileRequestParams(e.getFilePathUnsafe()), e.activeProject(), ).execute() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt index b88a4bb04..a95a24285 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt @@ -3,15 +3,22 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.FolderRequest -import org.utbot.cpp.clion.plugin.grpc.getFolderGrpcRequest +import org.utbot.cpp.clion.plugin.grpc.IllegalActionEventException +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject +import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe class GenerateForFolderAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) = - FolderRequest( - getFolderGrpcRequest(e), - e.activeProject() - ).execute() + try { + FolderRequest( + ParamsBuilder(e.activeProject()).buildFolderRequestParams(e.getFilePathUnsafe()), + e.activeProject() + ).executeUsingCurrentClient() + } catch (exception: IllegalActionEventException) { + // should never happen, all keys should be checked in update + exception.notifyUser() + } override fun isDefined(e: AnActionEvent): Boolean { val project = e.project diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFunctionAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFunctionAction.kt index abd4c0dfe..ce258f637 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFunctionAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFunctionAction.kt @@ -3,14 +3,16 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.FunctionRequest -import org.utbot.cpp.clion.plugin.grpc.getFunctionGrpcRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject +import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe +import org.utbot.cpp.clion.plugin.utils.getLineNumberUnsafe class GenerateForFunctionAction : BaseGenerateTestsAction() { - override fun actionPerformed(e: AnActionEvent) = + override fun actionPerformed(e: AnActionEvent) { FunctionRequest( - getFunctionGrpcRequest(e), + ParamsBuilder(e.activeProject()).buildFunctionRequestParams(e.getFilePathUnsafe(), e.getLineNumberUnsafe()), e.activeProject() ).execute() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForLineAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForLineAction.kt index dd9b4c2db..5f2c82924 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForLineAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForLineAction.kt @@ -3,13 +3,16 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.LineRequest -import org.utbot.cpp.clion.plugin.grpc.getLineGrpcRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject class GenerateForLineAction : BaseGenerateTestsAction() { - override fun actionPerformed(e: AnActionEvent) = + override fun actionPerformed(e: AnActionEvent) { + val filePath = e.getRequiredData(CommonDataKeys.VIRTUAL_FILE).path + val editor = e.getRequiredData(CommonDataKeys.EDITOR) + val lineNumber = editor.caretModel.logicalPosition.line + 1 LineRequest( - getLineGrpcRequest(e), + ParamsBuilder(e.activeProject()).buildLineRequestBuilder(lineNumber, filePath), e.activeProject(), ).execute() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForPredicateAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForPredicateAction.kt index e96487acc..edeaa70ee 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForPredicateAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForPredicateAction.kt @@ -9,12 +9,13 @@ import com.intellij.ui.DocumentAdapter import com.intellij.ui.components.fields.ExtendableTextField import javax.swing.ListSelectionModel import javax.swing.event.DocumentEvent -import org.utbot.cpp.clion.plugin.grpc.getFunctionGrpcRequest -import org.utbot.cpp.clion.plugin.grpc.getPredicateGrpcRequest import org.utbot.cpp.clion.plugin.client.requests.test.FunctionReturnTypeRequest import org.utbot.cpp.clion.plugin.client.requests.test.PredicateRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.client +import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe +import org.utbot.cpp.clion.plugin.utils.getLineNumberUnsafe import org.utbot.cpp.clion.plugin.utils.invokeOnEdt import org.utbot.cpp.clion.plugin.utils.notifyError import testsgen.Util.ValidationType @@ -46,7 +47,13 @@ class GenerateForPredicateAction : BaseGenerateTestsAction() { // when we gathered all needed information for predicate request, assemble it and execute it. fun sendPredicateToServer(validationType: ValidationType, valueToCompare: String, comparisonOperator: String) = PredicateRequest( - getPredicateGrpcRequest(e, comparisonOperator, validationType, valueToCompare), + ParamsBuilder(e.activeProject()).buildPredicateRequestParams( + comparisonOperator, + validationType, + valueToCompare, + e.getLineNumberUnsafe(), + e.getFilePathUnsafe() + ), e.activeProject() ).apply { e.client.executeRequest(this) @@ -101,7 +108,7 @@ class GenerateForPredicateAction : BaseGenerateTestsAction() { } //ask server for return type FunctionReturnTypeRequest( - getFunctionGrpcRequest(e), + ParamsBuilder(e.activeProject()).buildFunctionRequestParams(e.getFilePathUnsafe(), e.getLineNumberUnsafe()), e.activeProject(), ) { functionReturnType -> val validationType = functionReturnType.validationType diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForProjectAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForProjectAction.kt index 5655985e8..40bf5c2e4 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForProjectAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForProjectAction.kt @@ -1,15 +1,15 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent -import org.utbot.cpp.clion.plugin.grpc.getProjectGrpcRequest import org.utbot.cpp.clion.plugin.client.requests.test.ProjectRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.client class GenerateForProjectAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) { ProjectRequest( - getProjectGrpcRequest(e), + ParamsBuilder(e.activeProject()).buildProjectRequestParams(), e.activeProject(), ).apply { e.client.executeRequest(this) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForSnippetAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForSnippetAction.kt index b29e48e4f..c7837440b 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForSnippetAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForSnippetAction.kt @@ -3,13 +3,14 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.SnippetRequest -import org.utbot.cpp.clion.plugin.grpc.getSnippetGrpcRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject +import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe class GenerateForSnippetAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) { SnippetRequest( - getSnippetGrpcRequest(e), + ParamsBuilder(e.activeProject()).buildSnippetRequestParams(e.getFilePathUnsafe()), e.activeProject(), ).execute() } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunAllTestsWithCoverageAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunAllTestsWithCoverageAction.kt index 203e6f58f..95c460a76 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunAllTestsWithCoverageAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunAllTestsWithCoverageAction.kt @@ -2,10 +2,15 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import org.utbot.cpp.clion.plugin.client.requests.RunAllTestsWithCoverageRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.utils.activeProject -class RunAllTestsWithCoverageAction: BaseGenerateTestsAction() { +class RunAllTestsWithCoverageAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) { - RunAllTestsWithCoverageRequest(e).execute() + RunAllTestsWithCoverageRequest( + ParamsBuilder(e.activeProject()).buildCoverageAndResultsRequestParams(null), + e.activeProject() + ).execute() } override fun isDefined(e: AnActionEvent): Boolean { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunWithCoverageAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunWithCoverageAction.kt index 7f9219c23..4cd589881 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunWithCoverageAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunWithCoverageAction.kt @@ -5,8 +5,7 @@ import com.intellij.openapi.actionSystem.CommonDataKeys import com.intellij.openapi.diagnostic.Logger import com.intellij.psi.PsiElement import org.utbot.cpp.clion.plugin.client.requests.RunWithCoverageRequest -import org.utbot.cpp.clion.plugin.grpc.getCoverageAndResultsGrpcRequest -import org.utbot.cpp.clion.plugin.ui.testsResults.TestNameAndTestSuite +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject @@ -14,14 +13,10 @@ class RunWithCoverageAction(val element: PsiElement) : BaseGenerateTestsAction() override fun actionPerformed(e: AnActionEvent) { logger.debug("Action RunWithCoverageAction was called") - val testArgs = TestNameAndTestSuite.create(element) - val suiteName = testArgs.suite - val testedMethodName = testArgs.name - val filePath = e.getRequiredData(CommonDataKeys.VIRTUAL_FILE).path val project = e.activeProject() RunWithCoverageRequest( - getCoverageAndResultsGrpcRequest(project, filePath, suiteName, testedMethodName), + ParamsBuilder(project).buildCoverageAndResultsRequestParams(element), project, ).execute() } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt index 82d723769..fd15f5df1 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt @@ -19,6 +19,9 @@ import kotlinx.coroutines.withTimeout import org.jetbrains.annotations.TestOnly import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.channels.LogChannel +import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest +import org.utbot.cpp.clion.plugin.grpc.IllegalPathException +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.client.logger.ClientLogger import org.utbot.cpp.clion.plugin.listeners.ConnectionStatus import org.utbot.cpp.clion.plugin.listeners.UTBotEventsListener @@ -83,10 +86,23 @@ class Client( request.execute(stub, coroutineContext[Job]) } catch (e: io.grpc.StatusException) { handleGRPCStatusException(e, "Exception when executing server request") + } catch (e: IllegalPathException) { + e.notifyUser() } } } + fun configureProject() { + CheckProjectConfigurationRequest( + ParamsBuilder(project).buildProjectConfigRequestParams(Testgen.ConfigMode.CHECK), + project, + ).also { + this.executeRequestIfNotDisposed(it) + } + } + + fun isServerAvailable() = connectionStatus == ConnectionStatus.CONNECTED + private fun provideLoggingChannels() { for (channel in loggingChannels) { servicesCS.launch(CoroutineName(channel.toString())) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/channels/GTestLogChannelImpl.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/channels/GTestLogChannelImpl.kt index a2d4907e1..fc946883e 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/channels/GTestLogChannelImpl.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/channels/GTestLogChannelImpl.kt @@ -2,9 +2,9 @@ package org.utbot.cpp.clion.plugin.client.channels import com.intellij.openapi.components.service import com.intellij.openapi.project.Project +import getDummyGrpcRequest +import getLogChannelGrpcRequest import kotlinx.coroutines.flow.Flow -import org.utbot.cpp.clion.plugin.grpc.getDummyGrpcRequest -import org.utbot.cpp.clion.plugin.grpc.getLogChannelGrpcRequest import org.utbot.cpp.clion.plugin.ui.services.OutputProvider import org.utbot.cpp.clion.plugin.ui.utbotToolWindow.logsToolWindow.UTBotConsole import testsgen.Testgen diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/channels/ServerLogChannelImpl.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/channels/ServerLogChannelImpl.kt index f85f6d402..6527b7b7a 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/channels/ServerLogChannelImpl.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/channels/ServerLogChannelImpl.kt @@ -2,9 +2,9 @@ package org.utbot.cpp.clion.plugin.client.channels import com.intellij.openapi.components.service import com.intellij.openapi.project.Project +import getDummyGrpcRequest +import getLogChannelGrpcRequest import kotlinx.coroutines.flow.Flow -import org.utbot.cpp.clion.plugin.grpc.getDummyGrpcRequest -import org.utbot.cpp.clion.plugin.grpc.getLogChannelGrpcRequest import org.utbot.cpp.clion.plugin.ui.services.OutputProvider import org.utbot.cpp.clion.plugin.ui.utbotToolWindow.logsToolWindow.UTBotConsole import testsgen.Testgen diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt index 9b255a8fc..3f96c03fd 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt @@ -8,7 +8,6 @@ import org.utbot.cpp.clion.plugin.actions.AskServerToGenerateBuildDir import org.utbot.cpp.clion.plugin.actions.AskServerToGenerateJsonForProjectConfiguration import org.utbot.cpp.clion.plugin.client.ManagedClient import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest -import org.utbot.cpp.clion.plugin.grpc.getProjectConfigGrpcRequest import org.utbot.cpp.clion.plugin.settings.settings import org.utbot.cpp.clion.plugin.utils.logger import org.utbot.cpp.clion.plugin.utils.notifyError @@ -85,9 +84,12 @@ class CreateBuildDirHandler( notifyInfo("Build directory was created!", project) CheckProjectConfigurationRequest( - getProjectConfigGrpcRequest(project, Testgen.ConfigMode.CHECK), - project, - ).execute() + project + ).also { + if (!client.isDisposed) { + client.execute(it) + } + } } Testgen.ProjectConfigStatus.BUILD_DIR_CREATION_FAILED -> { notifyError("Failed to create build directory! ${response.message}", project) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt index 27137e223..204b4cacd 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt @@ -3,19 +3,29 @@ package org.utbot.cpp.clion.plugin.client.requests import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import org.utbot.cpp.clion.plugin.client.Request -import org.utbot.cpp.clion.plugin.utils.client +import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.RemoteMapping +import org.utbot.cpp.clion.plugin.settings.settings +import org.utbot.cpp.clion.plugin.utils.getCurrentClient import org.utbot.cpp.clion.plugin.utils.logger +import org.utbot.cpp.clion.plugin.utils.path import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub /** * Base class for requests. * It sends a request of type [X] and handles the response of type [Y]. */ -abstract class BaseRequest(val request: X, val project: Project) : Request { +abstract class BaseRequest(val params: Params, val project: Project) : Request { abstract val logMessage: String + val request: X by lazy { build() } // must not be accessed from this class constructor override fun toString(): String = logMessage + open fun build(): X { + val mapping = RemoteMapping(project.path, project.settings.storedSettings.remotePath) + return params.build(mapping) + } + override suspend fun execute(stub: TestsGenServiceCoroutineStub, cancellationJob: Job?) { project.logger.info { "$logMessage \n$request" } stub.send(cancellationJob).handle(cancellationJob) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt index 9c6a47275..5142de1d9 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt @@ -4,20 +4,19 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.grpc.getProjectConfigGrpcRequest import org.utbot.cpp.clion.plugin.client.handlers.CheckProjectConfigurationHandler +import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt class CheckProjectConfigurationRequest( - request: Testgen.ProjectConfigRequest, + params: Params, project: Project, -): BaseRequest>(request, project) { +) : BaseRequest>(params, project) { override val logMessage: String = "Sending request to check project configuration." - constructor(project: Project): this(getProjectConfigGrpcRequest(project, Testgen.ConfigMode.CHECK), project) - override suspend fun TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub.send(cancellationJob: Job?): Flow { return this.configureProject(request) } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt index 0e24f5259..e668b3d55 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt @@ -1,28 +1,28 @@ package org.utbot.cpp.clion.plugin.client.requests import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.ManagedClient import org.utbot.cpp.clion.plugin.grpc.getProjectConfigGrpcRequest import org.utbot.cpp.clion.plugin.client.handlers.CreateBuildDirHandler +import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.utils.getCurrentClient import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.client import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class CreateBuildDirRequest( + params: Params, + project: Project, val client: ManagedClient, - request: Testgen.ProjectConfigRequest, ) : BaseRequest>(request, client.project) { override val logMessage: String = "Sending request to check project configuration." - constructor(e: AnActionEvent) : this( - e.project?.client ?: error("project is null for event: $e"), - getProjectConfigGrpcRequest(e.activeProject(), Testgen.ConfigMode.CREATE_BUILD_DIR) - ) - override suspend fun TestsGenServiceCoroutineStub.send(cancellationJob: Job?): Flow = this.configureProject(request) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/GenerateJsonFilesRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/GenerateJsonFilesRequest.kt index a39e9f813..06bf513fc 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/GenerateJsonFilesRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/GenerateJsonFilesRequest.kt @@ -5,20 +5,25 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.grpc.getProjectConfigGrpcRequest import org.utbot.cpp.clion.plugin.client.handlers.GenerateJsonHandler +import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt class GenerateJsonFilesRequest( - project: Project, - request: Testgen.ProjectConfigRequest, -): BaseRequest>(request, project) { + params: Params, + project: Project +) : BaseRequest>(params, project) { override val logMessage: String = "Sending request to check project configuration." - constructor(project: Project): this(project, getProjectConfigGrpcRequest(project, Testgen.ConfigMode.GENERATE_JSON_FILES)) - constructor(e: AnActionEvent): this(e.activeProject()) + constructor(project: Project) : this( + ParamsBuilder(project).buildProjectConfigRequestParams(Testgen.ConfigMode.GENERATE_JSON_FILES), + project + ) + + constructor(e: AnActionEvent) : this(e.activeProject()) override suspend fun TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub.send(cancellationJob: Job?): Flow { return this.configureProject(request) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/ProjectTargetsRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/ProjectTargetsRequest.kt index 3462855fe..08e098bdd 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/ProjectTargetsRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/ProjectTargetsRequest.kt @@ -2,15 +2,16 @@ package org.utbot.cpp.clion.plugin.client.requests import com.intellij.openapi.project.Project import kotlinx.coroutines.Job +import org.utbot.cpp.clion.plugin.grpc.Params import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt class ProjectTargetsRequest( + params: Params, project: Project, - request: Testgen.ProjectTargetsRequest, val processTargets: suspend (Testgen.ProjectTargetsResponse)->Unit, val onError: suspend (Throwable) -> Unit -): BaseRequest(request, project) { +): BaseRequest(params, project) { override val logMessage: String = "Sending request to get project targets" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunAllTestsWithCoverageRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunAllTestsWithCoverageRequest.kt index 63757c130..3e4beb464 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunAllTestsWithCoverageRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunAllTestsWithCoverageRequest.kt @@ -1,26 +1,22 @@ package org.utbot.cpp.clion.plugin.client.requests -import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.handlers.CoverageAndResultsHandler -import org.utbot.cpp.clion.plugin.grpc.getRunWithCoverageRequestForAllTests -import org.utbot.cpp.clion.plugin.utils.activeProject +import org.utbot.cpp.clion.plugin.grpc.Params import testsgen.Testgen import testsgen.Testgen.CoverageAndResultsRequest import testsgen.TestsGenServiceGrpcKt class RunAllTestsWithCoverageRequest( - request: CoverageAndResultsRequest, + params: Params, project: Project, -) : BaseRequest>(request, project) { +) : BaseRequest>(params, project) { override val logMessage: String = "Sending request to get tests run results and coverage" - constructor(e: AnActionEvent) : this(getRunWithCoverageRequestForAllTests(e.activeProject()), e.activeProject()) - override suspend fun Flow.handle(cancellationJob: Job?) { if (cancellationJob?.isActive == true) { CoverageAndResultsHandler( diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunWithCoverageRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunWithCoverageRequest.kt index 630049078..5022a524d 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunWithCoverageRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunWithCoverageRequest.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.handlers.CoverageAndResultsHandler +import org.utbot.cpp.clion.plugin.grpc.Params import org.utbot.cpp.clion.plugin.utils.convertFromRemotePathIfNeeded import org.utbot.cpp.clion.plugin.utils.testFilePathToSourceFilePath import testsgen.Testgen @@ -12,9 +13,9 @@ import testsgen.Testgen.CoverageAndResultsResponse import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class RunWithCoverageRequest( - request: Testgen.CoverageAndResultsRequest, + params: Params, project: Project, -): BaseRequest>(request, project) { +): BaseRequest>(params, project) { override val logMessage: String = "Sending request to get tests run results and coverage" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/AssertionRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/AssertionRequest.kt index 7667dba53..19436f994 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/AssertionRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/AssertionRequest.kt @@ -4,13 +4,14 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.grpc.Params import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class AssertionRequest( - request: Testgen.AssertionRequest, + params: Params, project: Project, -) : BaseTestsRequest(request, project, UTBot.message("requests.assertion.description.progress")) { +) : BaseTestsRequest(params, project, UTBot.message("requests.assertion.description.progress")) { override val logMessage: String = "Sending request to generate tests for Assertion" override fun getInfoMessage(): String = "Tests for assertion are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt index 8ecde326f..6f9e4c071 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt @@ -6,11 +6,15 @@ import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.actions.FocusAction import org.utbot.cpp.clion.plugin.client.handlers.TestsStreamHandler import org.utbot.cpp.clion.plugin.client.requests.BaseRequest +import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.RemoteMapping +import org.utbot.cpp.clion.plugin.settings.settings import org.utbot.cpp.clion.plugin.utils.getLongestCommonPathFromRoot import org.utbot.cpp.clion.plugin.utils.isHeaderFile import org.utbot.cpp.clion.plugin.utils.isSarifReport import org.utbot.cpp.clion.plugin.utils.logger import org.utbot.cpp.clion.plugin.utils.notifyInfo +import org.utbot.cpp.clion.plugin.utils.path import testsgen.Testgen import java.nio.file.Path @@ -18,9 +22,13 @@ import java.nio.file.Path * Base class for requests that handle a stream of [Testgen.TestsResponse]. * @param progressName - a name of a progress that user will see, when this request will be executing. */ -abstract class BaseTestsRequest(request: R, project: Project, private val progressName: String) : - BaseRequest>(request, project) { +abstract class BaseTestsRequest(params: Params, project: Project, private val progressName: String) : + BaseRequest>(params, project) { val logger = project.logger + override fun build(): R { + val mapping = RemoteMapping(project.path, project.settings.storedSettings.remotePath) + return params.build(mapping) + } override suspend fun Flow.handle(cancellationJob: Job?) { if (cancellationJob?.isActive == true) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ClassRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ClassRequest.kt index 932acf81f..02b3ee99a 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ClassRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ClassRequest.kt @@ -4,13 +4,14 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.grpc.Params import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class ClassRequest( - request: Testgen.ClassRequest, + params: Params, project: Project, -) : BaseTestsRequest(request, project, UTBot.message("requests.class.description.progress")) { +) : BaseTestsRequest(params, project, UTBot.message("requests.class.description.progress")) { override val logMessage: String = "Sending request to generate tests for class" override fun getInfoMessage(): String = "Tests for class are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FileRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FileRequest.kt index 5c5921531..2f173cb67 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FileRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FileRequest.kt @@ -4,14 +4,15 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.grpc.Params import org.utbot.cpp.clion.plugin.utils.fileNameOrNull import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class FileRequest( - request: Testgen.FileRequest, + params: Params, project: Project, -) : BaseTestsRequest(request, project, UTBot.message("requests.file.description.progress")) { +) : BaseTestsRequest(params, project, UTBot.message("requests.file.description.progress")) { override val logMessage: String = "Sending request to generate tests for file" override fun getInfoMessage(): String = "Tests for file ${(request.filePath.fileNameOrNull()?.plus(" ")) ?: ""} are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FolderRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FolderRequest.kt index e5f4e24ab..7cf9990ae 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FolderRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FolderRequest.kt @@ -4,14 +4,15 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.grpc.Params import org.utbot.cpp.clion.plugin.utils.fileNameOrNull import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class FolderRequest( - request: Testgen.FolderRequest, + folderRequestParams: Params, project: Project, -) : BaseTestsRequest(request, project, UTBot.message("requests.folder.description.progress")) { +) : BaseTestsRequest(folderRequestParams, project, UTBot.message("requests.folder.description.progress")) { override val logMessage: String = "Sending request to generate tests for folder." override fun getInfoMessage(): String = "Tests for folder ${request.folderPath.fileNameOrNull()?.plus(" ") ?: ""} are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionRequest.kt index ec1d4ec3a..2d0bf4b76 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionRequest.kt @@ -4,13 +4,14 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.grpc.Params import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class FunctionRequest( - request: Testgen.FunctionRequest, + params: Params, project: Project, -) : BaseTestsRequest(request, project, UTBot.message("requests.function.description.progress")) { +) : BaseTestsRequest(params, project, UTBot.message("requests.function.description.progress")) { override val logMessage: String = "Sending request to generate tests for function." override fun getInfoMessage(): String = "Tests for function are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionReturnTypeRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionReturnTypeRequest.kt index 2684518b7..2a3a7019d 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionReturnTypeRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionReturnTypeRequest.kt @@ -3,15 +3,16 @@ package org.utbot.cpp.clion.plugin.client.requests.test import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import org.utbot.cpp.clion.plugin.client.requests.BaseRequest +import org.utbot.cpp.clion.plugin.grpc.Params import testsgen.Testgen import testsgen.Testgen.FunctionTypeResponse import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class FunctionReturnTypeRequest( - request: Testgen.FunctionRequest, + params: Params, project: Project, val processReturnType: suspend (FunctionTypeResponse)->(Unit) -) : BaseRequest(request, project) { +) : BaseRequest(params, project) { override val logMessage: String = "Sending request to get function return type" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/LineRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/LineRequest.kt index eba6d6b0d..d6bbf4c1f 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/LineRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/LineRequest.kt @@ -4,13 +4,14 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.grpc.Params import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class LineRequest( - request: Testgen.LineRequest, + params: Params, project: Project, -) : BaseTestsRequest(request, project, UTBot.message("requests.line.description.progress")) { +) : BaseTestsRequest(params, project, UTBot.message("requests.line.description.progress")) { override val logMessage: String = "Sending request to generate tests for line." override fun getInfoMessage(): String = "Tests for line are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/PredicateRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/PredicateRequest.kt index 392d36578..cf2cc389c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/PredicateRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/PredicateRequest.kt @@ -4,13 +4,14 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.grpc.Params import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class PredicateRequest( - request: Testgen.PredicateRequest, + params: Params, project: Project, -) : BaseTestsRequest(request, project, UTBot.message("requests.predicate.description.progress")) { +) : BaseTestsRequest(params, project, UTBot.message("requests.predicate.description.progress")) { override val logMessage: String = "Sending request to generate tests for predicate" override fun getInfoMessage(): String = "Tests for predicate are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ProjectRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ProjectRequest.kt index db1e747b9..157032167 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ProjectRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ProjectRequest.kt @@ -4,13 +4,14 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.grpc.Params import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class ProjectRequest( - request: Testgen.ProjectRequest, + params: Params, project: Project, -) : BaseTestsRequest(request, project, UTBot.message("requests.project.description.progress")) { +) : BaseTestsRequest(params, project, UTBot.message("requests.project.description.progress")) { override val logMessage: String = "Sending request to generate tests for project" override fun getInfoMessage(): String = "Tests for project are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/SnippetRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/SnippetRequest.kt index 0be96a02b..15fad305a 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/SnippetRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/SnippetRequest.kt @@ -4,13 +4,14 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.grpc.Params import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class SnippetRequest( - request: Testgen.SnippetRequest, + params: Params, project: Project -) : BaseTestsRequest(request, project, UTBot.message("requests.snippet.description.progress")) { +) : BaseTestsRequest(params, project, UTBot.message("requests.snippet.description.progress")) { override val logMessage: String = "Sending request to generate tests for snippet" override fun getInfoMessage(): String = "Tests for snippet are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ActionsGrpcRequests.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ActionsGrpcRequests.kt deleted file mode 100644 index 5ca482342..000000000 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ActionsGrpcRequests.kt +++ /dev/null @@ -1,123 +0,0 @@ -package org.utbot.cpp.clion.plugin.grpc - -import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.CommonDataKeys -import com.intellij.openapi.project.Project -import org.utbot.cpp.clion.plugin.settings.settings -import org.utbot.cpp.clion.plugin.utils.activeProject -import org.utbot.cpp.clion.plugin.utils.convertToRemotePathIfNeeded -import testsgen.Testgen -import testsgen.Util - -fun getProjectGrpcRequest(e: AnActionEvent): Testgen.ProjectRequest = getProjectGrpcRequest(e.activeProject()) - -fun getFolderGrpcRequest(e: AnActionEvent): Testgen.FolderRequest { - val project = e.activeProject() - val localPath = e.getRequiredData(CommonDataKeys.VIRTUAL_FILE).path - - return Testgen.FolderRequest.newBuilder() - .setProjectRequest(getProjectGrpcRequest(e)) - .setFolderPath(localPath.convertToRemotePathIfNeeded(project)) - .build() -} - -fun getRunWithCoverageRequestForAllTests(project: Project): Testgen.CoverageAndResultsRequest = - Testgen.CoverageAndResultsRequest.newBuilder() - .setCoverage(true) - .setSettingsContext(getSettingsContextMessage(project)) - .setProjectContext(getProjectContextMessage(project)) - .build() - -fun getFileGrpcRequest(e: AnActionEvent): Testgen.FileRequest { - val project = e.activeProject() - val filePath = e.getRequiredData(CommonDataKeys.VIRTUAL_FILE).path - - return Testgen.FileRequest.newBuilder() - .setProjectRequest(getProjectGrpcRequest(project)) - .setFilePath(filePath.convertToRemotePathIfNeeded(project)) - .build() -} - -fun getClassGrpcRequest(e: AnActionEvent): Testgen.ClassRequest = Testgen.ClassRequest.newBuilder() - .setLineRequest(getLineGrpcRequest(e)) - .build() - -fun getFunctionGrpcRequest(e: AnActionEvent): Testgen.FunctionRequest { - val lineRequest = getLineGrpcRequest(e) - return Testgen.FunctionRequest.newBuilder() - .setLineRequest(lineRequest) - .build() -} - -fun getSnippetGrpcRequest(e: AnActionEvent): Testgen.SnippetRequest { - val project = e.activeProject() - val localPath = e.getRequiredData(CommonDataKeys.VIRTUAL_FILE).path - - return Testgen.SnippetRequest.newBuilder() - .setProjectContext(getProjectContextMessage(project)) - .setSettingsContext(getSettingsContextMessage(project)) - .setFilePath(localPath.convertToRemotePathIfNeeded(project)) - .build() -} - -fun getLineGrpcRequest(e: AnActionEvent): Testgen.LineRequest { - val project = e.getRequiredData(CommonDataKeys.PROJECT) - val filePath = e.getRequiredData(CommonDataKeys.VIRTUAL_FILE).path - val editor = e.getRequiredData(CommonDataKeys.EDITOR) - val lineNumber = editor.caretModel.logicalPosition.line + 1 - - return getLineGrpcRequest(project, lineNumber, filePath) -} - -fun getAssertionGrpcRequest(e: AnActionEvent): Testgen.AssertionRequest { - return Testgen.AssertionRequest.newBuilder() - .setLineRequest(getLineGrpcRequest(e)) - .build() -} - -fun getPredicateGrpcRequest( - e: AnActionEvent, - predicate: String, - validationType: Util.ValidationType, - returnValue: String, -): Testgen.PredicateRequest { - val predicateInfo = getPredicateGrpcRequest(predicate, returnValue, validationType) - return Testgen.PredicateRequest.newBuilder() - .setLineRequest(getLineGrpcRequest(e)) - .setPredicateInfo(predicateInfo) - .build() -} - -private fun getPredicateGrpcRequest( - predicate: String, - returnValue: String, - type: Util.ValidationType -): Util.PredicateInfo = - Util.PredicateInfo.newBuilder() - .setPredicate(predicate) - .setReturnValue(returnValue) - .setType(type) - .build() - -private fun getProjectGrpcRequest(project: Project): Testgen.ProjectRequest { - return Testgen.ProjectRequest.newBuilder() - .setSettingsContext(getSettingsContextMessage(project)) - .setProjectContext(getProjectContextMessage(project)) - .setTargetPath(project.settings.convertedTargetPath) - .addAllSourcePaths(project.settings.convertedSourcePaths) - .setSynchronizeCode(project.settings.isRemoteScenario) - .build() -} - - -private fun getLineGrpcRequest(project: Project, line: Int, filePath: String): Testgen.LineRequest = - Testgen.LineRequest.newBuilder() - .setProjectRequest(getProjectGrpcRequest(project)) - .setSourceInfo(getSourceInfo(project, line, filePath)) - .build() - -private fun getSourceInfo(project: Project, line: Int, filePath: String): Util.SourceInfo = - Util.SourceInfo.newBuilder() - .setLine(line) - .setFilePath(filePath.convertToRemotePathIfNeeded(project)) - .build() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ConfigurationGrpcRequests.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ConfigurationGrpcRequests.kt index 488114b27..713719f19 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ConfigurationGrpcRequests.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ConfigurationGrpcRequests.kt @@ -1,32 +1,8 @@ -package org.utbot.cpp.clion.plugin.grpc - -import com.intellij.openapi.project.Project -import com.jetbrains.cidr.cpp.cmake.workspace.CMakeWorkspace import testsgen.Testgen -fun getProjectTargetsGrpcRequest(project: Project): Testgen.ProjectTargetsRequest = - Testgen.ProjectTargetsRequest.newBuilder() - .setProjectContext(getProjectContextMessage(project)) - .build() - -fun getProjectConfigGrpcRequest(project: Project, configMode: Testgen.ConfigMode): Testgen.ProjectConfigRequest { - val builder = Testgen.ProjectConfigRequest.newBuilder() - .setProjectContext(getProjectContextMessage(project)) - .setConfigMode(configMode) - getCmakeOptions(project)?.let { builder.setCmakeOptions(0, it) } - - return builder.build() -} - fun getDummyGrpcRequest(): Testgen.DummyRequest = Testgen.DummyRequest.newBuilder().build() fun getLogChannelGrpcRequest(logLevel: String): Testgen.LogChannelRequest = Testgen.LogChannelRequest.newBuilder() .setLogLevel(logLevel) - .build() - -private fun getCmakeOptions(project: Project): String? = - CMakeWorkspace.getInstance(project).profileInfos - .map { it.profile } - .firstOrNull { it.enabled } - ?.generationOptions \ No newline at end of file + .build() \ No newline at end of file diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/CoverageAndResultGrpcRequests.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/CoverageAndResultGrpcRequests.kt deleted file mode 100644 index 724925728..000000000 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/CoverageAndResultGrpcRequests.kt +++ /dev/null @@ -1,33 +0,0 @@ -package org.utbot.cpp.clion.plugin.grpc - -import com.intellij.openapi.project.Project -import org.utbot.cpp.clion.plugin.utils.convertToRemotePathIfNeeded -import testsgen.Testgen - -/** - * [testName] and [testSuiteName] are non-empty if a concrete test is specified. - * Request for several tests leaves these fields empty. - */ -fun getCoverageAndResultsGrpcRequest( - project: Project, - filePath: String, - testSuiteName: String = "", - testName: String = "", - includeCoverage: Boolean = true, -): Testgen.CoverageAndResultsRequest { - val remoteFilePath = filePath.convertToRemotePathIfNeeded(project) - - return Testgen.CoverageAndResultsRequest.newBuilder() - .setCoverage(includeCoverage) - .setProjectContext(getProjectContextMessage(project)) - .setSettingsContext(getSettingsContextMessage(project)) - .setTestFilter(getTestFilter(remoteFilePath, testName, testSuiteName)) - .build() -} - -private fun getTestFilter(filePath: String, testName: String = "", testSuiteName: String = ""): Testgen.TestFilter = - Testgen.TestFilter.newBuilder() - .setTestFilePath(filePath) - .setTestName(testName) - .setTestSuite(testSuiteName) - .build() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcMessagingUtils.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcMessagingUtils.kt deleted file mode 100644 index 3f7705b64..000000000 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcMessagingUtils.kt +++ /dev/null @@ -1,24 +0,0 @@ -package org.utbot.cpp.clion.plugin.grpc - -import com.intellij.openapi.project.Project -import org.utbot.cpp.clion.plugin.settings.settings -import testsgen.Testgen - -fun getSettingsContextMessage(project: Project): Testgen.SettingsContext { - val storedSettings = project.settings.storedSettings - return Testgen.SettingsContext.newBuilder() - .setVerbose(storedSettings.verbose) - .setUseStubs(storedSettings.useStubs) - .setTimeoutPerTest(storedSettings.timeoutPerTest) - .setTimeoutPerFunction(storedSettings.timeoutPerFunction) - .setGenerateForStaticFunctions(storedSettings.generateForStaticFunctions) - .setUseDeterministicSearcher(storedSettings.useDeterministicSearcher) - .build() -} - -fun getProjectContextMessage(project: Project): Testgen.ProjectContext = Testgen.ProjectContext.newBuilder() - .setProjectName(project.name) - .setProjectPath(project.settings.convertedProjectPath) - .setBuildDirRelativePath(project.settings.storedSettings.buildDirRelativePath) - .setTestDirPath(project.settings.convertedTestDirPath) - .build() \ No newline at end of file diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt new file mode 100644 index 000000000..c909d9670 --- /dev/null +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt @@ -0,0 +1,61 @@ +package org.utbot.cpp.clion.plugin.grpc + +import com.intellij.openapi.actionSystem.AnActionEvent +import org.apache.commons.io.FilenameUtils +import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.utils.notifyError +import java.nio.file.InvalidPathException +import java.nio.file.Paths + +abstract class ClientException(message: String) : Exception(message) { + abstract fun notifyUser() +} + +class IllegalActionEventException(val event: AnActionEvent, missingKey: String) : + ClientException("Action event has no $missingKey!") { + override fun notifyUser() { + notifyError("Could create request for server, from Action context invocation! Probably you are invoking Action in a wrong way, please see docs") + } +} + +class IllegalPathException(val path: String, val info: String) : + ClientException("Bad path: $path. Info: $info") { + + override fun notifyUser() { + notifyError(info) + } +} + + +data class RemoteMapping(val localProjectPath: String, val remoteProjectPath: String) { + fun convertToRemote(path: String, errorText: String): String { + if (!shouldConvert()) + return path + val localProjectNioPath = Paths.get(localProjectPath) + val remoteProjectNioPath = try { + Paths.get(remoteProjectPath) + } catch (_: InvalidPathException) { + throw IllegalPathException(path, UTBot.message("settings.project.remotePath.wrong")) + } + val relativeToProjectNioPath = try { + localProjectNioPath.relativize(Paths.get(path)) + } catch (_: IllegalArgumentException) { + throw IllegalPathException(path, errorText) + } + return FilenameUtils.separatorsToUnix(remoteProjectNioPath.resolve(relativeToProjectNioPath).toString()) + } + + fun shouldConvert(): Boolean = localProjectPath != remoteProjectPath +} + +/** + * Wrapper on grpc generated class [G], that can + * build request for server, converting paths to remote filesystem + */ +interface Params { + /** + * Builds grpc message [G] with paths converted to remote version. + * May throw exceptions + */ + fun build(remoteMapping: RemoteMapping): G +} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt new file mode 100644 index 000000000..6dccbae88 --- /dev/null +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt @@ -0,0 +1,154 @@ +package org.utbot.cpp.clion.plugin.grpc + +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement +import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.settings.settings +import org.utbot.cpp.clion.plugin.ui.testsResults.TestNameAndTestSuite +import org.utbot.cpp.clion.plugin.utils.localPath +import org.utbot.cpp.clion.plugin.utils.notifyError +import org.utbot.cpp.clion.plugin.utils.path +import testsgen.Testgen +import testsgen.Util + +/** + * Facade that creates Params, where X is the grpc message + */ +class ParamsBuilder( + val project: Project +) { + fun buildProjectContextParams(): Params { + return ProjectContextParams( + project.name, + project.path, + project.settings.storedSettings.testsDirRelativePath, + project.settings.storedSettings.buildDirRelativePath + ) + } + + fun buildSettingsContextParams(): Params { + return project.settings.storedSettings.let { + SettingsContextParams( + it.generateForStaticFunctions, + it.verbose, + it.timeoutPerFunction, + it.timeoutPerTest, + it.useDeterministicSearcher, + it.useStubs + ) + } + } + + fun buildProjectRequestParams(): Params { + val settings = project.settings.storedSettings + val sourcePaths = settings.sourceDirs.toList() + return ProjectRequestParams( + buildProjectContextParams() as ProjectContextParams, + buildSettingsContextParams() as SettingsContextParams, + sourcePaths, + project.settings.isRemoteScenario, + settings.targetPath + ) + } + + + fun buildLineRequestBuilder(lineNumber: Int, filePath: String): Params { + return LineRequestParams( + buildProjectRequestParams(), + SourceInfoParams(filePath, lineNumber) + ) + } + + fun buildFunctionRequestParams(filePath: String, lineNumber: Int): Params { + return FunctionRequestParams( + buildLineRequestBuilder(lineNumber, filePath) + ) + } + + fun buildFolderRequestParams(folderPath: String): Params { + return FolderRequestParams( + buildProjectRequestParams() as ProjectRequestParams, + folderPath + ) + } + + fun buildFileRequestParams(filePath: String): Params { + return FileRequestParams( + buildProjectRequestParams() as ProjectRequestParams, + filePath + ) + } + + fun buildProjectConfigRequestParams(configMode: Testgen.ConfigMode): Params { + return ProjectConfigRequestParams( + buildProjectContextParams() as ProjectContextParams, + configMode, + project.settings.storedSettings.cmakeOptions.split(" ") + ) + } + + fun buildProjectTargetsParams(): Params { + return ProjectTargetsParams(buildProjectContextParams() as ProjectContextParams) + } + + /** + * if [element] is null return params that correspond for running all tests + */ + fun buildCoverageAndResultsRequestParams(element: PsiElement? = null): Params { + return CoverageAndResultsRequestParams( + buildProjectContextParams() as ProjectContextParams, + buildSettingsContextParams() as SettingsContextParams, + element?.let { buildTestFilterParams(it) as TestFilterParams }, + coverage = true + ) + } + + fun buildTestFilterParams(element: PsiElement): Params { + try { + val (testName: String, testSuite: String) = TestNameAndTestSuite.create(element) + val testFilePath = element.containingFile.virtualFile.localPath.toString() + return TestFilterParams( + testFilePath, + testName, + testSuite + ) + } catch (_: Throwable) { + throw object : ClientException("Could not create test filter from psi element") { + override fun notifyUser() { + notifyError(UTBot.message("coverageAndResults.creation.failure")) + } + } + } + } + + fun buildClassRequestParams(filePath: String, lineNumber: Int): Params { + return ClassRequestParams(buildLineRequestBuilder(lineNumber, filePath) as LineRequestParams) + } + + fun buildAssertionRequestParams(lineNumber: Int, filePath: String): Params { + return AssertionRequestParams( + buildLineRequestBuilder(lineNumber, filePath) as LineRequestParams + ) + } + + fun buildPredicateRequestParams( + comparisonOperator: String, + validationType: Util.ValidationType, + valueToCompare: String, + lineNumber: Int, + filePath: String + ): Params { + return PredicateRequestParams( + buildLineRequestBuilder(lineNumber, filePath) as LineRequestParams, + PredicateInfoParams(validationType, comparisonOperator, valueToCompare) + ) + } + + fun buildSnippetRequestParams(filePath: String): Params { + return SnippetRequestParams( + buildProjectContextParams() as ProjectContextParams, + buildSettingsContextParams() as SettingsContextParams, + filePath + ) + } +} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt new file mode 100644 index 000000000..d8db6d608 --- /dev/null +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt @@ -0,0 +1,260 @@ +package org.utbot.cpp.clion.plugin.grpc + +import org.utbot.cpp.clion.plugin.UTBot +import testsgen.Testgen +import testsgen.Util +import java.nio.file.InvalidPathException +import java.nio.file.Paths + + +internal data class ProjectContextParams( + val projectName: String, + val projectPath: String, + val testDirRelativePath: String, + val buildDirRelativePath: String +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.ProjectContext { + val projectNioPath = Paths.get(projectPath) // project path is not set by user, assuming it is valid + val relativeTestsDirNioPath = try { + Paths.get(testDirRelativePath) + } catch (e: InvalidPathException) { + throw IllegalPathException(testDirRelativePath, UTBot.message("settings.project.testsDir.wrong")) + } + return Testgen.ProjectContext.newBuilder() + .setProjectPath(projectPath) + .setTestDirPath( + remoteMapping.convertToRemote( + projectNioPath.resolve(relativeTestsDirNioPath).toString(), + UTBot.message("settings.project.testsDir.wrong") + ) + ) + .setBuildDirRelativePath(buildDirRelativePath) + .setProjectName(projectName) + .setProjectPath(remoteMapping.convertToRemote(projectPath, UTBot.message("projectPath.wrong.conversion"))) + .build() + } +} + +internal data class SettingsContextParams( + val generateForStaticFunctions: Boolean, + val verbose: Boolean, + val timeoutPerFunction: Int, + val timeoutPerTest: Int, + val useDeterministicSearcher: Boolean, + val useStubs: Boolean +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.SettingsContext { + return Testgen.SettingsContext.newBuilder() + .setVerbose(verbose) + .setGenerateForStaticFunctions(generateForStaticFunctions) + .setTimeoutPerFunction(timeoutPerFunction) + .setTimeoutPerTest(timeoutPerTest) + .build() + } +} + +internal data class ProjectRequestParams( + val projectContextParams: ProjectContextParams, + val settingsContextParams: SettingsContextParams, + val sourcePaths: List, + val synchronizeCode: Boolean, + val targetPath: String +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.ProjectRequest { + return Testgen.ProjectRequest.newBuilder() + .setProjectContext(projectContextParams.build(remoteMapping)) + .setSettingsContext(settingsContextParams.build(remoteMapping)) + .addAllSourcePaths(sourcePaths.map { sourcePath -> + remoteMapping.convertToRemote( + sourcePath, + UTBot.message("settings.project.sourcePaths.wrong.conversion") + ) + }) + .setTargetPath( + remoteMapping.convertToRemote( + targetPath, + UTBot.message("settings.project.target.wrong.conversion") + ) + ) + .setSynchronizeCode(synchronizeCode) + .build() + } +} + +internal data class FolderRequestParams( + val projectRequestParams: ProjectRequestParams, + val folderPath: String +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.FolderRequest { + return Testgen.FolderRequest.newBuilder() + .setFolderPath(remoteMapping.convertToRemote(folderPath, UTBot.message("folderPath.wrong.conversion"))) + .setProjectRequest(projectRequestParams.build(remoteMapping)) + .build() + } +} + +internal data class FileRequestParams( + val projectRequestParams: ProjectRequestParams, + val filePath: String +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.FileRequest { + return Testgen.FileRequest.newBuilder() + .setProjectRequest(projectRequestParams.build(remoteMapping)) + .setFilePath(remoteMapping.convertToRemote(filePath, UTBot.message("filePath.wrong.conversion"))) + .build() + } +} + +internal data class ProjectConfigRequestParams( + val projectContextParams: ProjectContextParams, + val configMode: Testgen.ConfigMode, + val cmakeOptions: List +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.ProjectConfigRequest { + return Testgen.ProjectConfigRequest.newBuilder() + .setProjectContext(projectContextParams.build(remoteMapping)) + .setConfigMode(configMode) + .addAllCmakeOptions(cmakeOptions) + .build() + } +} + +internal data class ProjectTargetsParams( + val projectContextParams: ProjectContextParams +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.ProjectTargetsRequest { + return Testgen.ProjectTargetsRequest.newBuilder() + .setProjectContext(projectContextParams.build(remoteMapping)) + .build() + } +} + +internal data class TestFilterParams( + val testFilePath: String, + val testName: String, + val testSuite: String +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.TestFilter { + return Testgen.TestFilter.newBuilder() + .setTestFilePath( + remoteMapping.convertToRemote( + testFilePath, + UTBot.message("testFilePath.wrong.conversion") + ) + ) + .setTestName(testName) + .setTestSuite(testSuite) + .build() + } +} + +internal data class CoverageAndResultsRequestParams( + val projectContextParams: ProjectContextParams, + val settingsContextParams: SettingsContextParams, + val testFilterParams: TestFilterParams? = null, + val coverage: Boolean = true +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.CoverageAndResultsRequest { + val builder = Testgen.CoverageAndResultsRequest.newBuilder() + .setCoverage(coverage) + .setSettingsContext(settingsContextParams.build(remoteMapping)) + .setProjectContext(projectContextParams.build(remoteMapping)) + testFilterParams?.let { + builder.setTestFilter(it.build(remoteMapping)) + } + + return builder.build() + } +} + +internal data class SourceInfoParams( + val filePath: String, + val line: Int +) : Params { + override fun build(remoteMapping: RemoteMapping): Util.SourceInfo { + return Util.SourceInfo.newBuilder() + .setLine(line) + .setFilePath(remoteMapping.convertToRemote(filePath, UTBot.message("filePath.wrong.conversion"))) + .build() + } +} + +data class LineRequestParams( + val projectRequestParams: Params, + val sourceInfoParams: Params +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.LineRequest { + return Testgen.LineRequest.newBuilder() + .setProjectRequest(projectRequestParams.build(remoteMapping)) + .setSourceInfo(sourceInfoParams.build(remoteMapping)) + .build() + } +} + +internal data class FunctionRequestParams( + val fileRequestParams: Params +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.FunctionRequest { + return Testgen.FunctionRequest.newBuilder() + .setLineRequest(fileRequestParams.build(remoteMapping)) + .build() + } +} + +internal data class ClassRequestParams( + val lineRequestParams: LineRequestParams +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.ClassRequest { + return Testgen.ClassRequest.newBuilder() + .setLineRequest(lineRequestParams.build(remoteMapping)) + .build() + } +} + +internal class AssertionRequestParams(val lineRequestParams: LineRequestParams) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.AssertionRequest { + return Testgen.AssertionRequest.newBuilder() + .setLineRequest(lineRequestParams.build(remoteMapping)) + .build() + } +} + +internal data class PredicateInfoParams( + val validationType: Util.ValidationType, + val predicate: String, + val returnValue: String +) : Params { + override fun build(remoteMapping: RemoteMapping): Util.PredicateInfo { + return Util.PredicateInfo.newBuilder() + .setPredicate(predicate) + .setReturnValue(returnValue) + .setType(validationType) + .build() + } +} + +internal class PredicateRequestParams( + val lineRequestParams: LineRequestParams, + val predicateInfoParams: PredicateInfoParams +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.PredicateRequest { + return Testgen.PredicateRequest.newBuilder() + .setLineRequest(lineRequestParams.build(remoteMapping)) + .setPredicateInfo(predicateInfoParams.build(remoteMapping)) + .build() + } +} + +internal class SnippetRequestParams( + val projectContextParams: ProjectContextParams, + val settingsContextParams: SettingsContextParams, + val filePath: String +) : Params { + override fun build(remoteMapping: RemoteMapping): Testgen.SnippetRequest { + return Testgen.SnippetRequest.newBuilder() + .setProjectContext(projectContextParams.build(remoteMapping)) + .setSettingsContext(settingsContextParams.build(remoteMapping)) + .setFilePath(remoteMapping.convertToRemote(filePath, UTBot.message("filePath.wrong.conversion"))) + .build() + } +} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTargetsController.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTargetsController.kt index 3ac335e8d..d12568004 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTargetsController.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTargetsController.kt @@ -7,7 +7,7 @@ import com.intellij.openapi.project.Project import com.intellij.ui.CollectionListModel import org.utbot.cpp.clion.plugin.client.ManagedClient import org.utbot.cpp.clion.plugin.client.requests.ProjectTargetsRequest -import org.utbot.cpp.clion.plugin.grpc.getProjectTargetsGrpcRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.listeners.ConnectionStatus import org.utbot.cpp.clion.plugin.listeners.UTBotEventsListener import org.utbot.cpp.clion.plugin.settings.UTBotAllProjectSettings @@ -46,8 +46,8 @@ class UTBotTargetsController(val project: Project) { targetsToolWindow.setBusy(true) } ProjectTargetsRequest( + ParamsBuilder(project).buildProjectTargetsParams(), project, - getProjectTargetsGrpcRequest(project), processTargets = { targetsResponse: Testgen.ProjectTargetsResponse -> invokeOnEdt { targetsToolWindow.setBusy(false) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ActionUtils.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ActionUtils.kt index 10431534b..82a4e1180 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ActionUtils.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ActionUtils.kt @@ -1,8 +1,19 @@ package org.utbot.cpp.clion.plugin.utils import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.settings.settings + +fun AnActionEvent.getLineNumberUnsafe(): Int { + val editor = this.getRequiredData(CommonDataKeys.EDITOR) + return editor.caretModel.logicalPosition.line + 1 +} + +fun AnActionEvent.getFilePathUnsafe(): String { + return getRequiredData(CommonDataKeys.VIRTUAL_FILE).localPath.toString() +} + fun isPluginEnabled(e: AnActionEvent): Boolean { var isEnabled = false val project = e.project diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ClientUtils.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ClientUtils.kt index 4cafe81bb..bc181c188 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ClientUtils.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ClientUtils.kt @@ -7,6 +7,7 @@ import com.intellij.openapi.project.Project import org.utbot.cpp.clion.plugin.client.Client import org.utbot.cpp.clion.plugin.client.ManagedClient import org.utbot.cpp.clion.plugin.client.logger.ClientLogger +import org.utbot.cpp.clion.plugin.grpc.IllegalActionEventException //TODO: remove logger from this file val Project.logger: ClientLogger get() = this.service() @@ -22,4 +23,4 @@ val AnActionEvent.client: ManagedClient val Project.client: ManagedClient get() = this.service() fun AnActionEvent.activeProject() = this.project - ?: error("A project related to action event $this not found") + ?: throw IllegalActionEventException(this, "project") diff --git a/clion-plugin/src/main/resources/messages/UTBot.properties b/clion-plugin/src/main/resources/messages/UTBot.properties index 945d7104a..663d3bbaf 100644 --- a/clion-plugin/src/main/resources/messages/UTBot.properties +++ b/clion-plugin/src/main/resources/messages/UTBot.properties @@ -7,8 +7,14 @@ wizard.show=Quickstart wizard settings.project.sourcePaths=Source paths settings.project.buildDir=Build directory: settings.project.target=target path: +settings.project.target.wrong.conversion=Possibly wrong target path. Could not create relative path from remote path settings.project.testsDir=Tests directory: +settings.project.testsDir.wrong=Wrong relative path to tests directory +settings.project.buildDir.browse.title=Choose build directory +settings.project.target.browse.title=Choose target +settings.project.sourcePaths.wrong.conversion=Possibly wrong source path. Could not create relative path from remote path or this path settings.project.remotePath=Path to project on remote machine +settings.project.remotePath.wrong=Bad remote path settings.project.serverName=Server host name settings.project.port=Server port settings.project.cmakeOptions=Cmake options @@ -54,6 +60,15 @@ actions.enable.menu.disabled=Enable actions.enable.enabled=UTBot: Plugin Enabled actions.enable.disabled=UTBot: Enable Plugin warning.reconnecting=Reconnecting to server! Request won't be executed! Please try again, later. +folderPath.wrong.conversion=Could not create relative path from remote path to folder path! Review your remote path in settings \ + and make sure folder you generate tests for is under project root. +filePath.wrong.conversion=Could not create relative path from remote path to file path! Review your remote path in settings \ + and make sure file you generate tests for is under project root. +projectPath.wrong.conversion=Could not convert project path to remote version. Please, report this issue, here +testFilePath.wrong.conversion=Could not create relative path from remote path to test file! Please review your remote path in settings \ + and make sure test file is under project root. +coverageAndResults.creation.failure=Could not create request for coverage and results from current context. Please see \ + the docs on how to run tests with coverage. toolwindow.targets.displayName=Targets toolwindow.logs.displayName=Logs actions.verbose.menu.enabled=Verbose Mode: On From f9e5e42371410750f23bfaf4b61d879448a7e7b4 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Tue, 20 Sep 2022 03:25:34 +0300 Subject: [PATCH 02/24] add titles to notifications, change texts --- .../cpp/clion/plugin/actions/ShowSettings.kt | 13 +++ .../generate/GenerateForFolderAction.kt | 6 -- .../generate/GenerateForPredicateAction.kt | 3 + .../utbot/cpp/clion/plugin/client/Client.kt | 93 +++++++++++++++---- .../utbot/cpp/clion/plugin/client/Request.kt | 1 + .../handlers/CoverageAndResultsHandler.kt | 17 +++- .../handlers/ProjectConfigurationHandler.kt | 35 +++++-- .../plugin/client/handlers/StreamHandler.kt | 8 +- .../handlers/StreamHandlerWithProgress.kt | 2 +- .../client/handlers/TestsStreamHandler.kt | 8 -- .../CheckProjectConfigurationRequest.kt | 1 + .../requests/CreateBuildFolderRequest.kt | 5 +- .../requests/GenerateJsonFilesRequest.kt | 1 + .../client/requests/ProjectTargetsRequest.kt | 2 +- .../RunAllTestsWithCoverageRequest.kt | 2 +- .../client/requests/RunWithCoverageRequest.kt | 2 +- .../client/requests/test/AssertionRequest.kt | 3 +- .../client/requests/test/BaseTestsRequest.kt | 11 ++- .../client/requests/test/ClassRequest.kt | 1 + .../client/requests/test/FileRequest.kt | 1 + .../client/requests/test/FolderRequest.kt | 1 + .../client/requests/test/FunctionRequest.kt | 1 + .../test/FunctionReturnTypeRequest.kt | 1 + .../client/requests/test/LineRequest.kt | 1 + .../client/requests/test/PredicateRequest.kt | 1 + .../client/requests/test/ProjectRequest.kt | 1 + .../client/requests/test/SnippetRequest.kt | 1 + .../org/utbot/cpp/clion/plugin/grpc/Params.kt | 18 +--- .../cpp/clion/plugin/grpc/ParamsBuilder.kt | 22 ++--- .../ui/UTBotRequestProgressIndicator.kt | 7 +- .../ui/testsResults/TestNameAndTestSuite.kt | 2 +- .../cpp/clion/plugin/utils/ClientUtils.kt | 3 +- .../clion/plugin/utils/NotificationUtils.kt | 24 +++-- .../main/resources/messages/UTBot.properties | 48 +++++++++- 34 files changed, 242 insertions(+), 104 deletions(-) create mode 100644 clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/ShowSettings.kt diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/ShowSettings.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/ShowSettings.kt new file mode 100644 index 000000000..bda220897 --- /dev/null +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/ShowSettings.kt @@ -0,0 +1,13 @@ +package org.utbot.cpp.clion.plugin.actions + +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.options.ShowSettingsUtil +import com.intellij.openapi.project.DumbAwareAction +import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.settings.UTBotConfigurable + +class ShowSettingsAction : DumbAwareAction(UTBot.message("show.settings.text"))/*, LightEditCompatible*/ { + override fun actionPerformed(e: AnActionEvent) { + ShowSettingsUtil.getInstance().showSettingsDialog(e.project, UTBotConfigurable::class.java) + } +} \ No newline at end of file diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt index a95a24285..fa6f87642 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt @@ -3,22 +3,16 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.FolderRequest -import org.utbot.cpp.clion.plugin.grpc.IllegalActionEventException import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe class GenerateForFolderAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) = - try { FolderRequest( ParamsBuilder(e.activeProject()).buildFolderRequestParams(e.getFilePathUnsafe()), e.activeProject() ).executeUsingCurrentClient() - } catch (exception: IllegalActionEventException) { - // should never happen, all keys should be checked in update - exception.notifyUser() - } override fun isDefined(e: AnActionEvent): Boolean { val project = e.project diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForPredicateAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForPredicateAction.kt index edeaa70ee..f0bd8dd36 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForPredicateAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForPredicateAction.kt @@ -9,6 +9,7 @@ import com.intellij.ui.DocumentAdapter import com.intellij.ui.components.fields.ExtendableTextField import javax.swing.ListSelectionModel import javax.swing.event.DocumentEvent +import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.requests.test.FunctionReturnTypeRequest import org.utbot.cpp.clion.plugin.client.requests.test.PredicateRequest import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder @@ -72,6 +73,7 @@ class GenerateForPredicateAction : BaseGenerateTestsAction() { } ValidationType.UNSUPPORTED -> { notifyError( + UTBot.message("notify.title.error"), "Unsupported return type for \'Generate Tests With Prompted Result\' feature: \n" + "supported types are integers, booleans, characters, floats and strings" ) @@ -79,6 +81,7 @@ class GenerateForPredicateAction : BaseGenerateTestsAction() { } ValidationType.UNRECOGNIZED -> { notifyError( + UTBot.message("notify.title.error"), "Could not recognise return type for 'Generate Tests With Prompted Result' feature: \n" + "supported types are integers, booleans, characters, floats and strings" ) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt index fd15f5df1..66b4533c2 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt @@ -3,6 +3,7 @@ package org.utbot.cpp.clion.plugin.client import com.intellij.openapi.Disposable import com.intellij.util.messages.MessageBus import io.grpc.Status +import io.grpc.StatusException import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope @@ -18,6 +19,8 @@ import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withTimeout import org.jetbrains.annotations.TestOnly import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.actions.ReconnectAction +import org.utbot.cpp.clion.plugin.actions.ShowSettingsAction import org.utbot.cpp.clion.plugin.client.channels.LogChannel import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest import org.utbot.cpp.clion.plugin.grpc.IllegalPathException @@ -26,6 +29,9 @@ import org.utbot.cpp.clion.plugin.client.logger.ClientLogger import org.utbot.cpp.clion.plugin.listeners.ConnectionStatus import org.utbot.cpp.clion.plugin.listeners.UTBotEventsListener import org.utbot.cpp.clion.plugin.settings.projectIndependentSettings +import org.utbot.cpp.clion.plugin.utils.logger +import org.utbot.cpp.clion.plugin.utils.notifyError +import org.utbot.cpp.clion.plugin.utils.notifyInfo import org.utbot.cpp.clion.plugin.utils.notifyWarning import testsgen.Testgen @@ -74,7 +80,10 @@ class Client( if (isDisposed) { // if client is disposed, then connection settings were changed, and requests issued to this client // are no longer relevant, so we don't execute them - notifyWarning(UTBot.message("warning.reconnecting")) + notifyWarning( + UTBot.message("notify.warning.reconnecting.title"), + UTBot.message("notify.warning.reconnecting") + ) return } executeRequestImpl(request) @@ -85,9 +94,57 @@ class Client( try { request.execute(stub, coroutineContext[Job]) } catch (e: io.grpc.StatusException) { - handleGRPCStatusException(e, "Exception when executing server request") + val id = request.id + when (e.status.code) { + Status.UNAVAILABLE.code -> notifyError( + UTBot.message("notify.title.noConnection"), + UTBot.message("notify.noConnection"), + project, + ShowSettingsAction(), + ReconnectAction() + ) + Status.UNKNOWN.code -> notifyError( + UTBot.message("notify.title.unknownServerException"), + UTBot.message("notify.unknownServerException"), + project + ) + Status.CANCELLED.code -> notifyError( + UTBot.message("notify.title.cancelled"), + UTBot.message("notify.cancelled", id, e.message ?: ""), + project + ) + Status.FAILED_PRECONDITION.code -> notifyError( + UTBot.message("notify.title.failedPrecondition"), + UTBot.message("notify.failedPrecondition", id, e.message ?: ""), + project + ) + Status.INTERNAL.code -> notifyError( + UTBot.message("notify.title.internalError"), + UTBot.message("notify.internalError", request, e.message ?: ""), + project + ) + Status.UNIMPLEMENTED.code -> notifyError( + UTBot.message("notify.title.error"), + UTBot.message("notify.unimplemented", id, e.message ?: ""), + project + ) + Status.INVALID_ARGUMENT.code -> notifyError( + UTBot.message("notify.title.invalid.argument"), + UTBot.message("notify.invalid.argument", e.message ?: "", id), + project + ) + else -> notifyError( + UTBot.message("notify.title.error"), + e.message ?: "Corresponding exception's message is missing", + project + ) + } } catch (e: IllegalPathException) { - e.notifyUser() + notifyError( + UTBot.message("notify.bad.settings.title"), + UTBot.message("notify.bad.path", e.message ?: ""), + project + ) } } } @@ -117,7 +174,7 @@ class Client( logger.info { "Sending REGISTER CLIENT request, clientID == $clientId" } stub.registerClient(Testgen.RegisterClientRequest.newBuilder().setClientId(clientId).build()) } catch (e: io.grpc.StatusException) { - handleGRPCStatusException(e, "Register client request failed with grpc exception!") + logger.error { "${e.status}: ${e.message}" } } } } @@ -141,6 +198,7 @@ class Client( connectionStatus = ConnectionStatus.CONNECTED if (oldStatus != ConnectionStatus.CONNECTED) { + notifyInfo(UTBot.message("notify.connected.title"), UTBot.message("notify.connected", port, serverName)) logger.info { "Successfully connected to server!" } registerClient() } @@ -164,19 +222,18 @@ class Client( if (!messageBus.isDisposed) { val connectionChangedPublisher = messageBus.syncPublisher(UTBotEventsListener.CONNECTION_CHANGED_TOPIC) - if (oldStatus != ConnectionStatus.BROKEN) + if (oldStatus != ConnectionStatus.BROKEN) { + notifyError( + UTBot.message("notify.disconnected.title"), + UTBot.message("notify.disconnected", port, serverName), + project, + ShowSettingsAction() + ) connectionChangedPublisher.onConnectionChange(oldStatus, ConnectionStatus.BROKEN) + } } - handleGRPCStatusException(e, "Heartbeat failed with grpc io exception") - } - } - - private fun handleGRPCStatusException(e: io.grpc.StatusException, message: String) { - logger.error { "$message \n${e.message}" } - when (e.status) { - Status.UNAVAILABLE -> logger.error { "Server is unavailable: possibly it is shut down." } - Status.UNKNOWN -> logger.error { "Server threw an exception." } + logger.error { "${e.status} \n${e.message}" } } } @@ -192,9 +249,11 @@ class Client( // should be used only in tests @TestOnly - fun waitForServerRequestsToFinish(timeout: Long = SERVER_TIMEOUT, - delayTime: Long = 1000L, - ifNotFinished: (List) -> Unit = {}) { + fun waitForServerRequestsToFinish( + timeout: Long = SERVER_TIMEOUT, + delayTime: Long = 1000L, + ifNotFinished: (List) -> Unit = {} + ) { runBlocking { withTimeout(timeout) { while (requestsCS.coroutineContext.job.children.toList().any()) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Request.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Request.kt index 3734f793f..e283618d0 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Request.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Request.kt @@ -14,4 +14,5 @@ interface Request { * request can't be completed, for example because user canceled it from UI. */ suspend fun execute(stub: TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub, cancellationJob: Job?) + abstract val id: String } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/CoverageAndResultsHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/CoverageAndResultsHandler.kt index fa063a2a1..ac52369e8 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/CoverageAndResultsHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/CoverageAndResultsHandler.kt @@ -3,11 +3,13 @@ package org.utbot.cpp.clion.plugin.client.handlers import com.intellij.coverage.CoverageDataManager import com.intellij.coverage.CoverageEngine import com.intellij.coverage.CoverageRunner +import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.project.Project import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.withContext +import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.actions.FocusAction import org.utbot.cpp.clion.plugin.coverage.Coverage import org.utbot.cpp.clion.plugin.coverage.UTBotCoverageEngine @@ -44,7 +46,11 @@ class CoverageAndResultsHandler( return } if (response.errorMessage.isNotEmpty()) { - notifyError(response.errorMessage, project) + notifyError( + UTBot.message("notify.title.error"), + response.errorMessage, + project + ) } data class CoverageCollector( @@ -96,6 +102,13 @@ class CoverageAndResultsHandler( } private fun notifyCoverageReceived() { - notifyInfo("Coverage received!", project, sourceFilePath?.let { FocusAction(it) }) + val actions = mutableListOf() + sourceFilePath?.let { actions.add(FocusAction(it)) } + notifyInfo( + UTBot.message("notify.coverage.received.title"), + UTBot.message("notify.coverage.received"), + project, + sourceFilePath?.let { FocusAction(it) } + ) } } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt index 3f96c03fd..1fa9a106a 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt @@ -1,6 +1,7 @@ package org.utbot.cpp.clion.plugin.client.handlers import com.intellij.openapi.project.Project +import kotlin.io.path.name import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot @@ -8,6 +9,7 @@ import org.utbot.cpp.clion.plugin.actions.AskServerToGenerateBuildDir import org.utbot.cpp.clion.plugin.actions.AskServerToGenerateJsonForProjectConfiguration import org.utbot.cpp.clion.plugin.client.ManagedClient import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.settings.settings import org.utbot.cpp.clion.plugin.utils.logger import org.utbot.cpp.clion.plugin.utils.notifyError @@ -44,11 +46,12 @@ class CheckProjectConfigurationHandler( override fun handle(response: Testgen.ProjectConfigResponse) { when (response.type) { Testgen.ProjectConfigStatus.IS_OK -> { - notifyInfo("Project is configured!", project) + notifyInfo(UTBot.message("notify.title.configured"), UTBot.message("notify.configured"), project) } Testgen.ProjectConfigStatus.BUILD_DIR_NOT_FOUND -> { notifyError( - "Project build dir not found! ${response.message}", + UTBot.message("notify.title.missingBuildDir"), + UTBot.message("notify.missingBuildDir"), project, AskServerToGenerateBuildDir() ) @@ -57,7 +60,8 @@ class CheckProjectConfigurationHandler( val missingFileName = if (response.type == Testgen.ProjectConfigStatus.LINK_COMMANDS_JSON_NOT_FOUND) "link_commands.json" else "compile_commands.json" notifyError( - "Project is not configured properly: file $missingFileName is missed in the build directory", + UTBot.message("notify.title.notConfigured"), + UTBot.message("notify.missing.cdb.files", missingFileName), project, AskServerToGenerateJsonForProjectConfiguration(), ) @@ -65,7 +69,7 @@ class CheckProjectConfigurationHandler( Testgen.ProjectConfigStatus.BUILD_DIR_SAME_AS_PROJECT -> { val message = response.message logger.warn(message) - notifyWarning("$message ${UTBot.message("uri.wiki")}", project) + notifyError(UTBot.message("notify.title.error"), "$message ${UTBot.message("uri.wiki")}", project) } else -> notifyUnknownResponse(response, project) } @@ -81,9 +85,14 @@ class CreateBuildDirHandler( override fun handle(response: Testgen.ProjectConfigResponse) { when (response.type) { Testgen.ProjectConfigStatus.IS_OK -> { - notifyInfo("Build directory was created!", project) + notifyInfo( + UTBot.message("notify.build.dir.created.title"), + UTBot.message("notify.build.dir.created", project.settings.buildDirPath.name), + project + ) CheckProjectConfigurationRequest( + ParamsBuilder(project).buildProjectConfigRequestParams(Testgen.ConfigMode.CHECK), project ).also { if (!client.isDisposed) { @@ -92,7 +101,11 @@ class CreateBuildDirHandler( } } Testgen.ProjectConfigStatus.BUILD_DIR_CREATION_FAILED -> { - notifyError("Failed to create build directory! ${response.message}", project) + notifyError( + UTBot.message("notify.failed.to.create.build.dir.title"), + "", + project + ) } else -> notifyUnknownResponse(response, project) } @@ -108,10 +121,14 @@ class GenerateJsonHandler( ) : ProjectConfigResponseHandler(project, grpcStream, progressName, cancellationJob) { override fun handle(response: Testgen.ProjectConfigResponse) { when (response.type) { - Testgen.ProjectConfigStatus.IS_OK -> notifyInfo("Successfully configured project!", project) + Testgen.ProjectConfigStatus.IS_OK -> notifyInfo( + UTBot.message("notify.title.configured"), + UTBot.message("notify.configured"), + project + ) Testgen.ProjectConfigStatus.RUN_JSON_GENERATION_FAILED -> notifyError( - "UTBot tried to configure project, but failed with the " + - "following message: ${response.message}", project + UTBot.message("notify.title.notConfigured"), + response.message ) else -> notifyUnknownResponse(response, project) } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt index b1985905f..2a2e106d4 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt @@ -37,12 +37,8 @@ abstract class StreamHandler( abstract fun onData(data: T) open fun onCompletion(exception: Throwable?) { - if (exception != null) { - logger.warn(exception.message) - if (exception !is CancellationException) { - exception.printStackTrace() - exception.message?.let { notifyError(it, project) } - } + exception?.let { + throw it } } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandlerWithProgress.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandlerWithProgress.kt index 5e88ea76a..2c92fe7f0 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandlerWithProgress.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandlerWithProgress.kt @@ -49,11 +49,11 @@ abstract class StreamHandlerWithProgress( abstract fun T.getProgress(): Util.Progress override fun onCompletion(exception: Throwable?) { - super.onCompletion(exception) if (exception != null) { invokeOnEdt { indicator.stop() } + throw exception } } } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt index 2113ffd69..f402c1ae3 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt @@ -121,12 +121,4 @@ class TestsStreamHandler( Files.move(previousReportPaths, newPath) } } - - override fun onCompletion(exception: Throwable?) { - super.onCompletion(exception) - if (exception == null) - onSuccess(myGeneratedTestFilesLocalFS) - else - onError(exception) - } } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt index 5142de1d9..470b14fce 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt @@ -14,6 +14,7 @@ class CheckProjectConfigurationRequest( params: Params, project: Project, ) : BaseRequest>(params, project) { + override val id: String = "Configure Project" override val logMessage: String = "Sending request to check project configuration." diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt index e668b3d55..fcbd23937 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt @@ -19,8 +19,9 @@ import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class CreateBuildDirRequest( params: Params, project: Project, - val client: ManagedClient, -) : BaseRequest>(request, client.project) { + val client: ManagedClient +) : BaseRequest>(params, project) { + override val id: String = "Create Build Directory" override val logMessage: String = "Sending request to check project configuration." override suspend fun TestsGenServiceCoroutineStub.send(cancellationJob: Job?): Flow = diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/GenerateJsonFilesRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/GenerateJsonFilesRequest.kt index 06bf513fc..2351e2a43 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/GenerateJsonFilesRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/GenerateJsonFilesRequest.kt @@ -16,6 +16,7 @@ class GenerateJsonFilesRequest( params: Params, project: Project ) : BaseRequest>(params, project) { + override val id: String = "Generate JSON Files" override val logMessage: String = "Sending request to check project configuration." constructor(project: Project) : this( diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/ProjectTargetsRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/ProjectTargetsRequest.kt index 08e098bdd..c2ca9703c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/ProjectTargetsRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/ProjectTargetsRequest.kt @@ -12,7 +12,7 @@ class ProjectTargetsRequest( val processTargets: suspend (Testgen.ProjectTargetsResponse)->Unit, val onError: suspend (Throwable) -> Unit ): BaseRequest(params, project) { - + override val id: String = "Get Project Targets" override val logMessage: String = "Sending request to get project targets" override suspend fun execute(stub: TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub, cancellationJob: Job?) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunAllTestsWithCoverageRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunAllTestsWithCoverageRequest.kt index 3e4beb464..c3faedf64 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunAllTestsWithCoverageRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunAllTestsWithCoverageRequest.kt @@ -14,7 +14,7 @@ class RunAllTestsWithCoverageRequest( params: Params, project: Project, ) : BaseRequest>(params, project) { - + override val id: String = "Run All Tests with Coverage" override val logMessage: String = "Sending request to get tests run results and coverage" override suspend fun Flow.handle(cancellationJob: Job?) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunWithCoverageRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunWithCoverageRequest.kt index 5022a524d..0801e1080 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunWithCoverageRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunWithCoverageRequest.kt @@ -16,7 +16,7 @@ class RunWithCoverageRequest( params: Params, project: Project, ): BaseRequest>(params, project) { - + override val id: String = "Run with Coverage" override val logMessage: String = "Sending request to get tests run results and coverage" override suspend fun Flow.handle(cancellationJob: Job?) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/AssertionRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/AssertionRequest.kt index 19436f994..5a7b715f6 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/AssertionRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/AssertionRequest.kt @@ -10,8 +10,9 @@ import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class AssertionRequest( params: Params, - project: Project, + project: Project ) : BaseTestsRequest(params, project, UTBot.message("requests.assertion.description.progress")) { + override val id: String = "Generate for Assertion" override val logMessage: String = "Sending request to generate tests for Assertion" override fun getInfoMessage(): String = "Tests for assertion are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt index 6f9e4c071..296990c30 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt @@ -3,6 +3,7 @@ package org.utbot.cpp.clion.plugin.client.requests.test import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow +import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.actions.FocusAction import org.utbot.cpp.clion.plugin.client.handlers.TestsStreamHandler import org.utbot.cpp.clion.plugin.client.requests.BaseRequest @@ -51,9 +52,13 @@ abstract class BaseTestsRequest(params: Params, project: Project, private open fun getInfoMessage() = "Tests generated!" open fun notifySuccess(generatedTestFiles: List) { - notifyInfo(getInfoMessage(), project, getFocusTarget(generatedTestFiles)?.let { - FocusAction(it) - }) + notifyInfo( + UTBot.message("notify.tests.generated"), + getInfoMessage(), + project, + getFocusTarget(generatedTestFiles)?.let { + FocusAction(it) + }) } open fun notifyError(cause: Throwable) {} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ClassRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ClassRequest.kt index 02b3ee99a..09d780350 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ClassRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ClassRequest.kt @@ -12,6 +12,7 @@ class ClassRequest( params: Params, project: Project, ) : BaseTestsRequest(params, project, UTBot.message("requests.class.description.progress")) { + override val id: String = "Generate for Class" override val logMessage: String = "Sending request to generate tests for class" override fun getInfoMessage(): String = "Tests for class are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FileRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FileRequest.kt index 2f173cb67..37c48ef9d 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FileRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FileRequest.kt @@ -13,6 +13,7 @@ class FileRequest( params: Params, project: Project, ) : BaseTestsRequest(params, project, UTBot.message("requests.file.description.progress")) { + override val id: String = "Generate for File" override val logMessage: String = "Sending request to generate tests for file" override fun getInfoMessage(): String = "Tests for file ${(request.filePath.fileNameOrNull()?.plus(" ")) ?: ""} are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FolderRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FolderRequest.kt index 7cf9990ae..43e361085 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FolderRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FolderRequest.kt @@ -13,6 +13,7 @@ class FolderRequest( folderRequestParams: Params, project: Project, ) : BaseTestsRequest(folderRequestParams, project, UTBot.message("requests.folder.description.progress")) { + override val id: String = "Generate for Folder" override val logMessage: String = "Sending request to generate tests for folder." override fun getInfoMessage(): String = "Tests for folder ${request.folderPath.fileNameOrNull()?.plus(" ") ?: ""} are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionRequest.kt index 2d0bf4b76..dd20ac3dd 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionRequest.kt @@ -12,6 +12,7 @@ class FunctionRequest( params: Params, project: Project, ) : BaseTestsRequest(params, project, UTBot.message("requests.function.description.progress")) { + override val id: String = "Generate for Function" override val logMessage: String = "Sending request to generate tests for function." override fun getInfoMessage(): String = "Tests for function are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionReturnTypeRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionReturnTypeRequest.kt index 2a3a7019d..7fd890e5c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionReturnTypeRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionReturnTypeRequest.kt @@ -13,6 +13,7 @@ class FunctionReturnTypeRequest( project: Project, val processReturnType: suspend (FunctionTypeResponse)->(Unit) ) : BaseRequest(params, project) { + override val id: String = "Get Function Return Type" override val logMessage: String = "Sending request to get function return type" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/LineRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/LineRequest.kt index d6bbf4c1f..b09704ce8 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/LineRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/LineRequest.kt @@ -12,6 +12,7 @@ class LineRequest( params: Params, project: Project, ) : BaseTestsRequest(params, project, UTBot.message("requests.line.description.progress")) { + override val id: String = "Generate for Line" override val logMessage: String = "Sending request to generate tests for line." override fun getInfoMessage(): String = "Tests for line are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/PredicateRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/PredicateRequest.kt index cf2cc389c..991234e54 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/PredicateRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/PredicateRequest.kt @@ -12,6 +12,7 @@ class PredicateRequest( params: Params, project: Project, ) : BaseTestsRequest(params, project, UTBot.message("requests.predicate.description.progress")) { + override val id: String = "Generate for Predicate" override val logMessage: String = "Sending request to generate tests for predicate" override fun getInfoMessage(): String = "Tests for predicate are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ProjectRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ProjectRequest.kt index 157032167..246e3b1bd 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ProjectRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ProjectRequest.kt @@ -12,6 +12,7 @@ class ProjectRequest( params: Params, project: Project, ) : BaseTestsRequest(params, project, UTBot.message("requests.project.description.progress")) { + override val id: String = "Generate for Project" override val logMessage: String = "Sending request to generate tests for project" override fun getInfoMessage(): String = "Tests for project are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/SnippetRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/SnippetRequest.kt index 15fad305a..19545f1d7 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/SnippetRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/SnippetRequest.kt @@ -12,6 +12,7 @@ class SnippetRequest( params: Params, project: Project ) : BaseTestsRequest(params, project, UTBot.message("requests.snippet.description.progress")) { + override val id: String = "Generate for Snippet" override val logMessage: String = "Sending request to generate tests for snippet" override fun getInfoMessage(): String = "Tests for snippet are generated!" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt index c909d9670..caf403a12 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt @@ -7,24 +7,10 @@ import org.utbot.cpp.clion.plugin.utils.notifyError import java.nio.file.InvalidPathException import java.nio.file.Paths -abstract class ClientException(message: String) : Exception(message) { - abstract fun notifyUser() -} - -class IllegalActionEventException(val event: AnActionEvent, missingKey: String) : - ClientException("Action event has no $missingKey!") { - override fun notifyUser() { - notifyError("Could create request for server, from Action context invocation! Probably you are invoking Action in a wrong way, please see docs") - } -} +abstract class ClientException(message: String) : Exception(message) class IllegalPathException(val path: String, val info: String) : - ClientException("Bad path: $path. Info: $info") { - - override fun notifyUser() { - notifyError(info) - } -} + ClientException("Bad path: $path. Info: $info") data class RemoteMapping(val localProjectPath: String, val remoteProjectPath: String) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt index 6dccbae88..381eb56aa 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt @@ -104,21 +104,13 @@ class ParamsBuilder( } fun buildTestFilterParams(element: PsiElement): Params { - try { - val (testName: String, testSuite: String) = TestNameAndTestSuite.create(element) - val testFilePath = element.containingFile.virtualFile.localPath.toString() - return TestFilterParams( - testFilePath, - testName, - testSuite - ) - } catch (_: Throwable) { - throw object : ClientException("Could not create test filter from psi element") { - override fun notifyUser() { - notifyError(UTBot.message("coverageAndResults.creation.failure")) - } - } - } + val (testName: String, testSuite: String) = TestNameAndTestSuite.create(element) + val testFilePath = element.containingFile.virtualFile.localPath.toString() + return TestFilterParams( + testFilePath, + testName, + testSuite + ) } fun buildClassRequestParams(filePath: String, lineNumber: Int): Params { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt index eee03581b..b3c6c219a 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt @@ -6,6 +6,7 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.wm.ex.StatusBarEx import com.intellij.openapi.wm.ex.WindowManagerEx import kotlinx.coroutines.Job +import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.utils.invokeOnEdt import org.utbot.cpp.clion.plugin.utils.notifyInfo @@ -16,6 +17,7 @@ class UTBotRequestProgressIndicator( ) : AbstractProgressIndicatorExBase(true) { private val requestTask = UTBotRequestTaskInfo(taskDisplayName) + init { isIndeterminate = false } @@ -41,7 +43,10 @@ class UTBotRequestProgressIndicator( requestJob?.cancel() finish(requestTask) super.cancel() - notifyInfo("Successfully canceled: $taskDisplayName") + notifyInfo( + UTBot.message("notify.cancelled.request.title"), + UTBot.message("notify.cancelled.request", taskDisplayName) + ) } private class UTBotRequestTaskInfo(private val titleText: String) : TaskInfo { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/testsResults/TestNameAndTestSuite.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/testsResults/TestNameAndTestSuite.kt index 23f3df6b5..3d61216b3 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/testsResults/TestNameAndTestSuite.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/testsResults/TestNameAndTestSuite.kt @@ -28,4 +28,4 @@ data class TestNameAndTestSuite private constructor(val name: String = "", val s return TestNameAndTestSuite(testedMethodName, suiteName) } } -} \ No newline at end of file +} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ClientUtils.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ClientUtils.kt index bc181c188..708ab2fcb 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ClientUtils.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ClientUtils.kt @@ -7,7 +7,6 @@ import com.intellij.openapi.project.Project import org.utbot.cpp.clion.plugin.client.Client import org.utbot.cpp.clion.plugin.client.ManagedClient import org.utbot.cpp.clion.plugin.client.logger.ClientLogger -import org.utbot.cpp.clion.plugin.grpc.IllegalActionEventException //TODO: remove logger from this file val Project.logger: ClientLogger get() = this.service() @@ -23,4 +22,4 @@ val AnActionEvent.client: ManagedClient val Project.client: ManagedClient get() = this.service() fun AnActionEvent.activeProject() = this.project - ?: throw IllegalActionEventException(this, "project") + ?: error("Project is missing for event: $this") diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/NotificationUtils.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/NotificationUtils.kt index 5822b9258..1476fd3bd 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/NotificationUtils.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/NotificationUtils.kt @@ -4,30 +4,34 @@ import com.intellij.notification.NotificationGroupManager import com.intellij.notification.NotificationType import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.project.Project +import org.utbot.cpp.clion.plugin.UTBot import testsgen.Testgen -fun notifyError(errorText: String, project: Project? = null, action: AnAction? = null) = - notify(NotificationType.ERROR, errorText, project, action) +fun notifyError(title: String, errorText: String, project: Project? = null, vararg actions: AnAction?) = + notify(NotificationType.ERROR, title, errorText,project, *actions) -fun notifyInfo(infoText: String, project: Project? = null, action: AnAction? = null) = - notify(NotificationType.INFORMATION, infoText, project, action) +fun notifyInfo(title: String, infoText: String, project: Project? = null, vararg actions: AnAction?) = + notify(NotificationType.INFORMATION, title, infoText, project, *actions) -fun notifyWarning(warningText: String, project: Project? = null, action: AnAction? = null) = - notify(NotificationType.WARNING, warningText, project, action) +fun notifyWarning(title: String, warningText: String, project: Project? = null, vararg actions: AnAction?) = + notify(NotificationType.WARNING, title, warningText, project, *actions) fun notifyUnknownResponse(response: Testgen.ProjectConfigResponse, project: Project) = - notifyInfo("Unknown server response: ${response.message}", project) + notifyError(UTBot.message("notify.title.error"), "Unknown server response: ${response.message}", project) private fun notify( type: NotificationType, + title: String, content: String, project: Project? = null, - action: AnAction? = null, + vararg actions: AnAction? ) { val notification = NotificationGroupManager.getInstance() .getNotificationGroup("UTBot events") - .createNotification(content, type) + .createNotification(title, content, type) notification.notify(project) - action?.let { notification.addAction(it) } + actions.filterNotNull().forEach { + notification.addAction(it) + } } diff --git a/clion-plugin/src/main/resources/messages/UTBot.properties b/clion-plugin/src/main/resources/messages/UTBot.properties index 663d3bbaf..f095d151f 100644 --- a/clion-plugin/src/main/resources/messages/UTBot.properties +++ b/clion-plugin/src/main/resources/messages/UTBot.properties @@ -1,7 +1,7 @@ name=UTBot plugin projectConfigure.configure=Configure Project projectConfigure.generate.buildDir=Generate build directory -projectConfigure.generate.json=Generate Missing Json Files +projectConfigure.generate.json=Generate Missing JSON Files projectConfigure.reconfigure=Reset cache and configure project wizard.show=Quickstart wizard settings.project.sourcePaths=Source paths @@ -60,13 +60,59 @@ actions.enable.menu.disabled=Enable actions.enable.enabled=UTBot: Plugin Enabled actions.enable.disabled=UTBot: Enable Plugin warning.reconnecting=Reconnecting to server! Request won't be executed! Please try again, later. +notify.warning.reconnecting=Reconnecting to server! Request won't be executed! Please try again, later. +notify.warning.reconnecting.title=UTBot: Reconnecting folderPath.wrong.conversion=Could not create relative path from remote path to folder path! Review your remote path in settings \ and make sure folder you generate tests for is under project root. filePath.wrong.conversion=Could not create relative path from remote path to file path! Review your remote path in settings \ and make sure file you generate tests for is under project root. +# hardly it will ever happen projectPath.wrong.conversion=Could not convert project path to remote version. Please, report this issue, here testFilePath.wrong.conversion=Could not create relative path from remote path to test file! Please review your remote path in settings \ and make sure test file is under project root. +notify.title.missingBuildDir=UTBot: Build directory not found +notify.missingBuildDir=Build directory does not exist on server filesystem! +notify.title.configured=UTBot: Project is configured +notify.configured=Project is configured, you are ready to generate tests! +notify.title.notConfigured=UTBot: Project not configured +notify.failed.to.create.build.dir.title=UTBot: Failed to Create Build Directory +notify.title.noConnection=UTBot: not connected to server +notify.noConnection=Check your connection settings +notify.title.unknownServerException=UTBot: Unknown error +notify.unknownServerException=Server threw an unknown exception +notify.title.cancelled=UTBot: Request was cancelled +#0 - exception message, #1 - request id +notify.cancelled={0}. Request: "{1}" failed. +notify.title.failedPrecondition=UTBot: Failed Precondition +notify.failedPrecondition={0}. Request: "{1}" failed. +notify.title.internalError=UTBot: Server internal error +#0 - exception message, #1 - request id +notify.internalError={0}. Request: "{1}" failed. +#0 - exception message, #1 - request id +notify.unimplemented={0}. Request: "{1}" failed. +notify.title.error=UTBot: Error +notify.title.invalid.argument=UTBot: Invalid input +#0 - exception message, #1 - request id +notify.invalid.argument={0}. Request: "{1}" failed. +notify.coverage.received.title=UTBot: Coverage gathered +notify.coverage.received=Coverage response received from server. +notify.build.dir.created.title=UTBot: Build Directory was created +#0 - name of a build directory +notify.build.dir.created=Build directory "{0}" was created +notify.tests.generated=UTBot: Tests generated +notify.bad.settings.title=UTBot: Error +#0 - Message containing info about bad path +notify.bad.path=Please check your settings. {0} +notify.cancelled.request.title=UTBot: Request cancelled +#0 - request id +notify.cancelled.request=Successfully cancelled: "{0}" +notify.connected.title=UTBot: Connection Established +notify.connected=Successfully pinged UTBot server on port: {0, number, #}, host: {1} +notify.disconnected.title=UTBot: No Connection +notify.disconnected=Please check your connection settings +#0 - name of a json file missing in the build dir (link_commands.json or compile_commands.json) +notify.missing.cdb.files=File {0} is missing in the build directory +show.settings.text=Go to Settings coverageAndResults.creation.failure=Could not create request for coverage and results from current context. Please see \ the docs on how to run tests with coverage. toolwindow.targets.displayName=Targets From b1791ec3bde4ef6b41ae7a97b42e9777301b0822 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Tue, 20 Sep 2022 10:37:44 +0300 Subject: [PATCH 03/24] change text --- clion-plugin/src/main/resources/messages/UTBot.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clion-plugin/src/main/resources/messages/UTBot.properties b/clion-plugin/src/main/resources/messages/UTBot.properties index f095d151f..37c1e1d6d 100644 --- a/clion-plugin/src/main/resources/messages/UTBot.properties +++ b/clion-plugin/src/main/resources/messages/UTBot.properties @@ -61,7 +61,7 @@ actions.enable.enabled=UTBot: Plugin Enabled actions.enable.disabled=UTBot: Enable Plugin warning.reconnecting=Reconnecting to server! Request won't be executed! Please try again, later. notify.warning.reconnecting=Reconnecting to server! Request won't be executed! Please try again, later. -notify.warning.reconnecting.title=UTBot: Reconnecting +notify.warning.reconnecting.title=UTBot: Reconnecting folderPath.wrong.conversion=Could not create relative path from remote path to folder path! Review your remote path in settings \ and make sure folder you generate tests for is under project root. filePath.wrong.conversion=Could not create relative path from remote path to file path! Review your remote path in settings \ @@ -98,7 +98,7 @@ notify.coverage.received.title=UTBot: Coverage gathered notify.coverage.received=Coverage response received from server. notify.build.dir.created.title=UTBot: Build Directory was created #0 - name of a build directory -notify.build.dir.created=Build directory "{0}" was created +notify.build.dir.created=Build directory {0} was created notify.tests.generated=UTBot: Tests generated notify.bad.settings.title=UTBot: Error #0 - Message containing info about bad path From 88749400975c381fde383f4ec6d55dba278e64c2 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Tue, 20 Sep 2022 12:53:55 +0300 Subject: [PATCH 04/24] throw on buildDirPath and testsDirPath failure --- .../settings/UTBotAllProjectSettings.kt | 35 +++++++++++++++++-- .../UTBotTestRunLineMarkerProvider.kt | 11 ++++-- .../utbot/cpp/clion/plugin/utils/UiUtils.kt | 1 - .../main/resources/messages/UTBot.properties | 2 ++ 4 files changed, 43 insertions(+), 6 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotAllProjectSettings.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotAllProjectSettings.kt index deb61dbf0..e71c2a56e 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotAllProjectSettings.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotAllProjectSettings.kt @@ -3,6 +3,8 @@ package org.utbot.cpp.clion.plugin.settings import com.intellij.openapi.components.Service import com.intellij.openapi.components.service import com.intellij.openapi.project.Project +import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.grpc.IllegalPathException import org.utbot.cpp.clion.plugin.listeners.PluginActivationListener import org.utbot.cpp.clion.plugin.listeners.UTBotSettingsChangedListener import org.utbot.cpp.clion.plugin.ui.utbotToolWindow.targetToolWindow.UTBotTarget @@ -10,6 +12,7 @@ import org.utbot.cpp.clion.plugin.utils.convertToRemotePathIfNeeded import org.utbot.cpp.clion.plugin.utils.isWindows import org.utbot.cpp.clion.plugin.utils.path import java.io.File +import java.nio.file.InvalidPathException import java.nio.file.Path import java.nio.file.Paths @@ -19,10 +22,36 @@ class UTBotAllProjectSettings(val project: Project) { get() = project.service() val buildDirPath: Path - get() = Paths.get(project.path).resolve(storedSettings.buildDirRelativePath) + get() { + try { + return Paths.get(project.path).resolve(storedSettings.buildDirRelativePath) + } catch (e: InvalidPathException) { + throw IllegalPathException( + UTBot.message( + "paths.invalid", + "relative path to build dir", + storedSettings.buildDirRelativePath + ), + storedSettings.buildDirRelativePath + ) + } + } val testsDirPath: Path - get() = Paths.get(project.path).resolve(storedSettings.testDirRelativePath) + get() { + try { + return Paths.get(project.path).resolve(storedSettings.testsDirRelativePath) + } catch (e: InvalidPathException) { + throw IllegalPathException( + storedSettings.testsDirRelativePath, + UTBot.message( + "paths.invalid", + "relative path to tests dir", + storedSettings.testsDirRelativePath + ) + ) + } + } val convertedSourcePaths: List get() = storedSettings.sourceDirs.map { it.convertToRemotePathIfNeeded(project) } @@ -51,7 +80,7 @@ class UTBotAllProjectSettings(val project: Project) { fun fireUTBotSettingsChanged() { project.messageBus.let { bus -> - if(!bus.isDisposed) + if (!bus.isDisposed) bus.syncPublisher(UTBotSettingsChangedListener.TOPIC).settingsChanged(this) } } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/testsResults/UTBotTestRunLineMarkerProvider.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/testsResults/UTBotTestRunLineMarkerProvider.kt index d4bf45a11..287016953 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/testsResults/UTBotTestRunLineMarkerProvider.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/testsResults/UTBotTestRunLineMarkerProvider.kt @@ -11,9 +11,11 @@ import com.intellij.psi.PsiElement import javax.swing.Icon import kotlin.io.path.name import org.utbot.cpp.clion.plugin.actions.generate.RunWithCoverageAction +import org.utbot.cpp.clion.plugin.grpc.IllegalPathException import org.utbot.cpp.clion.plugin.settings.settings import org.utbot.cpp.clion.plugin.ui.services.TestsResultsStorage import org.utbot.cpp.clion.plugin.utils.localPath +import org.utbot.cpp.clion.plugin.utils.logger import testsgen.Testgen class UTBotTestRunLineMarkerProvider : LineMarkerProvider { @@ -57,10 +59,15 @@ class UTBotTestRunLineMarkerProvider : LineMarkerProvider { private fun isElementInTestFileGeneratedByUTBot(element: PsiElement) = element.containingFile.virtualFile.localPath.let { - it.toString().startsWith(element.project.settings.testsDirPath.toString()) && - it.name.contains("test") + try { + it.toString().startsWith(element.project.settings.testsDirPath.toString()) && + it.name.contains("test") + } catch (e: IllegalPathException) { + return false + } } + fun getStatusIcon(element: PsiElement): Icon { // return icon for Running All Tests if (element.canPlaceAllTestsIcon()) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/UiUtils.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/UiUtils.kt index 5484f1079..54848757a 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/UiUtils.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/UiUtils.kt @@ -10,7 +10,6 @@ import com.intellij.ui.DocumentAdapter import com.intellij.ui.RawCommandLineEditor import com.intellij.ui.dsl.builder.Row import com.intellij.ui.layout.PropertyBinding -import javax.swing.JSpinner import javax.swing.JTextField import javax.swing.event.DocumentEvent diff --git a/clion-plugin/src/main/resources/messages/UTBot.properties b/clion-plugin/src/main/resources/messages/UTBot.properties index 37c1e1d6d..234f7ec29 100644 --- a/clion-plugin/src/main/resources/messages/UTBot.properties +++ b/clion-plugin/src/main/resources/messages/UTBot.properties @@ -67,6 +67,8 @@ folderPath.wrong.conversion=Could not create relative path from remote path to f filePath.wrong.conversion=Could not create relative path from remote path to file path! Review your remote path in settings \ and make sure file you generate tests for is under project root. # hardly it will ever happen +#0 - path name (e.g relative path to ...), #1 - path value +paths.invalid=Invalid {0}: {1}. Please review it in settings! projectPath.wrong.conversion=Could not convert project path to remote version. Please, report this issue, here testFilePath.wrong.conversion=Could not create relative path from remote path to test file! Please review your remote path in settings \ and make sure test file is under project root. From 1cca32d80e59d1704b30dd851401a97fdc85e54f Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Tue, 20 Sep 2022 12:58:12 +0300 Subject: [PATCH 05/24] fix heatbeat error log message --- .../src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt index 66b4533c2..9adafde01 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt @@ -233,7 +233,7 @@ class Client( } } - logger.error { "${e.status} \n${e.message}" } + logger.error { "Failed to ping the server. Status code: ${e.status.code}" } } } From 9124f427e95f2a02d59bbb0de73d0487e35e2561 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Tue, 20 Sep 2022 19:38:17 +0300 Subject: [PATCH 06/24] validate tests, build, remote paths in wizard and settings --- .../plugin/settings/UTBotConfigurable.kt | 39 +++++++++++++-- .../plugin/ui/wizard/UTBotBaseWizardStep.kt | 28 +++++++++-- .../cpp/clion/plugin/ui/wizard/UTBotWizard.kt | 12 +++-- .../ui/wizard/steps/BuildOptionsStep.kt | 7 ++- .../plugin/ui/wizard/steps/ConnectionStep.kt | 41 ++++++++++++---- .../clion/plugin/ui/wizard/steps/FinalStep.kt | 3 +- .../clion/plugin/ui/wizard/steps/IntroStep.kt | 3 +- .../utbot/cpp/clion/plugin/utils/PathUtils.kt | 27 +++++++++-- .../utbot/cpp/clion/plugin/utils/UiUtils.kt | 47 ++++++++++++++----- .../main/resources/messages/UTBot.properties | 4 ++ 10 files changed, 172 insertions(+), 39 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotConfigurable.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotConfigurable.kt index 77e6e7987..52c5235ff 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotConfigurable.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotConfigurable.kt @@ -5,6 +5,7 @@ package org.utbot.cpp.clion.plugin.settings import com.intellij.openapi.components.service import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.options.BoundConfigurable +import com.intellij.openapi.options.ConfigurationException import com.intellij.openapi.project.Project import com.intellij.openapi.ui.DialogPanel import com.intellij.ui.JBIntSpinner @@ -12,6 +13,7 @@ import com.intellij.ui.components.JBCheckBox import com.intellij.ui.components.JBTextField import com.intellij.ui.dsl.builder.BottomGap import com.intellij.ui.dsl.builder.COLUMNS_LARGE +import com.intellij.ui.dsl.builder.Cell import com.intellij.ui.dsl.builder.LabelPosition import com.intellij.ui.dsl.builder.Panel import com.intellij.ui.dsl.builder.bindIntValue @@ -25,7 +27,12 @@ import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.listeners.UTBotSettingsChangedListener import org.utbot.cpp.clion.plugin.ui.ObservableValue import org.utbot.cpp.clion.plugin.ui.sourceFoldersView.UTBotProjectViewPaneForSettings +import org.utbot.cpp.clion.plugin.utils.ComponentValidationInfo +import org.utbot.cpp.clion.plugin.utils.ValidationCondition +import org.utbot.cpp.clion.plugin.utils.addValidation import org.utbot.cpp.clion.plugin.utils.commandLineEditor +import org.utbot.cpp.clion.plugin.utils.isLookLikeUnixPath +import org.utbot.cpp.clion.plugin.utils.isValidHostName import org.utbot.cpp.clion.plugin.utils.projectLifetimeDisposable import java.awt.Dimension import java.awt.event.ItemEvent @@ -37,6 +44,7 @@ class UTBotConfigurable(private val myProject: Project) : BoundConfigurable( private val panel by lazy { createMainPanel() } private val settings: UTBotProjectStoredSettings = myProject.service() + private val validationInfos: MutableList = mutableListOf() private lateinit var portComponent: JBIntSpinner private lateinit var serverNameTextField: JBTextField private lateinit var pluginEnabledCheckBox: JBCheckBox @@ -49,6 +57,13 @@ class UTBotConfigurable(private val myProject: Project) : BoundConfigurable( }) } + private fun Cell.validateInput(vararg conditions: ValidationCondition): Cell { + return this.apply { + validationInfos.add(this.addValidation(*conditions)) + } + } + + override fun createPanel() = panel private fun createMainPanel(): DialogPanel { @@ -98,17 +113,28 @@ class UTBotConfigurable(private val myProject: Project) : BoundConfigurable( row(UTBot.message("settings.project.serverName")) { textField().bindText(projectIndependentSettings::serverName).applyToComponent { serverNameTextField = this - } + }.validateInput( + ValidationCondition( + UTBot.message("validation.invalid.host") + ) { it.text.isValidHostName() } + ) }.rowComment(UTBot.message("deployment.utbotHost.description")) row(UTBot.message("settings.project.remotePath")) { - textField().bindText(settings::remotePath).columns(COLUMNS_LARGE) + textField().bindText(settings::remotePath).columns(COLUMNS_LARGE).validateInput( + ValidationCondition(UTBot.message("validation.not.empty")) { it.text.isNotEmpty() }, + ValidationCondition(UTBot.message("validation.not.unix.path")) { it.text.isLookLikeUnixPath() } + ) }.rowComment(UTBot.message("deployment.remotePath.description")) } private fun Panel.createPathsSettings() { row(UTBot.message("settings.project.buildDir")) { + val validator: (JBTextField) -> Boolean = { + it.text.isNotEmpty() + } textField().bindText(settings::buildDirRelativePath).columns(COLUMNS_LARGE) + .validateInput(ValidationCondition(UTBot.message("validation.not.empty")) { it.text.isNotEmpty() }) }.rowComment(UTBot.message("paths.buildDirectory.description")) row(UTBot.message("settings.project.target")) { @@ -122,6 +148,7 @@ class UTBotConfigurable(private val myProject: Project) : BoundConfigurable( row(UTBot.message("settings.project.testsDir")) { textField().bindText(settings::testDirRelativePath).columns(COLUMNS_LARGE) + .validateInput(ValidationCondition(UTBot.message("validation.not.empty")) { it.text.isNotEmpty() }) }.rowComment(UTBot.message("paths.testsDir.description")) row { @@ -208,6 +235,12 @@ class UTBotConfigurable(private val myProject: Project) : BoundConfigurable( } override fun apply() { + val invalidComponentValidationInfo = validationInfos.find { !it.isValid() } + if (invalidComponentValidationInfo != null) { + panel.scrollRectToVisible(invalidComponentValidationInfo.component.visibleRect) + invalidComponentValidationInfo.component.requestFocus() + throw ConfigurationException("Some fields have invalid values") + } val wereConnectionSettingsModified = portComponent.number != projectIndependentSettings.port || serverNameTextField.text != projectIndependentSettings.serverName val wasPluginEnabledChanged = pluginEnabledCheckBox.isSelected != settings.isPluginEnabled @@ -226,4 +259,4 @@ class UTBotConfigurable(private val myProject: Project) : BoundConfigurable( companion object { val TEXT_FIELD_MAX_SIZE = Dimension(370, 100) } -} \ No newline at end of file +} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotBaseWizardStep.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotBaseWizardStep.kt index 232420be5..b4b997edc 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotBaseWizardStep.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotBaseWizardStep.kt @@ -1,7 +1,10 @@ package org.utbot.cpp.clion.plugin.ui.wizard import com.intellij.ide.wizard.Step +import com.intellij.openapi.Disposable import com.intellij.openapi.ui.DialogPanel +import com.intellij.ui.components.JBTextField +import com.intellij.ui.dsl.builder.Cell import com.intellij.util.ui.HtmlPanel import com.intellij.util.ui.UIUtil import javax.swing.Box @@ -9,16 +12,19 @@ import javax.swing.BoxLayout import javax.swing.Icon import javax.swing.JComponent import javax.swing.JPanel +import org.utbot.cpp.clion.plugin.utils.ComponentValidationInfo +import org.utbot.cpp.clion.plugin.utils.ValidationCondition +import org.utbot.cpp.clion.plugin.utils.validateInput import java.awt.Component import java.awt.Dimension import java.awt.Font -abstract class UTBotBaseWizardStep: Step { +abstract class UTBotBaseWizardStep(private val parentDisposable: Disposable) : Step { private val panel by lazy { JPanel() } private var isInitialized = false - + private val validators = mutableListOf() private val onApplyCallbacks = mutableListOf<() -> Unit>() - + class Validator(val component: JComponent, val isValid: ()->Boolean) abstract fun createUI() override fun _init() { @@ -39,6 +45,12 @@ abstract class UTBotBaseWizardStep: Step { addComponentToStep(this) } + protected fun Cell.validateWith(vararg conditions: ValidationCondition): Cell { + return this.applyToComponent { + validators.add(this.validateInput(parentDisposable, *conditions)) + } + } + override fun _commit(finishChosen: Boolean) = onApplyCallbacks.forEach { it.invoke() } //TODO: find a good icon and use here @@ -60,7 +72,15 @@ abstract class UTBotBaseWizardStep: Step { panel.add(component) } - open fun canProceedToNextStep(): Boolean = true + protected fun validate(): JComponent? { + return validators.find { !it.isValid() }?.component + } + + open fun canProceedToNextStep(): Boolean { + val validationResult = validate() + validationResult?.requestFocus() + return validationResult == null + } private fun createHtmlComponent(html: String): JComponent = object : HtmlPanel() { init { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotWizard.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotWizard.kt index 4a2755ec7..227c1d15f 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotWizard.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotWizard.kt @@ -16,13 +16,14 @@ import java.awt.event.KeyEvent class UTBotWizard(private val project: Project) : AbstractWizard("UTBot: Quickstart", project) { // copy of settings to make changes during wizard steps - private val mySettingsModel = UTBotSettingsModel(project.settings.storedSettings.state.copy(), projectIndependentSettings.copy()) + private val mySettingsModel = + UTBotSettingsModel(project.settings.storedSettings.copy(), projectIndependentSettings.copy()) init { - addStep(IntroStep()) - addStep(ConnectionStep(project, mySettingsModel)) - addStep(BuildOptionsStep(mySettingsModel)) - addStep(FinalStep()) + addStep(IntroStep(disposable)) + addStep(ConnectionStep(disposable, project, mySettingsModel)) + addStep(BuildOptionsStep(disposable, mySettingsModel)) + addStep(FinalStep(disposable)) super.init() isResizable = true setSize(400, 400) @@ -55,6 +56,7 @@ class UTBotWizard(private val project: Project) : AbstractWizard Unit) { useConnectionDefaults.addOnChangeListener { newValue -> listener(!newValue) } } - }) + }).validateWith( + ValidationCondition( + UTBot.message("validation.invalid.host") + ) { it.text.isValidHostName() } + ) } row("Port") { @@ -194,7 +212,10 @@ class ConnectionStep( override fun addListener(listener: (Boolean) -> Unit) { useConnectionDefaults.addOnChangeListener { newValue -> listener(!newValue) } } - }) + }).validateWith( + ValidationCondition(UTBot.message("validation.not.empty")) { it.text.isNotEmpty() }, + ValidationCondition(UTBot.message("validation.not.unix.path")) { it.text.isLookLikeUnixPath() } + ) } }.addToUI() } @@ -221,7 +242,10 @@ class ConnectionStep( } private fun pingServer() { - CoroutineScope(Dispatchers.IO + SupervisorJob()).launch { + val handler = CoroutineExceptionHandler { _, e -> + e.printStackTrace() + } + CoroutineScope(Dispatchers.IO + SupervisorJob() + handler).launch { connectionStatus.value = pingServer(portComponent.number, hostTextField.text) } } @@ -229,7 +253,8 @@ class ConnectionStep( private fun setupPingOnPortOrHostChange() { hostTextField.document.addDocumentListener(object : DocumentAdapter() { override fun textChanged(e: DocumentEvent) { - pingServer() + if (hostTextField.text.isValidHostName()) + pingServer() } }) portComponent.addChangeListener { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/steps/FinalStep.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/steps/FinalStep.kt index ab620b944..dbc303e25 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/steps/FinalStep.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/steps/FinalStep.kt @@ -1,7 +1,8 @@ package org.utbot.cpp.clion.plugin.ui.wizard.steps +import com.intellij.openapi.Disposable import org.utbot.cpp.clion.plugin.ui.wizard.UTBotBaseWizardStep -class FinalStep : UTBotBaseWizardStep() { +class FinalStep(parentDisposable: Disposable) : UTBotBaseWizardStep(parentDisposable) { override fun createUI() = addHtml("media/final_wizard_text.html") } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/steps/IntroStep.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/steps/IntroStep.kt index 557eb7955..eb3d5605b 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/steps/IntroStep.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/steps/IntroStep.kt @@ -1,7 +1,8 @@ package org.utbot.cpp.clion.plugin.ui.wizard.steps +import com.intellij.openapi.Disposable import org.utbot.cpp.clion.plugin.ui.wizard.UTBotBaseWizardStep -class IntroStep : UTBotBaseWizardStep() { +class IntroStep(parentDisposable: Disposable) : UTBotBaseWizardStep(parentDisposable) { override fun createUI() = addHtml("media/intro_wizard_text.html") } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/PathUtils.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/PathUtils.kt index c469a7ed3..f9cbef426 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/PathUtils.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/PathUtils.kt @@ -13,6 +13,8 @@ import java.nio.file.SimpleFileVisitor import java.nio.file.attribute.BasicFileAttributes import java.util.* import kotlin.io.path.div +import java.net.URI +import java.net.URISyntaxException val Project.path get() = this.basePath ?: error("Project path can't be null!") val Project.nioPath: Path get() = Paths.get(this.path) @@ -62,6 +64,19 @@ fun String.fileNameOrNull(): String? { } } +fun String.isLookLikeUnixPath(): Boolean { + return this.startsWith("/") && !this.contains("\\") +} + +fun String.isValidHostName(): Boolean { + try { + URI(null, null, this, 2121, null, null, null).authority + } catch (_: URISyntaxException) { + return false + } + return true +} + fun testFilePathToSourceFilePath(path: Path, project: Project): Path { val relativeToProject = project.settings.testsDirPath.relativize(path.parent) return (Paths.get(project.path) / relativeToProject / testFileNameToSourceFileName(path)) @@ -115,11 +130,14 @@ fun String.convertFromRemotePathIfNeeded(project: Project): Path { private fun String.convertToRemotePath(project: Project): String { val relativeToProjectPath = relativize(project.path, this) - return FilenameUtils.separatorsToUnix(Paths.get(project.settings.storedSettings.remotePath, relativeToProjectPath).toString()) + return FilenameUtils.separatorsToUnix( + Paths.get(project.settings.storedSettings.remotePath, relativeToProjectPath).toString() + ) } private fun String.convertFromRemotePath(project: Project): String { - val relativeToProjectPath = FilenameUtils.separatorsToSystem(relativize(project.settings.storedSettings.remotePath, this)) + val relativeToProjectPath = + FilenameUtils.separatorsToSystem(relativize(project.settings.storedSettings.remotePath, this)) return FilenameUtils.separatorsToSystem(Paths.get(project.path, relativeToProjectPath).toString()) } @@ -166,8 +184,9 @@ private fun removeSuffix(path: Path, suffix: String): Path { ) } -val VirtualFile.localPath: Path get() = this.fileSystem.getNioPath(this) ?: error("Could not get filesystem path from $this") +val VirtualFile.localPath: Path + get() = this.fileSystem.getNioPath(this) ?: error("Could not get filesystem path from $this") private const val DOT_SEP = "_dot_" -private const val TEST_SUFFIX = "_test" \ No newline at end of file +private const val TEST_SUFFIX = "_test" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/UiUtils.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/UiUtils.kt index 54848757a..3f190c997 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/UiUtils.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/UiUtils.kt @@ -6,31 +6,54 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.ui.ComponentValidator import com.intellij.openapi.ui.ValidationInfo -import com.intellij.ui.DocumentAdapter import com.intellij.ui.RawCommandLineEditor +import com.intellij.ui.components.JBTextField +import com.intellij.ui.dsl.builder.Cell import com.intellij.ui.dsl.builder.Row import com.intellij.ui.layout.PropertyBinding +import javax.swing.JComponent import javax.swing.JTextField -import javax.swing.event.DocumentEvent fun invokeOnEdt(task: () -> Unit) { ApplicationManager.getApplication().invokeLater(task) } -fun JTextField.validateInput(parentDisposable: Disposable, validator: () -> ValidationInfo?) { +data class ValidationCondition(val errorText: String, val isValid: (JTextField) -> Boolean) +data class ComponentValidationInfo(val component: JComponent, val isValid: () -> Boolean) + +fun Cell.addValidation(vararg conditions: ValidationCondition): ComponentValidationInfo { + this.validationOnInput { textField -> + conditions.forEach { condition -> + if (!condition.isValid(textField)) { + return@validationOnInput ValidationInfo(condition.errorText) + } + } + return@validationOnInput null + } + return ComponentValidationInfo(this.component) { + conditions.all { it.isValid(this.component) } + } +} + +fun JBTextField.validateInput( + parentDisposable: Disposable, + vararg conditions: ValidationCondition +): ComponentValidationInfo { + val validator: () -> ValidationInfo? = lmb@{ + for (condition in conditions) { + if (!condition.isValid(this)) { + return@lmb ValidationInfo(condition.errorText, this) + } + } + null + } + ComponentValidator(parentDisposable) .withValidator(validator) .installOn(this) + .andRegisterOnDocumentListener(this) - document.addDocumentListener( - object : DocumentAdapter() { - override fun textChanged(e: DocumentEvent) { - ComponentValidator - .getInstance(this@validateInput) - .ifPresent { v -> v.revalidate() } - } - } - ) + return ComponentValidationInfo(this) { conditions.all { it.isValid(this) } } } fun Row.commandLineEditor( diff --git a/clion-plugin/src/main/resources/messages/UTBot.properties b/clion-plugin/src/main/resources/messages/UTBot.properties index 234f7ec29..6fc6f9b0f 100644 --- a/clion-plugin/src/main/resources/messages/UTBot.properties +++ b/clion-plugin/src/main/resources/messages/UTBot.properties @@ -6,6 +6,7 @@ projectConfigure.reconfigure=Reset cache and configure project wizard.show=Quickstart wizard settings.project.sourcePaths=Source paths settings.project.buildDir=Build directory: +settings.project.error.empty.field=Must not be empty settings.project.target=target path: settings.project.target.wrong.conversion=Possibly wrong target path. Could not create relative path from remote path settings.project.testsDir=Tests directory: @@ -115,6 +116,9 @@ notify.disconnected=Please check your connection settings #0 - name of a json file missing in the build dir (link_commands.json or compile_commands.json) notify.missing.cdb.files=File {0} is missing in the build directory show.settings.text=Go to Settings +validation.not.empty=Please fill in this field +validation.not.unix.path=This path must be an absolute unix path! +validation.invalid.host=Invalid host name coverageAndResults.creation.failure=Could not create request for coverage and results from current context. Please see \ the docs on how to run tests with coverage. toolwindow.targets.displayName=Targets From 652fe4eca325ba78502cf59c458a8be637102860 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Tue, 20 Sep 2022 20:46:01 +0300 Subject: [PATCH 07/24] add notifyNotConnected --- .../org/utbot/cpp/clion/plugin/client/Client.kt | 16 +++------------- .../cpp/clion/plugin/utils/NotificationUtils.kt | 12 ++++++++++++ .../src/main/resources/messages/UTBot.properties | 1 - 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt index 9adafde01..f22a4f8b8 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt @@ -32,6 +32,7 @@ import org.utbot.cpp.clion.plugin.settings.projectIndependentSettings import org.utbot.cpp.clion.plugin.utils.logger import org.utbot.cpp.clion.plugin.utils.notifyError import org.utbot.cpp.clion.plugin.utils.notifyInfo +import org.utbot.cpp.clion.plugin.utils.notifyNotConnected import org.utbot.cpp.clion.plugin.utils.notifyWarning import testsgen.Testgen @@ -96,13 +97,7 @@ class Client( } catch (e: io.grpc.StatusException) { val id = request.id when (e.status.code) { - Status.UNAVAILABLE.code -> notifyError( - UTBot.message("notify.title.noConnection"), - UTBot.message("notify.noConnection"), - project, - ShowSettingsAction(), - ReconnectAction() - ) + Status.UNAVAILABLE.code -> notifyNotConnected(project, port, serverName) Status.UNKNOWN.code -> notifyError( UTBot.message("notify.title.unknownServerException"), UTBot.message("notify.unknownServerException"), @@ -223,12 +218,7 @@ class Client( if (!messageBus.isDisposed) { val connectionChangedPublisher = messageBus.syncPublisher(UTBotEventsListener.CONNECTION_CHANGED_TOPIC) if (oldStatus != ConnectionStatus.BROKEN) { - notifyError( - UTBot.message("notify.disconnected.title"), - UTBot.message("notify.disconnected", port, serverName), - project, - ShowSettingsAction() - ) + notifyNotConnected(project, port, serverName) connectionChangedPublisher.onConnectionChange(oldStatus, ConnectionStatus.BROKEN) } } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/NotificationUtils.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/NotificationUtils.kt index 1476fd3bd..d8081d465 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/NotificationUtils.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/NotificationUtils.kt @@ -5,6 +5,8 @@ import com.intellij.notification.NotificationType import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.project.Project import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.actions.ReconnectAction +import org.utbot.cpp.clion.plugin.actions.ShowSettingsAction import testsgen.Testgen fun notifyError(title: String, errorText: String, project: Project? = null, vararg actions: AnAction?) = @@ -35,3 +37,13 @@ private fun notify( notification.addAction(it) } } + +fun notifyNotConnected(project: Project? = null, port: Int, serverName: String) { + notifyError( + UTBot.message("notify.disconnected.title"), + UTBot.message("notify.disconnected", port, serverName), + project, + ShowSettingsAction(), + ReconnectAction() + ) +} diff --git a/clion-plugin/src/main/resources/messages/UTBot.properties b/clion-plugin/src/main/resources/messages/UTBot.properties index 6fc6f9b0f..1fc851573 100644 --- a/clion-plugin/src/main/resources/messages/UTBot.properties +++ b/clion-plugin/src/main/resources/messages/UTBot.properties @@ -79,7 +79,6 @@ notify.title.configured=UTBot: Project is configured notify.configured=Project is configured, you are ready to generate tests! notify.title.notConfigured=UTBot: Project not configured notify.failed.to.create.build.dir.title=UTBot: Failed to Create Build Directory -notify.title.noConnection=UTBot: not connected to server notify.noConnection=Check your connection settings notify.title.unknownServerException=UTBot: Unknown error notify.unknownServerException=Server threw an unknown exception From 7110047f48a436af736250602c43d90e7862d43f Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Fri, 23 Sep 2022 11:13:25 +0300 Subject: [PATCH 08/24] uncomment detect --- clion-plugin/build.gradle.kts | 16 ++++++---------- .../org/utbot/cpp/clion/plugin/client/Client.kt | 3 --- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/clion-plugin/build.gradle.kts b/clion-plugin/build.gradle.kts index 1672b7f72..ce3cec4d8 100644 --- a/clion-plugin/build.gradle.kts +++ b/clion-plugin/build.gradle.kts @@ -46,7 +46,7 @@ plugins { kotlin("plugin.serialization") version "1.6.10" id("com.google.protobuf") version "0.8.15" // code style - // id("io.gitlab.arturbosch.detekt").version("1.21.0") + id("io.gitlab.arturbosch.detekt").version("1.21.0") idea application } @@ -86,18 +86,16 @@ sourceSets { } } -/* detekt { buildUponDefaultConfig = true // preconfigure defaults allRules = false // activate all available (even unstable) rules. } - */ -//kotlin { -// jvmToolchain { -// (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(11)) -// } -//} +kotlin { + jvmToolchain { + (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(11)) + } +} protobuf { protoc { @@ -170,14 +168,12 @@ qodana { } tasks { - /** withType().configureEach { jvmTarget = "1.8" } withType().configureEach { jvmTarget = "1.8" } - */ // Set the JVM compatibility versions properties("javaVersion").let { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt index f22a4f8b8..86e46b2ea 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt @@ -3,7 +3,6 @@ package org.utbot.cpp.clion.plugin.client import com.intellij.openapi.Disposable import com.intellij.util.messages.MessageBus import io.grpc.Status -import io.grpc.StatusException import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope @@ -19,8 +18,6 @@ import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withTimeout import org.jetbrains.annotations.TestOnly import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.actions.ReconnectAction -import org.utbot.cpp.clion.plugin.actions.ShowSettingsAction import org.utbot.cpp.clion.plugin.client.channels.LogChannel import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest import org.utbot.cpp.clion.plugin.grpc.IllegalPathException From 776e3eeb579dafde6e184b986a465542c3838559 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Fri, 23 Sep 2022 11:32:31 +0300 Subject: [PATCH 09/24] fix messages keys --- .../org/utbot/cpp/clion/plugin/client/Client.kt | 14 +++++++------- .../src/main/resources/messages/UTBot.properties | 16 ++++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt index 86e46b2ea..5e5e4d21d 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt @@ -96,8 +96,8 @@ class Client( when (e.status.code) { Status.UNAVAILABLE.code -> notifyNotConnected(project, port, serverName) Status.UNKNOWN.code -> notifyError( - UTBot.message("notify.title.unknownServerException"), - UTBot.message("notify.unknownServerException"), + UTBot.message("notify.title.unknown.server.error"), // unknown server error + UTBot.message("notify.unknown.server.error"), project ) Status.CANCELLED.code -> notifyError( @@ -106,17 +106,17 @@ class Client( project ) Status.FAILED_PRECONDITION.code -> notifyError( - UTBot.message("notify.title.failedPrecondition"), - UTBot.message("notify.failedPrecondition", id, e.message ?: ""), + UTBot.message("notify.title.failed.precondition"), + UTBot.message("notify.failed.precondition", e.message ?: "", id), project ) Status.INTERNAL.code -> notifyError( - UTBot.message("notify.title.internalError"), - UTBot.message("notify.internalError", request, e.message ?: ""), + UTBot.message("notify.title.internal.error"), + UTBot.message("notify.internal.error", request, e.message ?: ""), project ) Status.UNIMPLEMENTED.code -> notifyError( - UTBot.message("notify.title.error"), + UTBot.message("notify.title.server.error"), UTBot.message("notify.unimplemented", id, e.message ?: ""), project ) diff --git a/clion-plugin/src/main/resources/messages/UTBot.properties b/clion-plugin/src/main/resources/messages/UTBot.properties index 1fc851573..8bc970ef0 100644 --- a/clion-plugin/src/main/resources/messages/UTBot.properties +++ b/clion-plugin/src/main/resources/messages/UTBot.properties @@ -79,20 +79,20 @@ notify.title.configured=UTBot: Project is configured notify.configured=Project is configured, you are ready to generate tests! notify.title.notConfigured=UTBot: Project not configured notify.failed.to.create.build.dir.title=UTBot: Failed to Create Build Directory -notify.noConnection=Check your connection settings -notify.title.unknownServerException=UTBot: Unknown error -notify.unknownServerException=Server threw an unknown exception +notify.title.unknown.server.error=UTBot: Unknown Server Error +notify.unknown.server.error=Server threw an unknown exception notify.title.cancelled=UTBot: Request was cancelled #0 - exception message, #1 - request id -notify.cancelled={0}. Request: "{1}" failed. -notify.title.failedPrecondition=UTBot: Failed Precondition -notify.failedPrecondition={0}. Request: "{1}" failed. -notify.title.internalError=UTBot: Server internal error +notify.cancelled={0}. Request: "{1}" cancelled. +notify.title.failed.precondition=UTBot: Failed Precondition +notify.failed.precondition={0}. Request: "{1}" failed. +notify.title.internal.error=UTBot: Server internal error #0 - exception message, #1 - request id -notify.internalError={0}. Request: "{1}" failed. +notify.internal.error={0}. Request: "{1}" failed. #0 - exception message, #1 - request id notify.unimplemented={0}. Request: "{1}" failed. notify.title.error=UTBot: Error +notify.title.server.error=UTBot: Server Error notify.title.invalid.argument=UTBot: Invalid input #0 - exception message, #1 - request id notify.invalid.argument={0}. Request: "{1}" failed. From 67cb36f450835da7b59a98c90669b21e81ddfbc9 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Tue, 4 Oct 2022 16:41:47 +0300 Subject: [PATCH 10/24] fixes after rebase --- clion-plugin/build.gradle.kts | 2 +- .../plugin/actions/AskServerToGenerateBuildDir.kt | 4 +++- .../cpp/clion/plugin/actions/RefreshTargetsAction.kt | 3 +-- .../org/utbot/cpp/clion/plugin/actions/ShowSettings.kt | 2 +- .../cpp/clion/plugin/actions/UTBotBaseToggleAction.kt | 2 +- .../plugin/actions/configure/ConfigureProjectAction.kt | 2 +- .../actions/configure/ReconfigureProjectAction.kt | 1 - .../plugin/actions/generate/GenerateForFolderAction.kt | 2 +- .../actions/generate/GenerateForFunctionAction.kt | 2 +- .../plugin/actions/generate/GenerateForLineAction.kt | 1 + .../plugin/actions/mark/BaseSourceFolderAction.kt | 2 +- .../kotlin/org/utbot/cpp/clion/plugin/client/Client.kt | 6 +++--- .../org/utbot/cpp/clion/plugin/client/ManagedClient.kt | 6 +++--- .../client/handlers/ProjectConfigurationHandler.kt | 5 +---- .../cpp/clion/plugin/client/handlers/StreamHandler.kt | 2 -- .../clion/plugin/client/handlers/TestsStreamHandler.kt | 10 ++++++++++ .../cpp/clion/plugin/client/requests/BaseRequest.kt | 2 +- .../requests/CheckProjectConfigurationRequest.kt | 1 - .../plugin/client/requests/CreateBuildFolderRequest.kt | 6 ------ .../cpp/clion/plugin/coverage/UTBotCoverageRunner.kt | 1 - .../kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt | 2 -- .../org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt | 4 +--- .../clion/plugin/settings/UTBotAllProjectSettings.kt | 6 +++--- .../ui/sourceFoldersView/ProxyProjectViewTree.kt | 2 -- .../ui/testsResults/UTBotTestRunLineMarkerProvider.kt | 1 - .../utbot/cpp/clion/plugin/ui/wizard/UTBotWizard.kt | 2 +- 26 files changed, 35 insertions(+), 44 deletions(-) diff --git a/clion-plugin/build.gradle.kts b/clion-plugin/build.gradle.kts index ce3cec4d8..ab99c9bf8 100644 --- a/clion-plugin/build.gradle.kts +++ b/clion-plugin/build.gradle.kts @@ -35,7 +35,7 @@ plugins { // Java support id("java") // Kotlin support - id("org.jetbrains.kotlin.jvm") version "1.6.10" + id("org.jetbrains.kotlin.jvm") version "1.7.20" // Gradle IntelliJ Plugin id("org.jetbrains.intellij") version "1.5.2" // Gradle Changelog Plugin diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/AskServerToGenerateBuildDir.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/AskServerToGenerateBuildDir.kt index cbf6f315b..8d19d3083 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/AskServerToGenerateBuildDir.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/AskServerToGenerateBuildDir.kt @@ -5,13 +5,15 @@ import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.requests.CreateBuildDirRequest import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject +import org.utbot.cpp.clion.plugin.utils.client import testsgen.Testgen class AskServerToGenerateBuildDir : UTBotBaseAction(UTBot.message("projectConfigure.generate.buildDir")) { override fun actionPerformed(e: AnActionEvent) = CreateBuildDirRequest( ParamsBuilder(e.activeProject()).buildProjectConfigRequestParams(Testgen.ConfigMode.CREATE_BUILD_DIR), - e.activeProject() + e.activeProject(), + e.activeProject().client ).execute() override fun updateIfEnabled(e: AnActionEvent) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/RefreshTargetsAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/RefreshTargetsAction.kt index 758146de9..e94eea22f 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/RefreshTargetsAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/RefreshTargetsAction.kt @@ -1,7 +1,6 @@ package org.utbot.cpp.clion.plugin.actions import com.intellij.icons.AllIcons -import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.components.service import org.utbot.cpp.clion.plugin.ui.utbotToolWindow.targetToolWindow.UTBotTargetsController @@ -16,4 +15,4 @@ class RefreshTargetsAction: UTBotBaseAction() { e.presentation.isEnabledAndVisible = e.project != null e.presentation.icon = AllIcons.Actions.Refresh } -} \ No newline at end of file +} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/ShowSettings.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/ShowSettings.kt index bda220897..be74c0fe4 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/ShowSettings.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/ShowSettings.kt @@ -10,4 +10,4 @@ class ShowSettingsAction : DumbAwareAction(UTBot.message("show.settings.text"))/ override fun actionPerformed(e: AnActionEvent) { ShowSettingsUtil.getInstance().showSettingsDialog(e.project, UTBotConfigurable::class.java) } -} \ No newline at end of file +} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/UTBotBaseToggleAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/UTBotBaseToggleAction.kt index f246f70cb..14779931c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/UTBotBaseToggleAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/UTBotBaseToggleAction.kt @@ -20,4 +20,4 @@ abstract class UTBotBaseToggleAction( } abstract fun updateIfEnabled(e: AnActionEvent) -} \ No newline at end of file +} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ConfigureProjectAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ConfigureProjectAction.kt index 1fc4221af..20cbfed83 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ConfigureProjectAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ConfigureProjectAction.kt @@ -13,7 +13,7 @@ class ConfigureProjectAction : UTBotBaseAction(UTBot.message("projectConfigure.c override fun actionPerformed(e: AnActionEvent) = CheckProjectConfigurationRequest( ParamsBuilder(e.activeProject()).buildProjectConfigRequestParams(Testgen.ConfigMode.CHECK), e.activeProject() - ).executeUsingCurrentClient() + ).execute() override fun updateIfEnabled(e: AnActionEvent) { e.presentation.isEnabledAndVisible = e.project != null diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ReconfigureProjectAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ReconfigureProjectAction.kt index 0779d5ef6..af956fc38 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ReconfigureProjectAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ReconfigureProjectAction.kt @@ -4,7 +4,6 @@ import com.intellij.openapi.actionSystem.AnActionEvent import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest import org.utbot.cpp.clion.plugin.actions.UTBotBaseAction -import org.utbot.cpp.clion.plugin.grpc.getProjectConfigGrpcRequest import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject import testsgen.Testgen diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt index fa6f87642..f9554daf0 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt @@ -12,7 +12,7 @@ class GenerateForFolderAction : BaseGenerateTestsAction() { FolderRequest( ParamsBuilder(e.activeProject()).buildFolderRequestParams(e.getFilePathUnsafe()), e.activeProject() - ).executeUsingCurrentClient() + ).execute() override fun isDefined(e: AnActionEvent): Boolean { val project = e.project diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFunctionAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFunctionAction.kt index ce258f637..363e069f6 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFunctionAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFunctionAction.kt @@ -9,12 +9,12 @@ import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe import org.utbot.cpp.clion.plugin.utils.getLineNumberUnsafe class GenerateForFunctionAction : BaseGenerateTestsAction() { - override fun actionPerformed(e: AnActionEvent) { FunctionRequest( ParamsBuilder(e.activeProject()).buildFunctionRequestParams(e.getFilePathUnsafe(), e.getLineNumberUnsafe()), e.activeProject() ).execute() + } override fun isDefined(e: AnActionEvent): Boolean { val project = e.project diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForLineAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForLineAction.kt index 5f2c82924..565f3522e 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForLineAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForLineAction.kt @@ -15,6 +15,7 @@ class GenerateForLineAction : BaseGenerateTestsAction() { ParamsBuilder(e.activeProject()).buildLineRequestBuilder(lineNumber, filePath), e.activeProject(), ).execute() + } override fun isDefined(e: AnActionEvent): Boolean { val project = e.project diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/mark/BaseSourceFolderAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/mark/BaseSourceFolderAction.kt index ad2f2f756..91174182b 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/mark/BaseSourceFolderAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/mark/BaseSourceFolderAction.kt @@ -9,4 +9,4 @@ abstract class BaseSourceFolderAction: UTBotBaseAction() { override fun updateIfEnabled(e: AnActionEvent) { e.presentation.isEnabledAndVisible = e.getData(ProxyProjectViewTree.UTBOT_DIRS) != null } -} \ No newline at end of file +} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt index 5e5e4d21d..5328edad4 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt @@ -1,7 +1,7 @@ package org.utbot.cpp.clion.plugin.client import com.intellij.openapi.Disposable -import com.intellij.util.messages.MessageBus +import com.intellij.openapi.project.Project import io.grpc.Status import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.CoroutineName @@ -26,7 +26,6 @@ import org.utbot.cpp.clion.plugin.client.logger.ClientLogger import org.utbot.cpp.clion.plugin.listeners.ConnectionStatus import org.utbot.cpp.clion.plugin.listeners.UTBotEventsListener import org.utbot.cpp.clion.plugin.settings.projectIndependentSettings -import org.utbot.cpp.clion.plugin.utils.logger import org.utbot.cpp.clion.plugin.utils.notifyError import org.utbot.cpp.clion.plugin.utils.notifyInfo import org.utbot.cpp.clion.plugin.utils.notifyNotConnected @@ -40,12 +39,13 @@ class Client( clientId: String, private val logger: ClientLogger, private val loggingChannels: List, - private val messageBus: MessageBus + private val project: Project ) : Disposable, GrpcClient(projectIndependentSettings.port, projectIndependentSettings.serverName, clientId) { var connectionStatus = ConnectionStatus.INIT private set + private val messageBus = project.messageBus private var newClient = true var isDisposed = false private set diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/ManagedClient.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/ManagedClient.kt index 31e17a856..6f8cf7db2 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/ManagedClient.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/ManagedClient.kt @@ -12,7 +12,7 @@ import kotlinx.coroutines.Job import org.jetbrains.annotations.TestOnly import org.utbot.cpp.clion.plugin.client.Client.Companion.SERVER_TIMEOUT import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest -import org.utbot.cpp.clion.plugin.grpc.getProjectConfigGrpcRequest +import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.listeners.ConnectionSettingsListener import org.utbot.cpp.clion.plugin.listeners.ConnectionStatus import org.utbot.cpp.clion.plugin.listeners.PluginActivationListener @@ -76,7 +76,7 @@ class ManagedClient(val project: Project) : Disposable { fun configureProject() { CheckProjectConfigurationRequest( - getProjectConfigGrpcRequest(project, Testgen.ConfigMode.CHECK), + ParamsBuilder(project).buildProjectConfigRequestParams(Testgen.ConfigMode.CHECK), project, ).also { request -> client?.executeRequestIfNotDisposed(request) @@ -88,7 +88,7 @@ class ManagedClient(val project: Project) : Disposable { client = null } - private fun createNewClient(): Client = Client(clientId, project.logger, loggingChannels, project.messageBus) + private fun createNewClient(): Client = Client(clientId, project.logger, loggingChannels, project) private fun generateClientID(): String { fun createRandomSequence() = (1..RANDOM_SEQUENCE_LENGTH) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt index 1fa9a106a..298727231 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt @@ -15,7 +15,6 @@ import org.utbot.cpp.clion.plugin.utils.logger import org.utbot.cpp.clion.plugin.utils.notifyError import org.utbot.cpp.clion.plugin.utils.notifyInfo import org.utbot.cpp.clion.plugin.utils.notifyUnknownResponse -import org.utbot.cpp.clion.plugin.utils.notifyWarning import org.utbot.cpp.clion.plugin.utils.markDirtyAndRefresh import testsgen.Testgen @@ -95,9 +94,7 @@ class CreateBuildDirHandler( ParamsBuilder(project).buildProjectConfigRequestParams(Testgen.ConfigMode.CHECK), project ).also { - if (!client.isDisposed) { - client.execute(it) - } + client.executeRequest(it) } } Testgen.ProjectConfigStatus.BUILD_DIR_CREATION_FAILED -> { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt index 2a2e106d4..a97e8eef4 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt @@ -5,8 +5,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.cancellable import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onCompletion -import org.utbot.cpp.clion.plugin.utils.notifyError -import java.util.concurrent.CancellationException /** * Base class for handling stream of server responses diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt index f402c1ae3..04b2697f7 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt @@ -3,6 +3,7 @@ package org.utbot.cpp.clion.plugin.client.handlers import com.intellij.openapi.components.service import com.intellij.openapi.project.Project import com.intellij.util.io.exists +import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.settings.settings @@ -58,6 +59,15 @@ class TestsStreamHandler( markDirtyAndRefresh(project.nioPath) } + override fun onCompletion(exception: Throwable?) { + if (exception != null ) { + if (exception !is CancellationException) + onError(exception) + } else { + onSuccess(myGeneratedTestFilesLocalFS) + } + } + private fun handleSarifReport(sarif: SourceCode) { backupPreviousClientSarifReport(sarif.localPath) createSourceCodeFiles(listOf(sarif), "sarif report") diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt index 204b4cacd..979428efb 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt @@ -6,7 +6,7 @@ import org.utbot.cpp.clion.plugin.client.Request import org.utbot.cpp.clion.plugin.grpc.Params import org.utbot.cpp.clion.plugin.grpc.RemoteMapping import org.utbot.cpp.clion.plugin.settings.settings -import org.utbot.cpp.clion.plugin.utils.getCurrentClient +import org.utbot.cpp.clion.plugin.utils.client import org.utbot.cpp.clion.plugin.utils.logger import org.utbot.cpp.clion.plugin.utils.path import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt index 470b14fce..e7cd7c508 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt @@ -6,7 +6,6 @@ import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.handlers.CheckProjectConfigurationHandler import org.utbot.cpp.clion.plugin.grpc.Params -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt index fcbd23937..af0591aa1 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt @@ -1,18 +1,12 @@ package org.utbot.cpp.clion.plugin.client.requests -import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.ManagedClient -import org.utbot.cpp.clion.plugin.grpc.getProjectConfigGrpcRequest import org.utbot.cpp.clion.plugin.client.handlers.CreateBuildDirHandler import org.utbot.cpp.clion.plugin.grpc.Params -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder -import org.utbot.cpp.clion.plugin.utils.getCurrentClient -import org.utbot.cpp.clion.plugin.utils.activeProject -import org.utbot.cpp.clion.plugin.utils.client import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/coverage/UTBotCoverageRunner.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/coverage/UTBotCoverageRunner.kt index 65813c612..87ea48076 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/coverage/UTBotCoverageRunner.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/coverage/UTBotCoverageRunner.kt @@ -12,7 +12,6 @@ import java.io.File import java.nio.charset.StandardCharsets import java.nio.file.Files import java.nio.file.Path -import java.nio.file.Paths /** * This class is used to convert from our representation of coverage to IntelliJ's [ProjectData] diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt index caf403a12..4915aec92 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt @@ -1,9 +1,7 @@ package org.utbot.cpp.clion.plugin.grpc -import com.intellij.openapi.actionSystem.AnActionEvent import org.apache.commons.io.FilenameUtils import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.utils.notifyError import java.nio.file.InvalidPathException import java.nio.file.Paths diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt index 381eb56aa..08eaf0d16 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt @@ -2,11 +2,9 @@ package org.utbot.cpp.clion.plugin.grpc import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement -import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.settings.settings import org.utbot.cpp.clion.plugin.ui.testsResults.TestNameAndTestSuite import org.utbot.cpp.clion.plugin.utils.localPath -import org.utbot.cpp.clion.plugin.utils.notifyError import org.utbot.cpp.clion.plugin.utils.path import testsgen.Testgen import testsgen.Util @@ -21,7 +19,7 @@ class ParamsBuilder( return ProjectContextParams( project.name, project.path, - project.settings.storedSettings.testsDirRelativePath, + project.settings.storedSettings.testDirRelativePath, project.settings.storedSettings.buildDirRelativePath ) } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotAllProjectSettings.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotAllProjectSettings.kt index e71c2a56e..657dbb025 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotAllProjectSettings.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotAllProjectSettings.kt @@ -40,14 +40,14 @@ class UTBotAllProjectSettings(val project: Project) { val testsDirPath: Path get() { try { - return Paths.get(project.path).resolve(storedSettings.testsDirRelativePath) + return Paths.get(project.path).resolve(storedSettings.testDirRelativePath) } catch (e: InvalidPathException) { throw IllegalPathException( - storedSettings.testsDirRelativePath, + storedSettings.testDirRelativePath, UTBot.message( "paths.invalid", "relative path to tests dir", - storedSettings.testsDirRelativePath + storedSettings.testDirRelativePath ) ) } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/sourceFoldersView/ProxyProjectViewTree.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/sourceFoldersView/ProxyProjectViewTree.kt index a0baff8c1..53e705c9c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/sourceFoldersView/ProxyProjectViewTree.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/sourceFoldersView/ProxyProjectViewTree.kt @@ -5,8 +5,6 @@ import com.intellij.openapi.actionSystem.DataKey import com.intellij.openapi.actionSystem.DataProvider import com.intellij.openapi.project.Project import org.utbot.cpp.clion.plugin.settings.settings -import java.awt.event.MouseAdapter -import java.awt.event.MouseEvent import javax.swing.tree.DefaultTreeModel import org.utbot.cpp.clion.plugin.listeners.SourceFoldersListener diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/testsResults/UTBotTestRunLineMarkerProvider.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/testsResults/UTBotTestRunLineMarkerProvider.kt index 287016953..b7a3447e8 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/testsResults/UTBotTestRunLineMarkerProvider.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/testsResults/UTBotTestRunLineMarkerProvider.kt @@ -15,7 +15,6 @@ import org.utbot.cpp.clion.plugin.grpc.IllegalPathException import org.utbot.cpp.clion.plugin.settings.settings import org.utbot.cpp.clion.plugin.ui.services.TestsResultsStorage import org.utbot.cpp.clion.plugin.utils.localPath -import org.utbot.cpp.clion.plugin.utils.logger import testsgen.Testgen class UTBotTestRunLineMarkerProvider : LineMarkerProvider { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotWizard.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotWizard.kt index 227c1d15f..747e1aeef 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotWizard.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotWizard.kt @@ -17,7 +17,7 @@ import java.awt.event.KeyEvent class UTBotWizard(private val project: Project) : AbstractWizard("UTBot: Quickstart", project) { // copy of settings to make changes during wizard steps private val mySettingsModel = - UTBotSettingsModel(project.settings.storedSettings.copy(), projectIndependentSettings.copy()) + UTBotSettingsModel(project.settings.storedSettings.state.copy(), projectIndependentSettings.copy()) init { addStep(IntroStep(disposable)) From 157554f63ebf7060ee57f1a9521cb7425d8d42bd Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Tue, 4 Oct 2022 16:53:14 +0300 Subject: [PATCH 11/24] remove unused code & fix some styles issues --- .../utbot/cpp/clion/plugin/client/Client.kt | 13 ------------ .../plugin/client/handlers/StreamHandler.kt | 2 +- .../plugin/coverage/UTBotCoverageEngine.kt | 3 --- .../plugin/coverage/UTBotCoverageSuite.kt | 4 ++-- .../org/utbot/cpp/clion/plugin/grpc/Params.kt | 2 +- .../cpp/clion/plugin/grpc/ParamsBuilder.kt | 6 +++--- .../utbot/cpp/clion/plugin/grpc/ParamsImpl.kt | 10 +++++----- .../settings/UTBotAllProjectSettings.kt | 14 ------------- .../plugin/settings/UTBotConfigurable.kt | 4 ++-- .../ui/userLog/ConsoleToolWindowProvider.kt | 20 ------------------- .../plugin/ui/wizard/UTBotBaseWizardStep.kt | 1 - .../main/resources/messages/UTBot.properties | 11 ++-------- 12 files changed, 16 insertions(+), 74 deletions(-) delete mode 100644 clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/userLog/ConsoleToolWindowProvider.kt diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt index 5328edad4..89055c03c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt @@ -19,9 +19,7 @@ import kotlinx.coroutines.withTimeout import org.jetbrains.annotations.TestOnly import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.channels.LogChannel -import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest import org.utbot.cpp.clion.plugin.grpc.IllegalPathException -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.client.logger.ClientLogger import org.utbot.cpp.clion.plugin.listeners.ConnectionStatus import org.utbot.cpp.clion.plugin.listeners.UTBotEventsListener @@ -141,17 +139,6 @@ class Client( } } - fun configureProject() { - CheckProjectConfigurationRequest( - ParamsBuilder(project).buildProjectConfigRequestParams(Testgen.ConfigMode.CHECK), - project, - ).also { - this.executeRequestIfNotDisposed(it) - } - } - - fun isServerAvailable() = connectionStatus == ConnectionStatus.CONNECTED - private fun provideLoggingChannels() { for (channel in loggingChannels) { servicesCS.launch(CoroutineName(channel.toString())) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt index a97e8eef4..659c5d3d2 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt @@ -11,7 +11,7 @@ import kotlinx.coroutines.flow.onCompletion */ abstract class StreamHandler( val project: Project, - val grpcStream: Flow, + private val grpcStream: Flow, ) : Handler { val logger = com.intellij.openapi.diagnostic.Logger.getInstance(this::class.java) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/coverage/UTBotCoverageEngine.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/coverage/UTBotCoverageEngine.kt index d485686e4..30dbe97de 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/coverage/UTBotCoverageEngine.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/coverage/UTBotCoverageEngine.kt @@ -10,7 +10,6 @@ import com.intellij.coverage.SimpleCoverageAnnotator import com.intellij.execution.configurations.RunConfigurationBase import com.intellij.execution.configurations.coverage.CoverageEnabledConfiguration import com.intellij.execution.testframework.AbstractTestProxy -import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement @@ -25,8 +24,6 @@ import java.io.File * for additional docs @see [CoverageEngine] in IntelliJ Platform source code */ class UTBotCoverageEngine : CoverageEngine() { - private val log = Logger.getInstance(this::class.java) - /** * This method is not called, when the coverage is processed in CoverageDataManager#coverageGathered(suite). * diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/coverage/UTBotCoverageSuite.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/coverage/UTBotCoverageSuite.kt index dd48157f9..f8eeb00c1 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/coverage/UTBotCoverageSuite.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/coverage/UTBotCoverageSuite.kt @@ -35,8 +35,8 @@ class UTBotCoverageSuite( coverageRunner, project ) { - val covEngine = coverageEngine - val covRunner = coverageRunner + private val covEngine = coverageEngine + private val covRunner = coverageRunner val coveragesList: List? = covLists override fun getCoverageEngine(): CoverageEngine { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt index 4915aec92..e757afbd4 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt @@ -29,7 +29,7 @@ data class RemoteMapping(val localProjectPath: String, val remoteProjectPath: St return FilenameUtils.separatorsToUnix(remoteProjectNioPath.resolve(relativeToProjectNioPath).toString()) } - fun shouldConvert(): Boolean = localProjectPath != remoteProjectPath + private fun shouldConvert(): Boolean = localProjectPath != remoteProjectPath } /** diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt index 08eaf0d16..af4bbb28f 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt @@ -15,7 +15,7 @@ import testsgen.Util class ParamsBuilder( val project: Project ) { - fun buildProjectContextParams(): Params { + private fun buildProjectContextParams(): Params { return ProjectContextParams( project.name, project.path, @@ -24,7 +24,7 @@ class ParamsBuilder( ) } - fun buildSettingsContextParams(): Params { + private fun buildSettingsContextParams(): Params { return project.settings.storedSettings.let { SettingsContextParams( it.generateForStaticFunctions, @@ -101,7 +101,7 @@ class ParamsBuilder( ) } - fun buildTestFilterParams(element: PsiElement): Params { + private fun buildTestFilterParams(element: PsiElement): Params { val (testName: String, testSuite: String) = TestNameAndTestSuite.create(element) val testFilePath = element.containingFile.virtualFile.localPath.toString() return TestFilterParams( diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt index d8db6d608..960ed645a 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt @@ -211,7 +211,7 @@ internal data class ClassRequestParams( } } -internal class AssertionRequestParams(val lineRequestParams: LineRequestParams) : Params { +internal class AssertionRequestParams(private val lineRequestParams: LineRequestParams) : Params { override fun build(remoteMapping: RemoteMapping): Testgen.AssertionRequest { return Testgen.AssertionRequest.newBuilder() .setLineRequest(lineRequestParams.build(remoteMapping)) @@ -234,8 +234,8 @@ internal data class PredicateInfoParams( } internal class PredicateRequestParams( - val lineRequestParams: LineRequestParams, - val predicateInfoParams: PredicateInfoParams + private val lineRequestParams: LineRequestParams, + private val predicateInfoParams: PredicateInfoParams ) : Params { override fun build(remoteMapping: RemoteMapping): Testgen.PredicateRequest { return Testgen.PredicateRequest.newBuilder() @@ -246,8 +246,8 @@ internal class PredicateRequestParams( } internal class SnippetRequestParams( - val projectContextParams: ProjectContextParams, - val settingsContextParams: SettingsContextParams, + private val projectContextParams: ProjectContextParams, + private val settingsContextParams: SettingsContextParams, val filePath: String ) : Params { override fun build(remoteMapping: RemoteMapping): Testgen.SnippetRequest { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotAllProjectSettings.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotAllProjectSettings.kt index 657dbb025..f348a000c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotAllProjectSettings.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotAllProjectSettings.kt @@ -53,18 +53,6 @@ class UTBotAllProjectSettings(val project: Project) { } } - val convertedSourcePaths: List - get() = storedSettings.sourceDirs.map { it.convertToRemotePathIfNeeded(project) } - - val convertedTestDirPath: String - get() = testsDirPath.toString().convertToRemotePathIfNeeded(project) - - val convertedTargetPath: String - get() = if (storedSettings.targetPath == UTBotTarget.autoTarget.path) storedSettings.targetPath - else storedSettings.targetPath.convertToRemotePathIfNeeded(project) - - val convertedProjectPath: String get() = project.path.convertToRemotePathIfNeeded(project) - /** * If this property returns true, plugin must convert path sent and returned from server. * @see [String.convertToRemotePathIfNeeded] and [String.convertFromRemotePathIfNeeded] @@ -93,8 +81,6 @@ class UTBotAllProjectSettings(val project: Project) { } fun predictPaths() { - fun getSourceFoldersFromSources(sources: Collection) = sources.map { it.parent }.toMutableSet() - storedSettings.remotePath = UTBotProjectStoredSettings.REMOTE_PATH_VALUE_FOR_LOCAL_SCENARIO storedSettings.buildDirRelativePath = UTBotProjectStoredSettings.DEFAULT_RELATIVE_PATH_TO_BUILD_DIR storedSettings.targetPath = UTBotTarget.autoTarget.path diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotConfigurable.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotConfigurable.kt index 52c5235ff..e930aa2cf 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotConfigurable.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotConfigurable.kt @@ -108,7 +108,7 @@ class UTBotConfigurable(private val myProject: Project) : BoundConfigurable( ).bindIntValue(projectIndependentSettings::port).applyToComponent { portComponent = this } - }.rowComment(UTBot.message("deployment.utbotPort.description")) + }.rowComment(UTBot.message("deployment.utbot.port.description")) row(UTBot.message("settings.project.serverName")) { textField().bindText(projectIndependentSettings::serverName).applyToComponent { @@ -118,7 +118,7 @@ class UTBotConfigurable(private val myProject: Project) : BoundConfigurable( UTBot.message("validation.invalid.host") ) { it.text.isValidHostName() } ) - }.rowComment(UTBot.message("deployment.utbotHost.description")) + }.rowComment(UTBot.message("deployment.utbot.host.description")) row(UTBot.message("settings.project.remotePath")) { textField().bindText(settings::remotePath).columns(COLUMNS_LARGE).validateInput( diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/userLog/ConsoleToolWindowProvider.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/userLog/ConsoleToolWindowProvider.kt deleted file mode 100644 index fa10c490a..000000000 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/userLog/ConsoleToolWindowProvider.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.utbot.cpp.clion.plugin.ui.userLog - -import com.intellij.openapi.diagnostic.Logger -import com.intellij.openapi.project.Project -import com.intellij.openapi.wm.ToolWindow -import com.intellij.openapi.wm.ToolWindowFactory -import org.utbot.cpp.clion.plugin.ui.utbotToolWindow.logsToolWindow.ConsoleToolWindow - -class ConsoleToolWindowProvider : ToolWindowFactory { - private val logger = Logger.getInstance(this::class.java) - - override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) { - logger.debug("createToolWindowContent was called") - - val contentManager = toolWindow.contentManager - val content = - contentManager.factory.createContent(ConsoleToolWindow(project), null, false) - contentManager.addContent(content) - } -} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotBaseWizardStep.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotBaseWizardStep.kt index b4b997edc..def619fc6 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotBaseWizardStep.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/wizard/UTBotBaseWizardStep.kt @@ -24,7 +24,6 @@ abstract class UTBotBaseWizardStep(private val parentDisposable: Disposable) : S private var isInitialized = false private val validators = mutableListOf() private val onApplyCallbacks = mutableListOf<() -> Unit>() - class Validator(val component: JComponent, val isValid: ()->Boolean) abstract fun createUI() override fun _init() { diff --git a/clion-plugin/src/main/resources/messages/UTBot.properties b/clion-plugin/src/main/resources/messages/UTBot.properties index 8bc970ef0..83a6e30f4 100644 --- a/clion-plugin/src/main/resources/messages/UTBot.properties +++ b/clion-plugin/src/main/resources/messages/UTBot.properties @@ -1,4 +1,3 @@ -name=UTBot plugin projectConfigure.configure=Configure Project projectConfigure.generate.buildDir=Generate build directory projectConfigure.generate.json=Generate Missing JSON Files @@ -6,13 +5,10 @@ projectConfigure.reconfigure=Reset cache and configure project wizard.show=Quickstart wizard settings.project.sourcePaths=Source paths settings.project.buildDir=Build directory: -settings.project.error.empty.field=Must not be empty settings.project.target=target path: settings.project.target.wrong.conversion=Possibly wrong target path. Could not create relative path from remote path settings.project.testsDir=Tests directory: settings.project.testsDir.wrong=Wrong relative path to tests directory -settings.project.buildDir.browse.title=Choose build directory -settings.project.target.browse.title=Choose target settings.project.sourcePaths.wrong.conversion=Possibly wrong source path. Could not create relative path from remote path or this path settings.project.remotePath=Path to project on remote machine settings.project.remotePath.wrong=Bad remote path @@ -35,8 +31,8 @@ requests.check.description.progress=Checking project configuration... requests.json.description.progress=Generating json files... requests.buildDir.description.progress=Creating build directory... uri.wiki=https://github.com/UnitTestBot/UTBotCpp/wiki -deployment.utbotHost.description=UTBot Server host address. Learn more -deployment.utbotPort.description=UTBot Server port. Learn more +deployment.utbot.host.description=UTBot Server host address. Learn more +deployment.utbot.port.description=UTBot Server port. Learn more deployment.remotePath.description=Remote path configuration specifies the path to the project on a remote host. Empty value specifies local scenario (for Linux). Learn more paths.buildDirectory.description=Relative path to build directory with compile_commands.json and/or coverage.json. Learn more paths.target.description=Path to target which is passed to UTBot. You can select targets in UTBot targets tool window @@ -60,7 +56,6 @@ actions.enable.menu.enabled=Enabled actions.enable.menu.disabled=Enable actions.enable.enabled=UTBot: Plugin Enabled actions.enable.disabled=UTBot: Enable Plugin -warning.reconnecting=Reconnecting to server! Request won't be executed! Please try again, later. notify.warning.reconnecting=Reconnecting to server! Request won't be executed! Please try again, later. notify.warning.reconnecting.title=UTBot: Reconnecting folderPath.wrong.conversion=Could not create relative path from remote path to folder path! Review your remote path in settings \ @@ -118,8 +113,6 @@ show.settings.text=Go to Settings validation.not.empty=Please fill in this field validation.not.unix.path=This path must be an absolute unix path! validation.invalid.host=Invalid host name -coverageAndResults.creation.failure=Could not create request for coverage and results from current context. Please see \ - the docs on how to run tests with coverage. toolwindow.targets.displayName=Targets toolwindow.logs.displayName=Logs actions.verbose.menu.enabled=Verbose Mode: On From 339183a082d4e7f3f260ff3feab2d4d9a3837d34 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Tue, 4 Oct 2022 18:22:45 +0300 Subject: [PATCH 12/24] fix targetPath conversion to remote version --- .../org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt | 15 +++++++++------ .../targetToolWindow/UTBotTarget.kt | 2 ++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt index 960ed645a..9ac87eba5 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt @@ -1,6 +1,7 @@ package org.utbot.cpp.clion.plugin.grpc import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.ui.utbotToolWindow.targetToolWindow.UTBotTarget import testsgen.Testgen import testsgen.Util import java.nio.file.InvalidPathException @@ -70,13 +71,15 @@ internal data class ProjectRequestParams( UTBot.message("settings.project.sourcePaths.wrong.conversion") ) }) - .setTargetPath( - remoteMapping.convertToRemote( - targetPath, - UTBot.message("settings.project.target.wrong.conversion") - ) - ) .setSynchronizeCode(synchronizeCode) + .also { builder -> + if (!UTBotTarget.isAutoTargetPath(targetPath)) { + builder.targetPath = remoteMapping.convertToRemote( + targetPath, + UTBot.message("settings.project.target.wrong.conversion") + ) + } + } .build() } } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTarget.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTarget.kt index 585ceca1f..b3861d4bd 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTarget.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTarget.kt @@ -21,5 +21,7 @@ data class UTBotTarget(val path: String, val name: String, val description: Stri name = "UTBot: auto", description = "Finds any target that contains the code under test" ) + + fun isAutoTargetPath(path: String): Boolean = autoTarget.path == path } } From 1a88baf14e9c8e4d9dac744eb13add7dd257bd2b Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Wed, 5 Oct 2022 15:23:45 +0300 Subject: [PATCH 13/24] fix remote mapping --- .../utbot/cpp/clion/plugin/client/requests/BaseRequest.kt | 3 ++- .../clion/plugin/client/requests/test/BaseTestsRequest.kt | 8 -------- .../main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt | 6 ++---- .../kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt | 3 ++- 4 files changed, 6 insertions(+), 14 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt index 979428efb..88c2287c5 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt @@ -22,7 +22,8 @@ abstract class BaseRequest(val params: Params, val project: Project) : override fun toString(): String = logMessage open fun build(): X { - val mapping = RemoteMapping(project.path, project.settings.storedSettings.remotePath) + val mapping = + RemoteMapping(project.path, project.settings.storedSettings.remotePath, project.settings.isRemoteScenario) return params.build(mapping) } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt index 296990c30..ff9ff233a 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt @@ -8,14 +8,11 @@ import org.utbot.cpp.clion.plugin.actions.FocusAction import org.utbot.cpp.clion.plugin.client.handlers.TestsStreamHandler import org.utbot.cpp.clion.plugin.client.requests.BaseRequest import org.utbot.cpp.clion.plugin.grpc.Params -import org.utbot.cpp.clion.plugin.grpc.RemoteMapping -import org.utbot.cpp.clion.plugin.settings.settings import org.utbot.cpp.clion.plugin.utils.getLongestCommonPathFromRoot import org.utbot.cpp.clion.plugin.utils.isHeaderFile import org.utbot.cpp.clion.plugin.utils.isSarifReport import org.utbot.cpp.clion.plugin.utils.logger import org.utbot.cpp.clion.plugin.utils.notifyInfo -import org.utbot.cpp.clion.plugin.utils.path import testsgen.Testgen import java.nio.file.Path @@ -26,11 +23,6 @@ import java.nio.file.Path abstract class BaseTestsRequest(params: Params, project: Project, private val progressName: String) : BaseRequest>(params, project) { val logger = project.logger - override fun build(): R { - val mapping = RemoteMapping(project.path, project.settings.storedSettings.remotePath) - return params.build(mapping) - } - override suspend fun Flow.handle(cancellationJob: Job?) { if (cancellationJob?.isActive == true) { TestsStreamHandler( diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt index e757afbd4..34d300540 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt @@ -11,9 +11,9 @@ class IllegalPathException(val path: String, val info: String) : ClientException("Bad path: $path. Info: $info") -data class RemoteMapping(val localProjectPath: String, val remoteProjectPath: String) { +data class RemoteMapping(val localProjectPath: String, val remoteProjectPath: String, val shouldConvert: Boolean = true) { fun convertToRemote(path: String, errorText: String): String { - if (!shouldConvert()) + if (!shouldConvert) return path val localProjectNioPath = Paths.get(localProjectPath) val remoteProjectNioPath = try { @@ -28,8 +28,6 @@ data class RemoteMapping(val localProjectPath: String, val remoteProjectPath: St } return FilenameUtils.separatorsToUnix(remoteProjectNioPath.resolve(relativeToProjectNioPath).toString()) } - - private fun shouldConvert(): Boolean = localProjectPath != remoteProjectPath } /** diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt index 9ac87eba5..e33081051 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt @@ -214,7 +214,8 @@ internal data class ClassRequestParams( } } -internal class AssertionRequestParams(private val lineRequestParams: LineRequestParams) : Params { +internal class AssertionRequestParams(private val lineRequestParams: LineRequestParams) : + Params { override fun build(remoteMapping: RemoteMapping): Testgen.AssertionRequest { return Testgen.AssertionRequest.newBuilder() .setLineRequest(lineRequestParams.build(remoteMapping)) From c7ebe1b4ec5ba204a87024960eb90fddb1f75f2c Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Fri, 7 Oct 2022 16:24:06 +0300 Subject: [PATCH 14/24] add some tests for building grpc requests --- clion-plugin/build.gradle.kts | 2 + .../actions/AskServerToGenerateBuildDir.kt | 4 +- .../configure/ConfigureProjectAction.kt | 4 +- .../configure/ReconfigureProjectAction.kt | 4 +- .../generate/GenerateForAssertionAction.kt | 4 +- .../generate/GenerateForClassAction.kt | 4 +- .../actions/generate/GenerateForFileAction.kt | 5 +- .../generate/GenerateForFolderAction.kt | 4 +- .../generate/GenerateForFunctionAction.kt | 4 +- .../actions/generate/GenerateForLineAction.kt | 7 +- .../generate/GenerateForPredicateAction.kt | 6 +- .../generate/GenerateForProjectAction.kt | 4 +- .../generate/GenerateForSnippetAction.kt | 4 +- .../generate/RunAllTestsWithCoverageAction.kt | 4 +- .../actions/generate/RunWithCoverageAction.kt | 4 +- .../cpp/clion/plugin/client/ManagedClient.kt | 4 +- .../handlers/ProjectConfigurationHandler.kt | 4 +- .../plugin/client/requests/BaseRequest.kt | 9 +- .../CheckProjectConfigurationRequest.kt | 4 +- .../requests/CreateBuildFolderRequest.kt | 4 +- .../requests/GenerateJsonFilesRequest.kt | 8 +- .../client/requests/ProjectTargetsRequest.kt | 4 +- .../RunAllTestsWithCoverageRequest.kt | 4 +- .../client/requests/RunWithCoverageRequest.kt | 4 +- .../client/requests/test/AssertionRequest.kt | 4 +- .../client/requests/test/BaseTestsRequest.kt | 4 +- .../client/requests/test/ClassRequest.kt | 4 +- .../client/requests/test/FileRequest.kt | 4 +- .../client/requests/test/FolderRequest.kt | 4 +- .../client/requests/test/FunctionRequest.kt | 4 +- .../test/FunctionReturnTypeRequest.kt | 4 +- .../client/requests/test/LineRequest.kt | 4 +- .../client/requests/test/PredicateRequest.kt | 4 +- .../client/requests/test/ProjectRequest.kt | 4 +- .../client/requests/test/SnippetRequest.kt | 4 +- .../grpc/{Params.kt => GrpcRequestBuilder.kt} | 9 +- .../plugin/grpc/GrpcRequestBuilderFactory.kt | 144 ++++++++++++++++++ ...ramsImpl.kt => GrpcRequestBuildersImpl.kt} | 123 +++++++-------- .../cpp/clion/plugin/grpc/ParamsBuilder.kt | 144 ------------------ .../UTBotTargetsController.kt | 4 +- .../cpp/clion/plugin/utils/ActionUtils.kt | 17 ++- .../cpp/clion/plugin/TestFixtureProxy.kt | 23 +++ .../org/utbot/cpp/clion/plugin/TestUtil.kt | 40 ++++- .../buildingRequestsTests/BaseBuildingTest.kt | 86 +++++++++++ .../FileRequestBuildingTest.kt | 45 ++++++ .../LineRequestBuildingTest.kt | 56 +++++++ .../ProjectRequestBuildingTest.kt | 37 +++++ .../BaseGenerationTestCase.kt | 66 ++------ .../integrationTests}/CppCompiler.kt | 3 +- .../GenerateForFileTest.kt | 7 +- .../GenerateForIsolatedFileTest.kt | 9 +- .../GenerateForLineTest.kt | 21 +-- .../GenerateForProjectTest.kt | 10 +- .../tests/utilsTests/ToWslFormatTest.kt | 1 - 54 files changed, 625 insertions(+), 373 deletions(-) rename clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/{Params.kt => GrpcRequestBuilder.kt} (79%) create mode 100644 clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilderFactory.kt rename clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/{ParamsImpl.kt => GrpcRequestBuildersImpl.kt} (67%) delete mode 100644 clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt create mode 100644 clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/TestFixtureProxy.kt create mode 100644 clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/BaseBuildingTest.kt create mode 100644 clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/FileRequestBuildingTest.kt create mode 100644 clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/LineRequestBuildingTest.kt create mode 100644 clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/ProjectRequestBuildingTest.kt rename clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/{ => tests/integrationTests}/BaseGenerationTestCase.kt (70%) rename clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/{ => tests/integrationTests}/CppCompiler.kt (93%) rename clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/{ => integrationTests}/GenerateForFileTest.kt (88%) rename clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/{ => integrationTests}/GenerateForIsolatedFileTest.kt (81%) rename clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/{ => integrationTests}/GenerateForLineTest.kt (75%) rename clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/{ => integrationTests}/GenerateForProjectTest.kt (83%) diff --git a/clion-plugin/build.gradle.kts b/clion-plugin/build.gradle.kts index ab99c9bf8..86d6ba54e 100644 --- a/clion-plugin/build.gradle.kts +++ b/clion-plugin/build.gradle.kts @@ -76,6 +76,8 @@ dependencies { // testing with JUnit 5 testImplementation(platform("org.junit:junit-bom:5.8.2")) testImplementation("org.junit.jupiter:junit-jupiter") + testImplementation("org.mockito.kotlin:mockito-kotlin:4.0.0") + testImplementation("io.mockk:mockk:1.13.2") } sourceSets { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/AskServerToGenerateBuildDir.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/AskServerToGenerateBuildDir.kt index 8d19d3083..c5a6dd947 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/AskServerToGenerateBuildDir.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/AskServerToGenerateBuildDir.kt @@ -3,7 +3,7 @@ package org.utbot.cpp.clion.plugin.actions import com.intellij.openapi.actionSystem.AnActionEvent import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.requests.CreateBuildDirRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.client import testsgen.Testgen @@ -11,7 +11,7 @@ import testsgen.Testgen class AskServerToGenerateBuildDir : UTBotBaseAction(UTBot.message("projectConfigure.generate.buildDir")) { override fun actionPerformed(e: AnActionEvent) = CreateBuildDirRequest( - ParamsBuilder(e.activeProject()).buildProjectConfigRequestParams(Testgen.ConfigMode.CREATE_BUILD_DIR), + GrpcRequestBuilderFactory(e.activeProject()).createProjectConfigRequestBuilder(Testgen.ConfigMode.CREATE_BUILD_DIR), e.activeProject(), e.activeProject().client ).execute() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ConfigureProjectAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ConfigureProjectAction.kt index 20cbfed83..d40d03fff 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ConfigureProjectAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ConfigureProjectAction.kt @@ -4,14 +4,14 @@ import com.intellij.openapi.actionSystem.AnActionEvent import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.actions.UTBotBaseAction import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject import testsgen.Testgen class ConfigureProjectAction : UTBotBaseAction(UTBot.message("projectConfigure.configure")) { override fun actionPerformed(e: AnActionEvent) = CheckProjectConfigurationRequest( - ParamsBuilder(e.activeProject()).buildProjectConfigRequestParams(Testgen.ConfigMode.CHECK), + GrpcRequestBuilderFactory(e.activeProject()).createProjectConfigRequestBuilder(Testgen.ConfigMode.CHECK), e.activeProject() ).execute() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ReconfigureProjectAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ReconfigureProjectAction.kt index af956fc38..76230369c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ReconfigureProjectAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/configure/ReconfigureProjectAction.kt @@ -4,7 +4,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest import org.utbot.cpp.clion.plugin.actions.UTBotBaseAction -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject import testsgen.Testgen @@ -13,7 +13,7 @@ class ReconfigureProjectAction: UTBotBaseAction(UTBot.message("projectConfigure. override fun actionPerformed(e: AnActionEvent) { val project = e.activeProject() CheckProjectConfigurationRequest( - ParamsBuilder(project).buildProjectConfigRequestParams(Testgen.ConfigMode.ALL), + GrpcRequestBuilderFactory(project).createProjectConfigRequestBuilder(Testgen.ConfigMode.ALL), project, ).execute() } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForAssertionAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForAssertionAction.kt index b8cff70d6..3ee785f5d 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForAssertionAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForAssertionAction.kt @@ -3,7 +3,7 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.AssertionRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe import org.utbot.cpp.clion.plugin.utils.getLineNumberUnsafe @@ -11,7 +11,7 @@ import org.utbot.cpp.clion.plugin.utils.getLineNumberUnsafe class GenerateForAssertionAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) = AssertionRequest( - ParamsBuilder(e.activeProject()).buildAssertionRequestParams(e.getLineNumberUnsafe(), e.getFilePathUnsafe()), + GrpcRequestBuilderFactory(e.activeProject()).createAssertionRequestBuilder(e.getLineNumberUnsafe(), e.getFilePathUnsafe()), e.activeProject(), ).execute() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForClassAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForClassAction.kt index c46083657..b537e578c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForClassAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForClassAction.kt @@ -3,7 +3,7 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.ClassRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe import org.utbot.cpp.clion.plugin.utils.getLineNumberUnsafe @@ -12,7 +12,7 @@ import org.utbot.cpp.clion.plugin.utils.isCPPFileName class GenerateForClassAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) = ClassRequest( - ParamsBuilder(e.activeProject()).buildClassRequestParams(e.getFilePathUnsafe(), e.getLineNumberUnsafe()), + GrpcRequestBuilderFactory(e.activeProject()).createClassRequestBuilder(e.getFilePathUnsafe(), e.getLineNumberUnsafe()), e.activeProject(), ).execute() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFileAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFileAction.kt index 92d1ed9d4..cae75c646 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFileAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFileAction.kt @@ -3,15 +3,14 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.FileRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject -import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe +import org.utbot.cpp.clion.plugin.utils.getBuilderForFileRequest import org.utbot.cpp.clion.plugin.utils.isCPPorCFileName class GenerateForFileAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) = FileRequest( - ParamsBuilder(e.activeProject()).buildFileRequestParams(e.getFilePathUnsafe()), + e.getBuilderForFileRequest(), e.activeProject(), ).execute() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt index f9554daf0..da0b3c5fb 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFolderAction.kt @@ -3,14 +3,14 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.FolderRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe class GenerateForFolderAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) = FolderRequest( - ParamsBuilder(e.activeProject()).buildFolderRequestParams(e.getFilePathUnsafe()), + GrpcRequestBuilderFactory(e.activeProject()).createFolderRequestBuilder(e.getFilePathUnsafe()), e.activeProject() ).execute() diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFunctionAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFunctionAction.kt index 363e069f6..08701a61f 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFunctionAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForFunctionAction.kt @@ -3,7 +3,7 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.FunctionRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe import org.utbot.cpp.clion.plugin.utils.getLineNumberUnsafe @@ -11,7 +11,7 @@ import org.utbot.cpp.clion.plugin.utils.getLineNumberUnsafe class GenerateForFunctionAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) { FunctionRequest( - ParamsBuilder(e.activeProject()).buildFunctionRequestParams(e.getFilePathUnsafe(), e.getLineNumberUnsafe()), + GrpcRequestBuilderFactory(e.activeProject()).createFunctionRequestBuilder(e.getFilePathUnsafe(), e.getLineNumberUnsafe()), e.activeProject() ).execute() } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForLineAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForLineAction.kt index 565f3522e..5064522e4 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForLineAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForLineAction.kt @@ -3,16 +3,13 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.LineRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder import org.utbot.cpp.clion.plugin.utils.activeProject +import org.utbot.cpp.clion.plugin.utils.getBuilderForLineRequest class GenerateForLineAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) { - val filePath = e.getRequiredData(CommonDataKeys.VIRTUAL_FILE).path - val editor = e.getRequiredData(CommonDataKeys.EDITOR) - val lineNumber = editor.caretModel.logicalPosition.line + 1 LineRequest( - ParamsBuilder(e.activeProject()).buildLineRequestBuilder(lineNumber, filePath), + e.getBuilderForLineRequest(), e.activeProject(), ).execute() } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForPredicateAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForPredicateAction.kt index f0bd8dd36..7f0dba175 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForPredicateAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForPredicateAction.kt @@ -12,7 +12,7 @@ import javax.swing.event.DocumentEvent import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.requests.test.FunctionReturnTypeRequest import org.utbot.cpp.clion.plugin.client.requests.test.PredicateRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.client import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe @@ -48,7 +48,7 @@ class GenerateForPredicateAction : BaseGenerateTestsAction() { // when we gathered all needed information for predicate request, assemble it and execute it. fun sendPredicateToServer(validationType: ValidationType, valueToCompare: String, comparisonOperator: String) = PredicateRequest( - ParamsBuilder(e.activeProject()).buildPredicateRequestParams( + GrpcRequestBuilderFactory(e.activeProject()).createPredicateRequestBuilder( comparisonOperator, validationType, valueToCompare, @@ -111,7 +111,7 @@ class GenerateForPredicateAction : BaseGenerateTestsAction() { } //ask server for return type FunctionReturnTypeRequest( - ParamsBuilder(e.activeProject()).buildFunctionRequestParams(e.getFilePathUnsafe(), e.getLineNumberUnsafe()), + GrpcRequestBuilderFactory(e.activeProject()).createFunctionRequestBuilder(e.getFilePathUnsafe(), e.getLineNumberUnsafe()), e.activeProject(), ) { functionReturnType -> val validationType = functionReturnType.validationType diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForProjectAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForProjectAction.kt index 40bf5c2e4..eb9dd859f 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForProjectAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForProjectAction.kt @@ -2,14 +2,14 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import org.utbot.cpp.clion.plugin.client.requests.test.ProjectRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.client class GenerateForProjectAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) { ProjectRequest( - ParamsBuilder(e.activeProject()).buildProjectRequestParams(), + GrpcRequestBuilderFactory(e.activeProject()).createProjectRequestBuilder(), e.activeProject(), ).apply { e.client.executeRequest(this) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForSnippetAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForSnippetAction.kt index c7837440b..c0dd0e2e1 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForSnippetAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/GenerateForSnippetAction.kt @@ -3,14 +3,14 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys import org.utbot.cpp.clion.plugin.client.requests.test.SnippetRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.getFilePathUnsafe class GenerateForSnippetAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) { SnippetRequest( - ParamsBuilder(e.activeProject()).buildSnippetRequestParams(e.getFilePathUnsafe()), + GrpcRequestBuilderFactory(e.activeProject()).createSnippetRequestBuilder(e.getFilePathUnsafe()), e.activeProject(), ).execute() } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunAllTestsWithCoverageAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunAllTestsWithCoverageAction.kt index 95c460a76..a77066535 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunAllTestsWithCoverageAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunAllTestsWithCoverageAction.kt @@ -2,13 +2,13 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import org.utbot.cpp.clion.plugin.client.requests.RunAllTestsWithCoverageRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject class RunAllTestsWithCoverageAction : BaseGenerateTestsAction() { override fun actionPerformed(e: AnActionEvent) { RunAllTestsWithCoverageRequest( - ParamsBuilder(e.activeProject()).buildCoverageAndResultsRequestParams(null), + GrpcRequestBuilderFactory(e.activeProject()).createCovAndResulstsRequestBuilder(null), e.activeProject() ).execute() } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunWithCoverageAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunWithCoverageAction.kt index 4cd589881..e3be437b3 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunWithCoverageAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/RunWithCoverageAction.kt @@ -5,7 +5,7 @@ import com.intellij.openapi.actionSystem.CommonDataKeys import com.intellij.openapi.diagnostic.Logger import com.intellij.psi.PsiElement import org.utbot.cpp.clion.plugin.client.requests.RunWithCoverageRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject @@ -16,7 +16,7 @@ class RunWithCoverageAction(val element: PsiElement) : BaseGenerateTestsAction() val project = e.activeProject() RunWithCoverageRequest( - ParamsBuilder(project).buildCoverageAndResultsRequestParams(element), + GrpcRequestBuilderFactory(project).createCovAndResulstsRequestBuilder(element), project, ).execute() } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/ManagedClient.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/ManagedClient.kt index 6f8cf7db2..982c703da 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/ManagedClient.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/ManagedClient.kt @@ -12,7 +12,7 @@ import kotlinx.coroutines.Job import org.jetbrains.annotations.TestOnly import org.utbot.cpp.clion.plugin.client.Client.Companion.SERVER_TIMEOUT import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.listeners.ConnectionSettingsListener import org.utbot.cpp.clion.plugin.listeners.ConnectionStatus import org.utbot.cpp.clion.plugin.listeners.PluginActivationListener @@ -76,7 +76,7 @@ class ManagedClient(val project: Project) : Disposable { fun configureProject() { CheckProjectConfigurationRequest( - ParamsBuilder(project).buildProjectConfigRequestParams(Testgen.ConfigMode.CHECK), + GrpcRequestBuilderFactory(project).createProjectConfigRequestBuilder(Testgen.ConfigMode.CHECK), project, ).also { request -> client?.executeRequestIfNotDisposed(request) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt index 298727231..0ed44042c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/ProjectConfigurationHandler.kt @@ -9,7 +9,7 @@ import org.utbot.cpp.clion.plugin.actions.AskServerToGenerateBuildDir import org.utbot.cpp.clion.plugin.actions.AskServerToGenerateJsonForProjectConfiguration import org.utbot.cpp.clion.plugin.client.ManagedClient import org.utbot.cpp.clion.plugin.client.requests.CheckProjectConfigurationRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.settings.settings import org.utbot.cpp.clion.plugin.utils.logger import org.utbot.cpp.clion.plugin.utils.notifyError @@ -91,7 +91,7 @@ class CreateBuildDirHandler( ) CheckProjectConfigurationRequest( - ParamsBuilder(project).buildProjectConfigRequestParams(Testgen.ConfigMode.CHECK), + GrpcRequestBuilderFactory(project).createProjectConfigRequestBuilder(Testgen.ConfigMode.CHECK), project ).also { client.executeRequest(it) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt index 88c2287c5..79976bb56 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/BaseRequest.kt @@ -3,27 +3,24 @@ package org.utbot.cpp.clion.plugin.client.requests import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import org.utbot.cpp.clion.plugin.client.Request -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import org.utbot.cpp.clion.plugin.grpc.RemoteMapping -import org.utbot.cpp.clion.plugin.settings.settings import org.utbot.cpp.clion.plugin.utils.client import org.utbot.cpp.clion.plugin.utils.logger -import org.utbot.cpp.clion.plugin.utils.path import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub /** * Base class for requests. * It sends a request of type [X] and handles the response of type [Y]. */ -abstract class BaseRequest(val params: Params, val project: Project) : Request { +abstract class BaseRequest(val params: GrpcRequestBuilder, val project: Project) : Request { abstract val logMessage: String val request: X by lazy { build() } // must not be accessed from this class constructor override fun toString(): String = logMessage open fun build(): X { - val mapping = - RemoteMapping(project.path, project.settings.storedSettings.remotePath, project.settings.isRemoteScenario) + val mapping = RemoteMapping(project) return params.build(mapping) } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt index e7cd7c508..9dae62773 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CheckProjectConfigurationRequest.kt @@ -5,12 +5,12 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.handlers.CheckProjectConfigurationHandler -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt class CheckProjectConfigurationRequest( - params: Params, + params: GrpcRequestBuilder, project: Project, ) : BaseRequest>(params, project) { override val id: String = "Configure Project" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt index af0591aa1..a8e720650 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/CreateBuildFolderRequest.kt @@ -6,12 +6,12 @@ import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.ManagedClient import org.utbot.cpp.clion.plugin.client.handlers.CreateBuildDirHandler -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class CreateBuildDirRequest( - params: Params, + params: GrpcRequestBuilder, project: Project, val client: ManagedClient ) : BaseRequest>(params, project) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/GenerateJsonFilesRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/GenerateJsonFilesRequest.kt index 2351e2a43..32c104753 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/GenerateJsonFilesRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/GenerateJsonFilesRequest.kt @@ -6,21 +6,21 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.handlers.GenerateJsonHandler -import org.utbot.cpp.clion.plugin.grpc.Params -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.utils.activeProject import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt class GenerateJsonFilesRequest( - params: Params, + params: GrpcRequestBuilder, project: Project ) : BaseRequest>(params, project) { override val id: String = "Generate JSON Files" override val logMessage: String = "Sending request to check project configuration." constructor(project: Project) : this( - ParamsBuilder(project).buildProjectConfigRequestParams(Testgen.ConfigMode.GENERATE_JSON_FILES), + GrpcRequestBuilderFactory(project).createProjectConfigRequestBuilder(Testgen.ConfigMode.GENERATE_JSON_FILES), project ) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/ProjectTargetsRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/ProjectTargetsRequest.kt index c2ca9703c..5a20da2a4 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/ProjectTargetsRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/ProjectTargetsRequest.kt @@ -2,12 +2,12 @@ package org.utbot.cpp.clion.plugin.client.requests import com.intellij.openapi.project.Project import kotlinx.coroutines.Job -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt class ProjectTargetsRequest( - params: Params, + params: GrpcRequestBuilder, project: Project, val processTargets: suspend (Testgen.ProjectTargetsResponse)->Unit, val onError: suspend (Throwable) -> Unit diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunAllTestsWithCoverageRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunAllTestsWithCoverageRequest.kt index c3faedf64..6c8dcc839 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunAllTestsWithCoverageRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunAllTestsWithCoverageRequest.kt @@ -5,13 +5,13 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.handlers.CoverageAndResultsHandler -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import testsgen.Testgen import testsgen.Testgen.CoverageAndResultsRequest import testsgen.TestsGenServiceGrpcKt class RunAllTestsWithCoverageRequest( - params: Params, + params: GrpcRequestBuilder, project: Project, ) : BaseRequest>(params, project) { override val id: String = "Run All Tests with Coverage" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunWithCoverageRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunWithCoverageRequest.kt index 0801e1080..19f70f79c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunWithCoverageRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/RunWithCoverageRequest.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.client.handlers.CoverageAndResultsHandler -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import org.utbot.cpp.clion.plugin.utils.convertFromRemotePathIfNeeded import org.utbot.cpp.clion.plugin.utils.testFilePathToSourceFilePath import testsgen.Testgen @@ -13,7 +13,7 @@ import testsgen.Testgen.CoverageAndResultsResponse import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class RunWithCoverageRequest( - params: Params, + params: GrpcRequestBuilder, project: Project, ): BaseRequest>(params, project) { override val id: String = "Run with Coverage" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/AssertionRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/AssertionRequest.kt index 5a7b715f6..d9161ff27 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/AssertionRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/AssertionRequest.kt @@ -4,12 +4,12 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class AssertionRequest( - params: Params, + params: GrpcRequestBuilder, project: Project ) : BaseTestsRequest(params, project, UTBot.message("requests.assertion.description.progress")) { override val id: String = "Generate for Assertion" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt index ff9ff233a..06b3dce91 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt @@ -7,7 +7,7 @@ import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.actions.FocusAction import org.utbot.cpp.clion.plugin.client.handlers.TestsStreamHandler import org.utbot.cpp.clion.plugin.client.requests.BaseRequest -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import org.utbot.cpp.clion.plugin.utils.getLongestCommonPathFromRoot import org.utbot.cpp.clion.plugin.utils.isHeaderFile import org.utbot.cpp.clion.plugin.utils.isSarifReport @@ -20,7 +20,7 @@ import java.nio.file.Path * Base class for requests that handle a stream of [Testgen.TestsResponse]. * @param progressName - a name of a progress that user will see, when this request will be executing. */ -abstract class BaseTestsRequest(params: Params, project: Project, private val progressName: String) : +abstract class BaseTestsRequest(params: GrpcRequestBuilder, project: Project, private val progressName: String) : BaseRequest>(params, project) { val logger = project.logger override suspend fun Flow.handle(cancellationJob: Job?) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ClassRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ClassRequest.kt index 09d780350..9ad1075b0 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ClassRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ClassRequest.kt @@ -4,12 +4,12 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class ClassRequest( - params: Params, + params: GrpcRequestBuilder, project: Project, ) : BaseTestsRequest(params, project, UTBot.message("requests.class.description.progress")) { override val id: String = "Generate for Class" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FileRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FileRequest.kt index 37c48ef9d..4e0a133bd 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FileRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FileRequest.kt @@ -4,13 +4,13 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import org.utbot.cpp.clion.plugin.utils.fileNameOrNull import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class FileRequest( - params: Params, + params: GrpcRequestBuilder, project: Project, ) : BaseTestsRequest(params, project, UTBot.message("requests.file.description.progress")) { override val id: String = "Generate for File" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FolderRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FolderRequest.kt index 43e361085..32ad36644 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FolderRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FolderRequest.kt @@ -4,13 +4,13 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import org.utbot.cpp.clion.plugin.utils.fileNameOrNull import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class FolderRequest( - folderRequestParams: Params, + folderRequestParams: GrpcRequestBuilder, project: Project, ) : BaseTestsRequest(folderRequestParams, project, UTBot.message("requests.folder.description.progress")) { override val id: String = "Generate for Folder" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionRequest.kt index dd20ac3dd..652a83620 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionRequest.kt @@ -4,12 +4,12 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class FunctionRequest( - params: Params, + params: GrpcRequestBuilder, project: Project, ) : BaseTestsRequest(params, project, UTBot.message("requests.function.description.progress")) { override val id: String = "Generate for Function" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionReturnTypeRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionReturnTypeRequest.kt index 7fd890e5c..b0ef39207 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionReturnTypeRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/FunctionReturnTypeRequest.kt @@ -3,13 +3,13 @@ package org.utbot.cpp.clion.plugin.client.requests.test import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import org.utbot.cpp.clion.plugin.client.requests.BaseRequest -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import testsgen.Testgen import testsgen.Testgen.FunctionTypeResponse import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class FunctionReturnTypeRequest( - params: Params, + params: GrpcRequestBuilder, project: Project, val processReturnType: suspend (FunctionTypeResponse)->(Unit) ) : BaseRequest(params, project) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/LineRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/LineRequest.kt index b09704ce8..38b747542 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/LineRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/LineRequest.kt @@ -4,12 +4,12 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class LineRequest( - params: Params, + params: GrpcRequestBuilder, project: Project, ) : BaseTestsRequest(params, project, UTBot.message("requests.line.description.progress")) { override val id: String = "Generate for Line" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/PredicateRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/PredicateRequest.kt index 991234e54..e6b10bceb 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/PredicateRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/PredicateRequest.kt @@ -4,12 +4,12 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class PredicateRequest( - params: Params, + params: GrpcRequestBuilder, project: Project, ) : BaseTestsRequest(params, project, UTBot.message("requests.predicate.description.progress")) { override val id: String = "Generate for Predicate" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ProjectRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ProjectRequest.kt index 246e3b1bd..9c163f2d3 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ProjectRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/ProjectRequest.kt @@ -4,12 +4,12 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class ProjectRequest( - params: Params, + params: GrpcRequestBuilder, project: Project, ) : BaseTestsRequest(params, project, UTBot.message("requests.project.description.progress")) { override val id: String = "Generate for Project" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/SnippetRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/SnippetRequest.kt index 19545f1d7..ef3b8d865 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/SnippetRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/SnippetRequest.kt @@ -4,12 +4,12 @@ import com.intellij.openapi.project.Project import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import org.utbot.cpp.clion.plugin.UTBot -import org.utbot.cpp.clion.plugin.grpc.Params +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder import testsgen.Testgen import testsgen.TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub class SnippetRequest( - params: Params, + params: GrpcRequestBuilder, project: Project ) : BaseTestsRequest(params, project, UTBot.message("requests.snippet.description.progress")) { override val id: String = "Generate for Snippet" diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilder.kt similarity index 79% rename from clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt rename to clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilder.kt index 34d300540..f0ba6faab 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/Params.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilder.kt @@ -1,7 +1,10 @@ package org.utbot.cpp.clion.plugin.grpc +import com.intellij.openapi.project.Project import org.apache.commons.io.FilenameUtils import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.settings.settings +import org.utbot.cpp.clion.plugin.utils.path import java.nio.file.InvalidPathException import java.nio.file.Paths @@ -12,6 +15,8 @@ class IllegalPathException(val path: String, val info: String) : data class RemoteMapping(val localProjectPath: String, val remoteProjectPath: String, val shouldConvert: Boolean = true) { + constructor(project: Project): this(project.path, project.settings.storedSettings.remotePath, project.settings.isRemoteScenario) + fun convertToRemote(path: String, errorText: String): String { if (!shouldConvert) return path @@ -32,9 +37,9 @@ data class RemoteMapping(val localProjectPath: String, val remoteProjectPath: St /** * Wrapper on grpc generated class [G], that can - * build request for server, converting paths to remote filesystem + * build request of type [G] for server, converting paths to remote filesystem */ -interface Params { +fun interface GrpcRequestBuilder { /** * Builds grpc message [G] with paths converted to remote version. * May throw exceptions diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilderFactory.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilderFactory.kt new file mode 100644 index 000000000..a28da1301 --- /dev/null +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilderFactory.kt @@ -0,0 +1,144 @@ +package org.utbot.cpp.clion.plugin.grpc + +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement +import org.utbot.cpp.clion.plugin.settings.settings +import org.utbot.cpp.clion.plugin.ui.testsResults.TestNameAndTestSuite +import org.utbot.cpp.clion.plugin.utils.localPath +import org.utbot.cpp.clion.plugin.utils.path +import testsgen.Testgen +import testsgen.Util + +/** + * A facade that provides builders for grpc generated requests aka GrpcRequestBuilder, + * where G is a grpc generated message + */ +class GrpcRequestBuilderFactory( + val project: Project +) { + fun createProjectContextBuilder(): GrpcRequestBuilder { + return ProjectContextBuilder( + project.name, + project.path, + project.settings.storedSettings.testDirRelativePath, + project.settings.storedSettings.buildDirRelativePath + ) + } + + fun createSettingsContextBuilder(): GrpcRequestBuilder { + return project.settings.storedSettings.let { + SettingsContextBuilder( + it.generateForStaticFunctions, + it.verbose, + it.timeoutPerFunction, + it.timeoutPerTest, + it.useDeterministicSearcher, + it.useStubs + ) + } + } + + fun createProjectRequestBuilder(): GrpcRequestBuilder { + val settings = project.settings.storedSettings + val sourcePaths = settings.sourceDirs.toList() + return ProjectRequestBuilder( + createProjectContextBuilder() as ProjectContextBuilder, + createSettingsContextBuilder() as SettingsContextBuilder, + sourcePaths, + project.settings.isRemoteScenario, + settings.targetPath + ) + } + + fun createLineRequestBuilder(lineNumber: Int, filePath: String): GrpcRequestBuilder { + return LineRequestBuilder( + createProjectRequestBuilder(), + SourceInfoParams(filePath, lineNumber) + ) + } + + fun createFunctionRequestBuilder(filePath: String, lineNumber: Int): GrpcRequestBuilder { + return FunctionRequestBuilder( + createLineRequestBuilder(lineNumber, filePath) + ) + } + + fun createFolderRequestBuilder(folderPath: String): GrpcRequestBuilder { + return FolderRequestBuilder( + createProjectRequestBuilder() as ProjectRequestBuilder, + folderPath + ) + } + + fun createFileRequestBuilder(filePath: String): GrpcRequestBuilder { + return FileRequestBuilder( + createProjectRequestBuilder() as ProjectRequestBuilder, + filePath + ) + } + + fun createProjectConfigRequestBuilder(configMode: Testgen.ConfigMode): GrpcRequestBuilder { + return ProjectConfigRequestBuilder( + createProjectContextBuilder() as ProjectContextBuilder, + configMode, + project.settings.storedSettings.cmakeOptions.split(" ") + ) + } + + fun createProjectTargetsRequestBuilder(): GrpcRequestBuilder { + return ProjectTargetsParams(createProjectContextBuilder() as ProjectContextBuilder) + } + + /** + * if [element] is null return params that correspond for running all tests + */ + fun createCovAndResulstsRequestBuilder(element: PsiElement? = null): GrpcRequestBuilder { + return CoverageAndResultsRequestBuilder( + createProjectContextBuilder() as ProjectContextBuilder, + createSettingsContextBuilder() as SettingsContextBuilder, + element?.let { createTestFilterBuilder(it) as TestFilterBuilder }, + coverage = true + ) + } + + private fun createTestFilterBuilder(element: PsiElement): GrpcRequestBuilder { + val (testName: String, testSuite: String) = TestNameAndTestSuite.create(element) + val testFilePath = element.containingFile.virtualFile.localPath.toString() + return TestFilterBuilder( + testFilePath, + testName, + testSuite + ) + } + + fun createClassRequestBuilder(filePath: String, lineNumber: Int): GrpcRequestBuilder { + return ClassRequestParams(createLineRequestBuilder(lineNumber, filePath) as LineRequestBuilder) + } + + fun createAssertionRequestBuilder(lineNumber: Int, filePath: String): GrpcRequestBuilder { + return AssertionRequestBuilder( + createLineRequestBuilder(lineNumber, filePath) as LineRequestBuilder + ) + } + + fun createPredicateRequestBuilder( + comparisonOperator: String, + validationType: Util.ValidationType, + valueToCompare: String, + lineNumber: Int, + filePath: String + ): GrpcRequestBuilder { + return PredicateRequestBuilder( + createLineRequestBuilder(lineNumber, filePath) as LineRequestBuilder, + PredicateInfoParams(validationType, comparisonOperator, valueToCompare) + ) + } + + fun createSnippetRequestBuilder(filePath: String): GrpcRequestBuilder { + return SnippetRequestBuilder( + createProjectContextBuilder() as ProjectContextBuilder, + createSettingsContextBuilder() as SettingsContextBuilder, + filePath + ) + } +} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuildersImpl.kt similarity index 67% rename from clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt rename to clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuildersImpl.kt index e33081051..4e2c68fef 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsImpl.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuildersImpl.kt @@ -8,12 +8,12 @@ import java.nio.file.InvalidPathException import java.nio.file.Paths -internal data class ProjectContextParams( +internal data class ProjectContextBuilder( val projectName: String, val projectPath: String, val testDirRelativePath: String, val buildDirRelativePath: String -) : Params { +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.ProjectContext { val projectNioPath = Paths.get(projectPath) // project path is not set by user, assuming it is valid val relativeTestsDirNioPath = try { @@ -36,35 +36,36 @@ internal data class ProjectContextParams( } } -internal data class SettingsContextParams( +internal data class SettingsContextBuilder( val generateForStaticFunctions: Boolean, val verbose: Boolean, val timeoutPerFunction: Int, val timeoutPerTest: Int, val useDeterministicSearcher: Boolean, val useStubs: Boolean -) : Params { +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.SettingsContext { return Testgen.SettingsContext.newBuilder() .setVerbose(verbose) .setGenerateForStaticFunctions(generateForStaticFunctions) .setTimeoutPerFunction(timeoutPerFunction) .setTimeoutPerTest(timeoutPerTest) + .setUseStubs(useStubs) .build() } } -internal data class ProjectRequestParams( - val projectContextParams: ProjectContextParams, - val settingsContextParams: SettingsContextParams, +internal data class ProjectRequestBuilder( + val projectContextBuilder: ProjectContextBuilder, + val settingsContextBuilder: SettingsContextBuilder, val sourcePaths: List, val synchronizeCode: Boolean, val targetPath: String -) : Params { +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.ProjectRequest { return Testgen.ProjectRequest.newBuilder() - .setProjectContext(projectContextParams.build(remoteMapping)) - .setSettingsContext(settingsContextParams.build(remoteMapping)) + .setProjectContext(projectContextBuilder.build(remoteMapping)) + .setSettingsContext(settingsContextBuilder.build(remoteMapping)) .addAllSourcePaths(sourcePaths.map { sourcePath -> remoteMapping.convertToRemote( sourcePath, @@ -78,44 +79,46 @@ internal data class ProjectRequestParams( targetPath, UTBot.message("settings.project.target.wrong.conversion") ) + } else { + builder.targetPath = targetPath } } .build() } } -internal data class FolderRequestParams( - val projectRequestParams: ProjectRequestParams, +internal data class FolderRequestBuilder( + val projectRequestBuilder: ProjectRequestBuilder, val folderPath: String -) : Params { +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.FolderRequest { return Testgen.FolderRequest.newBuilder() .setFolderPath(remoteMapping.convertToRemote(folderPath, UTBot.message("folderPath.wrong.conversion"))) - .setProjectRequest(projectRequestParams.build(remoteMapping)) + .setProjectRequest(projectRequestBuilder.build(remoteMapping)) .build() } } -internal data class FileRequestParams( - val projectRequestParams: ProjectRequestParams, +internal data class FileRequestBuilder( + val projectRequestBuilder: ProjectRequestBuilder, val filePath: String -) : Params { +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.FileRequest { return Testgen.FileRequest.newBuilder() - .setProjectRequest(projectRequestParams.build(remoteMapping)) + .setProjectRequest(projectRequestBuilder.build(remoteMapping)) .setFilePath(remoteMapping.convertToRemote(filePath, UTBot.message("filePath.wrong.conversion"))) .build() } } -internal data class ProjectConfigRequestParams( - val projectContextParams: ProjectContextParams, +internal data class ProjectConfigRequestBuilder( + val projectContextBuilder: ProjectContextBuilder, val configMode: Testgen.ConfigMode, val cmakeOptions: List -) : Params { +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.ProjectConfigRequest { return Testgen.ProjectConfigRequest.newBuilder() - .setProjectContext(projectContextParams.build(remoteMapping)) + .setProjectContext(projectContextBuilder.build(remoteMapping)) .setConfigMode(configMode) .addAllCmakeOptions(cmakeOptions) .build() @@ -123,20 +126,20 @@ internal data class ProjectConfigRequestParams( } internal data class ProjectTargetsParams( - val projectContextParams: ProjectContextParams -) : Params { + val projectContextBuilder: ProjectContextBuilder +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.ProjectTargetsRequest { return Testgen.ProjectTargetsRequest.newBuilder() - .setProjectContext(projectContextParams.build(remoteMapping)) + .setProjectContext(projectContextBuilder.build(remoteMapping)) .build() } } -internal data class TestFilterParams( +internal data class TestFilterBuilder( val testFilePath: String, val testName: String, val testSuite: String -) : Params { +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.TestFilter { return Testgen.TestFilter.newBuilder() .setTestFilePath( @@ -151,18 +154,18 @@ internal data class TestFilterParams( } } -internal data class CoverageAndResultsRequestParams( - val projectContextParams: ProjectContextParams, - val settingsContextParams: SettingsContextParams, - val testFilterParams: TestFilterParams? = null, +internal data class CoverageAndResultsRequestBuilder( + val projectContextBuilder: ProjectContextBuilder, + val settingsContextBuilder: SettingsContextBuilder, + val testFilterBuilder: TestFilterBuilder? = null, val coverage: Boolean = true -) : Params { +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.CoverageAndResultsRequest { val builder = Testgen.CoverageAndResultsRequest.newBuilder() .setCoverage(coverage) - .setSettingsContext(settingsContextParams.build(remoteMapping)) - .setProjectContext(projectContextParams.build(remoteMapping)) - testFilterParams?.let { + .setSettingsContext(settingsContextBuilder.build(remoteMapping)) + .setProjectContext(projectContextBuilder.build(remoteMapping)) + testFilterBuilder?.let { builder.setTestFilter(it.build(remoteMapping)) } @@ -173,7 +176,7 @@ internal data class CoverageAndResultsRequestParams( internal data class SourceInfoParams( val filePath: String, val line: Int -) : Params { +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Util.SourceInfo { return Util.SourceInfo.newBuilder() .setLine(line) @@ -182,10 +185,10 @@ internal data class SourceInfoParams( } } -data class LineRequestParams( - val projectRequestParams: Params, - val sourceInfoParams: Params -) : Params { +data class LineRequestBuilder( + val projectRequestParams: GrpcRequestBuilder, + val sourceInfoParams: GrpcRequestBuilder +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.LineRequest { return Testgen.LineRequest.newBuilder() .setProjectRequest(projectRequestParams.build(remoteMapping)) @@ -194,9 +197,9 @@ data class LineRequestParams( } } -internal data class FunctionRequestParams( - val fileRequestParams: Params -) : Params { +internal data class FunctionRequestBuilder( + val fileRequestParams: GrpcRequestBuilder +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.FunctionRequest { return Testgen.FunctionRequest.newBuilder() .setLineRequest(fileRequestParams.build(remoteMapping)) @@ -205,20 +208,20 @@ internal data class FunctionRequestParams( } internal data class ClassRequestParams( - val lineRequestParams: LineRequestParams -) : Params { + val lineRequestBuilder: LineRequestBuilder +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.ClassRequest { return Testgen.ClassRequest.newBuilder() - .setLineRequest(lineRequestParams.build(remoteMapping)) + .setLineRequest(lineRequestBuilder.build(remoteMapping)) .build() } } -internal class AssertionRequestParams(private val lineRequestParams: LineRequestParams) : - Params { +internal class AssertionRequestBuilder(private val lineRequestBuilder: LineRequestBuilder) : + GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.AssertionRequest { return Testgen.AssertionRequest.newBuilder() - .setLineRequest(lineRequestParams.build(remoteMapping)) + .setLineRequest(lineRequestBuilder.build(remoteMapping)) .build() } } @@ -227,7 +230,7 @@ internal data class PredicateInfoParams( val validationType: Util.ValidationType, val predicate: String, val returnValue: String -) : Params { +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Util.PredicateInfo { return Util.PredicateInfo.newBuilder() .setPredicate(predicate) @@ -237,27 +240,27 @@ internal data class PredicateInfoParams( } } -internal class PredicateRequestParams( - private val lineRequestParams: LineRequestParams, +internal class PredicateRequestBuilder( + private val lineRequestBuilder: LineRequestBuilder, private val predicateInfoParams: PredicateInfoParams -) : Params { +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.PredicateRequest { return Testgen.PredicateRequest.newBuilder() - .setLineRequest(lineRequestParams.build(remoteMapping)) + .setLineRequest(lineRequestBuilder.build(remoteMapping)) .setPredicateInfo(predicateInfoParams.build(remoteMapping)) .build() } } -internal class SnippetRequestParams( - private val projectContextParams: ProjectContextParams, - private val settingsContextParams: SettingsContextParams, +internal class SnippetRequestBuilder( + private val projectContextBuilder: ProjectContextBuilder, + private val settingsContextBuilder: SettingsContextBuilder, val filePath: String -) : Params { +) : GrpcRequestBuilder { override fun build(remoteMapping: RemoteMapping): Testgen.SnippetRequest { return Testgen.SnippetRequest.newBuilder() - .setProjectContext(projectContextParams.build(remoteMapping)) - .setSettingsContext(settingsContextParams.build(remoteMapping)) + .setProjectContext(projectContextBuilder.build(remoteMapping)) + .setSettingsContext(settingsContextBuilder.build(remoteMapping)) .setFilePath(remoteMapping.convertToRemote(filePath, UTBot.message("filePath.wrong.conversion"))) .build() } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt deleted file mode 100644 index af4bbb28f..000000000 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/ParamsBuilder.kt +++ /dev/null @@ -1,144 +0,0 @@ -package org.utbot.cpp.clion.plugin.grpc - -import com.intellij.openapi.project.Project -import com.intellij.psi.PsiElement -import org.utbot.cpp.clion.plugin.settings.settings -import org.utbot.cpp.clion.plugin.ui.testsResults.TestNameAndTestSuite -import org.utbot.cpp.clion.plugin.utils.localPath -import org.utbot.cpp.clion.plugin.utils.path -import testsgen.Testgen -import testsgen.Util - -/** - * Facade that creates Params, where X is the grpc message - */ -class ParamsBuilder( - val project: Project -) { - private fun buildProjectContextParams(): Params { - return ProjectContextParams( - project.name, - project.path, - project.settings.storedSettings.testDirRelativePath, - project.settings.storedSettings.buildDirRelativePath - ) - } - - private fun buildSettingsContextParams(): Params { - return project.settings.storedSettings.let { - SettingsContextParams( - it.generateForStaticFunctions, - it.verbose, - it.timeoutPerFunction, - it.timeoutPerTest, - it.useDeterministicSearcher, - it.useStubs - ) - } - } - - fun buildProjectRequestParams(): Params { - val settings = project.settings.storedSettings - val sourcePaths = settings.sourceDirs.toList() - return ProjectRequestParams( - buildProjectContextParams() as ProjectContextParams, - buildSettingsContextParams() as SettingsContextParams, - sourcePaths, - project.settings.isRemoteScenario, - settings.targetPath - ) - } - - - fun buildLineRequestBuilder(lineNumber: Int, filePath: String): Params { - return LineRequestParams( - buildProjectRequestParams(), - SourceInfoParams(filePath, lineNumber) - ) - } - - fun buildFunctionRequestParams(filePath: String, lineNumber: Int): Params { - return FunctionRequestParams( - buildLineRequestBuilder(lineNumber, filePath) - ) - } - - fun buildFolderRequestParams(folderPath: String): Params { - return FolderRequestParams( - buildProjectRequestParams() as ProjectRequestParams, - folderPath - ) - } - - fun buildFileRequestParams(filePath: String): Params { - return FileRequestParams( - buildProjectRequestParams() as ProjectRequestParams, - filePath - ) - } - - fun buildProjectConfigRequestParams(configMode: Testgen.ConfigMode): Params { - return ProjectConfigRequestParams( - buildProjectContextParams() as ProjectContextParams, - configMode, - project.settings.storedSettings.cmakeOptions.split(" ") - ) - } - - fun buildProjectTargetsParams(): Params { - return ProjectTargetsParams(buildProjectContextParams() as ProjectContextParams) - } - - /** - * if [element] is null return params that correspond for running all tests - */ - fun buildCoverageAndResultsRequestParams(element: PsiElement? = null): Params { - return CoverageAndResultsRequestParams( - buildProjectContextParams() as ProjectContextParams, - buildSettingsContextParams() as SettingsContextParams, - element?.let { buildTestFilterParams(it) as TestFilterParams }, - coverage = true - ) - } - - private fun buildTestFilterParams(element: PsiElement): Params { - val (testName: String, testSuite: String) = TestNameAndTestSuite.create(element) - val testFilePath = element.containingFile.virtualFile.localPath.toString() - return TestFilterParams( - testFilePath, - testName, - testSuite - ) - } - - fun buildClassRequestParams(filePath: String, lineNumber: Int): Params { - return ClassRequestParams(buildLineRequestBuilder(lineNumber, filePath) as LineRequestParams) - } - - fun buildAssertionRequestParams(lineNumber: Int, filePath: String): Params { - return AssertionRequestParams( - buildLineRequestBuilder(lineNumber, filePath) as LineRequestParams - ) - } - - fun buildPredicateRequestParams( - comparisonOperator: String, - validationType: Util.ValidationType, - valueToCompare: String, - lineNumber: Int, - filePath: String - ): Params { - return PredicateRequestParams( - buildLineRequestBuilder(lineNumber, filePath) as LineRequestParams, - PredicateInfoParams(validationType, comparisonOperator, valueToCompare) - ) - } - - fun buildSnippetRequestParams(filePath: String): Params { - return SnippetRequestParams( - buildProjectContextParams() as ProjectContextParams, - buildSettingsContextParams() as SettingsContextParams, - filePath - ) - } -} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTargetsController.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTargetsController.kt index d12568004..dfeae5a26 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTargetsController.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTargetsController.kt @@ -7,7 +7,7 @@ import com.intellij.openapi.project.Project import com.intellij.ui.CollectionListModel import org.utbot.cpp.clion.plugin.client.ManagedClient import org.utbot.cpp.clion.plugin.client.requests.ProjectTargetsRequest -import org.utbot.cpp.clion.plugin.grpc.ParamsBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.listeners.ConnectionStatus import org.utbot.cpp.clion.plugin.listeners.UTBotEventsListener import org.utbot.cpp.clion.plugin.settings.UTBotAllProjectSettings @@ -46,7 +46,7 @@ class UTBotTargetsController(val project: Project) { targetsToolWindow.setBusy(true) } ProjectTargetsRequest( - ParamsBuilder(project).buildProjectTargetsParams(), + GrpcRequestBuilderFactory(project).createProjectTargetsRequestBuilder(), project, processTargets = { targetsResponse: Testgen.ProjectTargetsResponse -> invokeOnEdt { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ActionUtils.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ActionUtils.kt index 82a4e1180..d089f8c3c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ActionUtils.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/ActionUtils.kt @@ -2,8 +2,10 @@ package org.utbot.cpp.clion.plugin.utils import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilder +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory import org.utbot.cpp.clion.plugin.settings.settings - +import testsgen.Testgen fun AnActionEvent.getLineNumberUnsafe(): Int { val editor = this.getRequiredData(CommonDataKeys.EDITOR) @@ -14,6 +16,19 @@ fun AnActionEvent.getFilePathUnsafe(): String { return getRequiredData(CommonDataKeys.VIRTUAL_FILE).localPath.toString() } +fun AnActionEvent.getBuilderForFileRequest(): GrpcRequestBuilder { + return GrpcRequestBuilderFactory(this.activeProject()) + .createFileRequestBuilder(this.getFilePathUnsafe()) +} + +fun AnActionEvent.getBuilderForLineRequest(): GrpcRequestBuilder { + val filePath = this.getRequiredData(CommonDataKeys.VIRTUAL_FILE).path + val editor = this.getRequiredData(CommonDataKeys.EDITOR) + val lineNumber = editor.caretModel.logicalPosition.line + 1 + return GrpcRequestBuilderFactory(this.activeProject()) + .createLineRequestBuilder(lineNumber, filePath) +} + fun isPluginEnabled(e: AnActionEvent): Boolean { var isEnabled = false val project = e.project diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/TestFixtureProxy.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/TestFixtureProxy.kt new file mode 100644 index 000000000..a14756ca6 --- /dev/null +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/TestFixtureProxy.kt @@ -0,0 +1,23 @@ +package org.utbot.cpp.clion.plugin + +import com.intellij.testFramework.fixtures.impl.TempDirTestFixtureImpl +import java.nio.file.Path + +/** + * Implementation of TempDirTestFixture that uses [testsDirectory] as + * a tempDirectory, and does not delete it on tearDown. + * + * Intellij Platform tests are based on files in temp directory, which is provided and managed by TempDirTestFixture. + * On tearDown, temp directory is deleted. + * it may be expensive to copy all project files to temporary directory. + * This class solves the problem, by using [testsDirectory] + * instead of some generated temp directory. + */ +class TestFixtureProxy(private val testsDirectory: Path) : TempDirTestFixtureImpl() { + override fun doCreateTempDirectory(): Path { + return testsDirectory + } + + // as the directory is not actually temporary, it should not be deleted + override fun deleteOnTearDown() = false +} diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/TestUtil.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/TestUtil.kt index 223804b76..3930535a8 100644 --- a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/TestUtil.kt +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/TestUtil.kt @@ -1,5 +1,13 @@ package org.utbot.cpp.clion.plugin +import com.intellij.openapi.actionSystem.ActionPlaces +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.Presentation +import com.intellij.openapi.actionSystem.ex.ActionManagerEx +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.editor.ex.EditorEx +import com.intellij.testFramework.fixtures.CodeInsightTestFixture +import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory import com.intellij.util.io.exists import com.intellij.util.io.readText import kotlin.io.path.extension @@ -30,7 +38,8 @@ fun Path.assertTestFilesExist(sourceFileNames: List) { val name = testFile.nameWithoutExtension if (!name.endsWith("_stub") && !name.endsWith("_wrapper") && - testFile.extension != "mk") { + testFile.extension != "mk" + ) { val sourceFileName = testFile.name.removeTestSuffixes() if (sourceFileName !in visitedFile) { Logger.error("Unable to find a corresponding source file for test: ${testFile.name}") @@ -59,3 +68,32 @@ fun String.removeTestSuffixes(): String { fun Path.assertFileOrDirExists(message: String = "") { assert(this.exists()) { "$this does not exist!\n${message}" } } + +fun createActionEventFrom(editor: Editor): AnActionEvent { + val dataContext = (editor as EditorEx).dataContext + val actionManager = ActionManagerEx.getInstance() + return AnActionEvent(null, dataContext, ActionPlaces.UNKNOWN, Presentation(), actionManager, 0); +} + +/** + * moves caret to beginning of the line with [lineNumber] + * + * @param lineNumber - 1-based line number + */ +fun Editor.moveCursorToLine(lineNumber: Int) { + this.caretModel.moveToOffset(this.document.getLineStartOffset(lineNumber - 1)) +} + +fun createFixture(projectPath: Path): CodeInsightTestFixture { + Logger.info("Creating fixture") + val fixture = IdeaTestFixtureFactory.getFixtureFactory().let { + it.createCodeInsightFixture( + it.createFixtureBuilder(projectPath.name, projectPath, false).fixture, + TestFixtureProxy(projectPath) + ) + } + fixture.setUp() + fixture.testDataPath = projectPath.toString() + Logger.info("Finished creating fixture") + return fixture +} diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/BaseBuildingTest.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/BaseBuildingTest.kt new file mode 100644 index 000000000..7f2b8a071 --- /dev/null +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/BaseBuildingTest.kt @@ -0,0 +1,86 @@ +package org.utbot.cpp.clion.plugin.tests.buildingRequestsTests + +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.actionSystem.ex.ActionUtil +import com.intellij.openapi.project.Project +import com.intellij.testFramework.fixtures.CodeInsightTestFixture +import org.junit.jupiter.api.extension.ExtendWith +import org.utbot.cpp.clion.plugin.SwingEdtInterceptor +import org.utbot.cpp.clion.plugin.actions.generate.GenerateForLineAction +import org.utbot.cpp.clion.plugin.client.logger.SystemWriter +import org.utbot.cpp.clion.plugin.createActionEventFrom +import org.utbot.cpp.clion.plugin.createFixture +import org.utbot.cpp.clion.plugin.moveCursorToLine +import org.utbot.cpp.clion.plugin.settings.UTBotProjectStoredSettings +import org.utbot.cpp.clion.plugin.settings.settings +import org.utbot.cpp.clion.plugin.utils.logger +import testsgen.Testgen +import java.io.File +import java.nio.file.Path +import java.nio.file.Paths + +@ExtendWith(SwingEdtInterceptor::class) +open class BaseBuildingTest { + val projectPath: Path = + Paths.get(File(".").canonicalPath).resolve("../integration-tests/c-example-mini").normalize() + protected val testsDirRelativePath = "cl-plugin-test-tests" + protected val testsDirectoryPath: Path = projectPath.resolve(testsDirRelativePath) + protected val buildDirRelativePath = "build" + protected val fixture: CodeInsightTestFixture = createFixture(projectPath) + protected val project: Project + get() = fixture.project + val settings = project.settings.storedSettings + + init { + settings.buildDirRelativePath = buildDirRelativePath + settings.testDirRelativePath = projectPath.relativize(testsDirectoryPath).toString() + settings.isPluginEnabled = true + project.logger.logWriters.let { + it.clear() + it.add(SystemWriter()) + } + } + + // HELPER METHODS: + + protected fun createExpectedProjectContext(remotePath: String): Testgen.ProjectContext { + val isRemote = isRemoteScenarioExpectedInTests(remotePath) + return Testgen.ProjectContext.newBuilder().apply { + projectPath = if (isRemote) remotePath else this@BaseBuildingTest.projectPath.toString() + projectName = project.name + testDirPath = + if (isRemote) "$remotePath/$testsDirRelativePath" else this@BaseBuildingTest.testsDirectoryPath.toString() + buildDirRelativePath = this@BaseBuildingTest.buildDirRelativePath + }.build() + } + + protected fun createExpectedSettingsContextFromCurrentSettings(): Testgen.SettingsContext { + return Testgen.SettingsContext.newBuilder().apply { + generateForStaticFunctions = settings.generateForStaticFunctions + verbose = settings.verbose + timeoutPerFunction = settings.timeoutPerFunction + timeoutPerTest = settings.timeoutPerTest + useDeterministicSearcher = settings.useDeterministicSearcher + useStubs = settings.useStubs + }.build() + } + + protected fun isRemoteScenarioExpectedInTests(remotePath: String): Boolean = + remotePath != UTBotProjectStoredSettings.REMOTE_PATH_VALUE_FOR_LOCAL_SCENARIO + + protected fun setRemoteScenarioInPlugin(remotePath: String) { + settings.remotePath = remotePath + } + + fun createActionEventFromEditor(relativeFilePath: String, lineNumber: Int? = null): AnActionEvent { + fixture.configureFromTempProjectFile(relativeFilePath) + val editor = fixture.editor ?: error("Fixture's editor is null") + if (lineNumber != null) + editor.moveCursorToLine(lineNumber) + val event = createActionEventFrom(editor) + val action = GenerateForLineAction() + ActionUtil.performDumbAwareUpdate(action, event, true) + + return event + } +} \ No newline at end of file diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/FileRequestBuildingTest.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/FileRequestBuildingTest.kt new file mode 100644 index 000000000..3f0ce2fb2 --- /dev/null +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/FileRequestBuildingTest.kt @@ -0,0 +1,45 @@ +package org.utbot.cpp.clion.plugin.tests.buildingRequestsTests + +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test +import org.utbot.cpp.clion.plugin.grpc.RemoteMapping +import org.utbot.cpp.clion.plugin.settings.UTBotProjectStoredSettings +import org.utbot.cpp.clion.plugin.utils.getBuilderForFileRequest +import testsgen.Testgen + +class FileRequestBuildingTest : BaseBuildingTest() { + private fun doTest( + testedFileRelativePath: String, + remotePath: String = UTBotProjectStoredSettings.REMOTE_PATH_VALUE_FOR_LOCAL_SCENARIO + ) { + setRemoteScenarioInPlugin(remotePath) + val isRemoteExpected = isRemoteScenarioExpectedInTests(remotePath) + + val actualRequest: Testgen.FileRequest = + createActionEventFromEditor(testedFileRelativePath).getBuilderForFileRequest().build(RemoteMapping(project)) + + val expectedRequest: Testgen.FileRequest = Testgen.FileRequest.newBuilder().apply { + projectRequest = Testgen.ProjectRequest.newBuilder().apply { + targetPath = settings.targetPath + synchronizeCode = isRemoteExpected + projectContext = this@FileRequestBuildingTest.createExpectedProjectContext(remotePath) + settingsContext = this@FileRequestBuildingTest.createExpectedSettingsContextFromCurrentSettings() + }.build() + filePath = if (isRemoteExpected) "$remotePath/$testedFileRelativePath" else projectPath.resolve( + testedFileRelativePath + ).toString() + }.build() + + Assertions.assertEquals(expectedRequest, actualRequest) + } + + @Test + fun `test generateForFile grpc request is built correctly from action event in local scenario`() { + doTest("lib/basic_functions.c") + } + + @Test + fun `test grpc FileRequest is built correctly from action event in remote scenario`() { + doTest("lib/basic_functions.c", "/some/remote/path/${project.name}") + } +} diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/LineRequestBuildingTest.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/LineRequestBuildingTest.kt new file mode 100644 index 000000000..d7518aaf3 --- /dev/null +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/LineRequestBuildingTest.kt @@ -0,0 +1,56 @@ +package org.utbot.cpp.clion.plugin.tests.buildingRequestsTests + +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test +import org.utbot.cpp.clion.plugin.grpc.RemoteMapping +import org.utbot.cpp.clion.plugin.settings.UTBotProjectStoredSettings +import org.utbot.cpp.clion.plugin.tests.integrationTests.GenerateForLineTest +import org.utbot.cpp.clion.plugin.utils.getBuilderForLineRequest +import testsgen.Testgen +import testsgen.Util + +class LineRequestBuildingTest : BaseBuildingTest() { + private fun doTest( + testedFileRelativeFilePath: String, + lineNumber: Int, // 1-indexed + remotePath: String = UTBotProjectStoredSettings.REMOTE_PATH_VALUE_FOR_LOCAL_SCENARIO + ) { + this.setRemoteScenarioInPlugin(remotePath) + val isRemoteExpected = this.isRemoteScenarioExpectedInTests(remotePath) + + val actualRequest: Testgen.LineRequest = + this.createActionEventFromEditor(testedFileRelativeFilePath, lineNumber) + .getBuilderForLineRequest().build(RemoteMapping(project)) + + val expectedRequest: Testgen.LineRequest = Testgen.LineRequest.newBuilder().apply { + projectRequest = Testgen.ProjectRequest.newBuilder().apply { + targetPath = settings.targetPath + synchronizeCode = isRemoteExpected + projectContext = createExpectedProjectContext(remotePath) + settingsContext = createExpectedSettingsContextFromCurrentSettings() + }.build() + sourceInfo = Util.SourceInfo.newBuilder().apply { + filePath = if (isRemoteExpected) "$remotePath/$testedFileRelativeFilePath" else projectPath.resolve( + testedFileRelativeFilePath + ).toString() + line = lineNumber + }.build() + }.build() + + Assertions.assertEquals(expectedRequest, actualRequest) + } + + @Test + fun `test grpc LineRequest is built correctly from action event in local scenario`() { + doTest("lib/basic_functions.c", GenerateForLineTest.IF_IN_MAX_FUNCTION_LINE) + } + + @Test + fun `test grpc LineRequest is built correctly from action event in remote scenario`() { + doTest( + "lib/basic_functions.c", + GenerateForLineTest.IF_IN_MAX_FUNCTION_LINE, + "/some/remote/path/${project.name}" + ) + } +} diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/ProjectRequestBuildingTest.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/ProjectRequestBuildingTest.kt new file mode 100644 index 000000000..d5a79d718 --- /dev/null +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/ProjectRequestBuildingTest.kt @@ -0,0 +1,37 @@ +package org.utbot.cpp.clion.plugin.tests.buildingRequestsTests + +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test +import org.utbot.cpp.clion.plugin.grpc.GrpcRequestBuilderFactory +import org.utbot.cpp.clion.plugin.grpc.RemoteMapping +import org.utbot.cpp.clion.plugin.settings.UTBotProjectStoredSettings +import testsgen.Testgen + +class ProjectRequestBuildingTest : BaseBuildingTest() { + private fun doTest(remotePath: String = UTBotProjectStoredSettings.REMOTE_PATH_VALUE_FOR_LOCAL_SCENARIO) { + setRemoteScenarioInPlugin(remotePath) + val isRemoteExpected = isRemoteScenarioExpectedInTests(remotePath) + + val actualRequest: Testgen.ProjectRequest = + GrpcRequestBuilderFactory(project).createProjectRequestBuilder().build(RemoteMapping(project)) + + val expectedRequest: Testgen.ProjectRequest = Testgen.ProjectRequest.newBuilder().apply { + targetPath = settings.targetPath + synchronizeCode = isRemoteExpected + projectContext = createExpectedProjectContext(remotePath) + settingsContext = createExpectedSettingsContextFromCurrentSettings() + }.build() + + Assertions.assertEquals(expectedRequest, actualRequest) + } + + @Test + fun `test grpc ProjectRequest is built correctly in local scenario`() { + doTest(UTBotProjectStoredSettings.REMOTE_PATH_VALUE_FOR_LOCAL_SCENARIO) + } + + @Test + fun `test grpc ProjectRequest is built correctly in remote scenario`() { + doTest("/some/remote/path") + } +} diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/BaseGenerationTestCase.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/BaseGenerationTestCase.kt similarity index 70% rename from clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/BaseGenerationTestCase.kt rename to clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/BaseGenerationTestCase.kt index 2d82ced40..4dec93a42 100644 --- a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/BaseGenerationTestCase.kt +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/BaseGenerationTestCase.kt @@ -1,61 +1,40 @@ -package org.utbot.cpp.clion.plugin +package org.utbot.cpp.clion.plugin.tests.integrationTests import com.intellij.openapi.components.service import com.intellij.openapi.project.Project import com.intellij.testFramework.PlatformTestUtil -import com.intellij.testFramework.TestLoggerFactory import com.intellij.testFramework.fixtures.CodeInsightTestFixture -import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory -import com.intellij.testFramework.fixtures.impl.TempDirTestFixtureImpl import com.intellij.util.io.delete +import kotlinx.coroutines.Job +import kotlinx.coroutines.TimeoutCancellationException +import kotlinx.coroutines.delay +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withTimeout import org.junit.jupiter.api.AfterAll import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.TestInstance import org.junit.jupiter.api.extension.ExtendWith +import org.tinylog.kotlin.Logger +import org.utbot.cpp.clion.plugin.SwingEdtInterceptor +import org.utbot.cpp.clion.plugin.client.ManagedClient import org.utbot.cpp.clion.plugin.client.logger.SystemWriter +import org.utbot.cpp.clion.plugin.createFixture import org.utbot.cpp.clion.plugin.settings.settings +import org.utbot.cpp.clion.plugin.ui.utbotToolWindow.targetToolWindow.UTBotTargetsController +import org.utbot.cpp.clion.plugin.utils.client import org.utbot.cpp.clion.plugin.utils.logger import java.io.File import java.nio.file.Path import java.nio.file.Paths -import kotlin.io.path.name -import kotlinx.coroutines.Job -import kotlinx.coroutines.TimeoutCancellationException -import kotlinx.coroutines.delay -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withTimeout -import org.tinylog.kotlin.Logger -import org.utbot.cpp.clion.plugin.client.ManagedClient -import org.utbot.cpp.clion.plugin.ui.utbotToolWindow.targetToolWindow.UTBotTargetsController -import org.utbot.cpp.clion.plugin.utils.client @TestInstance(TestInstance.Lifecycle.PER_CLASS) @ExtendWith(SwingEdtInterceptor::class) abstract class BaseGenerationTestCase { - /** - * Implementation of TempDirTestFixture that uses [testsDirectory] as - * a tempDirectory, and does not delete it on tearDown. - * - * Intellij Platform tests are based on files in temp directory, which is provided and managed by TempDirTestFixture. - * On tearDown, temp directory is deleted. - * it may be expensive to copy all project files to temporary directory. - * This class solves the problem, by using [testsDirectory] - * instead of some generated temp directory. - */ - class TestFixtureProxy(private val testsDirectory: Path) : TempDirTestFixtureImpl() { - override fun doCreateTempDirectory(): Path { - return testsDirectory - } - - // as the directory is not actually temporary, it should not be deleted - override fun deleteOnTearDown() = false - } - val projectPath: Path = Paths.get(File(".").canonicalPath).resolve("../integration-tests/c-example-mini").normalize() val testsDirectoryPath: Path = projectPath.resolve("cl-plugin-test-tests") val buildDirName = "build" - protected val fixture: CodeInsightTestFixture = createFixture() + protected val fixture: CodeInsightTestFixture = createFixture(projectPath) protected val project: Project get() = fixture.project protected val client: ManagedClient @@ -71,20 +50,6 @@ abstract class BaseGenerationTestCase { } } - private fun createFixture(): CodeInsightTestFixture { - Logger.info("Creating fixture") - val fixture = IdeaTestFixtureFactory.getFixtureFactory().let { - it.createCodeInsightFixture( - it.createFixtureBuilder(projectPath.name, projectPath, false).fixture, - TestFixtureProxy(projectPath) - ) - } - fixture.setUp() - fixture.testDataPath = projectPath.toString() - Logger.info("Finished creating fixture") - return fixture - } - fun setTarget(targetName: String) { val targetsController = project.service() assert(client.isServerAvailable()) { "Not connected to server!" } @@ -117,7 +82,8 @@ abstract class BaseGenerationTestCase { Logger.info { "Waiting for connection to server!" } } } - } catch (_: TimeoutCancellationException) {} + } catch (_: TimeoutCancellationException) { + } assert(client.isServerAvailable()) { "Not connected to server!" } Logger.info { "Connected" } } @@ -136,4 +102,4 @@ abstract class BaseGenerationTestCase { fixture.tearDown() Logger.info("tearDownAll of BaseGenerationTest has finished!") } -} +} \ No newline at end of file diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/CppCompiler.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/CppCompiler.kt similarity index 93% rename from clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/CppCompiler.kt rename to clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/CppCompiler.kt index 68195fea6..ff01966fe 100644 --- a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/CppCompiler.kt +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/CppCompiler.kt @@ -1,6 +1,7 @@ -package org.utbot.cpp.clion.plugin +package org.utbot.cpp.clion.plugin.tests.integrationTests import org.tinylog.kotlin.Logger +import org.utbot.cpp.clion.plugin.assertFileOrDirExists import java.nio.file.Path abstract class CppCompiler { diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/GenerateForFileTest.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/GenerateForFileTest.kt similarity index 88% rename from clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/GenerateForFileTest.kt rename to clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/GenerateForFileTest.kt index d094f19e3..5b052466a 100644 --- a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/GenerateForFileTest.kt +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/GenerateForFileTest.kt @@ -1,10 +1,7 @@ -package org.utbot.cpp.clion.plugin.tests +package org.utbot.cpp.clion.plugin.tests.integrationTests import org.junit.jupiter.api.Test import org.tinylog.kotlin.Logger -import org.utbot.cpp.clion.plugin.BaseGenerationTestCase -import org.utbot.cpp.clion.plugin.Clang -import org.utbot.cpp.clion.plugin.CppCompiler import org.utbot.cpp.clion.plugin.assertAllFilesNotEmptyRecursively import org.utbot.cpp.clion.plugin.assertFileOrDirExists import org.utbot.cpp.clion.plugin.assertTestFilesExist @@ -34,4 +31,4 @@ class GenerateForFileTest : BaseGenerationTestCase() { fun `test generate for file with non-verbose mode`() { doTest("/lib/basic_functions.c", Clang, false) } -} +} \ No newline at end of file diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/GenerateForIsolatedFileTest.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/GenerateForIsolatedFileTest.kt similarity index 81% rename from clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/GenerateForIsolatedFileTest.kt rename to clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/GenerateForIsolatedFileTest.kt index 65844cd9d..a5d3d8d66 100644 --- a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/GenerateForIsolatedFileTest.kt +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/GenerateForIsolatedFileTest.kt @@ -1,9 +1,7 @@ -package org.utbot.cpp.clion.plugin.tests +package org.utbot.cpp.clion.plugin.tests.integrationTests import org.junit.jupiter.api.Test import org.tinylog.kotlin.Logger -import org.utbot.cpp.clion.plugin.BaseGenerationTestCase -import org.utbot.cpp.clion.plugin.Clang import org.utbot.cpp.clion.plugin.assertAllFilesNotEmptyRecursively import org.utbot.cpp.clion.plugin.assertFileOrDirExists import org.utbot.cpp.clion.plugin.assertTestFilesExist @@ -14,7 +12,8 @@ class GenerateForIsolatedFileTest : BaseGenerationTestCase() { fun testGenerateForFile() { val compiler = Clang Logger.info( - "Testing generate for snippet using target: auto, compiler: ${compiler.name}, verbose mode = ${project.settings.storedSettings.verbose}") + "Testing generate for snippet using target: auto, compiler: ${Clang.name}, verbose mode = ${project.settings.storedSettings.verbose}" + ) compiler.buildProject(projectPath, buildDirName) fixture.configureFromTempProjectFile("snippet.c") waitForConnection() @@ -24,4 +23,4 @@ class GenerateForIsolatedFileTest : BaseGenerationTestCase() { testsDirectoryPath.assertTestFilesExist(listOf("snippet")) testsDirectoryPath.assertAllFilesNotEmptyRecursively() } -} +} \ No newline at end of file diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/GenerateForLineTest.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/GenerateForLineTest.kt similarity index 75% rename from clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/GenerateForLineTest.kt rename to clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/GenerateForLineTest.kt index f17462561..29078df24 100644 --- a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/GenerateForLineTest.kt +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/GenerateForLineTest.kt @@ -1,16 +1,12 @@ -package org.utbot.cpp.clion.plugin.tests +package org.utbot.cpp.clion.plugin.tests.integrationTests -import com.intellij.openapi.editor.Editor import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.tinylog.kotlin.Logger -import org.utbot.cpp.clion.plugin.BaseGenerationTestCase -import org.utbot.cpp.clion.plugin.Clang -import org.utbot.cpp.clion.plugin.CppCompiler -import org.utbot.cpp.clion.plugin.Gcc import org.utbot.cpp.clion.plugin.assertAllFilesNotEmptyRecursively import org.utbot.cpp.clion.plugin.assertFileOrDirExists import org.utbot.cpp.clion.plugin.assertTestFilesExist +import org.utbot.cpp.clion.plugin.moveCursorToLine import org.utbot.cpp.clion.plugin.settings.settings @Disabled("Disabled as a flaky test until #483 is fixed") @@ -48,14 +44,9 @@ class GenerateForLineTest: BaseGenerationTestCase() { doTest(IF_IN_MAX_FUNCTION_LINE, compiler = Gcc) } - private fun Editor.moveCursorToLine(lineNumber: Int) { - this.caretModel.moveToOffset(this.document.getLineStartOffset(lineNumber)) - } - companion object { - // line numbers are assumed to start from 0 - const val HEAD_OF_MAX_LINE = 2 - const val IF_IN_MAX_FUNCTION_LINE = 3 + // line numbers are assumed to start from 1 + const val HEAD_OF_MAX_LINE = 3 + const val IF_IN_MAX_FUNCTION_LINE = 2 } -} - +} \ No newline at end of file diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/GenerateForProjectTest.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/GenerateForProjectTest.kt similarity index 83% rename from clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/GenerateForProjectTest.kt rename to clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/GenerateForProjectTest.kt index ceffb7333..67d4a3ee3 100644 --- a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/GenerateForProjectTest.kt +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/GenerateForProjectTest.kt @@ -1,13 +1,9 @@ -package org.utbot.cpp.clion.plugin.tests +package org.utbot.cpp.clion.plugin.tests.integrationTests import com.intellij.openapi.components.service import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.tinylog.kotlin.Logger -import org.utbot.cpp.clion.plugin.BaseGenerationTestCase -import org.utbot.cpp.clion.plugin.Clang -import org.utbot.cpp.clion.plugin.CppCompiler -import org.utbot.cpp.clion.plugin.Gcc import org.utbot.cpp.clion.plugin.actions.generate.GenerateForProjectAction import org.utbot.cpp.clion.plugin.assertFileOrDirExists import org.utbot.cpp.clion.plugin.assertTestFilesExist @@ -17,7 +13,7 @@ import org.utbot.cpp.clion.plugin.ui.utbotToolWindow.targetToolWindow.UTBotTarge @Disabled("Disabled as a flaky test until #483 is fixed") class GenerateForProjectTest : BaseGenerationTestCase() { private fun doTest(compiler: CppCompiler, isVerbose: Boolean, targetNames: List = emptyList()) { - Logger.info ( "Testing generate for project with ${compiler.name}, verbose mode: $isVerbose, and targets: ${targetNames.joinToString()}") + Logger.info("Testing generate for project with ${compiler.name}, verbose mode: $isVerbose, and targets: ${targetNames.joinToString()}") project.settings.storedSettings.verbose = isVerbose compiler.buildProject(projectPath, buildDirName) @@ -55,4 +51,4 @@ class GenerateForProjectTest : BaseGenerationTestCase() { fun `test generate for project with gcc, non-verbose mode`() { doTest(Gcc, false, emptyList()) } -} +} \ No newline at end of file diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/utilsTests/ToWslFormatTest.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/utilsTests/ToWslFormatTest.kt index 1590cf452..bb23e8e32 100644 --- a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/utilsTests/ToWslFormatTest.kt +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/utilsTests/ToWslFormatTest.kt @@ -5,7 +5,6 @@ import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource import org.utbot.cpp.clion.plugin.utils.convertPathToWslFormat -import org.utbot.cpp.clion.plugin.utils.toWslFormatIfNeeded class ToWslFormatTest { @MethodSource("inputData") From 296a0711ecf006bf9165f1f52297fb720a89f05f Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Sat, 8 Oct 2022 01:59:52 +0300 Subject: [PATCH 15/24] fix tests --- clion-plugin/build.gradle.kts | 2 +- .../cpp/clion/plugin/UTBotStartupActivity.kt | 2 ++ .../generate/BaseGenerateTestsAction.kt | 4 +++- .../cpp/clion/plugin/client/ManagedClient.kt | 4 ++++ .../plugin/client/channels/LogChannelImpl.kt | 9 +++++--- .../plugin/client/handlers/StreamHandler.kt | 1 + .../plugin/ui/services/OutputProvider.kt | 4 ++++ .../utbotToolWindow/UTBotToolWindowFactory.kt | 1 + .../UTBotTargetsController.kt | 21 ++++++++++--------- .../buildingRequestsTests/BaseBuildingTest.kt | 6 ++++++ .../BaseGenerationTestCase.kt | 2 +- .../src/test/resources/tinylog.properties | 1 + 12 files changed, 41 insertions(+), 16 deletions(-) diff --git a/clion-plugin/build.gradle.kts b/clion-plugin/build.gradle.kts index 86d6ba54e..e23d6845a 100644 --- a/clion-plugin/build.gradle.kts +++ b/clion-plugin/build.gradle.kts @@ -196,7 +196,7 @@ tasks { setScanForTestClasses(false) // Only run tests from classes that end with "Test" include("**/*Test.class") - exclude("**/*BaseGenerationTestCaseTest.class") + exclude("**/*BaseGenerationTestCaseTest.class", "**/*BaseBuildingTest.class") systemProperty("idea.log.debug.categories", true) systemProperty("idea.log.trace.categories", true) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/UTBotStartupActivity.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/UTBotStartupActivity.kt index 842964ab3..20ea648e7 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/UTBotStartupActivity.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/UTBotStartupActivity.kt @@ -4,6 +4,7 @@ import com.intellij.ide.util.RunOnceUtil import com.intellij.openapi.components.service import com.intellij.openapi.project.Project import com.intellij.openapi.startup.StartupActivity +import org.tinylog.kotlin.Logger import org.utbot.cpp.clion.plugin.client.ManagedClient import org.utbot.cpp.clion.plugin.settings.settings @@ -12,6 +13,7 @@ class UTBotStartupActivity : StartupActivity { // We initialize Client here, so that initialization will not happen // when user issues first generation request which would cause a UI freeze. if (project.settings.storedSettings.isPluginEnabled) { + Logger.info("startup activity is run: Initializing client") initializeClient(project) guessPathsOnFirstOpen(project) } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/BaseGenerateTestsAction.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/BaseGenerateTestsAction.kt index 38f435213..ee6dda971 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/BaseGenerateTestsAction.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/actions/generate/BaseGenerateTestsAction.kt @@ -2,6 +2,8 @@ package org.utbot.cpp.clion.plugin.actions.generate import com.intellij.openapi.actionSystem.AnActionEvent import org.utbot.cpp.clion.plugin.actions.UTBotBaseAction +import org.utbot.cpp.clion.plugin.client.ManagedClient +import org.utbot.cpp.clion.plugin.utils.activeProject import org.utbot.cpp.clion.plugin.utils.client abstract class BaseGenerateTestsAction : UTBotBaseAction() { @@ -10,7 +12,7 @@ abstract class BaseGenerateTestsAction : UTBotBaseAction() { val isDefined: Boolean = isDefined(e) e.presentation.isVisible = isDefined - e.presentation.isEnabled = isDefined && e.client.isServerAvailable() + e.presentation.isEnabled = isDefined && ManagedClient.isConnectedToServer(e.activeProject()) } /** diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/ManagedClient.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/ManagedClient.kt index 982c703da..fca3efa21 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/ManagedClient.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/ManagedClient.kt @@ -2,6 +2,7 @@ package org.utbot.cpp.clion.plugin.client import com.intellij.openapi.Disposable import com.intellij.openapi.components.Service +import com.intellij.openapi.components.serviceIfCreated import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import org.utbot.cpp.clion.plugin.client.channels.GTestLogChannelImpl @@ -26,6 +27,7 @@ class ManagedClient(val project: Project) : Disposable { private val clientId = generateClientID() private val loggingChannels = listOf(GTestLogChannelImpl(project), ServerLogChannelImpl(project)) val isPluginEnabled: Boolean get() = project.settings.storedSettings.isPluginEnabled + // if plugin is disabled then Client is null private var client: Client? = if (isPluginEnabled) createNewClient() else null @@ -107,6 +109,8 @@ class ManagedClient(val project: Project) : Disposable { } companion object { + fun isConnectedToServer(project: Project) = + project.serviceIfCreated()?.isServerAvailable() ?: false const val RANDOM_SEQUENCE_MAX_VALUE = 10 const val RANDOM_SEQUENCE_LENGTH = 5 } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/channels/LogChannelImpl.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/channels/LogChannelImpl.kt index 4ced8c471..c59aea6e3 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/channels/LogChannelImpl.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/channels/LogChannelImpl.kt @@ -18,12 +18,15 @@ abstract class LogChannelImpl(val project: Project) : LogChannel { abstract val name: String abstract val logLevel: String - val console: UTBotConsole by lazy { createConsole() } + // because this function is called asynchronously (we call it from invokeOnEdt which is async) + // it may be called when project is disposed or other services are disposed -- this is very unlikely in production + // but possible in tests, so we do nothing if this happens + private val console: UTBotConsole? by lazy { if (project.isDisposed) null else createConsole() } abstract suspend fun open(stub: TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub): Flow abstract suspend fun close(stub: TestsGenServiceGrpcKt.TestsGenServiceCoroutineStub) - abstract fun createConsole(): UTBotConsole + abstract fun createConsole(): UTBotConsole? override fun toString(): String = name @@ -37,6 +40,6 @@ abstract class LogChannelImpl(val project: Project) : LogChannel { open(stub) .catch { cause -> logger.error { "Exception in log channel: $name \n$cause" } } - .collect { invokeOnEdt { console.info(it.message) } } + .collect { invokeOnEdt { console?.info(it.message) } } } } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt index 659c5d3d2..9a2407a55 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.cancellable import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onCompletion +import org.tinylog.kotlin.Logger /** * Base class for handling stream of server responses diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/services/OutputProvider.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/services/OutputProvider.kt index 5a7675553..181a2813a 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/services/OutputProvider.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/services/OutputProvider.kt @@ -65,4 +65,8 @@ class OutputProvider(val project: Project) : Disposable { } } } + + companion object { + + } } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/UTBotToolWindowFactory.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/UTBotToolWindowFactory.kt index 7947b0635..6bc664bbb 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/UTBotToolWindowFactory.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/UTBotToolWindowFactory.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.wm.ToolWindowFactory import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.ui.utbotToolWindow.logsToolWindow.ConsoleToolWindow import org.utbot.cpp.clion.plugin.ui.utbotToolWindow.targetToolWindow.UTBotTargetsController +import org.utbot.cpp.clion.plugin.utils.invokeOnEdt class UTBotToolWindowFactory : ToolWindowFactory, DumbAware { private val logger = Logger.getInstance(this::class.java) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTargetsController.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTargetsController.kt index dfeae5a26..8cb3ee70f 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTargetsController.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/utbotToolWindow/targetToolWindow/UTBotTargetsController.kt @@ -26,7 +26,6 @@ class UTBotTargetsController(val project: Project) { private var areTargetsUpToDate = false private val targetsUiModel = CollectionListModel(mutableListOf()) - private val client = project.service() val targetsToolWindow: UTBotTargetsToolWindow by lazy { UTBotTargetsToolWindow(targetsUiModel, this) } val targets: List @@ -39,12 +38,14 @@ class UTBotTargetsController(val project: Project) { fun isTargetUpToDate(path: String): Boolean = areTargetsUpToDate && targets.find { it.path == path } != null fun requestTargetsFromServer() { + invokeOnEdt { requestTargetsEdt() } + } + + private fun requestTargetsEdt() { areTargetsUpToDate = false - invokeOnEdt { - targetsUiModel.removeAll() - targetsToolWindow.setBusy(true) - } + targetsUiModel.removeAll() + targetsToolWindow.setBusy(true) ProjectTargetsRequest( GrpcRequestBuilderFactory(project).createProjectTargetsRequestBuilder(), project, @@ -76,14 +77,14 @@ class UTBotTargetsController(val project: Project) { targetsToolWindow.setBusy(false) } }).let { targetsRequest -> - //todo: throw exception from client and handle it here + val client = project.service() + if (!client.isServerAvailable()) { logger.error { "Could not request targets from server: server is unavailable!" } - invokeOnEdt { - targetsToolWindow.setBusy(false) - } + targetsToolWindow.setBusy(false) return } + logger.trace { "Requesting project targets from server!" } client.executeRequest(targetsRequest) } @@ -110,7 +111,7 @@ class UTBotTargetsController(val project: Project) { if (newStatus != oldStatus) { // todo: remove this, when ci is fixed if (!ApplicationManager.getApplication().isUnitTestMode) - requestTargetsFromServer() + invokeOnEdt(::requestTargetsFromServer) } } } diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/BaseBuildingTest.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/BaseBuildingTest.kt index 7f2b8a071..2883face7 100644 --- a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/BaseBuildingTest.kt +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/buildingRequestsTests/BaseBuildingTest.kt @@ -4,6 +4,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.ex.ActionUtil import com.intellij.openapi.project.Project import com.intellij.testFramework.fixtures.CodeInsightTestFixture +import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.extension.ExtendWith import org.utbot.cpp.clion.plugin.SwingEdtInterceptor import org.utbot.cpp.clion.plugin.actions.generate.GenerateForLineAction @@ -41,6 +42,11 @@ open class BaseBuildingTest { } } + @AfterEach + fun tearDown() { + fixture.tearDown() + } + // HELPER METHODS: protected fun createExpectedProjectContext(remotePath: String): Testgen.ProjectContext { diff --git a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/BaseGenerationTestCase.kt b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/BaseGenerationTestCase.kt index 4dec93a42..3db3cee0a 100644 --- a/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/BaseGenerationTestCase.kt +++ b/clion-plugin/src/test/kotlin/org/utbot/cpp/clion/plugin/tests/integrationTests/BaseGenerationTestCase.kt @@ -74,12 +74,12 @@ abstract class BaseGenerationTestCase { } protected fun waitForConnection(timeout: Long = 10000L) { + Logger.info { "Waiting for connection to server!" } runBlocking { try { withTimeout(timeout) { while (!client.isServerAvailable()) { delay(1000L) - Logger.info { "Waiting for connection to server!" } } } } catch (_: TimeoutCancellationException) { diff --git a/clion-plugin/src/test/resources/tinylog.properties b/clion-plugin/src/test/resources/tinylog.properties index 0cf7b7c28..c811d6215 100644 --- a/clion-plugin/src/test/resources/tinylog.properties +++ b/clion-plugin/src/test/resources/tinylog.properties @@ -1,2 +1,3 @@ writer = console +writer.level = ${PLUGIN_LOG_LEVEL:info} writer.format = {date: HH:mm:ss.SSS} | {file}: {line} [{thread}] {pipe}{level}{pipe} {message} From ca17280c2ccc679da0b8f3d67170912dafcb2d3b Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Sun, 9 Oct 2022 17:07:02 +0300 Subject: [PATCH 16/24] Fix notifications messages, fix log level, relative paths - Relative paths entered by user are striped of leading slashed /\ - fixed log depth - wrong stacktrace was taken - changed notification messages' texts --- .../utbot/cpp/clion/plugin/client/Client.kt | 23 ++++------------ .../plugin/client/handlers/StreamHandler.kt | 1 - .../handlers/StreamHandlerWithProgress.kt | 8 +++--- .../client/handlers/TestsStreamHandler.kt | 4 +++ .../plugin/client/logger/ClientLogger.kt | 26 +++++++++++-------- .../clion/plugin/grpc/GrpcRequestBuilder.kt | 4 +-- .../settings/UTBotProjectStoredSettings.kt | 5 ++-- .../utbot/cpp/clion/plugin/utils/PathUtils.kt | 2 ++ .../main/resources/messages/UTBot.properties | 11 ++++---- 9 files changed, 41 insertions(+), 43 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt index 89055c03c..716837629 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt @@ -18,6 +18,7 @@ import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withTimeout import org.jetbrains.annotations.TestOnly import org.utbot.cpp.clion.plugin.UTBot +import org.utbot.cpp.clion.plugin.actions.ShowSettingsAction import org.utbot.cpp.clion.plugin.client.channels.LogChannel import org.utbot.cpp.clion.plugin.grpc.IllegalPathException import org.utbot.cpp.clion.plugin.client.logger.ClientLogger @@ -103,24 +104,9 @@ class Client( UTBot.message("notify.cancelled", id, e.message ?: ""), project ) - Status.FAILED_PRECONDITION.code -> notifyError( + Status.FAILED_PRECONDITION.code, Status.INTERNAL.code, Status.UNIMPLEMENTED.code, Status.INVALID_ARGUMENT.code -> notifyError( UTBot.message("notify.title.failed.precondition"), - UTBot.message("notify.failed.precondition", e.message ?: "", id), - project - ) - Status.INTERNAL.code -> notifyError( - UTBot.message("notify.title.internal.error"), - UTBot.message("notify.internal.error", request, e.message ?: ""), - project - ) - Status.UNIMPLEMENTED.code -> notifyError( - UTBot.message("notify.title.server.error"), - UTBot.message("notify.unimplemented", id, e.message ?: ""), - project - ) - Status.INVALID_ARGUMENT.code -> notifyError( - UTBot.message("notify.title.invalid.argument"), - UTBot.message("notify.invalid.argument", e.message ?: "", id), + UTBot.message("notify.request.failed", e.message ?: "", id), project ) else -> notifyError( @@ -133,7 +119,8 @@ class Client( notifyError( UTBot.message("notify.bad.settings.title"), UTBot.message("notify.bad.path", e.message ?: ""), - project + project, + ShowSettingsAction() ) } } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt index 9a2407a55..659c5d3d2 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandler.kt @@ -5,7 +5,6 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.cancellable import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onCompletion -import org.tinylog.kotlin.Logger /** * Base class for handling stream of server responses diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandlerWithProgress.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandlerWithProgress.kt index 2c92fe7f0..6ba7d03ff 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandlerWithProgress.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandlerWithProgress.kt @@ -17,7 +17,7 @@ abstract class StreamHandlerWithProgress( progressName: String, cancellationJob: Job ): StreamHandler(project, grpcStream) { - private val indicator = UTBotRequestProgressIndicator(progressName, cancellationJob, project) + protected val indicator = UTBotRequestProgressIndicator(progressName, cancellationJob, project) override fun onStart() { super.onStart() @@ -49,10 +49,10 @@ abstract class StreamHandlerWithProgress( abstract fun T.getProgress(): Util.Progress override fun onCompletion(exception: Throwable?) { + invokeOnEdt { + indicator.stop() + } if (exception != null) { - invokeOnEdt { - indicator.stop() - } throw exception } } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt index 04b2697f7..56730b745 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt @@ -10,6 +10,7 @@ import org.utbot.cpp.clion.plugin.settings.settings import org.utbot.cpp.clion.plugin.ui.services.TestsResultsStorage import org.utbot.cpp.clion.plugin.utils.convertFromRemotePathIfNeeded import org.utbot.cpp.clion.plugin.utils.createFileWithText +import org.utbot.cpp.clion.plugin.utils.invokeOnEdt import org.utbot.cpp.clion.plugin.utils.isSarifReport import org.utbot.cpp.clion.plugin.utils.logger import org.utbot.cpp.clion.plugin.utils.markDirtyAndRefresh @@ -60,6 +61,9 @@ class TestsStreamHandler( } override fun onCompletion(exception: Throwable?) { + invokeOnEdt { + indicator.stop() + } if (exception != null ) { if (exception !is CancellationException) onError(exception) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/logger/ClientLogger.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/logger/ClientLogger.kt index 3e92b66ee..854cc6130 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/logger/ClientLogger.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/logger/ClientLogger.kt @@ -5,27 +5,31 @@ import com.intellij.openapi.components.Service import com.intellij.openapi.project.Project interface Logger { - fun info(message: String, depth: Int = 3) = log({ message }, LogLevel.INFO, depth) + fun info(message: String, depth: Int = DEFAULT_LOG_DEPTH) = log({ message }, LogLevel.INFO, depth) - fun warn(message: String, depth: Int = 3) = log({ message }, LogLevel.WARN, depth) + fun warn(message: String, depth: Int = DEFAULT_LOG_DEPTH) = log({ message }, LogLevel.WARN, depth) - fun error(message: String, depth: Int = 3) = log({ message }, LogLevel.ERROR, depth) + fun error(message: String, depth: Int = DEFAULT_LOG_DEPTH) = log({ message }, LogLevel.ERROR, depth) - fun debug(message: String, depth: Int = 3) = log({ message }, LogLevel.DEBUG, depth) + fun debug(message: String, depth: Int = DEFAULT_LOG_DEPTH) = log({ message }, LogLevel.DEBUG, depth) - fun trace(message: String, depth: Int = 3) = log({ message }, LogLevel.TRACE, depth) + fun trace(message: String, depth: Int = DEFAULT_LOG_DEPTH) = log({ message }, LogLevel.TRACE, depth) - fun info(depth: Int = 3, message: () -> String) = log(message, LogLevel.INFO, depth) + fun info(depth: Int = DEFAULT_LOG_DEPTH, message: () -> String) = log(message, LogLevel.INFO, depth) - fun warn(depth: Int = 3, message: () -> String) = log(message, LogLevel.WARN, depth) + fun warn(depth: Int = DEFAULT_LOG_DEPTH, message: () -> String) = log(message, LogLevel.WARN, depth) - fun error(depth: Int = 3, message: () -> String) = log(message, LogLevel.ERROR, depth) + fun error(depth: Int = DEFAULT_LOG_DEPTH, message: () -> String) = log(message, LogLevel.ERROR, depth) - fun debug(depth: Int = 3, message: () -> String) = log(message, LogLevel.DEBUG, depth) + fun debug(depth: Int = DEFAULT_LOG_DEPTH, message: () -> String) = log(message, LogLevel.DEBUG, depth) - fun trace(depth: Int = 3, message: () -> String) = log(message, LogLevel.TRACE, depth) + fun trace(depth: Int = DEFAULT_LOG_DEPTH, message: () -> String) = log(message, LogLevel.TRACE, depth) - fun log(messageSupplier: () -> (String), level: LogLevel, depth: Int = 3) + fun log(messageSupplier: () -> (String), level: LogLevel, depth: Int = DEFAULT_LOG_DEPTH) + + companion object { + const val DEFAULT_LOG_DEPTH = 4 + } } @Service diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilder.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilder.kt index f0ba6faab..d6479bb7c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilder.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilder.kt @@ -10,8 +10,8 @@ import java.nio.file.Paths abstract class ClientException(message: String) : Exception(message) -class IllegalPathException(val path: String, val info: String) : - ClientException("Bad path: $path. Info: $info") +class IllegalPathException(val path: String, val pathName: String, message: String? = null) : + ClientException(message ?: "Illegal: $pathName: $path") data class RemoteMapping(val localProjectPath: String, val remoteProjectPath: String, val shouldConvert: Boolean = true) { diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotProjectStoredSettings.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotProjectStoredSettings.kt index cfce4b7c3..063bc4b76 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotProjectStoredSettings.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/settings/UTBotProjectStoredSettings.kt @@ -13,6 +13,7 @@ import org.utbot.cpp.clion.plugin.ui.utbotToolWindow.targetToolWindow.UTBotTarge import org.utbot.cpp.clion.plugin.ui.wizard.UTBotWizard import org.utbot.cpp.clion.plugin.utils.invokeOnEdt import org.utbot.cpp.clion.plugin.utils.path +import org.utbot.cpp.clion.plugin.utils.stripLeadingSlashes import java.nio.file.Paths /** @@ -101,7 +102,7 @@ class UTBotProjectStoredSettings(val project: Project) : PersistentStateComponen } var testDirRelativePath: String - get() = myState.testsDirRelativePath + get() = myState.testsDirRelativePath.stripLeadingSlashes() set(value) { myState.testsDirRelativePath = value } @@ -129,7 +130,7 @@ class UTBotProjectStoredSettings(val project: Project) : PersistentStateComponen Paths.get(project.path).relativize(Paths.get(targetPath)).toString() var buildDirRelativePath: String - get() = myState.buildDirRelativePath + get() = myState.buildDirRelativePath.stripLeadingSlashes() set(value) { myState.buildDirRelativePath = value } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/PathUtils.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/PathUtils.kt index f9cbef426..e9ad53d94 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/PathUtils.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/utils/PathUtils.kt @@ -184,6 +184,8 @@ private fun removeSuffix(path: Path, suffix: String): Path { ) } +fun String.stripLeadingSlashes() = this.replace("""^[\\/]+""".toRegex(), "") + val VirtualFile.localPath: Path get() = this.fileSystem.getNioPath(this) ?: error("Could not get filesystem path from $this") diff --git a/clion-plugin/src/main/resources/messages/UTBot.properties b/clion-plugin/src/main/resources/messages/UTBot.properties index 83a6e30f4..2ddf58983 100644 --- a/clion-plugin/src/main/resources/messages/UTBot.properties +++ b/clion-plugin/src/main/resources/messages/UTBot.properties @@ -78,19 +78,20 @@ notify.title.unknown.server.error=UTBot: Unknown Server Error notify.unknown.server.error=Server threw an unknown exception notify.title.cancelled=UTBot: Request was cancelled #0 - exception message, #1 - request id -notify.cancelled={0}. Request: "{1}" cancelled. +notify.cancelled={0}
Request "{1}" cancelled. +notify.request.failed={0}
Request "{1}" failed notify.title.failed.precondition=UTBot: Failed Precondition -notify.failed.precondition={0}. Request: "{1}" failed. +notify.failed.precondition={0}
Request "{1}" failed. notify.title.internal.error=UTBot: Server internal error #0 - exception message, #1 - request id -notify.internal.error={0}. Request: "{1}" failed. +notify.internal.error={0}
Request "{1}" failed. #0 - exception message, #1 - request id -notify.unimplemented={0}. Request: "{1}" failed. +notify.unimplemented={0}
Request "{1}" failed. notify.title.error=UTBot: Error notify.title.server.error=UTBot: Server Error notify.title.invalid.argument=UTBot: Invalid input #0 - exception message, #1 - request id -notify.invalid.argument={0}. Request: "{1}" failed. +notify.invalid.argument={0}
Request "{1}" failed. notify.coverage.received.title=UTBot: Coverage gathered notify.coverage.received=Coverage response received from server. notify.build.dir.created.title=UTBot: Build Directory was created From 8911588dbd34ef435dacbce785ccb9a817cf5d92 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Mon, 10 Oct 2022 14:38:17 +0300 Subject: [PATCH 17/24] Remove empty companion --- .../org/utbot/cpp/clion/plugin/ui/services/OutputProvider.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/services/OutputProvider.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/services/OutputProvider.kt index 181a2813a..5a7675553 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/services/OutputProvider.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/services/OutputProvider.kt @@ -65,8 +65,4 @@ class OutputProvider(val project: Project) : Disposable { } } } - - companion object { - - } } From 655fc4fd85bbb5c7f4976fcae744546871fc0259 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Mon, 10 Oct 2022 21:07:39 +0300 Subject: [PATCH 18/24] remove unused deps --- clion-plugin/build.gradle.kts | 2 -- 1 file changed, 2 deletions(-) diff --git a/clion-plugin/build.gradle.kts b/clion-plugin/build.gradle.kts index e23d6845a..3a1ee65fe 100644 --- a/clion-plugin/build.gradle.kts +++ b/clion-plugin/build.gradle.kts @@ -76,8 +76,6 @@ dependencies { // testing with JUnit 5 testImplementation(platform("org.junit:junit-bom:5.8.2")) testImplementation("org.junit.jupiter:junit-jupiter") - testImplementation("org.mockito.kotlin:mockito-kotlin:4.0.0") - testImplementation("io.mockk:mockk:1.13.2") } sourceSets { From 23fcce00b82c9ebfb4aa5dffecb125c0ff616773 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Mon, 10 Oct 2022 21:11:21 +0300 Subject: [PATCH 19/24] change texts --- .../kotlin/org/utbot/cpp/clion/plugin/client/Client.kt | 2 +- .../src/main/resources/messages/UTBot.properties | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt index 716837629..d8539da2d 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/Client.kt @@ -105,7 +105,7 @@ class Client( project ) Status.FAILED_PRECONDITION.code, Status.INTERNAL.code, Status.UNIMPLEMENTED.code, Status.INVALID_ARGUMENT.code -> notifyError( - UTBot.message("notify.title.failed.precondition"), + UTBot.message("notify.title.error"), UTBot.message("notify.request.failed", e.message ?: "", id), project ) diff --git a/clion-plugin/src/main/resources/messages/UTBot.properties b/clion-plugin/src/main/resources/messages/UTBot.properties index 2ddf58983..107ae5c25 100644 --- a/clion-plugin/src/main/resources/messages/UTBot.properties +++ b/clion-plugin/src/main/resources/messages/UTBot.properties @@ -81,17 +81,7 @@ notify.title.cancelled=UTBot: Request was cancelled notify.cancelled={0}
Request "{1}" cancelled. notify.request.failed={0}
Request "{1}" failed notify.title.failed.precondition=UTBot: Failed Precondition -notify.failed.precondition={0}
Request "{1}" failed. -notify.title.internal.error=UTBot: Server internal error -#0 - exception message, #1 - request id -notify.internal.error={0}
Request "{1}" failed. -#0 - exception message, #1 - request id -notify.unimplemented={0}
Request "{1}" failed. notify.title.error=UTBot: Error -notify.title.server.error=UTBot: Server Error -notify.title.invalid.argument=UTBot: Invalid input -#0 - exception message, #1 - request id -notify.invalid.argument={0}
Request "{1}" failed. notify.coverage.received.title=UTBot: Coverage gathered notify.coverage.received=Coverage response received from server. notify.build.dir.created.title=UTBot: Build Directory was created From 55f495a4f97c288ef93f5abfd1208618e9277a19 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Tue, 11 Oct 2022 12:40:33 +0300 Subject: [PATCH 20/24] renames, small refactorings --- .../plugin/client/handlers/CoverageAndResultsHandler.kt | 2 -- .../plugin/client/handlers/StreamHandlerWithProgress.kt | 2 +- .../clion/plugin/client/handlers/TestsStreamHandler.kt | 8 +++----- .../clion/plugin/client/requests/test/BaseTestsRequest.kt | 5 +---- .../cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt | 3 +-- 5 files changed, 6 insertions(+), 14 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/CoverageAndResultsHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/CoverageAndResultsHandler.kt index ac52369e8..3fe2a987a 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/CoverageAndResultsHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/CoverageAndResultsHandler.kt @@ -102,8 +102,6 @@ class CoverageAndResultsHandler( } private fun notifyCoverageReceived() { - val actions = mutableListOf() - sourceFilePath?.let { actions.add(FocusAction(it)) } notifyInfo( UTBot.message("notify.coverage.received.title"), UTBot.message("notify.coverage.received"), diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandlerWithProgress.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandlerWithProgress.kt index 6ba7d03ff..3ecfd6cde 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandlerWithProgress.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/StreamHandlerWithProgress.kt @@ -50,7 +50,7 @@ abstract class StreamHandlerWithProgress( override fun onCompletion(exception: Throwable?) { invokeOnEdt { - indicator.stop() + indicator.stopShowingProgressInUI() } if (exception != null) { throw exception diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt index 56730b745..46683d9de 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt @@ -28,7 +28,6 @@ class TestsStreamHandler( progressName: String, cancellationJob: Job, private val onSuccess: (List) -> Unit = {}, - private val onError: (Throwable) -> Unit = {} ) : StreamHandlerWithProgress(project, grpcStream, progressName, cancellationJob) { private val myGeneratedTestFilesLocalFS: MutableList = mutableListOf() @@ -62,11 +61,10 @@ class TestsStreamHandler( override fun onCompletion(exception: Throwable?) { invokeOnEdt { - indicator.stop() + indicator.stopShowingProgressInUI() } - if (exception != null ) { - if (exception !is CancellationException) - onError(exception) + if (exception != null && exception !is CancellationException) { + throw exception } else { onSuccess(myGeneratedTestFilesLocalFS) } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt index 06b3dce91..329c38b46 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/requests/test/BaseTestsRequest.kt @@ -31,7 +31,6 @@ abstract class BaseTestsRequest(params: GrpcRequestBuilder, project: Proje progressName, cancellationJob, ::notifySuccess, - ::notifyError ).handle() } } @@ -52,6 +51,4 @@ abstract class BaseTestsRequest(params: GrpcRequestBuilder, project: Proje FocusAction(it) }) } - - open fun notifyError(cause: Throwable) {} -} \ No newline at end of file +} diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt index b3c6c219a..460cf3283 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt @@ -31,8 +31,7 @@ class UTBotRequestProgressIndicator( super.start() } - override fun stop() { - requestJob?.cancel() + fun stopShowingProgressInUI() { finish() super.stop() } From 2790e98a985c823582eaa5e68c60d6865bf4ee9d Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Fri, 14 Oct 2022 02:06:07 +0300 Subject: [PATCH 21/24] stop indicator only if started --- .../plugin/ui/UTBotRequestProgressIndicator.kt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt index 460cf3283..949cf2025 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt @@ -23,6 +23,7 @@ class UTBotRequestProgressIndicator( } override fun start() { + // start showing progress in the ui val frame = WindowManagerEx.getInstanceEx().findFrameFor(project) ?: return val statusBar = frame.statusBar as? StatusBarEx ?: return invokeOnEdt { @@ -32,15 +33,21 @@ class UTBotRequestProgressIndicator( } fun stopShowingProgressInUI() { - finish() - super.stop() + // stop can be called only if progress was started (=running) + if (isRunning) { + finish() + super.stop() + } } - fun finish() = finish(requestTask) + fun finish() { + if (isRunning) + finish(requestTask) + } override fun cancel() { requestJob?.cancel() - finish(requestTask) + finish() super.cancel() notifyInfo( UTBot.message("notify.cancelled.request.title"), From 29b019f957a17b480e10806b60ba63820eb3b761 Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Sun, 16 Oct 2022 22:45:36 +0300 Subject: [PATCH 22/24] Start indicator even if no statusbar - now progress indicator is started even if there is no statusBar to display progress - fixed condition in TestsStreamHandler for showing notification --- .../plugin/client/handlers/TestsStreamHandler.kt | 2 +- .../clion/plugin/ui/UTBotRequestProgressIndicator.kt | 12 +++++------- .../src/main/resources/messages/UTBot.properties | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt index 46683d9de..6129448f3 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/client/handlers/TestsStreamHandler.kt @@ -65,7 +65,7 @@ class TestsStreamHandler( } if (exception != null && exception !is CancellationException) { throw exception - } else { + } else if (exception !is CancellationException) { onSuccess(myGeneratedTestFilesLocalFS) } } diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt index 949cf2025..a3db5664b 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/ui/UTBotRequestProgressIndicator.kt @@ -10,6 +10,7 @@ import org.utbot.cpp.clion.plugin.UTBot import org.utbot.cpp.clion.plugin.utils.invokeOnEdt import org.utbot.cpp.clion.plugin.utils.notifyInfo +// todo: remove this class and use new api for coroutines progress: TaskCancellation, withBackgroundProgressIndicator class UTBotRequestProgressIndicator( private val taskDisplayName: String, private val requestJob: Job? = null, @@ -24,25 +25,22 @@ class UTBotRequestProgressIndicator( override fun start() { // start showing progress in the ui + super.start() val frame = WindowManagerEx.getInstanceEx().findFrameFor(project) ?: return val statusBar = frame.statusBar as? StatusBarEx ?: return invokeOnEdt { statusBar.addProgress(this, requestTask) } - super.start() } fun stopShowingProgressInUI() { // stop can be called only if progress was started (=running) - if (isRunning) { - finish() - super.stop() - } + finish() + super.stop() } fun finish() { - if (isRunning) - finish(requestTask) + finish(requestTask) } override fun cancel() { diff --git a/clion-plugin/src/main/resources/messages/UTBot.properties b/clion-plugin/src/main/resources/messages/UTBot.properties index 107ae5c25..9e9241292 100644 --- a/clion-plugin/src/main/resources/messages/UTBot.properties +++ b/clion-plugin/src/main/resources/messages/UTBot.properties @@ -3,7 +3,7 @@ projectConfigure.generate.buildDir=Generate build directory projectConfigure.generate.json=Generate Missing JSON Files projectConfigure.reconfigure=Reset cache and configure project wizard.show=Quickstart wizard -settings.project.sourcePaths=Source paths +settings.project.sourcePaths=Source paths: settings.project.buildDir=Build directory: settings.project.target=target path: settings.project.target.wrong.conversion=Possibly wrong target path. Could not create relative path from remote path From 872fe815031d70e10436c4d7d8071338888e2c1e Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Mon, 17 Oct 2022 16:24:30 +0300 Subject: [PATCH 23/24] fix typos --- .../org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilder.kt | 2 +- clion-plugin/src/main/resources/messages/UTBot.properties | 1 - vscode-plugin/.vscode/settings.json | 3 ++- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilder.kt b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilder.kt index d6479bb7c..39c458f7c 100644 --- a/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilder.kt +++ b/clion-plugin/src/main/kotlin/org/utbot/cpp/clion/plugin/grpc/GrpcRequestBuilder.kt @@ -24,7 +24,7 @@ data class RemoteMapping(val localProjectPath: String, val remoteProjectPath: St val remoteProjectNioPath = try { Paths.get(remoteProjectPath) } catch (_: InvalidPathException) { - throw IllegalPathException(path, UTBot.message("settings.project.remotePath.wrong")) + throw IllegalPathException(remoteProjectPath, UTBot.message("settings.project.remotePath")) } val relativeToProjectNioPath = try { localProjectNioPath.relativize(Paths.get(path)) diff --git a/clion-plugin/src/main/resources/messages/UTBot.properties b/clion-plugin/src/main/resources/messages/UTBot.properties index 9e9241292..98bc7cb0e 100644 --- a/clion-plugin/src/main/resources/messages/UTBot.properties +++ b/clion-plugin/src/main/resources/messages/UTBot.properties @@ -11,7 +11,6 @@ settings.project.testsDir=Tests directory: settings.project.testsDir.wrong=Wrong relative path to tests directory settings.project.sourcePaths.wrong.conversion=Possibly wrong source path. Could not create relative path from remote path or this path settings.project.remotePath=Path to project on remote machine -settings.project.remotePath.wrong=Bad remote path settings.project.serverName=Server host name settings.project.port=Server port settings.project.cmakeOptions=Cmake options diff --git a/vscode-plugin/.vscode/settings.json b/vscode-plugin/.vscode/settings.json index db0bd59cd..2ce37f105 100644 --- a/vscode-plugin/.vscode/settings.json +++ b/vscode-plugin/.vscode/settings.json @@ -8,5 +8,6 @@ }, // Turn off tsc task auto detection since we have the necessary tasks as npm scripts "typescript.tsc.autoDetect": "off", - "git.ignoreLimitWarning": true + "git.ignoreLimitWarning": true, + "unittestbot.paths.sourceDirectories": ".,app_images,icons,media,node_modules,node_modules/.bin,node_modules/@babel,node_modules/@grpc,node_modules/@mapbox,node_modules/@protobufjs,node_modules/@tootallnate,node_modules/@types,node_modules/@typescript-eslint,node_modules/@ungap,node_modules/@vscode,node_modules/abbrev,node_modules/acorn,node_modules/acorn-jsx,node_modules/agent-base,node_modules/ajv,node_modules/ansi-colors,node_modules/ansi-escapes,node_modules/ansi-regex,node_modules/ansi-styles,node_modules/anymatch,node_modules/aproba,node_modules/are-we-there-yet,node_modules/argparse,node_modules/array-uniq,node_modules/astral-regex,node_modules/balanced-match,node_modules/big-integer,node_modules/binary,node_modules/binary-extensions,node_modules/bluebird,node_modules/brace-expansion,node_modules/braces,node_modules/browser-stdout,node_modules/buffer-from,node_modules/buffer-indexof-polyfill,node_modules/buffers,node_modules/callsites,node_modules/camelcase,node_modules/chainsaw,node_modules/chalk,node_modules/chardet,node_modules/chokidar,node_modules/chownr,node_modules/cli-cursor,node_modules/cli-width,node_modules/cliui,node_modules/color-convert,node_modules/color-name,node_modules/color-support,node_modules/concat-map,node_modules/console-control-strings,node_modules/core-util-is,node_modules/cross-spawn,node_modules/date-format,node_modules/debug,node_modules/decamelize,node_modules/deep-is,node_modules/delegates,node_modules/detect-libc,node_modules/diff,node_modules/doctrine,node_modules/duplexer2,node_modules/emittery,node_modules/emoji-regex,node_modules/escalade,node_modules/escape-string-regexp,node_modules/eslint,node_modules/eslint-scope,node_modules/eslint-utils,node_modules/eslint-visitor-keys,node_modules/espree,node_modules/esprima,node_modules/esquery,node_modules/esrecurse,node_modules/estraverse,node_modules/esutils,node_modules/external-editor,node_modules/fast-deep-equal,node_modules/fast-json-stable-stringify,node_modules/fast-levenshtein,node_modules/figures,node_modules/file-entry-cache,node_modules/filepath,node_modules/fill-range,node_modules/find-up,node_modules/flat,node_modules/flat-cache,node_modules/flatted,node_modules/fs-extra,node_modules/fs-minipass,node_modules/fs.realpath,node_modules/fsevents,node_modules/fstream,node_modules/functional-red-black-tree,node_modules/gauge,node_modules/get-caller-file,node_modules/glob,node_modules/glob-parent,node_modules/globals,node_modules/google-protobuf,node_modules/graceful-fs,node_modules/growl,node_modules/grpc,node_modules/grpc-tools,node_modules/grpc_tools_node_protoc_ts,node_modules/handlebars,node_modules/has-flag,node_modules/has-unicode,node_modules/he,node_modules/http-proxy-agent,node_modules/https-proxy-agent,node_modules/iconv-lite,node_modules/ignore,node_modules/import-fresh,node_modules/imurmurhash,node_modules/inflight,node_modules/inherits,node_modules/inquirer,node_modules/is-binary-path,node_modules/is-extglob,node_modules/is-fullwidth-code-point,node_modules/is-glob,node_modules/is-number,node_modules/is-plain-obj,node_modules/is-unicode-supported,node_modules/isarray,node_modules/isexe,node_modules/js-tokens,node_modules/js-yaml,node_modules/json-schema-traverse,node_modules/json-stable-stringify-without-jsonify,node_modules/jsonfile,node_modules/levn,node_modules/listenercount,node_modules/locate-path,node_modules/lodash,node_modules/lodash.camelcase,node_modules/log-symbols,node_modules/log4js,node_modules/long,node_modules/lru-cache,node_modules/make-dir,node_modules/mimic-fn,node_modules/minimatch,node_modules/minimist,node_modules/minipass,node_modules/minizlib,node_modules/mkdirp,node_modules/mocha,node_modules/ms,node_modules/mute-stream,node_modules/nanoid,node_modules/natural-compare,node_modules/neo-async,node_modules/nice-try,node_modules/node-fetch,node_modules/nopt,node_modules/normalize-path,node_modules/npmlog,node_modules/object-assign,node_modules/once,node_modules/onetime,node_modules/optionator,node_modules/os-tmpdir,node_modules/p-limit,node_modules/p-locate,node_modules/parent-module,node_modules/path-exists,node_modules/path-is-absolute,node_modules/path-key,node_modules/picomatch,node_modules/prelude-ls,node_modules/process-nextick-args,node_modules/progress,node_modules/protobufjs,node_modules/punycode,node_modules/randombytes,node_modules/randomstring,node_modules/readable-stream,node_modules/readdirp,node_modules/regexpp,node_modules/require-directory,node_modules/resolve-from,node_modules/restore-cursor,node_modules/rfdc,node_modules/rimraf,node_modules/run-async,node_modules/rxjs,node_modules/safe-buffer,node_modules/safer-buffer,node_modules/semver,node_modules/serialize-javascript,node_modules/set-blocking,node_modules/setimmediate,node_modules/shebang-command,node_modules/shebang-regex,node_modules/signal-exit,node_modules/slice-ansi,node_modules/source-map,node_modules/source-map-support,node_modules/sprintf-js,node_modules/streamroller,node_modules/string-width,node_modules/string_decoder,node_modules/strip-ansi,node_modules/strip-json-comments,node_modules/supports-color,node_modules/table,node_modules/tar,node_modules/text-table,node_modules/through,node_modules/tmp,node_modules/to-regex-range,node_modules/tr46,node_modules/traverse,node_modules/tslib,node_modules/tsutils,node_modules/type-check,node_modules/type-fest,node_modules/typescript,node_modules/uglify-js,node_modules/universalify,node_modules/unzipper,node_modules/uri-js,node_modules/util-deprecate,node_modules/v8-compile-cache,node_modules/webidl-conversions,node_modules/whatwg-url,node_modules/which,node_modules/wide-align,node_modules/word-wrap,node_modules/wordwrap,node_modules/workerpool,node_modules/wrap-ansi,node_modules/wrappy,node_modules/write,node_modules/y18n,node_modules/yallist,node_modules/yargs,node_modules/yargs-parser,node_modules/yargs-unparser,node_modules/yocto-queue,node_modules/@babel/code-frame,node_modules/@babel/helper-validator-identifier,node_modules/@babel/highlight,node_modules/@babel/code-frame/lib,node_modules/@babel/helper-validator-identifier/lib,node_modules/@babel/helper-validator-identifier/scripts,node_modules/@babel/highlight/lib,node_modules/@grpc/proto-loader,node_modules/@grpc/proto-loader/build,node_modules/@grpc/proto-loader/build/bin,node_modules/@grpc/proto-loader/build/src,node_modules/@mapbox/node-pre-gyp,node_modules/@mapbox/node-pre-gyp/bin,node_modules/@mapbox/node-pre-gyp/lib,node_modules/@mapbox/node-pre-gyp/lib/util,node_modules/@mapbox/node-pre-gyp/lib/util/nw-pre-gyp,node_modules/@protobufjs/aspromise,node_modules/@protobufjs/base64,node_modules/@protobufjs/codegen,node_modules/@protobufjs/eventemitter,node_modules/@protobufjs/fetch,node_modules/@protobufjs/float,node_modules/@protobufjs/inquire,node_modules/@protobufjs/path,node_modules/@protobufjs/pool,node_modules/@protobufjs/utf8,node_modules/@protobufjs/aspromise/tests,node_modules/@protobufjs/base64/tests,node_modules/@protobufjs/codegen/tests,node_modules/@protobufjs/eventemitter/tests,node_modules/@protobufjs/fetch/tests,node_modules/@protobufjs/float/bench,node_modules/@protobufjs/float/tests,node_modules/@protobufjs/inquire/tests,node_modules/@protobufjs/inquire/tests/data,node_modules/@protobufjs/path/tests,node_modules/@protobufjs/pool/tests,node_modules/@protobufjs/utf8/tests,node_modules/@protobufjs/utf8/tests/data,node_modules/@tootallnate/once,node_modules/@tootallnate/once/dist,node_modules/@types/eslint-visitor-keys,node_modules/@types/glob,node_modules/@types/google-protobuf,node_modules/@types/json-schema,node_modules/@types/long,node_modules/@types/minimatch,node_modules/@types/mocha,node_modules/@types/node,node_modules/@types/randomstring,node_modules/@types/vscode,node_modules/@types/google-protobuf/google,node_modules/@types/google-protobuf/google/protobuf,node_modules/@types/google-protobuf/google/protobuf/compiler,node_modules/@types/node/assert,node_modules/@types/node/dns,node_modules/@types/node/fs,node_modules/@types/node/stream,node_modules/@types/node/timers,node_modules/@types/node/ts3.6,node_modules/@types/node/util,node_modules/@typescript-eslint/eslint-plugin,node_modules/@typescript-eslint/experimental-utils,node_modules/@typescript-eslint/parser,node_modules/@typescript-eslint/typescript-estree,node_modules/@typescript-eslint/eslint-plugin/dist,node_modules/@typescript-eslint/eslint-plugin/docs,node_modules/@typescript-eslint/eslint-plugin/dist/configs,node_modules/@typescript-eslint/eslint-plugin/dist/rules,node_modules/@typescript-eslint/eslint-plugin/dist/util,node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use,node_modules/@typescript-eslint/eslint-plugin/docs/rules,node_modules/@typescript-eslint/experimental-utils/dist,node_modules/@typescript-eslint/experimental-utils/dist/ast-utils,node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils,node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint,node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope,node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils,node_modules/@typescript-eslint/parser/dist,node_modules/@typescript-eslint/parser/dist/scope,node_modules/@typescript-eslint/typescript-estree/dist,node_modules/@typescript-eslint/typescript-estree/dist/create-program,node_modules/@typescript-eslint/typescript-estree/dist/ts-estree,node_modules/@ungap/promise-all-settled,node_modules/@ungap/promise-all-settled/cjs,node_modules/@ungap/promise-all-settled/esm,node_modules/@vscode/test-electron,node_modules/@vscode/test-electron/.github,node_modules/@vscode/test-electron/out,node_modules/@vscode/test-electron/.github/workflows,node_modules/acorn/bin,node_modules/acorn/dist,node_modules/agent-base/dist,node_modules/agent-base/src,node_modules/agent-base/dist/src,node_modules/ajv/dist,node_modules/ajv/lib,node_modules/ajv/scripts,node_modules/ajv/lib/compile,node_modules/ajv/lib/dot,node_modules/ajv/lib/dotjs,node_modules/ajv/lib/refs,node_modules/ansi-colors/types,node_modules/ansi-escapes/node_modules,node_modules/ansi-escapes/node_modules/type-fest,node_modules/ansi-escapes/node_modules/type-fest/source,node_modules/ansi-escapes/node_modules/type-fest/ts41,node_modules/are-we-there-yet/lib,node_modules/argparse/lib,node_modules/argparse/lib/action,node_modules/argparse/lib/argument,node_modules/argparse/lib/help,node_modules/argparse/lib/action/append,node_modules/argparse/lib/action/store,node_modules/balanced-match/.github,node_modules/binary/example,node_modules/binary/lib,node_modules/binary/perf,node_modules/binary/test,node_modules/bluebird/js,node_modules/bluebird/js/browser,node_modules/bluebird/js/release,node_modules/braces/lib,node_modules/buffer-indexof-polyfill/test,node_modules/buffers/examples,node_modules/buffers/test,node_modules/chainsaw/examples,node_modules/chainsaw/test,node_modules/chalk/types,node_modules/chardet/encoding,node_modules/chokidar/lib,node_modules/chokidar/types,node_modules/cli-width/.nyc_output,node_modules/cli-width/.nyc_output/processinfo,node_modules/cliui/build,node_modules/cliui/node_modules,node_modules/cliui/build/lib,node_modules/cliui/node_modules/ansi-regex,node_modules/cliui/node_modules/strip-ansi,node_modules/concat-map/example,node_modules/concat-map/test,node_modules/core-util-is/lib,node_modules/cross-spawn/lib,node_modules/cross-spawn/node_modules,node_modules/cross-spawn/lib/util,node_modules/cross-spawn/node_modules/.bin,node_modules/cross-spawn/node_modules/semver,node_modules/cross-spawn/node_modules/semver/bin,node_modules/date-format/lib,node_modules/debug/src,node_modules/deep-is/example,node_modules/deep-is/test,node_modules/delegates/test,node_modules/detect-libc/bin,node_modules/detect-libc/lib,node_modules/diff/dist,node_modules/diff/lib,node_modules/diff/lib/convert,node_modules/diff/lib/diff,node_modules/diff/lib/patch,node_modules/diff/lib/util,node_modules/doctrine/lib,node_modules/duplexer2/node_modules,node_modules/duplexer2/node_modules/readable-stream,node_modules/duplexer2/node_modules/safe-buffer,node_modules/duplexer2/node_modules/string_decoder,node_modules/duplexer2/node_modules/readable-stream/doc,node_modules/duplexer2/node_modules/readable-stream/lib,node_modules/duplexer2/node_modules/readable-stream/doc/wg-meetings,node_modules/duplexer2/node_modules/readable-stream/lib/internal,node_modules/duplexer2/node_modules/readable-stream/lib/internal/streams,node_modules/duplexer2/node_modules/string_decoder/lib,node_modules/emoji-regex/es2015,node_modules/escalade/dist,node_modules/escalade/sync,node_modules/eslint/bin,node_modules/eslint/conf,node_modules/eslint/lib,node_modules/eslint/messages,node_modules/eslint/node_modules,node_modules/eslint/lib/cli-engine,node_modules/eslint/lib/init,node_modules/eslint/lib/linter,node_modules/eslint/lib/rule-tester,node_modules/eslint/lib/rules,node_modules/eslint/lib/shared,node_modules/eslint/lib/source-code,node_modules/eslint/lib/cli-engine/config-array,node_modules/eslint/lib/cli-engine/formatters,node_modules/eslint/lib/linter/code-path-analysis,node_modules/eslint/lib/rules/utils,node_modules/eslint/lib/rules/utils/patterns,node_modules/eslint/lib/rules/utils/unicode,node_modules/eslint/lib/source-code/token-store,node_modules/eslint/node_modules/.bin,node_modules/eslint/node_modules/eslint-utils,node_modules/eslint/node_modules/regexpp,node_modules/eslint/node_modules/semver,node_modules/eslint/node_modules/semver/bin,node_modules/eslint-scope/lib,node_modules/eslint-visitor-keys/lib,node_modules/espree/lib,node_modules/esprima/bin,node_modules/esprima/dist,node_modules/esquery/dist,node_modules/esquery/node_modules,node_modules/esquery/node_modules/estraverse,node_modules/esrecurse/node_modules,node_modules/esrecurse/node_modules/estraverse,node_modules/esutils/lib,node_modules/external-editor/main,node_modules/external-editor/main/errors,node_modules/fast-deep-equal/es6,node_modules/fast-json-stable-stringify/.github,node_modules/fast-json-stable-stringify/benchmark,node_modules/fast-json-stable-stringify/example,node_modules/fast-json-stable-stringify/test,node_modules/flat/test,node_modules/flat-cache/node_modules,node_modules/flat-cache/node_modules/.bin,node_modules/flat-cache/node_modules/rimraf,node_modules/flatted/.github,node_modules/flatted/cjs,node_modules/flatted/esm,node_modules/fs-extra/lib,node_modules/fs-extra/lib/copy,node_modules/fs-extra/lib/empty,node_modules/fs-extra/lib/ensure,node_modules/fs-extra/lib/fs,node_modules/fs-extra/lib/json,node_modules/fs-extra/lib/mkdirs,node_modules/fs-extra/lib/move,node_modules/fs-extra/lib/output-file,node_modules/fs-extra/lib/path-exists,node_modules/fs-extra/lib/remove,node_modules/fs-extra/lib/util,node_modules/fstream/examples,node_modules/fstream/lib,node_modules/fstream/node_modules,node_modules/fstream/node_modules/.bin,node_modules/fstream/node_modules/rimraf,node_modules/functional-red-black-tree/bench,node_modules/functional-red-black-tree/test,node_modules/gauge/node_modules,node_modules/gauge/node_modules/ansi-regex,node_modules/gauge/node_modules/strip-ansi,node_modules/google-protobuf/google,node_modules/google-protobuf/google/protobuf,node_modules/google-protobuf/google/protobuf/compiler,node_modules/growl/lib,node_modules/grpc/build,node_modules/grpc/proto,node_modules/grpc/src,node_modules/grpc/build/src,node_modules/grpc/build/src/generated,node_modules/grpc/build/src/generated/google,node_modules/grpc/build/src/generated/grpc,node_modules/grpc/build/src/generated/google/protobuf,node_modules/grpc/build/src/generated/grpc/channelz,node_modules/grpc/build/src/generated/grpc/channelz/v1,node_modules/grpc/src/generated,node_modules/grpc/src/generated/google,node_modules/grpc/src/generated/grpc,node_modules/grpc/src/generated/google/protobuf,node_modules/grpc/src/generated/grpc/channelz,node_modules/grpc/src/generated/grpc/channelz/v1,node_modules/grpc-tools/bin,node_modules/grpc-tools/bin/google,node_modules/grpc-tools/bin/google/protobuf,node_modules/grpc-tools/bin/google/protobuf/compiler,node_modules/grpc_tools_node_protoc_ts/.idea,node_modules/grpc_tools_node_protoc_ts/bin,node_modules/grpc_tools_node_protoc_ts/build,node_modules/grpc_tools_node_protoc_ts/node_modules,node_modules/grpc_tools_node_protoc_ts/src,node_modules/grpc_tools_node_protoc_ts/.idea/codeStyles,node_modules/grpc_tools_node_protoc_ts/.idea/inspectionProfiles,node_modules/grpc_tools_node_protoc_ts/build/lib,node_modules/grpc_tools_node_protoc_ts/build/lib/format,node_modules/grpc_tools_node_protoc_ts/build/lib/template,node_modules/grpc_tools_node_protoc_ts/build/lib/format/partial,node_modules/grpc_tools_node_protoc_ts/build/lib/template/partial,node_modules/grpc_tools_node_protoc_ts/node_modules/google-protobuf,node_modules/grpc_tools_node_protoc_ts/node_modules/google-protobuf/google,node_modules/grpc_tools_node_protoc_ts/node_modules/google-protobuf/google/protobuf,node_modules/grpc_tools_node_protoc_ts/node_modules/google-protobuf/google/protobuf/compiler,node_modules/grpc_tools_node_protoc_ts/src/lib,node_modules/grpc_tools_node_protoc_ts/src/typings,node_modules/grpc_tools_node_protoc_ts/src/lib/format,node_modules/grpc_tools_node_protoc_ts/src/lib/template,node_modules/grpc_tools_node_protoc_ts/src/lib/format/partial,node_modules/grpc_tools_node_protoc_ts/src/lib/template/partial,node_modules/handlebars/bin,node_modules/handlebars/dist,node_modules/handlebars/lib,node_modules/handlebars/types,node_modules/handlebars/dist/amd,node_modules/handlebars/dist/cjs,node_modules/handlebars/dist/amd/handlebars,node_modules/handlebars/dist/amd/handlebars/compiler,node_modules/handlebars/dist/amd/handlebars/decorators,node_modules/handlebars/dist/amd/handlebars/helpers,node_modules/handlebars/dist/amd/handlebars/internal,node_modules/handlebars/dist/cjs/handlebars,node_modules/handlebars/dist/cjs/handlebars/compiler,node_modules/handlebars/dist/cjs/handlebars/decorators,node_modules/handlebars/dist/cjs/handlebars/helpers,node_modules/handlebars/dist/cjs/handlebars/internal,node_modules/handlebars/lib/handlebars,node_modules/handlebars/lib/handlebars/compiler,node_modules/handlebars/lib/handlebars/decorators,node_modules/handlebars/lib/handlebars/helpers,node_modules/handlebars/lib/handlebars/internal,node_modules/he/bin,node_modules/he/man,node_modules/http-proxy-agent/dist,node_modules/https-proxy-agent/dist,node_modules/iconv-lite/encodings,node_modules/iconv-lite/lib,node_modules/iconv-lite/encodings/tables,node_modules/inquirer/lib,node_modules/inquirer/node_modules,node_modules/inquirer/lib/objects,node_modules/inquirer/lib/prompts,node_modules/inquirer/lib/ui,node_modules/inquirer/lib/utils,node_modules/inquirer/node_modules/ansi-regex,node_modules/inquirer/node_modules/ansi-styles,node_modules/inquirer/node_modules/chalk,node_modules/inquirer/node_modules/color-convert,node_modules/inquirer/node_modules/color-name,node_modules/inquirer/node_modules/has-flag,node_modules/inquirer/node_modules/strip-ansi,node_modules/inquirer/node_modules/supports-color,node_modules/inquirer/node_modules/chalk/source,node_modules/isexe/test,node_modules/js-yaml/bin,node_modules/js-yaml/dist,node_modules/js-yaml/lib,node_modules/js-yaml/lib/js-yaml,node_modules/js-yaml/lib/js-yaml/schema,node_modules/js-yaml/lib/js-yaml/type,node_modules/js-yaml/lib/js-yaml/type/js,node_modules/json-schema-traverse/spec,node_modules/json-schema-traverse/spec/fixtures,node_modules/json-stable-stringify-without-jsonify/example,node_modules/json-stable-stringify-without-jsonify/test,node_modules/levn/lib,node_modules/listenercount/test,node_modules/lodash/fp,node_modules/log-symbols/node_modules,node_modules/log-symbols/node_modules/ansi-styles,node_modules/log-symbols/node_modules/chalk,node_modules/log-symbols/node_modules/color-convert,node_modules/log-symbols/node_modules/color-name,node_modules/log-symbols/node_modules/has-flag,node_modules/log-symbols/node_modules/supports-color,node_modules/log-symbols/node_modules/chalk/source,node_modules/log4js/lib,node_modules/log4js/node_modules,node_modules/log4js/types,node_modules/log4js/lib/appenders,node_modules/log4js/node_modules/flatted,node_modules/log4js/node_modules/flatted/.github,node_modules/log4js/node_modules/flatted/cjs,node_modules/log4js/node_modules/flatted/esm,node_modules/log4js/node_modules/flatted/php,node_modules/log4js/node_modules/flatted/.github/workflows,node_modules/long/dist,node_modules/long/src,node_modules/make-dir/node_modules,node_modules/make-dir/node_modules/.bin,node_modules/make-dir/node_modules/semver,node_modules/make-dir/node_modules/semver/bin,node_modules/minimist/example,node_modules/minimist/test,node_modules/mkdirp/bin,node_modules/mocha/assets,node_modules/mocha/bin,node_modules/mocha/lib,node_modules/mocha/node_modules,node_modules/mocha/assets/growl,node_modules/mocha/lib/browser,node_modules/mocha/lib/cli,node_modules/mocha/lib/interfaces,node_modules/mocha/lib/nodejs,node_modules/mocha/lib/reporters,node_modules/mocha/lib/nodejs/reporters,node_modules/mocha/node_modules/.bin,node_modules/mocha/node_modules/argparse,node_modules/mocha/node_modules/debug,node_modules/mocha/node_modules/escape-string-regexp,node_modules/mocha/node_modules/has-flag,node_modules/mocha/node_modules/js-yaml,node_modules/mocha/node_modules/minimatch,node_modules/mocha/node_modules/ms,node_modules/mocha/node_modules/supports-color,node_modules/mocha/node_modules/which,node_modules/mocha/node_modules/argparse/lib,node_modules/mocha/node_modules/debug/node_modules,node_modules/mocha/node_modules/debug/src,node_modules/mocha/node_modules/debug/node_modules/ms,node_modules/mocha/node_modules/js-yaml/bin,node_modules/mocha/node_modules/js-yaml/dist,node_modules/mocha/node_modules/js-yaml/lib,node_modules/mocha/node_modules/js-yaml/lib/schema,node_modules/mocha/node_modules/js-yaml/lib/type,node_modules/mocha/node_modules/which/bin,node_modules/nanoid/async,node_modules/nanoid/bin,node_modules/nanoid/non-secure,node_modules/nanoid/url-alphabet,node_modules/nice-try/src,node_modules/node-fetch/lib,node_modules/nopt/bin,node_modules/nopt/lib,node_modules/optionator/lib,node_modules/picomatch/lib,node_modules/prelude-ls/lib,node_modules/progress/lib,node_modules/protobufjs/bin,node_modules/protobufjs/cli,node_modules/protobufjs/dist,node_modules/protobufjs/ext,node_modules/protobufjs/google,node_modules/protobufjs/scripts,node_modules/protobufjs/src,node_modules/protobufjs/cli/bin,node_modules/protobufjs/cli/lib,node_modules/protobufjs/cli/node_modules,node_modules/protobufjs/cli/targets,node_modules/protobufjs/cli/wrappers,node_modules/protobufjs/cli/lib/tsd-jsdoc,node_modules/protobufjs/dist/light,node_modules/protobufjs/dist/minimal,node_modules/protobufjs/ext/debug,node_modules/protobufjs/ext/descriptor,node_modules/protobufjs/google/api,node_modules/protobufjs/google/protobuf,node_modules/protobufjs/src/rpc,node_modules/protobufjs/src/util,node_modules/randomstring/bin,node_modules/randomstring/examples,node_modules/randomstring/lib,node_modules/randomstring/test,node_modules/readable-stream/lib,node_modules/readable-stream/lib/internal,node_modules/readable-stream/lib/internal/streams,node_modules/rfdc/.github,node_modules/rfdc/test,node_modules/rfdc/.github/workflows,node_modules/rxjs/_esm2015,node_modules/rxjs/_esm5,node_modules/rxjs/add,node_modules/rxjs/ajax,node_modules/rxjs/bundles,node_modules/rxjs/fetch,node_modules/rxjs/internal,node_modules/rxjs/internal-compatibility,node_modules/rxjs/migrations,node_modules/rxjs/observable,node_modules/rxjs/operator,node_modules/rxjs/operators,node_modules/rxjs/scheduler,node_modules/rxjs/src,node_modules/rxjs/symbol,node_modules/rxjs/testing,node_modules/rxjs/util,node_modules/rxjs/webSocket,node_modules/rxjs/_esm2015/ajax,node_modules/rxjs/_esm2015/fetch,node_modules/rxjs/_esm2015/internal,node_modules/rxjs/_esm2015/internal-compatibility,node_modules/rxjs/_esm2015/operators,node_modules/rxjs/_esm2015/testing,node_modules/rxjs/_esm2015/webSocket,node_modules/rxjs/_esm2015/internal/observable,node_modules/rxjs/_esm2015/internal/operators,node_modules/rxjs/_esm2015/internal/scheduled,node_modules/rxjs/_esm2015/internal/scheduler,node_modules/rxjs/_esm2015/internal/symbol,node_modules/rxjs/_esm2015/internal/testing,node_modules/rxjs/_esm2015/internal/util,node_modules/rxjs/_esm2015/internal/observable/dom,node_modules/rxjs/_esm5/ajax,node_modules/rxjs/_esm5/fetch,node_modules/rxjs/_esm5/internal,node_modules/rxjs/_esm5/internal-compatibility,node_modules/rxjs/_esm5/operators,node_modules/rxjs/_esm5/testing,node_modules/rxjs/_esm5/webSocket,node_modules/rxjs/_esm5/internal/observable,node_modules/rxjs/_esm5/internal/operators,node_modules/rxjs/_esm5/internal/scheduled,node_modules/rxjs/_esm5/internal/scheduler,node_modules/rxjs/_esm5/internal/symbol,node_modules/rxjs/_esm5/internal/testing,node_modules/rxjs/_esm5/internal/util,node_modules/rxjs/_esm5/internal/observable/dom,node_modules/rxjs/add/observable,node_modules/rxjs/add/operator,node_modules/rxjs/add/observable/dom,node_modules/rxjs/internal/observable,node_modules/rxjs/internal/operators,node_modules/rxjs/internal/scheduled,node_modules/rxjs/internal/scheduler,node_modules/rxjs/internal/symbol,node_modules/rxjs/internal/testing,node_modules/rxjs/internal/util,node_modules/rxjs/internal/observable/dom,node_modules/rxjs/migrations/update-6_0_0,node_modules/rxjs/observable/dom,node_modules/rxjs/src/add,node_modules/rxjs/src/ajax,node_modules/rxjs/src/fetch,node_modules/rxjs/src/internal,node_modules/rxjs/src/internal-compatibility,node_modules/rxjs/src/observable,node_modules/rxjs/src/operator,node_modules/rxjs/src/operators,node_modules/rxjs/src/scheduler,node_modules/rxjs/src/symbol,node_modules/rxjs/src/testing,node_modules/rxjs/src/util,node_modules/rxjs/src/webSocket,node_modules/rxjs/src/add/observable,node_modules/rxjs/src/add/operator,node_modules/rxjs/src/add/observable/dom,node_modules/rxjs/src/internal/observable,node_modules/rxjs/src/internal/operators,node_modules/rxjs/src/internal/scheduled,node_modules/rxjs/src/internal/scheduler,node_modules/rxjs/src/internal/symbol,node_modules/rxjs/src/internal/testing,node_modules/rxjs/src/internal/util,node_modules/rxjs/src/internal/observable/dom,node_modules/rxjs/src/observable/dom,node_modules/semver/bin,node_modules/semver/classes,node_modules/semver/functions,node_modules/semver/internal,node_modules/semver/ranges,node_modules/serialize-javascript/node_modules,node_modules/serialize-javascript/node_modules/randombytes,node_modules/slice-ansi/node_modules,node_modules/slice-ansi/node_modules/is-fullwidth-code-point,node_modules/source-map/dist,node_modules/source-map/lib,node_modules/sprintf-js/demo,node_modules/sprintf-js/dist,node_modules/sprintf-js/src,node_modules/sprintf-js/test,node_modules/streamroller/lib,node_modules/string-width/node_modules,node_modules/string-width/node_modules/ansi-regex,node_modules/string-width/node_modules/strip-ansi,node_modules/string_decoder/lib,node_modules/table/dist,node_modules/table/node_modules,node_modules/table/dist/schemas,node_modules/table/node_modules/emoji-regex,node_modules/table/node_modules/is-fullwidth-code-point,node_modules/table/node_modules/string-width,node_modules/table/node_modules/emoji-regex/es2015,node_modules/tar/lib,node_modules/tar/node_modules,node_modules/tar/node_modules/.bin,node_modules/tar/node_modules/mkdirp,node_modules/tar/node_modules/mkdirp/bin,node_modules/tar/node_modules/mkdirp/lib,node_modules/text-table/example,node_modules/text-table/test,node_modules/through/test,node_modules/tmp/lib,node_modules/tr46/lib,node_modules/traverse/examples,node_modules/traverse/test,node_modules/tslib/modules,node_modules/tslib/test,node_modules/tslib/test/validateModuleExportsMatchCommonJS,node_modules/tsutils/typeguard,node_modules/tsutils/util,node_modules/tsutils/typeguard/2.8,node_modules/tsutils/typeguard/2.9,node_modules/tsutils/typeguard/3.0,node_modules/tsutils/typeguard/3.2,node_modules/tsutils/typeguard/next,node_modules/type-check/lib,node_modules/type-fest/source,node_modules/typescript/bin,node_modules/typescript/lib,node_modules/typescript/loc,node_modules/typescript/lib/cs,node_modules/typescript/lib/de,node_modules/typescript/lib/es,node_modules/typescript/lib/fr,node_modules/typescript/lib/it,node_modules/typescript/lib/ja,node_modules/typescript/lib/ko,node_modules/typescript/lib/pl,node_modules/typescript/lib/pt-br,node_modules/typescript/lib/ru,node_modules/typescript/lib/tr,node_modules/typescript/lib/zh-cn,node_modules/typescript/lib/zh-tw,node_modules/typescript/loc/lcl,node_modules/typescript/loc/lcl/CHS,node_modules/typescript/loc/lcl/CHT,node_modules/typescript/loc/lcl/CSY,node_modules/typescript/loc/lcl/DEU,node_modules/typescript/loc/lcl/ESN,node_modules/typescript/loc/lcl/FRA,node_modules/typescript/loc/lcl/ITA,node_modules/typescript/loc/lcl/JPN,node_modules/typescript/loc/lcl/KOR,node_modules/typescript/loc/lcl/PLK,node_modules/typescript/loc/lcl/PTB,node_modules/typescript/loc/lcl/RUS,node_modules/typescript/loc/lcl/TRK,node_modules/typescript/loc/lcl/CHS/Targets,node_modules/typescript/loc/lcl/CHS/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/CHS/TypeScriptLanguageService,node_modules/typescript/loc/lcl/CHS/TypeScriptTasks,node_modules/typescript/loc/lcl/CHT/Targets,node_modules/typescript/loc/lcl/CHT/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/CHT/TypeScriptLanguageService,node_modules/typescript/loc/lcl/CHT/TypeScriptTasks,node_modules/typescript/loc/lcl/CSY/Targets,node_modules/typescript/loc/lcl/CSY/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/CSY/TypeScriptLanguageService,node_modules/typescript/loc/lcl/CSY/TypeScriptTasks,node_modules/typescript/loc/lcl/DEU/Targets,node_modules/typescript/loc/lcl/DEU/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/DEU/TypeScriptLanguageService,node_modules/typescript/loc/lcl/DEU/TypeScriptTasks,node_modules/typescript/loc/lcl/ESN/Targets,node_modules/typescript/loc/lcl/ESN/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/ESN/TypeScriptLanguageService,node_modules/typescript/loc/lcl/ESN/TypeScriptTasks,node_modules/typescript/loc/lcl/FRA/Targets,node_modules/typescript/loc/lcl/FRA/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/FRA/TypeScriptLanguageService,node_modules/typescript/loc/lcl/FRA/TypeScriptTasks,node_modules/typescript/loc/lcl/ITA/Targets,node_modules/typescript/loc/lcl/ITA/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/ITA/TypeScriptLanguageService,node_modules/typescript/loc/lcl/ITA/TypeScriptTasks,node_modules/typescript/loc/lcl/JPN/Targets,node_modules/typescript/loc/lcl/JPN/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/JPN/TypeScriptLanguageService,node_modules/typescript/loc/lcl/JPN/TypeScriptTasks,node_modules/typescript/loc/lcl/KOR/Targets,node_modules/typescript/loc/lcl/KOR/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/KOR/TypeScriptLanguageService,node_modules/typescript/loc/lcl/KOR/TypeScriptTasks,node_modules/typescript/loc/lcl/PLK/Targets,node_modules/typescript/loc/lcl/PLK/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/PLK/TypeScriptLanguageService,node_modules/typescript/loc/lcl/PLK/TypeScriptTasks,node_modules/typescript/loc/lcl/PTB/Targets,node_modules/typescript/loc/lcl/PTB/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/PTB/TypeScriptLanguageService,node_modules/typescript/loc/lcl/PTB/TypeScriptTasks,node_modules/typescript/loc/lcl/RUS/Targets,node_modules/typescript/loc/lcl/RUS/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/RUS/TypeScriptLanguageService,node_modules/typescript/loc/lcl/RUS/TypeScriptTasks,node_modules/typescript/loc/lcl/TRK/Targets,node_modules/typescript/loc/lcl/TRK/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/TRK/TypeScriptLanguageService,node_modules/typescript/loc/lcl/TRK/TypeScriptTasks,node_modules/uglify-js/bin,node_modules/uglify-js/lib,node_modules/uglify-js/tools,node_modules/unzipper/.circleci,node_modules/unzipper/lib,node_modules/unzipper/node_modules,node_modules/unzipper/lib/Open,node_modules/unzipper/node_modules/bluebird,node_modules/unzipper/node_modules/readable-stream,node_modules/unzipper/node_modules/safe-buffer,node_modules/unzipper/node_modules/string_decoder,node_modules/unzipper/node_modules/bluebird/js,node_modules/unzipper/node_modules/bluebird/js/browser,node_modules/unzipper/node_modules/bluebird/js/release,node_modules/unzipper/node_modules/readable-stream/doc,node_modules/unzipper/node_modules/readable-stream/lib,node_modules/unzipper/node_modules/readable-stream/doc/wg-meetings,node_modules/unzipper/node_modules/readable-stream/lib/internal,node_modules/unzipper/node_modules/readable-stream/lib/internal/streams,node_modules/unzipper/node_modules/string_decoder/lib,node_modules/uri-js/dist,node_modules/uri-js/dist/es5,node_modules/uri-js/dist/esnext,node_modules/uri-js/dist/esnext/schemes,node_modules/webidl-conversions/lib,node_modules/whatwg-url/lib,node_modules/which/bin,node_modules/wordwrap/example,node_modules/wordwrap/test,node_modules/workerpool/dist,node_modules/workerpool/src,node_modules/workerpool/src/generated,node_modules/wrap-ansi/node_modules,node_modules/wrap-ansi/node_modules/ansi-regex,node_modules/wrap-ansi/node_modules/ansi-styles,node_modules/wrap-ansi/node_modules/color-convert,node_modules/wrap-ansi/node_modules/color-name,node_modules/wrap-ansi/node_modules/strip-ansi,node_modules/y18n/build,node_modules/y18n/build/lib,node_modules/y18n/build/lib/platform-shims,node_modules/yargs/build,node_modules/yargs/helpers,node_modules/yargs/lib,node_modules/yargs/locales,node_modules/yargs/build/lib,node_modules/yargs/build/lib/typings,node_modules/yargs/build/lib/utils,node_modules/yargs/lib/platform-shims,node_modules/yargs-parser/build,node_modules/yargs-parser/build/lib,src,src/cache,src/client,src/codelens,src/config,src/dataloader,src/emitter,src/explorer,src/generators,src/interface,src/proto-ts,src/requests,src/responses,src/runner,src/test,src/utils,src/validators,src/visualizers,src/wizard,src/test/suite,syntaxes" } \ No newline at end of file From e7fcb1a004880f4c91a78d68ed41ce16d1e7bc8c Mon Sep 17 00:00:00 2001 From: Arseniy Volynets Date: Tue, 18 Oct 2022 11:15:24 +0300 Subject: [PATCH 24/24] undo vscode config change --- vscode-plugin/.vscode/settings.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vscode-plugin/.vscode/settings.json b/vscode-plugin/.vscode/settings.json index 2ce37f105..db0bd59cd 100644 --- a/vscode-plugin/.vscode/settings.json +++ b/vscode-plugin/.vscode/settings.json @@ -8,6 +8,5 @@ }, // Turn off tsc task auto detection since we have the necessary tasks as npm scripts "typescript.tsc.autoDetect": "off", - "git.ignoreLimitWarning": true, - "unittestbot.paths.sourceDirectories": ".,app_images,icons,media,node_modules,node_modules/.bin,node_modules/@babel,node_modules/@grpc,node_modules/@mapbox,node_modules/@protobufjs,node_modules/@tootallnate,node_modules/@types,node_modules/@typescript-eslint,node_modules/@ungap,node_modules/@vscode,node_modules/abbrev,node_modules/acorn,node_modules/acorn-jsx,node_modules/agent-base,node_modules/ajv,node_modules/ansi-colors,node_modules/ansi-escapes,node_modules/ansi-regex,node_modules/ansi-styles,node_modules/anymatch,node_modules/aproba,node_modules/are-we-there-yet,node_modules/argparse,node_modules/array-uniq,node_modules/astral-regex,node_modules/balanced-match,node_modules/big-integer,node_modules/binary,node_modules/binary-extensions,node_modules/bluebird,node_modules/brace-expansion,node_modules/braces,node_modules/browser-stdout,node_modules/buffer-from,node_modules/buffer-indexof-polyfill,node_modules/buffers,node_modules/callsites,node_modules/camelcase,node_modules/chainsaw,node_modules/chalk,node_modules/chardet,node_modules/chokidar,node_modules/chownr,node_modules/cli-cursor,node_modules/cli-width,node_modules/cliui,node_modules/color-convert,node_modules/color-name,node_modules/color-support,node_modules/concat-map,node_modules/console-control-strings,node_modules/core-util-is,node_modules/cross-spawn,node_modules/date-format,node_modules/debug,node_modules/decamelize,node_modules/deep-is,node_modules/delegates,node_modules/detect-libc,node_modules/diff,node_modules/doctrine,node_modules/duplexer2,node_modules/emittery,node_modules/emoji-regex,node_modules/escalade,node_modules/escape-string-regexp,node_modules/eslint,node_modules/eslint-scope,node_modules/eslint-utils,node_modules/eslint-visitor-keys,node_modules/espree,node_modules/esprima,node_modules/esquery,node_modules/esrecurse,node_modules/estraverse,node_modules/esutils,node_modules/external-editor,node_modules/fast-deep-equal,node_modules/fast-json-stable-stringify,node_modules/fast-levenshtein,node_modules/figures,node_modules/file-entry-cache,node_modules/filepath,node_modules/fill-range,node_modules/find-up,node_modules/flat,node_modules/flat-cache,node_modules/flatted,node_modules/fs-extra,node_modules/fs-minipass,node_modules/fs.realpath,node_modules/fsevents,node_modules/fstream,node_modules/functional-red-black-tree,node_modules/gauge,node_modules/get-caller-file,node_modules/glob,node_modules/glob-parent,node_modules/globals,node_modules/google-protobuf,node_modules/graceful-fs,node_modules/growl,node_modules/grpc,node_modules/grpc-tools,node_modules/grpc_tools_node_protoc_ts,node_modules/handlebars,node_modules/has-flag,node_modules/has-unicode,node_modules/he,node_modules/http-proxy-agent,node_modules/https-proxy-agent,node_modules/iconv-lite,node_modules/ignore,node_modules/import-fresh,node_modules/imurmurhash,node_modules/inflight,node_modules/inherits,node_modules/inquirer,node_modules/is-binary-path,node_modules/is-extglob,node_modules/is-fullwidth-code-point,node_modules/is-glob,node_modules/is-number,node_modules/is-plain-obj,node_modules/is-unicode-supported,node_modules/isarray,node_modules/isexe,node_modules/js-tokens,node_modules/js-yaml,node_modules/json-schema-traverse,node_modules/json-stable-stringify-without-jsonify,node_modules/jsonfile,node_modules/levn,node_modules/listenercount,node_modules/locate-path,node_modules/lodash,node_modules/lodash.camelcase,node_modules/log-symbols,node_modules/log4js,node_modules/long,node_modules/lru-cache,node_modules/make-dir,node_modules/mimic-fn,node_modules/minimatch,node_modules/minimist,node_modules/minipass,node_modules/minizlib,node_modules/mkdirp,node_modules/mocha,node_modules/ms,node_modules/mute-stream,node_modules/nanoid,node_modules/natural-compare,node_modules/neo-async,node_modules/nice-try,node_modules/node-fetch,node_modules/nopt,node_modules/normalize-path,node_modules/npmlog,node_modules/object-assign,node_modules/once,node_modules/onetime,node_modules/optionator,node_modules/os-tmpdir,node_modules/p-limit,node_modules/p-locate,node_modules/parent-module,node_modules/path-exists,node_modules/path-is-absolute,node_modules/path-key,node_modules/picomatch,node_modules/prelude-ls,node_modules/process-nextick-args,node_modules/progress,node_modules/protobufjs,node_modules/punycode,node_modules/randombytes,node_modules/randomstring,node_modules/readable-stream,node_modules/readdirp,node_modules/regexpp,node_modules/require-directory,node_modules/resolve-from,node_modules/restore-cursor,node_modules/rfdc,node_modules/rimraf,node_modules/run-async,node_modules/rxjs,node_modules/safe-buffer,node_modules/safer-buffer,node_modules/semver,node_modules/serialize-javascript,node_modules/set-blocking,node_modules/setimmediate,node_modules/shebang-command,node_modules/shebang-regex,node_modules/signal-exit,node_modules/slice-ansi,node_modules/source-map,node_modules/source-map-support,node_modules/sprintf-js,node_modules/streamroller,node_modules/string-width,node_modules/string_decoder,node_modules/strip-ansi,node_modules/strip-json-comments,node_modules/supports-color,node_modules/table,node_modules/tar,node_modules/text-table,node_modules/through,node_modules/tmp,node_modules/to-regex-range,node_modules/tr46,node_modules/traverse,node_modules/tslib,node_modules/tsutils,node_modules/type-check,node_modules/type-fest,node_modules/typescript,node_modules/uglify-js,node_modules/universalify,node_modules/unzipper,node_modules/uri-js,node_modules/util-deprecate,node_modules/v8-compile-cache,node_modules/webidl-conversions,node_modules/whatwg-url,node_modules/which,node_modules/wide-align,node_modules/word-wrap,node_modules/wordwrap,node_modules/workerpool,node_modules/wrap-ansi,node_modules/wrappy,node_modules/write,node_modules/y18n,node_modules/yallist,node_modules/yargs,node_modules/yargs-parser,node_modules/yargs-unparser,node_modules/yocto-queue,node_modules/@babel/code-frame,node_modules/@babel/helper-validator-identifier,node_modules/@babel/highlight,node_modules/@babel/code-frame/lib,node_modules/@babel/helper-validator-identifier/lib,node_modules/@babel/helper-validator-identifier/scripts,node_modules/@babel/highlight/lib,node_modules/@grpc/proto-loader,node_modules/@grpc/proto-loader/build,node_modules/@grpc/proto-loader/build/bin,node_modules/@grpc/proto-loader/build/src,node_modules/@mapbox/node-pre-gyp,node_modules/@mapbox/node-pre-gyp/bin,node_modules/@mapbox/node-pre-gyp/lib,node_modules/@mapbox/node-pre-gyp/lib/util,node_modules/@mapbox/node-pre-gyp/lib/util/nw-pre-gyp,node_modules/@protobufjs/aspromise,node_modules/@protobufjs/base64,node_modules/@protobufjs/codegen,node_modules/@protobufjs/eventemitter,node_modules/@protobufjs/fetch,node_modules/@protobufjs/float,node_modules/@protobufjs/inquire,node_modules/@protobufjs/path,node_modules/@protobufjs/pool,node_modules/@protobufjs/utf8,node_modules/@protobufjs/aspromise/tests,node_modules/@protobufjs/base64/tests,node_modules/@protobufjs/codegen/tests,node_modules/@protobufjs/eventemitter/tests,node_modules/@protobufjs/fetch/tests,node_modules/@protobufjs/float/bench,node_modules/@protobufjs/float/tests,node_modules/@protobufjs/inquire/tests,node_modules/@protobufjs/inquire/tests/data,node_modules/@protobufjs/path/tests,node_modules/@protobufjs/pool/tests,node_modules/@protobufjs/utf8/tests,node_modules/@protobufjs/utf8/tests/data,node_modules/@tootallnate/once,node_modules/@tootallnate/once/dist,node_modules/@types/eslint-visitor-keys,node_modules/@types/glob,node_modules/@types/google-protobuf,node_modules/@types/json-schema,node_modules/@types/long,node_modules/@types/minimatch,node_modules/@types/mocha,node_modules/@types/node,node_modules/@types/randomstring,node_modules/@types/vscode,node_modules/@types/google-protobuf/google,node_modules/@types/google-protobuf/google/protobuf,node_modules/@types/google-protobuf/google/protobuf/compiler,node_modules/@types/node/assert,node_modules/@types/node/dns,node_modules/@types/node/fs,node_modules/@types/node/stream,node_modules/@types/node/timers,node_modules/@types/node/ts3.6,node_modules/@types/node/util,node_modules/@typescript-eslint/eslint-plugin,node_modules/@typescript-eslint/experimental-utils,node_modules/@typescript-eslint/parser,node_modules/@typescript-eslint/typescript-estree,node_modules/@typescript-eslint/eslint-plugin/dist,node_modules/@typescript-eslint/eslint-plugin/docs,node_modules/@typescript-eslint/eslint-plugin/dist/configs,node_modules/@typescript-eslint/eslint-plugin/dist/rules,node_modules/@typescript-eslint/eslint-plugin/dist/util,node_modules/@typescript-eslint/eslint-plugin/dist/rules/indent-new-do-not-use,node_modules/@typescript-eslint/eslint-plugin/docs/rules,node_modules/@typescript-eslint/experimental-utils/dist,node_modules/@typescript-eslint/experimental-utils/dist/ast-utils,node_modules/@typescript-eslint/experimental-utils/dist/eslint-utils,node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint,node_modules/@typescript-eslint/experimental-utils/dist/ts-eslint-scope,node_modules/@typescript-eslint/experimental-utils/dist/ast-utils/eslint-utils,node_modules/@typescript-eslint/parser/dist,node_modules/@typescript-eslint/parser/dist/scope,node_modules/@typescript-eslint/typescript-estree/dist,node_modules/@typescript-eslint/typescript-estree/dist/create-program,node_modules/@typescript-eslint/typescript-estree/dist/ts-estree,node_modules/@ungap/promise-all-settled,node_modules/@ungap/promise-all-settled/cjs,node_modules/@ungap/promise-all-settled/esm,node_modules/@vscode/test-electron,node_modules/@vscode/test-electron/.github,node_modules/@vscode/test-electron/out,node_modules/@vscode/test-electron/.github/workflows,node_modules/acorn/bin,node_modules/acorn/dist,node_modules/agent-base/dist,node_modules/agent-base/src,node_modules/agent-base/dist/src,node_modules/ajv/dist,node_modules/ajv/lib,node_modules/ajv/scripts,node_modules/ajv/lib/compile,node_modules/ajv/lib/dot,node_modules/ajv/lib/dotjs,node_modules/ajv/lib/refs,node_modules/ansi-colors/types,node_modules/ansi-escapes/node_modules,node_modules/ansi-escapes/node_modules/type-fest,node_modules/ansi-escapes/node_modules/type-fest/source,node_modules/ansi-escapes/node_modules/type-fest/ts41,node_modules/are-we-there-yet/lib,node_modules/argparse/lib,node_modules/argparse/lib/action,node_modules/argparse/lib/argument,node_modules/argparse/lib/help,node_modules/argparse/lib/action/append,node_modules/argparse/lib/action/store,node_modules/balanced-match/.github,node_modules/binary/example,node_modules/binary/lib,node_modules/binary/perf,node_modules/binary/test,node_modules/bluebird/js,node_modules/bluebird/js/browser,node_modules/bluebird/js/release,node_modules/braces/lib,node_modules/buffer-indexof-polyfill/test,node_modules/buffers/examples,node_modules/buffers/test,node_modules/chainsaw/examples,node_modules/chainsaw/test,node_modules/chalk/types,node_modules/chardet/encoding,node_modules/chokidar/lib,node_modules/chokidar/types,node_modules/cli-width/.nyc_output,node_modules/cli-width/.nyc_output/processinfo,node_modules/cliui/build,node_modules/cliui/node_modules,node_modules/cliui/build/lib,node_modules/cliui/node_modules/ansi-regex,node_modules/cliui/node_modules/strip-ansi,node_modules/concat-map/example,node_modules/concat-map/test,node_modules/core-util-is/lib,node_modules/cross-spawn/lib,node_modules/cross-spawn/node_modules,node_modules/cross-spawn/lib/util,node_modules/cross-spawn/node_modules/.bin,node_modules/cross-spawn/node_modules/semver,node_modules/cross-spawn/node_modules/semver/bin,node_modules/date-format/lib,node_modules/debug/src,node_modules/deep-is/example,node_modules/deep-is/test,node_modules/delegates/test,node_modules/detect-libc/bin,node_modules/detect-libc/lib,node_modules/diff/dist,node_modules/diff/lib,node_modules/diff/lib/convert,node_modules/diff/lib/diff,node_modules/diff/lib/patch,node_modules/diff/lib/util,node_modules/doctrine/lib,node_modules/duplexer2/node_modules,node_modules/duplexer2/node_modules/readable-stream,node_modules/duplexer2/node_modules/safe-buffer,node_modules/duplexer2/node_modules/string_decoder,node_modules/duplexer2/node_modules/readable-stream/doc,node_modules/duplexer2/node_modules/readable-stream/lib,node_modules/duplexer2/node_modules/readable-stream/doc/wg-meetings,node_modules/duplexer2/node_modules/readable-stream/lib/internal,node_modules/duplexer2/node_modules/readable-stream/lib/internal/streams,node_modules/duplexer2/node_modules/string_decoder/lib,node_modules/emoji-regex/es2015,node_modules/escalade/dist,node_modules/escalade/sync,node_modules/eslint/bin,node_modules/eslint/conf,node_modules/eslint/lib,node_modules/eslint/messages,node_modules/eslint/node_modules,node_modules/eslint/lib/cli-engine,node_modules/eslint/lib/init,node_modules/eslint/lib/linter,node_modules/eslint/lib/rule-tester,node_modules/eslint/lib/rules,node_modules/eslint/lib/shared,node_modules/eslint/lib/source-code,node_modules/eslint/lib/cli-engine/config-array,node_modules/eslint/lib/cli-engine/formatters,node_modules/eslint/lib/linter/code-path-analysis,node_modules/eslint/lib/rules/utils,node_modules/eslint/lib/rules/utils/patterns,node_modules/eslint/lib/rules/utils/unicode,node_modules/eslint/lib/source-code/token-store,node_modules/eslint/node_modules/.bin,node_modules/eslint/node_modules/eslint-utils,node_modules/eslint/node_modules/regexpp,node_modules/eslint/node_modules/semver,node_modules/eslint/node_modules/semver/bin,node_modules/eslint-scope/lib,node_modules/eslint-visitor-keys/lib,node_modules/espree/lib,node_modules/esprima/bin,node_modules/esprima/dist,node_modules/esquery/dist,node_modules/esquery/node_modules,node_modules/esquery/node_modules/estraverse,node_modules/esrecurse/node_modules,node_modules/esrecurse/node_modules/estraverse,node_modules/esutils/lib,node_modules/external-editor/main,node_modules/external-editor/main/errors,node_modules/fast-deep-equal/es6,node_modules/fast-json-stable-stringify/.github,node_modules/fast-json-stable-stringify/benchmark,node_modules/fast-json-stable-stringify/example,node_modules/fast-json-stable-stringify/test,node_modules/flat/test,node_modules/flat-cache/node_modules,node_modules/flat-cache/node_modules/.bin,node_modules/flat-cache/node_modules/rimraf,node_modules/flatted/.github,node_modules/flatted/cjs,node_modules/flatted/esm,node_modules/fs-extra/lib,node_modules/fs-extra/lib/copy,node_modules/fs-extra/lib/empty,node_modules/fs-extra/lib/ensure,node_modules/fs-extra/lib/fs,node_modules/fs-extra/lib/json,node_modules/fs-extra/lib/mkdirs,node_modules/fs-extra/lib/move,node_modules/fs-extra/lib/output-file,node_modules/fs-extra/lib/path-exists,node_modules/fs-extra/lib/remove,node_modules/fs-extra/lib/util,node_modules/fstream/examples,node_modules/fstream/lib,node_modules/fstream/node_modules,node_modules/fstream/node_modules/.bin,node_modules/fstream/node_modules/rimraf,node_modules/functional-red-black-tree/bench,node_modules/functional-red-black-tree/test,node_modules/gauge/node_modules,node_modules/gauge/node_modules/ansi-regex,node_modules/gauge/node_modules/strip-ansi,node_modules/google-protobuf/google,node_modules/google-protobuf/google/protobuf,node_modules/google-protobuf/google/protobuf/compiler,node_modules/growl/lib,node_modules/grpc/build,node_modules/grpc/proto,node_modules/grpc/src,node_modules/grpc/build/src,node_modules/grpc/build/src/generated,node_modules/grpc/build/src/generated/google,node_modules/grpc/build/src/generated/grpc,node_modules/grpc/build/src/generated/google/protobuf,node_modules/grpc/build/src/generated/grpc/channelz,node_modules/grpc/build/src/generated/grpc/channelz/v1,node_modules/grpc/src/generated,node_modules/grpc/src/generated/google,node_modules/grpc/src/generated/grpc,node_modules/grpc/src/generated/google/protobuf,node_modules/grpc/src/generated/grpc/channelz,node_modules/grpc/src/generated/grpc/channelz/v1,node_modules/grpc-tools/bin,node_modules/grpc-tools/bin/google,node_modules/grpc-tools/bin/google/protobuf,node_modules/grpc-tools/bin/google/protobuf/compiler,node_modules/grpc_tools_node_protoc_ts/.idea,node_modules/grpc_tools_node_protoc_ts/bin,node_modules/grpc_tools_node_protoc_ts/build,node_modules/grpc_tools_node_protoc_ts/node_modules,node_modules/grpc_tools_node_protoc_ts/src,node_modules/grpc_tools_node_protoc_ts/.idea/codeStyles,node_modules/grpc_tools_node_protoc_ts/.idea/inspectionProfiles,node_modules/grpc_tools_node_protoc_ts/build/lib,node_modules/grpc_tools_node_protoc_ts/build/lib/format,node_modules/grpc_tools_node_protoc_ts/build/lib/template,node_modules/grpc_tools_node_protoc_ts/build/lib/format/partial,node_modules/grpc_tools_node_protoc_ts/build/lib/template/partial,node_modules/grpc_tools_node_protoc_ts/node_modules/google-protobuf,node_modules/grpc_tools_node_protoc_ts/node_modules/google-protobuf/google,node_modules/grpc_tools_node_protoc_ts/node_modules/google-protobuf/google/protobuf,node_modules/grpc_tools_node_protoc_ts/node_modules/google-protobuf/google/protobuf/compiler,node_modules/grpc_tools_node_protoc_ts/src/lib,node_modules/grpc_tools_node_protoc_ts/src/typings,node_modules/grpc_tools_node_protoc_ts/src/lib/format,node_modules/grpc_tools_node_protoc_ts/src/lib/template,node_modules/grpc_tools_node_protoc_ts/src/lib/format/partial,node_modules/grpc_tools_node_protoc_ts/src/lib/template/partial,node_modules/handlebars/bin,node_modules/handlebars/dist,node_modules/handlebars/lib,node_modules/handlebars/types,node_modules/handlebars/dist/amd,node_modules/handlebars/dist/cjs,node_modules/handlebars/dist/amd/handlebars,node_modules/handlebars/dist/amd/handlebars/compiler,node_modules/handlebars/dist/amd/handlebars/decorators,node_modules/handlebars/dist/amd/handlebars/helpers,node_modules/handlebars/dist/amd/handlebars/internal,node_modules/handlebars/dist/cjs/handlebars,node_modules/handlebars/dist/cjs/handlebars/compiler,node_modules/handlebars/dist/cjs/handlebars/decorators,node_modules/handlebars/dist/cjs/handlebars/helpers,node_modules/handlebars/dist/cjs/handlebars/internal,node_modules/handlebars/lib/handlebars,node_modules/handlebars/lib/handlebars/compiler,node_modules/handlebars/lib/handlebars/decorators,node_modules/handlebars/lib/handlebars/helpers,node_modules/handlebars/lib/handlebars/internal,node_modules/he/bin,node_modules/he/man,node_modules/http-proxy-agent/dist,node_modules/https-proxy-agent/dist,node_modules/iconv-lite/encodings,node_modules/iconv-lite/lib,node_modules/iconv-lite/encodings/tables,node_modules/inquirer/lib,node_modules/inquirer/node_modules,node_modules/inquirer/lib/objects,node_modules/inquirer/lib/prompts,node_modules/inquirer/lib/ui,node_modules/inquirer/lib/utils,node_modules/inquirer/node_modules/ansi-regex,node_modules/inquirer/node_modules/ansi-styles,node_modules/inquirer/node_modules/chalk,node_modules/inquirer/node_modules/color-convert,node_modules/inquirer/node_modules/color-name,node_modules/inquirer/node_modules/has-flag,node_modules/inquirer/node_modules/strip-ansi,node_modules/inquirer/node_modules/supports-color,node_modules/inquirer/node_modules/chalk/source,node_modules/isexe/test,node_modules/js-yaml/bin,node_modules/js-yaml/dist,node_modules/js-yaml/lib,node_modules/js-yaml/lib/js-yaml,node_modules/js-yaml/lib/js-yaml/schema,node_modules/js-yaml/lib/js-yaml/type,node_modules/js-yaml/lib/js-yaml/type/js,node_modules/json-schema-traverse/spec,node_modules/json-schema-traverse/spec/fixtures,node_modules/json-stable-stringify-without-jsonify/example,node_modules/json-stable-stringify-without-jsonify/test,node_modules/levn/lib,node_modules/listenercount/test,node_modules/lodash/fp,node_modules/log-symbols/node_modules,node_modules/log-symbols/node_modules/ansi-styles,node_modules/log-symbols/node_modules/chalk,node_modules/log-symbols/node_modules/color-convert,node_modules/log-symbols/node_modules/color-name,node_modules/log-symbols/node_modules/has-flag,node_modules/log-symbols/node_modules/supports-color,node_modules/log-symbols/node_modules/chalk/source,node_modules/log4js/lib,node_modules/log4js/node_modules,node_modules/log4js/types,node_modules/log4js/lib/appenders,node_modules/log4js/node_modules/flatted,node_modules/log4js/node_modules/flatted/.github,node_modules/log4js/node_modules/flatted/cjs,node_modules/log4js/node_modules/flatted/esm,node_modules/log4js/node_modules/flatted/php,node_modules/log4js/node_modules/flatted/.github/workflows,node_modules/long/dist,node_modules/long/src,node_modules/make-dir/node_modules,node_modules/make-dir/node_modules/.bin,node_modules/make-dir/node_modules/semver,node_modules/make-dir/node_modules/semver/bin,node_modules/minimist/example,node_modules/minimist/test,node_modules/mkdirp/bin,node_modules/mocha/assets,node_modules/mocha/bin,node_modules/mocha/lib,node_modules/mocha/node_modules,node_modules/mocha/assets/growl,node_modules/mocha/lib/browser,node_modules/mocha/lib/cli,node_modules/mocha/lib/interfaces,node_modules/mocha/lib/nodejs,node_modules/mocha/lib/reporters,node_modules/mocha/lib/nodejs/reporters,node_modules/mocha/node_modules/.bin,node_modules/mocha/node_modules/argparse,node_modules/mocha/node_modules/debug,node_modules/mocha/node_modules/escape-string-regexp,node_modules/mocha/node_modules/has-flag,node_modules/mocha/node_modules/js-yaml,node_modules/mocha/node_modules/minimatch,node_modules/mocha/node_modules/ms,node_modules/mocha/node_modules/supports-color,node_modules/mocha/node_modules/which,node_modules/mocha/node_modules/argparse/lib,node_modules/mocha/node_modules/debug/node_modules,node_modules/mocha/node_modules/debug/src,node_modules/mocha/node_modules/debug/node_modules/ms,node_modules/mocha/node_modules/js-yaml/bin,node_modules/mocha/node_modules/js-yaml/dist,node_modules/mocha/node_modules/js-yaml/lib,node_modules/mocha/node_modules/js-yaml/lib/schema,node_modules/mocha/node_modules/js-yaml/lib/type,node_modules/mocha/node_modules/which/bin,node_modules/nanoid/async,node_modules/nanoid/bin,node_modules/nanoid/non-secure,node_modules/nanoid/url-alphabet,node_modules/nice-try/src,node_modules/node-fetch/lib,node_modules/nopt/bin,node_modules/nopt/lib,node_modules/optionator/lib,node_modules/picomatch/lib,node_modules/prelude-ls/lib,node_modules/progress/lib,node_modules/protobufjs/bin,node_modules/protobufjs/cli,node_modules/protobufjs/dist,node_modules/protobufjs/ext,node_modules/protobufjs/google,node_modules/protobufjs/scripts,node_modules/protobufjs/src,node_modules/protobufjs/cli/bin,node_modules/protobufjs/cli/lib,node_modules/protobufjs/cli/node_modules,node_modules/protobufjs/cli/targets,node_modules/protobufjs/cli/wrappers,node_modules/protobufjs/cli/lib/tsd-jsdoc,node_modules/protobufjs/dist/light,node_modules/protobufjs/dist/minimal,node_modules/protobufjs/ext/debug,node_modules/protobufjs/ext/descriptor,node_modules/protobufjs/google/api,node_modules/protobufjs/google/protobuf,node_modules/protobufjs/src/rpc,node_modules/protobufjs/src/util,node_modules/randomstring/bin,node_modules/randomstring/examples,node_modules/randomstring/lib,node_modules/randomstring/test,node_modules/readable-stream/lib,node_modules/readable-stream/lib/internal,node_modules/readable-stream/lib/internal/streams,node_modules/rfdc/.github,node_modules/rfdc/test,node_modules/rfdc/.github/workflows,node_modules/rxjs/_esm2015,node_modules/rxjs/_esm5,node_modules/rxjs/add,node_modules/rxjs/ajax,node_modules/rxjs/bundles,node_modules/rxjs/fetch,node_modules/rxjs/internal,node_modules/rxjs/internal-compatibility,node_modules/rxjs/migrations,node_modules/rxjs/observable,node_modules/rxjs/operator,node_modules/rxjs/operators,node_modules/rxjs/scheduler,node_modules/rxjs/src,node_modules/rxjs/symbol,node_modules/rxjs/testing,node_modules/rxjs/util,node_modules/rxjs/webSocket,node_modules/rxjs/_esm2015/ajax,node_modules/rxjs/_esm2015/fetch,node_modules/rxjs/_esm2015/internal,node_modules/rxjs/_esm2015/internal-compatibility,node_modules/rxjs/_esm2015/operators,node_modules/rxjs/_esm2015/testing,node_modules/rxjs/_esm2015/webSocket,node_modules/rxjs/_esm2015/internal/observable,node_modules/rxjs/_esm2015/internal/operators,node_modules/rxjs/_esm2015/internal/scheduled,node_modules/rxjs/_esm2015/internal/scheduler,node_modules/rxjs/_esm2015/internal/symbol,node_modules/rxjs/_esm2015/internal/testing,node_modules/rxjs/_esm2015/internal/util,node_modules/rxjs/_esm2015/internal/observable/dom,node_modules/rxjs/_esm5/ajax,node_modules/rxjs/_esm5/fetch,node_modules/rxjs/_esm5/internal,node_modules/rxjs/_esm5/internal-compatibility,node_modules/rxjs/_esm5/operators,node_modules/rxjs/_esm5/testing,node_modules/rxjs/_esm5/webSocket,node_modules/rxjs/_esm5/internal/observable,node_modules/rxjs/_esm5/internal/operators,node_modules/rxjs/_esm5/internal/scheduled,node_modules/rxjs/_esm5/internal/scheduler,node_modules/rxjs/_esm5/internal/symbol,node_modules/rxjs/_esm5/internal/testing,node_modules/rxjs/_esm5/internal/util,node_modules/rxjs/_esm5/internal/observable/dom,node_modules/rxjs/add/observable,node_modules/rxjs/add/operator,node_modules/rxjs/add/observable/dom,node_modules/rxjs/internal/observable,node_modules/rxjs/internal/operators,node_modules/rxjs/internal/scheduled,node_modules/rxjs/internal/scheduler,node_modules/rxjs/internal/symbol,node_modules/rxjs/internal/testing,node_modules/rxjs/internal/util,node_modules/rxjs/internal/observable/dom,node_modules/rxjs/migrations/update-6_0_0,node_modules/rxjs/observable/dom,node_modules/rxjs/src/add,node_modules/rxjs/src/ajax,node_modules/rxjs/src/fetch,node_modules/rxjs/src/internal,node_modules/rxjs/src/internal-compatibility,node_modules/rxjs/src/observable,node_modules/rxjs/src/operator,node_modules/rxjs/src/operators,node_modules/rxjs/src/scheduler,node_modules/rxjs/src/symbol,node_modules/rxjs/src/testing,node_modules/rxjs/src/util,node_modules/rxjs/src/webSocket,node_modules/rxjs/src/add/observable,node_modules/rxjs/src/add/operator,node_modules/rxjs/src/add/observable/dom,node_modules/rxjs/src/internal/observable,node_modules/rxjs/src/internal/operators,node_modules/rxjs/src/internal/scheduled,node_modules/rxjs/src/internal/scheduler,node_modules/rxjs/src/internal/symbol,node_modules/rxjs/src/internal/testing,node_modules/rxjs/src/internal/util,node_modules/rxjs/src/internal/observable/dom,node_modules/rxjs/src/observable/dom,node_modules/semver/bin,node_modules/semver/classes,node_modules/semver/functions,node_modules/semver/internal,node_modules/semver/ranges,node_modules/serialize-javascript/node_modules,node_modules/serialize-javascript/node_modules/randombytes,node_modules/slice-ansi/node_modules,node_modules/slice-ansi/node_modules/is-fullwidth-code-point,node_modules/source-map/dist,node_modules/source-map/lib,node_modules/sprintf-js/demo,node_modules/sprintf-js/dist,node_modules/sprintf-js/src,node_modules/sprintf-js/test,node_modules/streamroller/lib,node_modules/string-width/node_modules,node_modules/string-width/node_modules/ansi-regex,node_modules/string-width/node_modules/strip-ansi,node_modules/string_decoder/lib,node_modules/table/dist,node_modules/table/node_modules,node_modules/table/dist/schemas,node_modules/table/node_modules/emoji-regex,node_modules/table/node_modules/is-fullwidth-code-point,node_modules/table/node_modules/string-width,node_modules/table/node_modules/emoji-regex/es2015,node_modules/tar/lib,node_modules/tar/node_modules,node_modules/tar/node_modules/.bin,node_modules/tar/node_modules/mkdirp,node_modules/tar/node_modules/mkdirp/bin,node_modules/tar/node_modules/mkdirp/lib,node_modules/text-table/example,node_modules/text-table/test,node_modules/through/test,node_modules/tmp/lib,node_modules/tr46/lib,node_modules/traverse/examples,node_modules/traverse/test,node_modules/tslib/modules,node_modules/tslib/test,node_modules/tslib/test/validateModuleExportsMatchCommonJS,node_modules/tsutils/typeguard,node_modules/tsutils/util,node_modules/tsutils/typeguard/2.8,node_modules/tsutils/typeguard/2.9,node_modules/tsutils/typeguard/3.0,node_modules/tsutils/typeguard/3.2,node_modules/tsutils/typeguard/next,node_modules/type-check/lib,node_modules/type-fest/source,node_modules/typescript/bin,node_modules/typescript/lib,node_modules/typescript/loc,node_modules/typescript/lib/cs,node_modules/typescript/lib/de,node_modules/typescript/lib/es,node_modules/typescript/lib/fr,node_modules/typescript/lib/it,node_modules/typescript/lib/ja,node_modules/typescript/lib/ko,node_modules/typescript/lib/pl,node_modules/typescript/lib/pt-br,node_modules/typescript/lib/ru,node_modules/typescript/lib/tr,node_modules/typescript/lib/zh-cn,node_modules/typescript/lib/zh-tw,node_modules/typescript/loc/lcl,node_modules/typescript/loc/lcl/CHS,node_modules/typescript/loc/lcl/CHT,node_modules/typescript/loc/lcl/CSY,node_modules/typescript/loc/lcl/DEU,node_modules/typescript/loc/lcl/ESN,node_modules/typescript/loc/lcl/FRA,node_modules/typescript/loc/lcl/ITA,node_modules/typescript/loc/lcl/JPN,node_modules/typescript/loc/lcl/KOR,node_modules/typescript/loc/lcl/PLK,node_modules/typescript/loc/lcl/PTB,node_modules/typescript/loc/lcl/RUS,node_modules/typescript/loc/lcl/TRK,node_modules/typescript/loc/lcl/CHS/Targets,node_modules/typescript/loc/lcl/CHS/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/CHS/TypeScriptLanguageService,node_modules/typescript/loc/lcl/CHS/TypeScriptTasks,node_modules/typescript/loc/lcl/CHT/Targets,node_modules/typescript/loc/lcl/CHT/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/CHT/TypeScriptLanguageService,node_modules/typescript/loc/lcl/CHT/TypeScriptTasks,node_modules/typescript/loc/lcl/CSY/Targets,node_modules/typescript/loc/lcl/CSY/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/CSY/TypeScriptLanguageService,node_modules/typescript/loc/lcl/CSY/TypeScriptTasks,node_modules/typescript/loc/lcl/DEU/Targets,node_modules/typescript/loc/lcl/DEU/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/DEU/TypeScriptLanguageService,node_modules/typescript/loc/lcl/DEU/TypeScriptTasks,node_modules/typescript/loc/lcl/ESN/Targets,node_modules/typescript/loc/lcl/ESN/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/ESN/TypeScriptLanguageService,node_modules/typescript/loc/lcl/ESN/TypeScriptTasks,node_modules/typescript/loc/lcl/FRA/Targets,node_modules/typescript/loc/lcl/FRA/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/FRA/TypeScriptLanguageService,node_modules/typescript/loc/lcl/FRA/TypeScriptTasks,node_modules/typescript/loc/lcl/ITA/Targets,node_modules/typescript/loc/lcl/ITA/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/ITA/TypeScriptLanguageService,node_modules/typescript/loc/lcl/ITA/TypeScriptTasks,node_modules/typescript/loc/lcl/JPN/Targets,node_modules/typescript/loc/lcl/JPN/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/JPN/TypeScriptLanguageService,node_modules/typescript/loc/lcl/JPN/TypeScriptTasks,node_modules/typescript/loc/lcl/KOR/Targets,node_modules/typescript/loc/lcl/KOR/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/KOR/TypeScriptLanguageService,node_modules/typescript/loc/lcl/KOR/TypeScriptTasks,node_modules/typescript/loc/lcl/PLK/Targets,node_modules/typescript/loc/lcl/PLK/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/PLK/TypeScriptLanguageService,node_modules/typescript/loc/lcl/PLK/TypeScriptTasks,node_modules/typescript/loc/lcl/PTB/Targets,node_modules/typescript/loc/lcl/PTB/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/PTB/TypeScriptLanguageService,node_modules/typescript/loc/lcl/PTB/TypeScriptTasks,node_modules/typescript/loc/lcl/RUS/Targets,node_modules/typescript/loc/lcl/RUS/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/RUS/TypeScriptLanguageService,node_modules/typescript/loc/lcl/RUS/TypeScriptTasks,node_modules/typescript/loc/lcl/TRK/Targets,node_modules/typescript/loc/lcl/TRK/TypeScriptDebugEngine,node_modules/typescript/loc/lcl/TRK/TypeScriptLanguageService,node_modules/typescript/loc/lcl/TRK/TypeScriptTasks,node_modules/uglify-js/bin,node_modules/uglify-js/lib,node_modules/uglify-js/tools,node_modules/unzipper/.circleci,node_modules/unzipper/lib,node_modules/unzipper/node_modules,node_modules/unzipper/lib/Open,node_modules/unzipper/node_modules/bluebird,node_modules/unzipper/node_modules/readable-stream,node_modules/unzipper/node_modules/safe-buffer,node_modules/unzipper/node_modules/string_decoder,node_modules/unzipper/node_modules/bluebird/js,node_modules/unzipper/node_modules/bluebird/js/browser,node_modules/unzipper/node_modules/bluebird/js/release,node_modules/unzipper/node_modules/readable-stream/doc,node_modules/unzipper/node_modules/readable-stream/lib,node_modules/unzipper/node_modules/readable-stream/doc/wg-meetings,node_modules/unzipper/node_modules/readable-stream/lib/internal,node_modules/unzipper/node_modules/readable-stream/lib/internal/streams,node_modules/unzipper/node_modules/string_decoder/lib,node_modules/uri-js/dist,node_modules/uri-js/dist/es5,node_modules/uri-js/dist/esnext,node_modules/uri-js/dist/esnext/schemes,node_modules/webidl-conversions/lib,node_modules/whatwg-url/lib,node_modules/which/bin,node_modules/wordwrap/example,node_modules/wordwrap/test,node_modules/workerpool/dist,node_modules/workerpool/src,node_modules/workerpool/src/generated,node_modules/wrap-ansi/node_modules,node_modules/wrap-ansi/node_modules/ansi-regex,node_modules/wrap-ansi/node_modules/ansi-styles,node_modules/wrap-ansi/node_modules/color-convert,node_modules/wrap-ansi/node_modules/color-name,node_modules/wrap-ansi/node_modules/strip-ansi,node_modules/y18n/build,node_modules/y18n/build/lib,node_modules/y18n/build/lib/platform-shims,node_modules/yargs/build,node_modules/yargs/helpers,node_modules/yargs/lib,node_modules/yargs/locales,node_modules/yargs/build/lib,node_modules/yargs/build/lib/typings,node_modules/yargs/build/lib/utils,node_modules/yargs/lib/platform-shims,node_modules/yargs-parser/build,node_modules/yargs-parser/build/lib,src,src/cache,src/client,src/codelens,src/config,src/dataloader,src/emitter,src/explorer,src/generators,src/interface,src/proto-ts,src/requests,src/responses,src/runner,src/test,src/utils,src/validators,src/visualizers,src/wizard,src/test/suite,syntaxes" + "git.ignoreLimitWarning": true } \ No newline at end of file