diff --git a/platform/configuration-store-impl/testSrc/ApplicationStoreTest.kt b/platform/configuration-store-impl/testSrc/ApplicationStoreTest.kt index f586f6d4bbc5..bed82a605b04 100644 --- a/platform/configuration-store-impl/testSrc/ApplicationStoreTest.kt +++ b/platform/configuration-store-impl/testSrc/ApplicationStoreTest.kt @@ -16,12 +16,9 @@ package com.intellij.configurationStore import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.components.* import com.intellij.openapi.components.impl.stores.StreamProvider -import com.intellij.openapi.util.io.FileUtilRt import com.intellij.openapi.vfs.CharsetToolkit -import com.intellij.openapi.vfs.VirtualFile import com.intellij.testFramework.* import com.intellij.util.SmartList import com.intellij.util.xmlb.XmlSerializerUtil @@ -34,6 +31,7 @@ import org.junit.Rule import org.junit.Test import java.io.ByteArrayInputStream import java.io.InputStream +import java.nio.file.Path import java.nio.file.Paths import kotlin.properties.Delegates @@ -48,12 +46,12 @@ class ApplicationStoreTest { private val edtRule = EdtRule() public Rule fun _edtRule(): EdtRule = edtRule - private var testAppConfig: VirtualFile by Delegates.notNull() + private var testAppConfig: Path by Delegates.notNull() private var componentStore: MyComponentStore by Delegates.notNull() public Before fun setUp() { - testAppConfig = tempDirManager.newVirtualDirectory() - componentStore = MyComponentStore(FileUtilRt.toSystemIndependentName(testAppConfig.getPath())) + testAppConfig = tempDirManager.newPath(refreshVfs = false) + componentStore = MyComponentStore(testAppConfig.systemIndependentPath) } @Test fun `stream provider save if several storages configured`() { @@ -85,11 +83,11 @@ class ApplicationStoreTest { assertThat(Paths.get(componentStore.storageManager.expandMacros(fileSpec))).exists() } - @Test @RunsInEdt fun `remove deprecated storage on write`() { + @Test fun `remove deprecated storage on write`() { doRemoveDeprecatedStorageOnWrite(SeveralStoragesConfigured()) } - @Test @RunsInEdt fun `remove deprecated storage on write 2`() { + @Test fun `remove deprecated storage on write 2`() { doRemoveDeprecatedStorageOnWrite(ActualStorageLast()) } @@ -97,16 +95,18 @@ class ApplicationStoreTest { val oldFile = writeConfig("other.xml", "") writeConfig("proxy.settings.xml", "") + testAppConfig.refreshVfs() + componentStore.initComponent(component, false) assertThat(component.foo).isEqualTo("new") component.foo = "new2" - componentStore.save(SmartList()) + runInEdtAndWait { componentStore.save(SmartList()) } assertThat(oldFile.exists()).isFalse() } - private fun writeConfig(fileName: String, Language("XML") data: String) = runWriteAction { testAppConfig.writeChild(fileName, data) } + private fun writeConfig(fileName: String, Language("XML") data: String) = testAppConfig.writeChild(fileName, data) private class MyStreamProvider : StreamProvider { public val data: MutableMap> = THashMap() diff --git a/platform/testFramework/src/com/intellij/testFramework/TemporaryDirectory.kt b/platform/testFramework/src/com/intellij/testFramework/TemporaryDirectory.kt index 7f0a3d15602b..aa1406b3143e 100644 --- a/platform/testFramework/src/com/intellij/testFramework/TemporaryDirectory.kt +++ b/platform/testFramework/src/com/intellij/testFramework/TemporaryDirectory.kt @@ -51,19 +51,15 @@ public class TemporaryDirectory : ExternalResource() { */ public fun newDirectory(directoryName: String? = null): File = generatePath(directoryName).toFile() - public fun newPath(directoryName: String? = null): Path { + public fun newPath(directoryName: String? = null, refreshVfs: Boolean = true): Path { val path = generatePath(directoryName) - LocalFileSystem.getInstance()?.let { fs -> - // If a temp directory is reused from some previous test run, there might be cached children in its VFS. Ensure they're removed. - val virtualFile = fs.findFileByPath(path.systemIndependentPath) - if (virtualFile != null) { - VfsUtil.markDirtyAndRefresh(false, true, true, virtualFile) - } + if (refreshVfs) { + path.refreshVfs() } return path } - public fun generatePath(suffix: String?): Path { + private fun generatePath(suffix: String?): Path { var fileName = sanitizedName!! if (suffix != null) { fileName += "_$suffix" @@ -122,7 +118,23 @@ public val Path.parentSystemIndependentPath: String public fun Path.readText(): String = Files.readAllBytes(this).toString(Charsets.UTF_8) -fun VirtualFile.writeChild(relativePath: String, data: String) = VfsTestUtil.createFile(this, relativePath, data) +public fun VirtualFile.writeChild(relativePath: String, data: String): VirtualFile = VfsTestUtil.createFile(this, relativePath, data) + +public fun Path.writeChild(relativePath: String, data: String): Path { + val path = resolve(relativePath) + path.getParent().createDirectories() + return Files.write(path, data.toByteArray()) +} + +public fun Path.refreshVfs() { + LocalFileSystem.getInstance()?.let { fs -> + // If a temp directory is reused from some previous test run, there might be cached children in its VFS. Ensure they're removed. + val virtualFile = fs.findFileByPath(systemIndependentPath) + if (virtualFile != null) { + VfsUtil.markDirtyAndRefresh(false, true, true, virtualFile) + } + } +} val VirtualFile.path: String get() = getPath() \ No newline at end of file