From b0f774a2cf4e68eeb62ec532ed4d1314dffdf72f Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Wed, 24 Sep 2014 21:22:03 +0200 Subject: [PATCH] Ensure that Smack is initialized when calling ProviderManager --- .../smack/provider/ProviderManager.java | 9 ++++ .../smack/provider/ProviderManagerTest.java | 45 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderManagerTest.java diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderManager.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderManager.java index af6e396ec..5ecd76b39 100644 --- a/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderManager.java +++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderManager.java @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.jivesoftware.smack.SmackConfiguration; import org.jivesoftware.smack.packet.IQ; import org.jxmpp.util.XmppStringUtils; @@ -110,6 +111,14 @@ public final class ProviderManager { private static final Map iqProviders = new ConcurrentHashMap(); private static final Map streamFeatureProviders = new ConcurrentHashMap(); + static { + // Ensure that Smack is initialized by calling getVersion, so that user + // registered providers do not get overwritten by a following Smack + // initialization. This guarantees that Smack is initialized before a + // new provider is registered + SmackConfiguration.getVersion(); + } + public static void addLoader(ProviderLoader loader) { if (loader.getIQProviderInfo() != null) { for (IQProviderInfo info : loader.getIQProviderInfo()) { diff --git a/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderManagerTest.java b/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderManagerTest.java new file mode 100644 index 000000000..601c03afa --- /dev/null +++ b/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderManagerTest.java @@ -0,0 +1,45 @@ +/** + * + * Copyright © 2014 Florian Schmaus + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jivesoftware.smack.provider; + +import static org.junit.Assert.assertTrue; + +import org.jivesoftware.smack.SmackConfiguration; +import org.jivesoftware.smack.packet.IQ; +import org.junit.Test; +import org.xmlpull.v1.XmlPullParser; + +public class ProviderManagerTest { + + /** + * This test should be run in a clean (e.g. forked) VM + */ + @Test + public void shouldInitializeSmackTest() throws Exception{ + ProviderManager.addIQProvider("foo", "bar", new TestIQProvider()); + assertTrue(SmackConfiguration.isSmackInitialized()); + } + + public static class TestIQProvider implements IQProvider { + + @Override + public IQ parseIQ(XmlPullParser parser) throws Exception { + return null; + } + + } +}