@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.idea.util.projectStructure.sdk
23
23
import org.utbot.common.PathUtil.toPath
24
24
import org.utbot.common.appendHtmlLine
25
25
import org.utbot.framework.UtSettings
26
+ import org.utbot.framework.plugin.api.util.LockFile
26
27
import org.utbot.intellij.plugin.ui.WarningTestsReportNotifier
27
28
import org.utbot.intellij.plugin.ui.utils.showErrorDialogLater
28
29
import org.utbot.intellij.plugin.ui.utils.testModules
@@ -114,61 +115,68 @@ object PythonDialogProcessor {
114
115
private fun createTests (project : Project , model : PythonTestsModel ) {
115
116
ProgressManager .getInstance().run (object : Backgroundable (project, " Generate python tests" ) {
116
117
override fun run (indicator : ProgressIndicator ) {
117
- val pythonPath = model.srcModule.sdk?.homePath
118
- if (pythonPath == null ) {
119
- showErrorDialogLater(
120
- project,
121
- message = " Couldn't find Python interpreter" ,
122
- title = " Python test generation error"
123
- )
124
- return
125
- }
126
- val methods = findSelectedPythonMethods(model)
127
- if (methods == null ) {
128
- showErrorDialogLater(
129
- project,
130
- message = " Couldn't parse file. Maybe it contains syntax error?" ,
131
- title = " Python test generation error"
132
- )
118
+ if (! LockFile .lock()) {
133
119
return
134
120
}
135
- processTestGeneration(
136
- pythonPath = pythonPath,
137
- pythonFilePath = model.file.virtualFile.path,
138
- pythonFileContent = getContentFromPyFile(model.file),
139
- directoriesForSysPath = model.directoriesForSysPath,
140
- currentPythonModule = model.currentPythonModule,
141
- pythonMethods = methods,
142
- containingClassName = model.containingClass?.name,
143
- timeout = model.timeout,
144
- testFramework = model.testFramework,
145
- timeoutForRun = model.timeoutForRun,
146
- visitOnlySpecifiedSource = model.visitOnlySpecifiedSource,
147
- isCanceled = { indicator.isCanceled },
148
- checkingRequirementsAction = { indicator.text = " Checking requirements" },
149
- requirementsAreNotInstalledAction = {
150
- askAndInstallRequirementsLater(model.project, pythonPath)
151
- PythonTestGenerationProcessor .MissingRequirementsActionResult .NOT_INSTALLED
152
- },
153
- startedLoadingPythonTypesAction = { indicator.text = " Loading information about Python types" },
154
- startedTestGenerationAction = { indicator.text = " Generating tests" },
155
- notGeneratedTestsAction = {
121
+ try {
122
+ val pythonPath = model.srcModule.sdk?.homePath
123
+ if (pythonPath == null ) {
124
+ showErrorDialogLater(
125
+ project,
126
+ message = " Couldn't find Python interpreter" ,
127
+ title = " Python test generation error"
128
+ )
129
+ return
130
+ }
131
+ val methods = findSelectedPythonMethods(model)
132
+ if (methods == null ) {
156
133
showErrorDialogLater(
157
134
project,
158
- message = " Cannot create tests for the following functions: " + it.joinToString() ,
135
+ message = " Couldn't parse file. Maybe it contains syntax error? " ,
159
136
title = " Python test generation error"
160
137
)
161
- },
162
- writeTestTextToFile = { generatedCode ->
163
- writeGeneratedCodeToPsiDocument(generatedCode, model)
164
- },
165
- processMypyWarnings = {
166
- val message = it.fold(StringBuilder ()) { acc, line -> acc.appendHtmlLine(line) }
167
- WarningTestsReportNotifier .notify(message.toString())
168
- },
169
- startedCleaningAction = { indicator.text = " Cleaning up..." },
170
- pythonRunRoot = Path (model.testSourceRootPath)
171
- )
138
+ return
139
+ }
140
+ processTestGeneration(
141
+ pythonPath = pythonPath,
142
+ pythonFilePath = model.file.virtualFile.path,
143
+ pythonFileContent = getContentFromPyFile(model.file),
144
+ directoriesForSysPath = model.directoriesForSysPath,
145
+ currentPythonModule = model.currentPythonModule,
146
+ pythonMethods = methods,
147
+ containingClassName = model.containingClass?.name,
148
+ timeout = model.timeout,
149
+ testFramework = model.testFramework,
150
+ timeoutForRun = model.timeoutForRun,
151
+ visitOnlySpecifiedSource = model.visitOnlySpecifiedSource,
152
+ isCanceled = { indicator.isCanceled },
153
+ checkingRequirementsAction = { indicator.text = " Checking requirements" },
154
+ requirementsAreNotInstalledAction = {
155
+ askAndInstallRequirementsLater(model.project, pythonPath)
156
+ PythonTestGenerationProcessor .MissingRequirementsActionResult .NOT_INSTALLED
157
+ },
158
+ startedLoadingPythonTypesAction = { indicator.text = " Loading information about Python types" },
159
+ startedTestGenerationAction = { indicator.text = " Generating tests" },
160
+ notGeneratedTestsAction = {
161
+ showErrorDialogLater(
162
+ project,
163
+ message = " Cannot create tests for the following functions: " + it.joinToString(),
164
+ title = " Python test generation error"
165
+ )
166
+ },
167
+ writeTestTextToFile = { generatedCode ->
168
+ writeGeneratedCodeToPsiDocument(generatedCode, model)
169
+ },
170
+ processMypyWarnings = {
171
+ val message = it.fold(StringBuilder ()) { acc, line -> acc.appendHtmlLine(line) }
172
+ WarningTestsReportNotifier .notify(message.toString())
173
+ },
174
+ startedCleaningAction = { indicator.text = " Cleaning up..." },
175
+ pythonRunRoot = Path (model.testSourceRootPath)
176
+ )
177
+ } finally {
178
+ LockFile .unlock()
179
+ }
172
180
}
173
181
})
174
182
}
0 commit comments