/*
* JBoss, Home of Professional Open Source
* Copyright 2011 Red Hat Inc. and/or its affiliates and other
* contributors as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a full listing of
* individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.infinispan.distribution;
import org.infinispan.AdvancedCache;
import org.infinispan.Cache;
import org.infinispan.context.Flag;
import org.infinispan.util.concurrent.NotifyingFuture;
import org.testng.annotations.Test;
import java.lang.reflect.Method;
import static org.infinispan.test.TestingUtil.k;
import static org.infinispan.test.TestingUtil.v;
import static org.testng.Assert.assertEquals;
/**
* Non-transactional tests for asynchronous methods in a distributed
* environment and a single owner.
*
* @author Mircea.Markus@jboss.com
* @author Galder ZamarreƱo
* @since 4.2
*/
@Test(groups = "functional", testName = "distribution.SingleOwnerAndAsyncMethodsTest")
public class SingleOwnerAndAsyncMethodsTest extends BaseDistFunctionalTest {
public SingleOwnerAndAsyncMethodsTest() {
INIT_CLUSTER_SIZE = 2;
numOwners = 1;
sync = true;
tx = false;
l1CacheEnabled = false;
}
public void testAsyncPut(Method m) throws Exception {
Cache<Object, String> ownerCache = getOwner(k(m));
ownerCache.put(k(m), v(m));
NotifyingFuture<String> f = ownerCache.putAsync(k(m), v(m, 1));
assert f != null;
assertEquals(v(m), f.get());
}
public void testAsyncGet(Method m) throws Exception {
final String key = k(m);
final String value = v(m);
Cache<Object, String> ownerCache = getOwner(key);
ownerCache.put(key, value);
AdvancedCache<Object, String> nonOwnerCache = getNonOwner(key).getAdvancedCache();
// Make the cache getAsync call go remote to verify it gets it correctly
NotifyingFuture<String> f = nonOwnerCache.getAsync(key);
assert f != null;
assert f.get().equals(value);
f = nonOwnerCache.withFlags(Flag.SKIP_REMOTE_LOOKUP).getAsync(key);
assert f != null;
assert f.get() == null;
f = nonOwnerCache.getAsync(key);
assert f != null;
assert f.get().equals(value);
f = nonOwnerCache.withFlags(Flag.CACHE_MODE_LOCAL).getAsync(key);
assert f != null;
assert f.get() == null;
f = nonOwnerCache.getAsync(key);
assert f != null;
assert f.get().equals(value);
}
public void testAsyncReplace(Method m) throws Exception {
// Calling replaceAsync() on a cache that does not own the key will force
// a remote get call to find out whether the key is associated with any
// value.
NotifyingFuture<String> f = getOwner(k(m)).replaceAsync(k(m), v(m));
assert f != null;
// In this case k1 is not present in cache(1), so should return null
assert f.get() == null;
// Now let's put put the key in the owner cache and then verify
// that a replace call from the non-owner cache resolves correctly.
getOwner(k(m)).put(k(m), v(m));
f = getNonOwner(k(m)).replaceAsync(k(m), v(m, 1));
assert f != null;
assert f.get().equals(v(m));
}
public void testAsyncGetThenPutOnSameNode(Method m) throws Exception {
Cache<Object, String> ownerCache = getOwner(k(m));
Cache<Object, String> nonOwnerCache = getNonOwner(k(m));
ownerCache.put(k(m), v(m));
// Make the cache getAsync call go remote to verify it gets it correctly
NotifyingFuture<String> f = nonOwnerCache.getAsync(k(m));
assert f != null;
assert f.get().equals(v(m));
nonOwnerCache.put(k(m, 1), v(m, 1));
}
public void testParallelAsyncGets(Method m) throws Exception {
getOwner(k(m, 1)).put(k(m, 1), v(m, 1));
getOwner(k(m, 2)).put(k(m, 2), v(m, 2));
getOwner(k(m, 3)).put(k(m, 3), v(m, 3));
NotifyingFuture<String> f1 = getNonOwner(k(m, 1)).getAsync(k(m, 1));
NotifyingFuture<String> f2 = getNonOwner(k(m, 2)).getAsync(k(m, 2));
NotifyingFuture<String> f3 = getNonOwner(k(m, 3)).getAsync(k(m, 3));
assert f1 != null;
assert f1.get().equals(v(m, 1));
assert f2 != null;
assert f2.get().equals(v(m, 2));
assert f3 != null;
assert f3.get().equals(v(m, 3));
getNonOwner(k(m, 1)).put(k(m, 1), v(m, 11));
getNonOwner(k(m, 2)).put(k(m, 2), v(m, 22));
getNonOwner(k(m, 3)).put(k(m, 3), v(m, 33));
f1 = getOwner(k(m, 1)).getAsync(k(m, 1));
f2 = getOwner(k(m, 2)).getAsync(k(m, 2));
f3 = getOwner(k(m, 3)).getAsync(k(m, 3));
assert f1 != null;
assert f1.get().equals(v(m, 11));
assert f2 != null;
assert f2.get().equals(v(m, 22));
assert f3 != null;
assert f3.get().equals(v(m, 33));
}
public void testLocalAsyncGet(Method m) throws Exception {
Cache<Object, String> ownerCache = getOwner(k(m));
ownerCache.put(k(m), v(m));
NotifyingFuture<String> f = getNonOwner(k(m)).getAdvancedCache().withFlags(Flag.SKIP_REMOTE_LOOKUP).getAsync(k(m));
assert f != null;
assert f.get() == null;
}
protected Cache<Object, String> getOwner(Object key) {
return getOwners(key)[0];
}
protected Cache<Object, String> getNonOwner(Object key) {
return getNonOwners(key)[0];
}
public Cache<Object, String>[] getOwners(Object key) {
return getOwners(key, 1);
}
public Cache<Object, String>[] getNonOwners(Object key) {
return getNonOwners(key, 1);
}
}