diff options
author | Thomas Watson | 2017-11-15 16:32:18 +0000 |
---|---|---|
committer | Thomas Watson | 2017-11-15 16:32:44 +0000 |
commit | 399ac521ec3043355fe1a0daa2bb0f0483c28605 (patch) | |
tree | 6a3bb9052c4b4805745a710cfadc846c77891fa8 | |
parent | ff045ea2ff997f4e4cf576d0dfb6c142b060f3f9 (diff) | |
download | rt.equinox.framework-399ac521ec3043355fe1a0daa2bb0f0483c28605.tar.gz rt.equinox.framework-399ac521ec3043355fe1a0daa2bb0f0483c28605.tar.xz rt.equinox.framework-399ac521ec3043355fe1a0daa2bb0f0483c28605.zip |
Bug 527302 - Issues installing bundles when a clean operation is initiated by StorageI20171115-2000
4 files changed, 30 insertions, 2 deletions
diff --git a/bundles/org.eclipse.osgi.tests/bundles_src/storage.hooks.a/org/eclipse/osgi/tests/hooks/framework/storage/a/TestHookConfigurator.java b/bundles/org.eclipse.osgi.tests/bundles_src/storage.hooks.a/org/eclipse/osgi/tests/hooks/framework/storage/a/TestHookConfigurator.java index 3f68e6690..ec927f627 100644 --- a/bundles/org.eclipse.osgi.tests/bundles_src/storage.hooks.a/org/eclipse/osgi/tests/hooks/framework/storage/a/TestHookConfigurator.java +++ b/bundles/org.eclipse.osgi.tests/bundles_src/storage.hooks.a/org/eclipse/osgi/tests/hooks/framework/storage/a/TestHookConfigurator.java @@ -39,7 +39,10 @@ public class TestHookConfigurator implements HookConfigurator { @Override public void load(Object loadContext, DataInputStream is) { - // Nothing. + if (TestHookConfigurator.failLoad) { + // will force a clean + throw new IllegalArgumentException(); + } } @Override @@ -106,6 +109,7 @@ public class TestHookConfigurator implements HookConfigurator { public static volatile boolean createStorageHookCalled; public static volatile boolean invalid; + public static volatile boolean failLoad; public static volatile boolean invalidFactoryClass; public static volatile boolean validateCalled; public static volatile boolean deletingGenerationCalled; diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java index 1df9950fa..40f6d98a8 100755 --- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java +++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/bundles/SystemBundleTests.java @@ -2761,7 +2761,7 @@ public class SystemBundleTests extends AbstractBundleTests { return bundles; } - static File createBundle(File outputDir, String id, boolean emptyManifest, boolean dirBundle) throws IOException { + public static File createBundle(File outputDir, String id, boolean emptyManifest, boolean dirBundle) throws IOException { File file = new File(outputDir, "bundle" + id + (dirBundle ? "" : ".jar")); //$NON-NLS-1$ //$NON-NLS-2$ if (!dirBundle) { JarOutputStream jos = new JarOutputStream(new FileOutputStream(file), createManifest(id, emptyManifest)); diff --git a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/StorageHookTests.java b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/StorageHookTests.java index ad52a358f..0a58c1724 100644 --- a/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/StorageHookTests.java +++ b/bundles/org.eclipse.osgi.tests/src/org/eclipse/osgi/tests/hooks/framework/StorageHookTests.java @@ -18,6 +18,7 @@ import java.util.*; import org.eclipse.osgi.container.ModuleContainerAdaptor.ModuleEvent; import org.eclipse.osgi.internal.hookregistry.HookRegistry; import org.eclipse.osgi.tests.OSGiTestsActivator; +import org.eclipse.osgi.tests.bundles.SystemBundleTests; import org.osgi.framework.*; import org.osgi.framework.launch.Framework; import org.osgi.framework.wiring.BundleRevision; @@ -28,6 +29,7 @@ public class StorageHookTests extends AbstractFrameworkHookTests { private static final String HOOK_CONFIGURATOR_BUNDLE = "storage.hooks.a"; private static final String HOOK_CONFIGURATOR_CLASS = "org.eclipse.osgi.tests.hooks.framework.storage.a.TestHookConfigurator"; private static final String HOOK_CONFIGURATOR_FIELD_CREATE_STORAGE_HOOK_CALLED = "createStorageHookCalled"; + private static final String HOOK_CONFIGURATOR_FIELD_FAIL_LOAD = "failLoad"; private static final String HOOK_CONFIGURATOR_FIELD_INVALID = "invalid"; private static final String HOOK_CONFIGURATOR_FIELD_INVALID_FACTORY_CLASS = "invalidFactoryClass"; private static final String HOOK_CONFIGURATOR_FIELD_VALIDATE_CALLED = "validateCalled"; @@ -114,6 +116,18 @@ public class StorageHookTests extends AbstractFrameworkHookTests { assertCreateStorageHookCalled(); } + public void testCleanOnFailLoad() throws Exception { + initAndStartFramework(); + installBundle(); + setFactoryHookFailLoad(true); + restartFramework(); + assertBundleDiscarded(); + // install a bundle without reference to test that the staging area is created correctly after clean + File bundlesBase = new File(OSGiTestsActivator.getContext().getDataFile(getName()), "bundles"); + bundlesBase.mkdirs(); + framework.getBundleContext().installBundle(SystemBundleTests.createBundle(bundlesBase, getName(), false, false).toURI().toString()); + } + public void testDeletingGenerationCalledOnDiscard() throws Exception { initAndStartFramework(); installBundle(); @@ -266,6 +280,7 @@ public class StorageHookTests extends AbstractFrameworkHookTests { clazz.getField(HOOK_CONFIGURATOR_FIELD_INVALID_FACTORY_CLASS).set(null, false); clazz.getField(HOOK_CONFIGURATOR_FIELD_DELETING_CALLED).set(null, false); clazz.getField(HOOK_CONFIGURATOR_FIELD_ADAPT_MANIFEST).set(null, false); + clazz.getField(HOOK_CONFIGURATOR_FIELD_FAIL_LOAD).set(null, false); } private void restartFramework() throws Exception { @@ -292,6 +307,11 @@ public class StorageHookTests extends AbstractFrameworkHookTests { clazz.getField(HOOK_CONFIGURATOR_FIELD_REPLACE_BUILDER).set(null, value); } + private void setFactoryHookFailLoad(boolean value) throws Exception { + Class<?> clazz = classLoader.loadClass(HOOK_CONFIGURATOR_CLASS); + clazz.getField(HOOK_CONFIGURATOR_FIELD_FAIL_LOAD).set(null, value); + } + private void updateBundle() throws Exception { framework.getBundleContext().getBundle(location).update(); } diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java index 728585915..9548fe962 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/storage/Storage.java @@ -381,6 +381,10 @@ public class Storage { if (location.isReadOnly() || !StorageUtil.rm(root, getConfiguration().getDebug().DEBUG_STORAGE)) { equinoxContainer.getLogServices().log(EquinoxContainer.NAME, FrameworkLogEntry.ERROR, "The -clean (osgi.clean) option was not successful. Unable to clean the storage area: " + root.getAbsolutePath(), null); //$NON-NLS-1$ } + if (!location.isReadOnly()) { + // make sure to recreate to root folder + root.mkdirs(); + } } public ModuleDatabase getModuleDatabase() { |