/**
 * 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.camel.component.kura;

import java.util.Dictionary;
import java.util.Hashtable;

import org.apache.camel.CamelContext;
import org.apache.camel.ServiceStatus;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.Configuration;
import org.osgi.service.cm.ConfigurationAdmin;

import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;

public class KuraRouterTest extends Assert {

    TestKuraRouter router = new TestKuraRouter();

    BundleContext bundleContext = mock(BundleContext.class, RETURNS_DEEP_STUBS);

    ConfigurationAdmin configurationAdmin = mock(ConfigurationAdmin.class);

    Configuration configuration = mock(Configuration.class);

    @Before
    public void before() throws Exception {
        given(bundleContext.getBundle().getVersion().toString()).willReturn("version");
        given(bundleContext.getBundle().getSymbolicName()).willReturn("symbolic_name");
        given(bundleContext.getService(any(ServiceReference.class))).willReturn(configurationAdmin);

        router.start(bundleContext);
    }

    @After
    public void after() throws Exception {
        router.stop(bundleContext);
    }

    @Test
    public void shouldCloseCamelContext() throws Exception {
        // When
        router.stop(bundleContext);

        // Then
        Assert.assertEquals(ServiceStatus.Stopped, router.camelContext.getStatus());
    }

    @Test
    public void shouldStartCamelContext() throws Exception {
        // Given
        String message = "foo";
        MockEndpoint mockEndpoint = router.camelContext.getEndpoint("mock:test", MockEndpoint.class);
        mockEndpoint.expectedBodiesReceived(message);

        // When
        router.producerTemplate.sendBody("direct:start", message);

        // Then
        mockEndpoint.assertIsSatisfied();
    }

    @Test
    public void shouldCreateConsumerTemplate() throws Exception {
        assertNotNull(router.consumerTemplate);
    }

    @Test
    public void shouldReturnNoService() {
        given(bundleContext.getServiceReference(any(Class.class))).willReturn(null);
        assertNull(router.service(ConfigurationAdmin.class));
    }

    @Test
    public void shouldReturnService() {
        assertNotNull(router.service(ConfigurationAdmin.class));
    }

    @Test(expected = IllegalStateException.class)
    public void shouldValidateLackOfService() {
        given(bundleContext.getServiceReference(any(Class.class))).willReturn(null);
        router.requiredService(ConfigurationAdmin.class);
    }

    @Test
    public void shouldLoadXmlRoutes() throws Exception {
        // Given
        given(configurationAdmin.getConfiguration(anyString())).willReturn(configuration);
        Dictionary<String, Object> properties = new Hashtable<>();
        properties.put("kura.camel.symbolic_name.route", IOUtils.toString(getClass().getResource("/route.xml")));
        given(configuration.getProperties()).willReturn(properties);

        // When
        router.start(router.bundleContext);

        // Then
        assertNotNull(router.camelContext.getRouteDefinition("loaded"));
    }

    static class TestKuraRouter extends KuraRouter {

        @Override
        public void configure() throws Exception {
            from("direct:start").to("mock:test");
        }

        @Override
        protected CamelContext createCamelContext() {
            return new DefaultCamelContext();
        }

    }

}

