/**
 * 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.activemq.karaf.itest;

import java.io.File;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.junit.PaxExam;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.ops4j.pax.exam.CoreOptions.composite;
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.editConfigurationFilePut;
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.replaceConfigurationFile;

@RunWith(PaxExam.class)
public class ActiveMQBrokerNdCamelFeatureTest extends AbstractFeatureTest {

    @Configuration
    public static Option[] configure() {
        return new Option[] //
        {
         composite(configure("activemq", "activemq-camel")),
         editConfigurationFilePut("etc/system.properties", "camel.version", camelVersion()),
         replaceConfigurationFile("etc/activemq.xml", new File(RESOURCE_BASE + "activemq-nd-camel.xml")),
         replaceConfigurationFile("etc/org.apache.activemq.server-default.cfg", new File(RESOURCE_BASE + "org.apache.activemq.server-default.cfg"))
        };
    }

    @Test(timeout = 2 * 60 * 1000)
    public void test() throws Throwable {
        System.err.println(executeCommand("feature:list -i").trim());
        assertFeatureInstalled("activemq");
        assertBrokerStarted();
        withinReason(new Runnable() {
            public void run() {
                getBundle("org.apache.camel.camel-jms");
                assertTrue("we have camel consumers", executeCommand("activemq:dstat").trim().contains("camel_in"));
            }
        });

        // produce and consume
        JMSTester jms = new JMSTester();
        jms.produceMessage("camel_in");
        assertEquals("got our message", "camel_in", jms.consumeMessage("camel_out"));
        jms.close();
    }
}
