blob: bbb649a4e8d19de936c38a7b8839c1297ede446d [file] [log] [blame]
/*
* 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.k.main;
import java.util.List;
import org.apache.camel.CamelContext;
import org.apache.camel.Route;
import org.apache.camel.component.knative.KnativeComponent;
import org.apache.camel.component.knative.spi.Knative;
import org.apache.camel.component.knative.spi.KnativeEnvironment;
import org.apache.camel.component.knative.test.KnativeEnvironmentSupport;
import org.apache.camel.k.Runtime;
import org.apache.camel.k.http.PlatformHttpServiceContextCustomizer;
import org.apache.camel.k.listener.ContextConfigurer;
import org.apache.camel.k.listener.SourcesConfigurer;
import org.apache.camel.k.main.support.MyBean;
import org.apache.camel.k.main.support.MyProcessor;
import org.apache.camel.k.support.SourcesSupport;
import org.apache.camel.k.test.AvailablePortFinder;
import org.apache.camel.model.ModelCamelContext;
import org.apache.camel.model.ToDefinition;
import org.apache.camel.util.ObjectHelper;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.apache.camel.util.CollectionHelper.mapOf;
import static org.assertj.core.api.Assertions.assertThat;
public class RuntimeTest {
private ApplicationRuntime runtime;
@BeforeEach
public void setUp() {
runtime = new ApplicationRuntime();
}
@AfterEach
public void cleanUp() throws Exception {
if (runtime != null) {
runtime.stop();
}
}
@Test
void testLoadMultipleRoutes() throws Exception {
runtime.addListener(new ContextConfigurer());
runtime.addListener(SourcesSupport.forRoutes("classpath:r1.js", "classpath:r2.mytype?language=js"));
runtime.addListener(Runtime.Phase.Started, r -> {
CamelContext context = r.getCamelContext();
List<Route> routes = context.getRoutes();
assertThat(routes).hasSize(2);
assertThat(routes).anyMatch(p -> ObjectHelper.equal("r1", p.getId()));
assertThat(routes).anyMatch(p -> ObjectHelper.equal("r2", p.getId()));
runtime.stop();
});
runtime.run();
}
@Test
void testLoadRouteAndRest() throws Exception {
runtime.addListener(new ContextConfigurer());
runtime.addListener(SourcesSupport.forRoutes("classpath:routes.xml", "classpath:rests.xml"));
runtime.addListener(Runtime.Phase.Started, r -> {
ModelCamelContext context = r.getCamelContext(ModelCamelContext.class);
assertThat(context.getRouteDefinitions()).isNotEmpty();
assertThat(context.getRestDefinitions()).isNotEmpty();
runtime.stop();
});
runtime.run();
}
@Test
void testLoadRouteWithExpression() throws Exception {
runtime.setProperties(mapOf(
"the.body", "10"
));
runtime.addListener(new ContextConfigurer());
runtime.addListener(SourcesSupport.forRoutes("classpath:routes-with-expression.xml"));
runtime.addListener(Runtime.Phase.Started, Runtime::stop);
runtime.run();
}
@Test
public void testLoadJavaSource() throws Exception {
runtime.setProperties(mapOf(
"camel.beans.myProcessor", "#class:" + MyProcessor.class.getName()
));
runtime.addListener(SourcesSupport.forRoutes("classpath:MyRoutesWithBeans.java"));
runtime.addListener(Runtime.Phase.Started, r -> {
assertThat(runtime.getCamelContext().getRoutes()).hasSize(1);
assertThat(runtime.getRegistry().lookupByName("myProcessor")).isNotNull();
assertThat(runtime.getRegistry().lookupByName("my-bean")).isInstanceOfSatisfying(MyBean.class, b -> {
assertThat(b).hasFieldOrPropertyWithValue("name", "my-bean-name");
});
r.stop();
});
runtime.run();
}
@Test
public void testLoadJavaSourceFromProperties() throws Exception {
runtime.setInitialProperties(
"camel.k.sources[0].name", "MyRoutesWithBeans",
"camel.k.sources[0].location", "classpath:MyRoutesWithBeans.java",
"camel.k.sources[0].language", "java"
);
runtime.setProperties(mapOf(
"camel.beans.myProcessor", "#class:" + MyProcessor.class.getName()
));
runtime.addListener(new SourcesConfigurer());
runtime.addListener(Runtime.Phase.Started, r -> {
assertThat(runtime.getCamelContext().getRoutes()).hasSize(1);
assertThat(runtime.getRegistry().lookupByName("myProcessor")).isNotNull();
assertThat(runtime.getRegistry().lookupByName("my-bean")).isInstanceOfSatisfying(MyBean.class, b -> {
assertThat(b).hasFieldOrPropertyWithValue("name", "my-bean-name");
});
r.stop();
});
runtime.run();
}
@Test
public void testLoadJavaSourceFromSimpleProperties() throws Exception {
runtime.setInitialProperties(
"camel.k.sources[0].location", "classpath:MyRoutesWithBeans.java"
);
runtime.setProperties(mapOf(
"camel.beans.myProcessor", "#class:" + MyProcessor.class.getName()
));
runtime.addListener(new SourcesConfigurer());
runtime.addListener(Runtime.Phase.Started, Runtime::stop);
runtime.run();
assertThat(runtime.getRegistry().lookupByName("myProcessor")).isNotNull();
assertThat(runtime.getRegistry().lookupByName("my-bean")).isInstanceOfSatisfying(MyBean.class, b -> {
assertThat(b).hasFieldOrPropertyWithValue("name", "my-bean-name");
});
}
@Test
public void testLoadJavaSourceWrap() throws Exception {
KnativeComponent component = new KnativeComponent();
component.setEnvironment(KnativeEnvironment.on(
KnativeEnvironmentSupport.endpoint(Knative.EndpointKind.sink, "sink", "localhost", AvailablePortFinder.getNextAvailable())
));
PlatformHttpServiceContextCustomizer phsc = new PlatformHttpServiceContextCustomizer();
phsc.setBindPort(AvailablePortFinder.getNextAvailable());
phsc.apply(runtime.getCamelContext());
runtime.getCamelContext().addComponent("knative", component);
runtime.addListener(SourcesSupport.forRoutes("classpath:MyRoutesWithBeans.java?interceptors=knative-source"));
runtime.addListener(Runtime.Phase.Started, Runtime::stop);
runtime.run();
assertThat(runtime.getRegistry().lookupByName("my-bean")).isInstanceOfSatisfying(MyBean.class, b -> {
assertThat(b).hasFieldOrPropertyWithValue("name", "my-bean-name");
});
assertThat(runtime.getCamelContext(ModelCamelContext.class).getRouteDefinition("my-route")).satisfies(definition -> {
assertThat(definition.getOutputs()).last().isInstanceOfSatisfying(ToDefinition.class, to -> {
assertThat(to.getEndpointUri()).isEqualTo("knative://endpoint/sink");
});
});
}
}