/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.apache.felix.ipojo.runtime.core;

import org.apache.felix.ipojo.ComponentInstance;
import org.apache.felix.ipojo.runtime.core.services.FooService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;

import java.io.IOException;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Properties;

import static junit.framework.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;

/**
 * iPOJO does not expose the ManagedServiceFactory anymore, we must use the configuration admin.
 */
public class TestDynamicallyConfigurablePropertiesUsingConfigAdmin extends Common {

    ComponentInstance instance, instance2;

    @Before
    public void setUp() {
        String type = "CONFIG-FooProviderType-3";

        Hashtable<String, String> p1 = new Hashtable<String, String>();
        p1.put("instance.name", "instance-r");
        p1.put("foo", "foo");
        p1.put("bar", "2");
        p1.put("baz", "baz");
        instance = ipojoHelper.createComponentInstance(type, p1);

        Hashtable<String, String> p2 = new Hashtable<String, String>();
        p2.put("instance.name", "instance2");

        instance2 = ipojoHelper.createComponentInstance(type, p2);
    }

    @After
    public void tearDown() {
        instance.dispose();
        instance2.dispose();
        instance2 = null;
        instance = null;
    }

    @Test
    public void testStatic() throws IOException, InterruptedException {
        ServiceReference fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance.getInstanceName());
        assertNotNull("Check FS availability", fooRef);
        String fooP = (String) fooRef.getProperty("foo");
        Integer barP = (Integer) fooRef.getProperty("bar");
        String bazP = (String) fooRef.getProperty("baz");
        assertEquals("Check foo equality -1", fooP, "foo");
        assertEquals("Check bar equality -1", barP, new Integer(2));
        assertEquals("Check baz equality -1", bazP, "baz");

        ConfigurationAdmin admin = osgiHelper.getServiceObject(ConfigurationAdmin.class);
        assertNotNull("Check Configuration Admin availability", admin);

        Configuration configuration = admin.getConfiguration(instance.getInstanceName(),
                getTestBundle().getLocation());

        // Configuration of baz
        Dictionary<String, Object> conf = new Hashtable<String, Object>();
        conf.put("baz", "zab");
        conf.put("bar", 2);
        conf.put("foo", "foo");
        conf.put("instance.name", instance.getInstanceName());

        configuration.update(conf);

        // Asynchronous dispatching of the configuration
        grace();

        // Recheck props
        fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance.getInstanceName());
        fooP = (String) fooRef.getProperty("foo");
        barP = (Integer) fooRef.getProperty("bar");
        bazP = (String) fooRef.getProperty("baz");
        assertEquals("Check foo equality -2", fooP, "foo");
        assertEquals("Check bar equality -2", barP, new Integer(2));
        assertEquals("Check baz equality -2", bazP, "zab");
    }

    @Test
    public void testStaticNoValue() throws IOException, InterruptedException {
        ServiceReference fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance2.getInstanceName());
        assertNotNull("Check FS availability", fooRef);
        Object fooP = fooRef.getProperty("foo");
        Object barP = fooRef.getProperty("bar");
        Object bazP = fooRef.getProperty("baz");
        assertEquals("Check foo equality -1", fooP, null);
        assertEquals("Check bar equality -1", barP, null);
        assertEquals("Check baz equality -1", bazP, null);

        ConfigurationAdmin admin = osgiHelper.getServiceObject(ConfigurationAdmin.class);
        assertNotNull("Check Configuration Admin availability", admin);

        Configuration configuration = admin.getConfiguration(instance2.getInstanceName(),
                getTestBundle().getLocation());

        // Configuration of baz
        Dictionary<String, Object> conf = new Hashtable<String, Object>();
        conf.put("baz", "zab");
        conf.put("bar", 2);
        conf.put("foo", "foo");

        // Asynchronous dispatching of the configuration
        configuration.update(conf);
        grace();

        // Recheck props
        fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance2.getInstanceName());
        fooP = (String) fooRef.getProperty("foo");
        barP = (Integer) fooRef.getProperty("bar");
        bazP = (String) fooRef.getProperty("baz");
        assertEquals("Check foo equality -2", fooP, "foo");
        assertEquals("Check bar equality -2", barP, 2);
        assertEquals("Check baz equality -2", bazP, "zab");
    }

    @Test
    public void testDynamic() throws IOException, InterruptedException {
        ServiceReference fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance.getInstanceName());
        assertNotNull("Check FS availability", fooRef);

        String fooP = (String) fooRef.getProperty("foo");
        Integer barP = (Integer) fooRef.getProperty("bar");
        String bazP = (String) fooRef.getProperty("baz");

        assertEquals("Check foo equality", fooP, "foo");
        assertEquals("Check bar equality", barP, new Integer(2));
        assertEquals("Check baz equality", bazP, "baz");

        ConfigurationAdmin admin = osgiHelper.getServiceObject(ConfigurationAdmin.class);
        assertNotNull("Check Configuration Admin availability", admin);

        Configuration configuration = admin.getConfiguration(instance.getInstanceName(),
                getTestBundle().getLocation());

        // Configuration of baz
        Dictionary<String, Object> conf = new Hashtable<String, Object>();
        conf.put("baz", "zab");
        conf.put("foo", "oof");
        conf.put("bar", 0);

        // Asynchronous dispatching of the configuration
        configuration.update(conf);
        grace();

        // Recheck props
        fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance.getInstanceName());
        fooP = (String) fooRef.getProperty("foo");
        barP = (Integer) fooRef.getProperty("bar");
        bazP = (String) fooRef.getProperty("baz");

        assertEquals("Check foo equality", fooP, "oof");
        assertEquals("Check bar equality", barP, new Integer(0));
        assertEquals("Check baz equality", bazP, "zab");

        // Check field value
        FooService fs = (FooService) osgiHelper.getContext().getService(fooRef);
        Properties p = fs.fooProps();
        fooP = (String) p.get("foo");
        barP = (Integer) p.get("bar");

        assertEquals("Check foo field equality", fooP, "oof");
        assertEquals("Check bar field equality", barP, new Integer(0));

        osgiHelper.getContext().ungetService(fooRef);
    }

    @Test
    public void testDynamicNoValue() throws IOException, InterruptedException {
        ServiceReference fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance2.getInstanceName());
        assertNotNull("Check FS availability", fooRef);

        Object fooP = fooRef.getProperty("foo");
        Object barP = fooRef.getProperty("bar");
        Object bazP = fooRef.getProperty("baz");
        assertEquals("Check foo equality -1", fooP, null);
        assertEquals("Check bar equality -1", barP, null);
        assertEquals("Check baz equality -1", bazP, null);

        ConfigurationAdmin admin = osgiHelper.getServiceObject(ConfigurationAdmin.class);
        assertNotNull("Check Configuration Admin availability", admin);

        Configuration configuration = admin.getConfiguration(instance2.getInstanceName(),
                getTestBundle().getLocation());

        // Configuration of baz
        Dictionary<String, Object> conf = new Hashtable<String, Object>();
        conf.put("baz", "zab");
        conf.put("foo", "oof");
        conf.put("bar", 0);

        // Asynchronous dispatching of the configuration
        configuration.update(conf);
        grace();

        // Recheck props
        fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance2.getInstanceName());
        fooP = (String) fooRef.getProperty("foo");
        barP = (Integer) fooRef.getProperty("bar");
        bazP = (String) fooRef.getProperty("baz");

        assertEquals("Check foo equality", fooP, "oof");
        assertEquals("Check bar equality", barP, 0);
        assertEquals("Check baz equality", bazP, "zab");

        // Check field value
        FooService fs = (FooService) osgiHelper.getContext().getService(fooRef);
        Properties p = fs.fooProps();
        fooP = (String) p.get("foo");
        barP = (Integer) p.get("bar");

        assertEquals("Check foo field equality", fooP, "oof");
        assertEquals("Check bar field equality", barP, 0);

        osgiHelper.getContext().ungetService(fooRef);
    }

    @Test
    public void testDynamicString() throws IOException, InterruptedException {
        ServiceReference fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(),
                instance.getInstanceName());
        assertNotNull("Check FS availability", fooRef);

        String fooP = (String) fooRef.getProperty("foo");
        Integer barP = (Integer) fooRef.getProperty("bar");
        String bazP = (String) fooRef.getProperty("baz");

        assertEquals("Check foo equality", fooP, "foo");
        assertEquals("Check bar equality", barP, new Integer(2));
        assertEquals("Check baz equality", bazP, "baz");

        ConfigurationAdmin admin = osgiHelper.getServiceObject(ConfigurationAdmin.class);
        assertNotNull("Check Configuration Admin availability", admin);

        Configuration configuration = admin.getConfiguration(instance.getInstanceName(),
                getTestBundle().getLocation());

        // Configuration of baz
        Dictionary<String, Object> conf = new Hashtable<String, Object>();
        conf.put("baz", "zab");
        conf.put("foo", "oof");
        conf.put("bar", "0");

        // Asynchronous dispatching of the configuration
        configuration.update(conf);
        grace();

        // Recheck props
        fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance.getInstanceName());
        fooP = (String) fooRef.getProperty("foo");
        barP = (Integer) fooRef.getProperty("bar");
        bazP = (String) fooRef.getProperty("baz");

        assertEquals("Check foo equality", fooP, "oof");
        assertEquals("Check bar equality", barP, new Integer(0));
        assertEquals("Check baz equality", bazP, "zab");

        // Check field value
        FooService fs = (FooService) osgiHelper.getContext().getService(fooRef);
        Properties p = fs.fooProps();
        fooP = (String) p.get("foo");
        barP = (Integer) p.get("bar");

        assertEquals("Check foo field equality", fooP, "oof");
        assertEquals("Check bar field equality", barP, new Integer(0));

        osgiHelper.getContext().ungetService(fooRef);
    }

    @Test
    public void testPropagation() throws IOException, InterruptedException {
        ServiceReference fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance.getInstanceName());
        assertNotNull("Check FS availability", fooRef);

        String fooP = (String) fooRef.getProperty("foo");
        Integer barP = (Integer) fooRef.getProperty("bar");
        String bazP = (String) fooRef.getProperty("baz");

        assertEquals("Check foo equality", fooP, "foo");
        assertEquals("Check bar equality", barP, new Integer(2));
        assertEquals("Check baz equality", bazP, "baz");

        ConfigurationAdmin admin = osgiHelper.getServiceObject(ConfigurationAdmin.class);
        assertNotNull("Check Configuration Admin availability", admin);

        Configuration configuration = admin.getConfiguration(instance.getInstanceName(),
                getTestBundle().getLocation());

        // Configuration of baz
        Dictionary<String, Object> conf = new Hashtable<String, Object>();
        conf.put("baz", "zab");
        conf.put("foo", "foo");
        conf.put("bar", 2);
        conf.put("propagated1", "propagated");
        conf.put("propagated2", 1);
        conf.put(".notpropagated", "xxx");

        // Asynchronous dispatching of the configuration
        configuration.update(conf);
        grace();

        System.out.println(instance.getInstanceDescription().getDescription());

        // Recheck props
        fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance.getInstanceName());
        fooP = (String) fooRef.getProperty("foo");
        barP = (Integer) fooRef.getProperty("bar");
        bazP = (String) fooRef.getProperty("baz");
        assertNotNull("Check the propagated1 existence", fooRef.getProperty("propagated1"));
        String prop1 = (String) fooRef.getProperty("propagated1");
        assertNotNull("Check the propagated2 existence", fooRef.getProperty("propagated2"));
        Integer prop2 = (Integer) fooRef.getProperty("propagated2");
        assertNull("Check the not propagated non-existence", fooRef.getProperty(".notpropagated"));

        assertEquals("Check foo equality", fooP, "foo");
        assertEquals("Check bar equality", barP, new Integer(2));
        assertEquals("Check baz equality", bazP, "zab");
        assertEquals("Check propagated1 equality", prop1, "propagated");
        assertEquals("Check propagated2 equality", prop2, new Integer(1));
    }

    @Test
    public void testPropagationNoValue() throws IOException, InterruptedException {
        ServiceReference fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance2.getInstanceName());
        assertNotNull("Check FS availability", fooRef);

        Object fooP = fooRef.getProperty("foo");
        Object barP = fooRef.getProperty("bar");
        Object bazP = fooRef.getProperty("baz");
        assertEquals("Check foo equality -1", fooP, null);
        assertEquals("Check bar equality -1", barP, null);
        assertEquals("Check baz equality -1", bazP, null);

        ConfigurationAdmin admin = osgiHelper.getServiceObject(ConfigurationAdmin.class);
        assertNotNull("Check Configuration Admin availability", admin);

        Configuration configuration = admin.getConfiguration(instance2.getInstanceName(),
                getTestBundle().getLocation());

        // Configuration of baz
        Dictionary<String, Object> conf = new Hashtable<String, Object>();
        conf.put("baz", "zab");
        conf.put("foo", "foo");
        conf.put("bar", new Integer(2));
        conf.put("propagated1", "propagated");
        conf.put("propagated2", new Integer(1));

        // Asynchronous dispatching of the configuration
        configuration.update(conf);
        grace();

        // Recheck props
        fooRef = ipojoHelper.getServiceReferenceByName(FooService.class.getName(), instance2.getInstanceName());
        fooP = (String) fooRef.getProperty("foo");
        barP = (Integer) fooRef.getProperty("bar");
        bazP = (String) fooRef.getProperty("baz");
        assertNotNull("Check the propagated1 existency", fooRef.getProperty("propagated1"));
        String prop1 = (String) fooRef.getProperty("propagated1");
        assertNotNull("Check the propagated2 existency", fooRef.getProperty("propagated2"));
        Integer prop2 = (Integer) fooRef.getProperty("propagated2");

        assertEquals("Check foo equality", fooP, "foo");
        assertEquals("Check bar equality", barP, new Integer(2));
        assertEquals("Check baz equality", bazP, "zab");
        assertEquals("Check propagated1 equality", prop1, "propagated");
        assertEquals("Check propagated2 equality", prop2, new Integer(1));
    }

}
