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

import mousio.etcd4j.responses.EtcdLeaderStatsResponse;
import mousio.etcd4j.responses.EtcdSelfStatsResponse;
import mousio.etcd4j.responses.EtcdStoreStatsResponse;
import org.apache.camel.Exchange;
import org.apache.camel.Predicate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.junit.Test;

public class EtcdStatsTest extends EtcdTestSupport {

    @Test
    public void testStats() throws Exception {
        testStatsConsumer("mock:stats-leader-consumer", EtcdConstants.ETCD_LEADER_STATS_PATH, EtcdLeaderStatsResponse.class);
        testStatsConsumer("mock:stats-self-consumer", EtcdConstants.ETCD_SELF_STATS_PATH, EtcdSelfStatsResponse.class);
        testStatsConsumer("mock:stats-store-consumer", EtcdConstants.ETCD_STORE_STATS_PATH, EtcdStoreStatsResponse.class);

        testStatsProducer("direct:stats-leader", "mock:stats-leader-producer", EtcdConstants.ETCD_LEADER_STATS_PATH, EtcdLeaderStatsResponse.class);
        testStatsProducer("direct:stats-self", "mock:stats-self-producer", EtcdConstants.ETCD_SELF_STATS_PATH, EtcdSelfStatsResponse.class);
        testStatsProducer("direct:stats-store", "mock:stats-store-producer", EtcdConstants.ETCD_STORE_STATS_PATH, EtcdStoreStatsResponse.class);
    }

    protected void testStatsConsumer(String mockEnpoint, String expectedPath, final Class<?> expectedType) throws Exception {
        MockEndpoint mock = getMockEndpoint(mockEnpoint);
        mock.expectedMinimumMessageCount(1);
        mock.expectedHeaderReceived(EtcdConstants.ETCD_NAMESPACE, EtcdNamespace.stats.name());
        mock.expectedHeaderReceived(EtcdConstants.ETCD_PATH, expectedPath);
        mock.expectedMessagesMatches(new Predicate() {
            @Override
            public boolean matches(Exchange exchange) {
                return exchange.getIn().getBody().getClass() == expectedType;
            }
        });

        assertMockEndpointsSatisfied();
    }

    protected void testStatsProducer(String producerEnpoint, String mockEnpoint, String expectedPath, final Class<?> expectedType) throws Exception {
        sendBody(producerEnpoint, "");

        testStatsConsumer(mockEnpoint, expectedPath, expectedType);
    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            public void configure() {
                // CONSUMER
                from("etcd:stats/leader?delay=50&initialDelay=0")
                    .to("mock:stats-leader-consumer");
                from("etcd:stats/self?delay=50&initialDelay=0")
                    .to("mock:stats-self-consumer");
                from("etcd:stats/store?delay=50&initialDelay=0")
                    .to("mock:stats-store-consumer");

                // PRODUCER
                from("direct:stats-leader")
                    .to("etcd:stats/leader")
                        .to("mock:stats-leader-producer");
                from("direct:stats-self")
                    .to("etcd:stats/self")
                        .to("mock:stats-self-producer");
                from("direct:stats-store")
                    .to("etcd:stats/store")
                        .to("mock:stats-store-producer");
            }
        };
    }
}
