blob: a806a5c27bc81c2724b1002bca16af7573a35111 [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.component.jcache.policy;
import javax.cache.Cache;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.spring.CamelSpringTestSupport;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import static org.apache.camel.component.jcache.policy.JCachePolicyTestBase.*;
public class SpringJCachePolicyTest extends CamelSpringTestSupport {
@Override
protected AbstractApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext("org/apache/camel/component/jcache/policy/SpringJCachePolicyTest.xml");
}
@BeforeClass
public static void beforeAll() {
System.setProperty("hazelcast.config", "classpath:org/apache/camel/component/jcache/policy/hazelcast-spring.xml");
}
@AfterClass
public static void afterAll() {
System.clearProperty("hazelcast.config");
}
@Before
public void before() {
//reset mock
MockEndpoint mock = getMockEndpoint("mock:spring");
mock.reset();
mock.whenAnyExchangeReceived(e ->
e.getMessage().setBody(generateValue(e.getMessage().getBody(String.class))));
}
//Verify value gets cached and route is not executed for the second time
@Test
public void testXmlDslValueGetsCached() throws Exception {
final String key = randomString();
MockEndpoint mock = getMockEndpoint("mock:spring");
//Send first, key is not in cache
Object responseBody = this.template().requestBody("direct:spring", key);
//We got back the value, mock was called once, value got cached.
Cache cache = lookupCache("spring");
assertEquals(generateValue(key), cache.get(key));
assertEquals(generateValue(key), responseBody);
assertEquals(1, mock.getExchanges().size());
//Send again, key is already in cache
responseBody = this.template().requestBody("direct:spring", key);
//We got back the stored value, but the mock was not called again
assertEquals(generateValue(key), cache.get(key));
assertEquals(generateValue(key), responseBody);
assertEquals(1, mock.getExchanges().size());
}
//Verify if we call the route with different keys, both gets cached
@Test
public void testXmlDslDifferent() throws Exception {
final String key1 = randomString();
MockEndpoint mock = getMockEndpoint("mock:spring");
//Send first, key is not in cache
Object responseBody = this.template().requestBody("direct:spring", key1);
//We got back the value, mock was called once, value got cached.
Cache cache = lookupCache("spring");
assertEquals(generateValue(key1), cache.get(key1));
assertEquals(generateValue(key1), responseBody);
assertEquals(1, mock.getExchanges().size());
//Send again, different key
final String key2 = randomString();
responseBody = this.template().requestBody("direct:spring", key2);
//We got back the stored value, mock was called again, value got cached.
assertEquals(generateValue(key2), cache.get(key2));
assertEquals(generateValue(key2), responseBody);
assertEquals(2, mock.getExchanges().size());
}
//Verify policy applies only on the section of the route wrapped
@Test
public void testXmlDslPartial() throws Exception {
final String key = randomString();
MockEndpoint mock = getMockEndpoint("mock:spring");
MockEndpoint mockUnwrapped = getMockEndpoint("mock:unwrapped");
//Send first, key is not in cache
Object responseBody = this.template().requestBody("direct:spring-partial", key);
//We got back the value, mock was called once, value got cached.
Cache cache = lookupCache("spring");
assertEquals(generateValue(key), cache.get(key));
assertEquals(generateValue(key), responseBody);
assertEquals(1, mock.getExchanges().size());
assertEquals(1, mockUnwrapped.getExchanges().size());
//Send again, key is already in cache
responseBody = this.template().requestBody("direct:spring-partial", key);
//We got back the stored value, but the mock was not called again
assertEquals(generateValue(key), cache.get(key));
assertEquals(generateValue(key), responseBody);
assertEquals(1, mock.getExchanges().size());
assertEquals(2, mockUnwrapped.getExchanges().size());
}
//Use a key expression ${header.mykey}
@Test
public void testXmlDslKeyExpression() throws Exception {
final String key = randomString();
final String body = randomString();
MockEndpoint mock = getMockEndpoint("mock:spring");
//Send first, key is not in cache
Object responseBody = this.template().requestBodyAndHeader("direct:spring-byheader", body, "mykey", key);
//We got back the value, mock was called once, value got cached.
Cache cache = lookupCache("spring");
assertEquals(generateValue(body), cache.get(key));
assertEquals(generateValue(body), responseBody);
assertEquals(1, mock.getExchanges().size());
//Send again, use another body, but the same key
responseBody = this.template().requestBodyAndHeader("direct:spring-byheader", randomString(), "mykey", key);
//We got back the stored value, and the mock was not called again
assertEquals(generateValue(body), cache.get(key));
assertEquals(generateValue(body), responseBody);
assertEquals(1, mock.getExchanges().size());
}
}