package com.hazelcast.map;
import com.hazelcast.config.Config;
import com.hazelcast.config.MapConfig;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.HazelcastInstanceAware;
import com.hazelcast.core.IMap;
import com.hazelcast.test.AssertTask;
import com.hazelcast.test.HazelcastSerialClassRunner;
import com.hazelcast.test.HazelcastTestSupport;
import com.hazelcast.test.TestHazelcastInstanceFactory;
import com.hazelcast.test.annotation.ParallelTest;
import com.hazelcast.test.annotation.QuickTest;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import static com.hazelcast.config.InMemoryFormat.BINARY;
import static org.junit.Assert.assertEquals;
@RunWith(HazelcastSerialClassRunner.class)
@Category({QuickTest.class, ParallelTest.class})
public class BackupEntryProcessorInstanceAwareTest extends HazelcastTestSupport {
public static final String MAP_NAME = "EntryProcessorTest";
@Override
public Config getConfig() {
final MapConfig mapConfig = new MapConfig(MAP_NAME)
.setReadBackupData(true)
.setInMemoryFormat(BINARY);
return super.getConfig().addMapConfig(mapConfig);
}
@Test
public void test() throws ExecutionException, InterruptedException {
final Config cfg = getConfig();
final TestHazelcastInstanceFactory factory = createHazelcastInstanceFactory(2);
final HazelcastInstance i1 = factory.newHazelcastInstance(cfg);
final HazelcastInstance i2 = factory.newHazelcastInstance(cfg);
final IMap<String, Integer> m1 = i1.getMap(MAP_NAME);
final IMap<String, Integer> m2 = i2.getMap(MAP_NAME);
m1.put("a", 1);
m1.put("b", 2);
m1.executeOnEntries(new PartitionAwareTestEntryProcessor());
for (final String key : m1.keySet()) {
assertTrueEventually(new AssertTask() {
@Override
public void run() throws Exception {
final Integer k = m1.get(key);
final Integer v = m2.get(key);
assertEquals(k, v);
}
});
}
i1.shutdown();
}
private static class PartitionAwareTestEntryProcessor extends AbstractEntryProcessor<String, Integer>
implements HazelcastInstanceAware {
private transient HazelcastInstance hz;
@Override
public Object process(Map.Entry<String, Integer> entry) {
if (hz != null) {
entry.setValue(entry.getValue() + 1);
}
return null;
}
@Override
public void setHazelcastInstance(HazelcastInstance hazelcastInstance) {
this.hz = hazelcastInstance;
}
}
}