summaryrefslogtreecommitdiff
path: root/platform/platform-tests/testSrc/com/intellij/openapi/components/impl/ApplicationStoreTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/platform-tests/testSrc/com/intellij/openapi/components/impl/ApplicationStoreTest.java')
-rw-r--r--platform/platform-tests/testSrc/com/intellij/openapi/components/impl/ApplicationStoreTest.java153
1 files changed, 153 insertions, 0 deletions
diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/components/impl/ApplicationStoreTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/components/impl/ApplicationStoreTest.java
new file mode 100644
index 000000000000..cfbd5a12f146
--- /dev/null
+++ b/platform/platform-tests/testSrc/com/intellij/openapi/components/impl/ApplicationStoreTest.java
@@ -0,0 +1,153 @@
+package com.intellij.openapi.components.impl;
+
+import com.intellij.application.options.PathMacrosImpl;
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.components.*;
+import com.intellij.openapi.components.impl.stores.*;
+import com.intellij.openapi.util.Disposer;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.testFramework.LightPlatformLangTestCase;
+import com.intellij.util.xmlb.XmlSerializerUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.File;
+import java.io.IOException;
+
+public class ApplicationStoreTest extends LightPlatformLangTestCase {
+ private File testAppConfig;
+ private MyComponentStore componentStore;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ String testAppConfigPath = System.getProperty("test.app.config.path");
+ if (testAppConfigPath == null) {
+ testAppConfig = FileUtil.createTempDirectory("testAppSettings", null);
+ }
+ else {
+ testAppConfig = new File(FileUtil.expandUserHome(testAppConfigPath));
+ }
+ FileUtil.delete(testAppConfig);
+
+ componentStore = new MyComponentStore(testAppConfig.getAbsolutePath());
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ try {
+ Disposer.dispose(componentStore);
+ componentStore = null;
+ }
+ finally {
+ try {
+ super.tearDown();
+ }
+ finally {
+ FileUtil.delete(testAppConfig);
+ }
+ }
+ }
+
+ public void testStreamProviderSaveIfSeveralStoragesConfigured() throws Exception {
+ SeveralStoragesConfigured component = new SeveralStoragesConfigured();
+ componentStore.initComponent(component, false);
+ StoreUtil.doSave(componentStore);
+ }
+
+ class MyComponentStore extends ComponentStoreImpl implements Disposable {
+ private final StateStorageManager stateStorageManager;
+
+ MyComponentStore(@NotNull final String testAppConfigPath) {
+ TrackingPathMacroSubstitutor macroSubstitutor = new ApplicationPathMacroManager().createTrackingSubstitutor();
+ stateStorageManager = new StateStorageManagerImpl(macroSubstitutor, "application", this, ApplicationManager.getApplication().getPicoContainer()) {
+ @Override
+ protected StorageData createStorageData(String storageSpec) {
+ return new FileBasedStorage.FileStorageData("application");
+ }
+
+ @Nullable
+ @Override
+ protected String getOldStorageSpec(Object component, final String componentName, final StateStorageOperation operation) {
+ return null;
+ }
+
+ @Override
+ protected String getVersionsFilePath() {
+ return testAppConfigPath + "/options/appComponentVersions.xml";
+ }
+
+ @Override
+ protected TrackingPathMacroSubstitutor getMacroSubstitutor(@NotNull final String fileSpec) {
+ if (fileSpec.equals(StoragePathMacros.APP_CONFIG + "/" + PathMacrosImpl.EXT_FILE_NAME + ".xml")) {
+ return null;
+ }
+ return super.getMacroSubstitutor(fileSpec);
+ }
+ };
+
+ stateStorageManager.addMacro(StoragePathMacros.getMacroName(StoragePathMacros.APP_CONFIG), testAppConfigPath);
+ }
+
+ @Override
+ public void load() throws IOException, StateStorageException {
+ }
+
+ @NotNull
+ @Override
+ public StateStorageManager getStateStorageManager() {
+ return stateStorageManager;
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Nullable
+ @Override
+ protected StateStorage getDefaultsStorage() {
+ return null;
+ }
+ }
+
+ static class SeveralStoragesConfiguredStorageChooser implements StateStorageChooser<SeveralStoragesConfigured> {
+ @Override
+ public Storage[] selectStorages(Storage[] storages, SeveralStoragesConfigured component, StateStorageOperation operation) {
+ if (operation == StateStorageOperation.WRITE) {
+ for (Storage storage : storages) {
+ if (storage.file().equals(StoragePathMacros.APP_CONFIG + "/proxy.settings.xml")) {
+ return new Storage[]{storage};
+ }
+ }
+ }
+ return storages;
+ }
+ }
+
+ @State(
+ name = "HttpConfigurable",
+ storages = {
+ // we use two storages due to backward compatibility, see http://crucible.labs.intellij.net/cru/CR-IC-5142
+ @Storage(file = StoragePathMacros.APP_CONFIG + "/other.xml"),
+ @Storage(file = StoragePathMacros.APP_CONFIG + "/proxy.settings.xml")
+ },
+ storageChooser = SeveralStoragesConfiguredStorageChooser.class
+ )
+ static class SeveralStoragesConfigured implements PersistentStateComponent<SeveralStoragesConfigured> {
+ public String foo = "defaultValue";
+
+ @Nullable
+ @Override
+ public SeveralStoragesConfigured getState() {
+ foo = "newValue";
+ return this;
+ }
+
+ @Override
+ public void loadState(SeveralStoragesConfigured state) {
+ XmlSerializerUtil.copyBean(state, this);
+ }
+ }
+}