/** * 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.ignite; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.cache.Cache.Entry; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import org.apache.camel.CamelException; import org.apache.camel.component.ignite.cache.IgniteCacheComponent; import org.apache.camel.component.ignite.cache.IgniteCacheOperation; import org.apache.camel.util.ObjectHelper; import org.apache.ignite.IgniteCache; import org.apache.ignite.cache.CachePeekMode; import org.apache.ignite.cache.query.Query; import org.apache.ignite.cache.query.ScanQuery; import org.apache.ignite.lang.IgniteBiPredicate; import org.junit.After; import org.junit.Test; import static com.google.common.truth.Truth.assert_; public class IgniteCacheTest extends AbstractIgniteTest { @Override protected String getScheme() { return "ignite-cache"; } @Override protected AbstractIgniteComponent createComponent() { return IgniteCacheComponent.fromConfiguration(createConfiguration()); } @Test public void testAddEntry() { template.requestBodyAndHeader("ignite-cache:testcache1?operation=PUT", "1234", IgniteConstants.IGNITE_CACHE_KEY, "abcd"); assert_().that(ignite().cache("testcache1").size(CachePeekMode.ALL)).isEqualTo(1); assert_().that(ignite().cache("testcache1").get("abcd")).isEqualTo("1234"); } @Test public void testAddEntrySet() { template.requestBody("ignite-cache:testcache1?operation=PUT", ImmutableMap.of("abcd", "1234", "efgh", "5678")); assert_().that(ignite().cache("testcache1").size(CachePeekMode.ALL)).isEqualTo(2); assert_().that(ignite().cache("testcache1").get("abcd")).isEqualTo("1234"); assert_().that(ignite().cache("testcache1").get("efgh")).isEqualTo("5678"); } @Test public void testGetOne() { testAddEntry(); String result = template.requestBody("ignite-cache:testcache1?operation=GET", "abcd", String.class); assert_().that(result).isEqualTo("1234"); result = template.requestBodyAndHeader("ignite-cache:testcache1?operation=GET", "this value won't be used", IgniteConstants.IGNITE_CACHE_KEY, "abcd", String.class); assert_().that(result).isEqualTo("1234"); } @Test @SuppressWarnings("unchecked") public void testGetMany() { IgniteCache<String, String> cache = ignite().getOrCreateCache("testcache1"); Set<String> keys = new HashSet<>(); for (int i = 0; i < 100; i++) { cache.put("k" + i, "v" + i); keys.add("k" + i); } Map<String, String> result = template.requestBody("ignite-cache:testcache1?operation=GET", keys, Map.class); for (String k : keys) { assert_().that(result.get(k)).isEqualTo(k.replace("k", "v")); } } @Test public void testGetSize() { IgniteCache<String, String> cache = ignite().getOrCreateCache("testcache1"); Set<String> keys = new HashSet<>(); for (int i = 0; i < 100; i++) { cache.put("k" + i, "v" + i); keys.add("k" + i); } Integer result = template.requestBody("ignite-cache:testcache1?operation=SIZE", keys, Integer.class); assert_().that(result).isEqualTo(100); } @Test public void testQuery() { IgniteCache<String, String> cache = ignite().getOrCreateCache("testcache1"); Set<String> keys = new HashSet<>(); for (int i = 0; i < 100; i++) { cache.put("k" + i, "v" + i); keys.add("k" + i); } Query<Entry<String, String>> query = new ScanQuery<String, String>(new IgniteBiPredicate<String, String>() { private static final long serialVersionUID = 1L; @Override public boolean apply(String key, String value) { return Integer.parseInt(key.replace("k", "")) >= 50; } }); List results = template.requestBodyAndHeader("ignite-cache:testcache1?operation=QUERY", keys, IgniteConstants.IGNITE_CACHE_QUERY, query, List.class); assert_().that(results.size()).isEqualTo(50); } @Test public void testGetManyTreatCollectionsAsCacheObjects() { IgniteCache<Object, String> cache = ignite().getOrCreateCache("testcache1"); Set<String> keys = new HashSet<>(); for (int i = 0; i < 100; i++) { cache.put("k" + i, "v" + i); keys.add("k" + i); } // Also add a cache entry with the entire Set as a key. cache.put(keys, "---"); String result = template.requestBody("ignite-cache:testcache1?operation=GET&treatCollectionsAsCacheObjects=true", keys, String.class); assert_().that(result).isEqualTo("---"); } @Test public void testRemoveEntry() { IgniteCache<String, String> cache = ignite().getOrCreateCache("testcache1"); cache.put("abcd", "1234"); cache.put("efgh", "5678"); assert_().that(cache.size(CachePeekMode.ALL)).isEqualTo(2); template.requestBody("ignite-cache:testcache1?operation=REMOVE", "abcd"); assert_().that(cache.size(CachePeekMode.ALL)).isEqualTo(1); assert_().that(cache.get("abcd")).isNull(); template.requestBodyAndHeader("ignite-cache:testcache1?operation=REMOVE", "this value won't be used", IgniteConstants.IGNITE_CACHE_KEY, "efgh"); assert_().that(cache.size(CachePeekMode.ALL)).isEqualTo(0); assert_().that(cache.get("efgh")).isNull(); } @Test public void testClearCache() { IgniteCache<String, String> cache = ignite().getOrCreateCache("testcache1"); for (int i = 0; i < 100; i++) { cache.put("k" + i, "v" + i); } assert_().that(cache.size(CachePeekMode.ALL)).isEqualTo(100); template.requestBody("ignite-cache:testcache1?operation=CLEAR", "this value won't be used"); assert_().that(cache.size(CachePeekMode.ALL)).isEqualTo(0); } @Test public void testHeaderSetRemoveEntry() { testAddEntry(); String result = template.requestBody("ignite-cache:testcache1?operation=GET", "abcd", String.class); assert_().that(result).isEqualTo("1234"); result = template.requestBodyAndHeader("ignite-cache:testcache1?operation=GET", "abcd", IgniteConstants.IGNITE_CACHE_OPERATION, IgniteCacheOperation.REMOVE, String.class); // The body has not changed, but the cache entry is gone. assert_().that(result).isEqualTo("abcd"); assert_().that(ignite().cache("testcache1").size(CachePeekMode.ALL)).isEqualTo(0); } @Test public void testAddEntryNoCacheCreation() { try { template.requestBodyAndHeader("ignite-cache:testcache2?operation=PUT&failIfInexistentCache=true", "1234", IgniteConstants.IGNITE_CACHE_KEY, "abcd"); } catch (Exception e) { assert_().that(ObjectHelper.getException(CamelException.class, e).getMessage()).startsWith("Ignite cache testcache2 doesn't exist"); return; } fail("Should have thrown an exception"); } @Test public void testAddEntryDoNotPropagateIncomingBody() { Object result = template.requestBodyAndHeader("ignite-cache:testcache1?operation=PUT&propagateIncomingBodyIfNoReturnValue=false", "1234", IgniteConstants.IGNITE_CACHE_KEY, "abcd", Object.class); assert_().that(ignite().cache("testcache1").size(CachePeekMode.ALL)).isEqualTo(1); assert_().that(ignite().cache("testcache1").get("abcd")).isEqualTo("1234"); assert_().that(result).isNull(); } @Override public boolean isCreateCamelContextPerClass() { return true; } @After public void deleteCaches() { for (String cacheName : ImmutableSet.<String> of("testcache1", "testcache2")) { IgniteCache<?, ?> cache = ignite().cache(cacheName); if (cache == null) { continue; } cache.clear(); } } }