/**
 * 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.cometd;

import java.util.List;

import org.apache.camel.Endpoint;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.AvailablePortFinder;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.cometd.bayeux.server.BayeuxServer;
import org.cometd.bayeux.server.SecurityPolicy;
import org.cometd.bayeux.server.ServerChannel;
import org.cometd.bayeux.server.ServerMessage;
import org.cometd.bayeux.server.ServerSession;
import org.junit.Before;
import org.junit.Test;

/**
 * Unit testing for using a CometdProducer and a CometdConsumer
 */
public class CometdProducerConsumerTest extends CamelTestSupport {

    private static final String SHOOKHANDS_SESSION_HEADER = "Shookhands";
    private int port;
    private String uri;

    @Test
    public void testProducer() throws Exception {
        Person person = new Person("David", "Greco");
        //act
        template.requestBodyAndHeader("direct:input", person, "testHeading", "value");

        //assert
        MockEndpoint ep = context.getEndpoint("mock:test", MockEndpoint.class);
        List<Exchange> exchanges = ep.getReceivedExchanges();
        for (Exchange exchange : exchanges) {
            Message message = exchange.getIn();
            Person person1 = (Person) message.getBody();
            assertEquals("David", person1.getName());
            assertEquals("Greco", person1.getSurname());
        }
    }

    @Test
    public void testHeadersSupported() throws Exception {
        //setup
        String headerName = "testHeading";
        String headerValue = "value";

        //act
        template.requestBodyAndHeader("direct:input", "message", headerName, headerValue);

        //assert
        MockEndpoint ep = context.getEndpoint("mock:test", MockEndpoint.class);
        List<Exchange> exchanges = ep.getReceivedExchanges();
        assertTrue(exchanges.size() > 0);
        for (Exchange exchange : exchanges) {
            Message message = exchange.getIn();
            assertEquals(headerValue, message.getHeader(headerName));
            assertNotNull(message.getHeader(CometdBinding.COMETD_CLIENT_ID_HEADER_NAME));
        }
    }
    
    @Test
    public void testSessionHeaderArgumentSet() throws Exception {
        // setup
        CometdComponent component = context.getComponent("cometd", CometdComponent.class);

        // act
        Endpoint result = component
            .createEndpoint("cometd://127.0.0.1:"
                            + port
                            + "/service/testArgs?baseResource=file:./target/test-classes/webapp&"
                            + "timeout=240000&interval=0&maxInterval=30000&multiFrameInterval=1500&jsonCommented=true&sessionHeadersEnabled=true&logLevel=2");

        // assert
        assertTrue(result instanceof CometdEndpoint);
        CometdEndpoint cometdEndpoint = (CometdEndpoint)result;
        assertTrue(cometdEndpoint.isSessionHeadersEnabled());
    }
    
    @Test
    public void testSessionInformationTransferred() throws Exception {
        // act
        template.sendBody("direct:input", "message");

        // assert
        MockEndpoint ep = context.getEndpoint("mock:test", MockEndpoint.class);
        List<Exchange> exchanges = ep.getReceivedExchanges();
        assertTrue(exchanges.size() > 0);
        for (Exchange exchange : exchanges) {
            Message message = exchange.getIn();
            assertTrue((Boolean)message.getHeader(SHOOKHANDS_SESSION_HEADER));
        }
    }


    @Override
    @Before
    public void setUp() throws Exception {
        port = AvailablePortFinder.getNextAvailable(23500);
        uri = "cometd://127.0.0.1:" + port + "/service/test?baseResource=file:./target/test-classes/webapp&"
                + "timeout=240000&interval=0&maxInterval=30000&multiFrameInterval=1500&jsonCommented=true&sessionHeadersEnabled=true&logLevel=2";

        super.setUp();
    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                CometdComponent component = context.getComponent("cometd", CometdComponent.class);
                // The security policy is used to set session attributes.
                component.setSecurityPolicy(createTestSecurityPolicy());
                from("direct:input").to(uri);
                from(uri).to("mock:test");
            }
        };

    }

    private SecurityPolicy createTestSecurityPolicy() {
        return new SecurityPolicy() {

            @Override
            public boolean canSubscribe(BayeuxServer server, ServerSession session, ServerChannel channel,
                                        ServerMessage message) {
                session.setAttribute("Subscribed", true);
                return true;
            }

            @Override
            public boolean canPublish(BayeuxServer server, ServerSession session, ServerChannel channel,
                                      ServerMessage message) {
                return true;
            }

            @Override
            public boolean canHandshake(BayeuxServer server, ServerSession session, ServerMessage message) {
                session.setAttribute(SHOOKHANDS_SESSION_HEADER, true);
                return true;
            }

            @Override
            public boolean canCreate(BayeuxServer server, ServerSession session, String channelId,
                                     ServerMessage message) {
                return true;
            }
        };
    }

    public static class Person {

        private String name;
        private String surname;

        Person(String name, String surname) {
            this.name = name;
            this.surname = surname;
        }

        public String getName() {
            return name;
        }

        public String getSurname() {
            return surname;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setSurname(String surname) {
            this.surname = surname;
        }
    }
}

