/**
* 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.consul.cloud;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.orbitz.consul.AgentClient;
import com.orbitz.consul.Consul;
import com.orbitz.consul.model.agent.ImmutableRegistration;
import com.orbitz.consul.model.agent.Registration;
import org.apache.camel.Navigate;
import org.apache.camel.Processor;
import org.apache.camel.Route;
import org.apache.camel.impl.cloud.DefaultServiceCallProcessor;
import org.apache.camel.processor.ChoiceProcessor;
import org.apache.camel.processor.FilterProcessor;
import org.apache.camel.test.spring.CamelSpringTestSupport;
import org.junit.Assert;
import org.junit.Test;
public abstract class SpringConsulServiceCallRouteTest extends CamelSpringTestSupport {
private AgentClient client;
private List<Registration> registrations;
// *************************************************************************
// Setup / tear down
// *************************************************************************
@Override
public void doPreSetup() throws Exception {
this.client = Consul.builder().build().agentClient();
this.registrations = Arrays.asList(
ImmutableRegistration.builder()
.id("service-1-1")
.name("http-service-1")
.address("127.0.0.1")
.port(9011)
.build(),
ImmutableRegistration.builder()
.id("service-1-2")
.name("http-service-1")
.address("127.0.0.1")
.port(9012)
.build(),
ImmutableRegistration.builder()
.id("service-1-3")
.name("http-service-1")
.address("127.0.0.1")
.port(9013)
.build(),
ImmutableRegistration.builder()
.id("service-2-1")
.name("http-service-2")
.address("127.0.0.1")
.port(9021)
.build(),
ImmutableRegistration.builder()
.id("service-2-2")
.name("http-service-2")
.address("127.0.0.1")
.port(9022)
.build(),
ImmutableRegistration.builder()
.id("service-2-3")
.name("http-service-2")
.address("127.0.0.1")
.port(9023)
.build()
);
this.registrations.forEach(client::register);
super.doPreSetup();
}
@Override
public void tearDown() throws Exception {
super.tearDown();
registrations.forEach(r -> client.deregister(r.getId()));
}
// *************************************************************************
// Test
// *************************************************************************
@Test
public void testServiceCall() throws Exception {
getMockEndpoint("mock:result-1").expectedMessageCount(2);
getMockEndpoint("mock:result-1").expectedBodiesReceivedInAnyOrder("service-1 9012", "service-1 9013");
getMockEndpoint("mock:result-2").expectedMessageCount(2);
getMockEndpoint("mock:result-2").expectedBodiesReceivedInAnyOrder("service-2 9021", "service-2 9023");
template.sendBody("direct:start", "service-1");
template.sendBody("direct:start", "service-1");
template.sendBody("direct:start", "service-2");
template.sendBody("direct:start", "service-2");
assertMockEndpointsSatisfied();
}
// ************************************
// Helpers
// ************************************
protected List<DefaultServiceCallProcessor> findServiceCallProcessors() {
Route route = context().getRoute("scall");
Assert.assertNotNull("ServiceCall Route should be present", route);
return findServiceCallProcessors(new ArrayList<>(), route.navigate());
}
protected List<DefaultServiceCallProcessor> findServiceCallProcessors(List<DefaultServiceCallProcessor> processors, Navigate<Processor> navigate) {
for (Processor processor : navigate.next()) {
if (processor instanceof DefaultServiceCallProcessor) {
processors.add((DefaultServiceCallProcessor)processor);
}
if (processor instanceof ChoiceProcessor) {
for (FilterProcessor filter : ((ChoiceProcessor) processor).getFilters()) {
findServiceCallProcessors(processors, filter);
}
} else if (processor instanceof Navigate) {
return findServiceCallProcessors(processors, (Navigate<Processor>)processor);
}
}
return processors;
}
}