This is an automated email from the ASF dual-hosted git repository.
klund pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/develop by this push:
new ce748d2 GEODE-3790: add new test for CacheListener invocations
ce748d2 is described below
commit ce748d25076d72f78efe3e0922b266e5e3ee476d
Author: Kirk Lund <[email protected]>
AuthorDate: Mon Oct 9 13:21:09 2017 -0700
GEODE-3790: add new test for CacheListener invocations
---
.../ReplicateCacheListenerInvocationTest.java | 327 +++++++++++++++++++++
1 file changed, 327 insertions(+)
diff --git
a/geode-core/src/test/java/org/apache/geode/internal/cache/ReplicateCacheListenerInvocationTest.java
b/geode-core/src/test/java/org/apache/geode/internal/cache/ReplicateCacheListenerInvocationTest.java
new file mode 100644
index 0000000..5b6c20f
--- /dev/null
+++
b/geode-core/src/test/java/org/apache/geode/internal/cache/ReplicateCacheListenerInvocationTest.java
@@ -0,0 +1,327 @@
+/*
+ * 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.geode.internal.cache;
+
+import static org.apache.geode.test.dunit.Host.getHost;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.fail;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.nullValue;
+
+import java.io.Serializable;
+
+import org.apache.logging.log4j.Logger;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import org.apache.geode.cache.CacheListener;
+import org.apache.geode.cache.DataPolicy;
+import org.apache.geode.cache.EntryEvent;
+import org.apache.geode.cache.Operation;
+import org.apache.geode.cache.Region;
+import org.apache.geode.cache.RegionEvent;
+import org.apache.geode.cache.RegionFactory;
+import org.apache.geode.cache.Scope;
+import org.apache.geode.cache.util.CacheListenerAdapter;
+import org.apache.geode.internal.logging.LogService;
+import org.apache.geode.test.dunit.rules.CacheRule;
+import org.apache.geode.test.dunit.rules.DistributedTestRule;
+import org.apache.geode.test.dunit.rules.SharedCountersRule;
+import org.apache.geode.test.dunit.rules.SharedErrorCollector;
+import org.apache.geode.test.junit.categories.DistributedTest;
+import org.apache.geode.test.junit.rules.serializable.SerializableTestName;
+
+/**
+ * Registers a {@code CacheListener} in the Controller and all DUnit VMs.
Verifies
+ * {@code CacheListener} invocations for {@code Region} operations.
+ *
+ * <p>
+ * Converted from JUnit 3.
+ *
+ * @since 2.0
+ */
+@Category(DistributedTest.class)
+@SuppressWarnings("serial")
+public class ReplicateCacheListenerInvocationTest implements Serializable {
+
+ private static final Logger logger = LogService.getLogger();
+
+ private static final String CREATES = "CREATES";
+ private static final String UPDATES = "UPDATES";
+ private static final String INVALIDATES = "INVALIDATES";
+ private static final String DESTROYS = "DESTROYS";
+
+ private static final int ENTRY_VALUE = 0;
+ private static final int UPDATED_ENTRY_VALUE = 1;
+
+ private String regionName;
+ private String key;
+
+ @ClassRule
+ public static DistributedTestRule distributedTestRule = new
DistributedTestRule();
+
+ @Rule
+ public CacheRule cacheRule = CacheRule.builder().createCacheInAll().build();
+
+ @Rule
+ public SerializableTestName testName = new SerializableTestName();
+
+ @Rule
+ public SharedCountersRule sharedCountersRule =
SharedCountersRule.builder().build();
+
+ @Rule
+ public SharedErrorCollector errorCollector = new SharedErrorCollector();
+
+ @Before
+ public void setUp() throws Exception {
+ regionName = testName.getMethodName();
+ key = "key-1";
+
+ sharedCountersRule.initialize(CREATES);
+ sharedCountersRule.initialize(DESTROYS);
+ sharedCountersRule.initialize(INVALIDATES);
+ sharedCountersRule.initialize(UPDATES);
+ }
+
+ @Test
+ public void afterCreateIsInvokedInEveryMember() throws Exception {
+ CacheListener<String, Integer> listener = new
CreateCountingCacheListener();
+ Region<String, Integer> region = createRegion(regionName, listener);
+ for (int i = 0; i < getHost(0).getVMCount(); i++) {
+ getHost(0).getVM(i).invoke(() -> {
+ createRegion(regionName, listener);
+ });
+ }
+
+ region.put(key, ENTRY_VALUE, cacheRule.getSystem().getDistributedMember());
+
+
assertThat(sharedCountersRule.getTotal(CREATES)).isEqualTo(expectedCreates());
+ }
+
+ @Test
+ public void afterUpdateIsInvokedInEveryMember() throws Exception {
+ CacheListener<String, Integer> listener = new
UpdateCountingCacheListener();
+ Region<String, Integer> region = createRegion(regionName, listener);
+ for (int i = 0; i < getHost(0).getVMCount(); i++) {
+ getHost(0).getVM(i).invoke(() -> {
+ createRegion(regionName, listener);
+ });
+ }
+
+ region.put(key, ENTRY_VALUE, cacheRule.getSystem().getDistributedMember());
+ region.put(key, UPDATED_ENTRY_VALUE,
cacheRule.getSystem().getDistributedMember());
+
+
assertThat(sharedCountersRule.getTotal(UPDATES)).isEqualTo(expectedUpdates());
+ }
+
+ @Test
+ public void afterInvalidateIsInvokedInEveryMember() throws Exception {
+ CacheListener<String, Integer> listener = new
InvalidateCountingCacheListener();
+ Region<String, Integer> region = createRegion(regionName, listener);
+ for (int i = 0; i < getHost(0).getVMCount(); i++) {
+ getHost(0).getVM(i).invoke(() -> {
+ createRegion(regionName, listener);
+ });
+ }
+
+ region.put(key, 0, cacheRule.getSystem().getDistributedMember());
+ region.invalidate(key);
+
+
assertThat(sharedCountersRule.getTotal(INVALIDATES)).isEqualTo(expectedInvalidates());
+ assertThat(region.get(key)).isNull();
+ }
+
+ @Test
+ public void afterDestroyIsInvokedInEveryMember() throws Exception {
+ CacheListener<String, Integer> listener = new
DestroyCountingCacheListener();
+ Region<String, Integer> region = createRegion(regionName, listener);
+ for (int i = 0; i < getHost(0).getVMCount(); i++) {
+ getHost(0).getVM(i).invoke(() -> {
+ createRegion(regionName, listener);
+ });
+ }
+
+ region.put(key, 0, cacheRule.getSystem().getDistributedMember());
+ region.destroy(key);
+
+
assertThat(sharedCountersRule.getTotal(DESTROYS)).isEqualTo(expectedDestroys());
+ }
+
+ protected Region<String, Integer> createRegion(final String name,
+ final CacheListener<String, Integer> listener) {
+ RegionFactory<String, Integer> regionFactory =
cacheRule.getCache().createRegionFactory();
+ regionFactory.setStatisticsEnabled(true);
+ regionFactory.setScope(Scope.DISTRIBUTED_ACK);
+ regionFactory.setDataPolicy(DataPolicy.REPLICATE);
+ regionFactory.addCacheListener(listener);
+
+ return regionFactory.create(name);
+ }
+
+ protected int expectedCreates() {
+ return getHost(0).getVMCount() + 1;
+ }
+
+ protected int expectedUpdates() {
+ return getHost(0).getVMCount() + 1;
+ }
+
+ protected int expectedInvalidates() {
+ return getHost(0).getVMCount() + 1;
+ }
+
+ protected int expectedDestroys() {
+ return getHost(0).getVMCount() + 1;
+ }
+
+ /**
+ * Overridden within tests to increment shared counters.
+ */
+ static abstract class BaseCacheListener extends CacheListenerAdapter<String,
Integer>
+ implements Serializable {
+
+ @Override
+ public void afterCreate(final EntryEvent event) {
+ fail("Unexpected listener callback: afterCreate");
+ }
+
+ @Override
+ public void afterInvalidate(final EntryEvent event) {
+ fail("Unexpected listener callback: afterInvalidate");
+ }
+
+ @Override
+ public void afterDestroy(final EntryEvent event) {
+ fail("Unexpected listener callback: afterDestroy");
+ }
+
+ @Override
+ public void afterUpdate(final EntryEvent event) {
+ fail("Unexpected listener callback: afterUpdate");
+ }
+
+ @Override
+ public void afterRegionInvalidate(final RegionEvent event) {
+ fail("Unexpected listener callback: afterRegionInvalidate");
+ }
+ }
+
+ class CreateCountingCacheListener extends BaseCacheListener {
+
+ @Override
+ public void afterCreate(final EntryEvent event) {
+ logger.info("Invoking afterCreate on listener; name={}", event.getKey());
+ sharedCountersRule.increment(CREATES);
+
+ errorCollector.checkThat(event.getDistributedMember(),
equalTo(event.getCallbackArgument()));
+ errorCollector.checkThat(event.getOperation(),
equalTo(Operation.CREATE));
+ errorCollector.checkThat(event.getNewValue(), equalTo(ENTRY_VALUE));
+ errorCollector.checkThat(event.getOldValue(), nullValue());
+
+ if (event.getSerializedOldValue() != null) {
+
errorCollector.checkThat(event.getSerializedOldValue().getDeserializedValue(),
+ equalTo(event.getOldValue()));
+ }
+ if (event.getSerializedNewValue() != null) {
+
errorCollector.checkThat(event.getSerializedNewValue().getDeserializedValue(),
+ equalTo(event.getNewValue()));
+ }
+
+ logger.info("create event new value is: {}", event.getNewValue());
+ }
+ }
+
+ class UpdateCountingCacheListener extends BaseCacheListener {
+
+ @Override
+ public void afterCreate(final EntryEvent event) {
+ // nothing
+ }
+
+ @Override
+ public void afterUpdate(final EntryEvent event) {
+ logger.info("Invoking afterUpdate on listener; name=" + event.getKey());
+ sharedCountersRule.increment(UPDATES);
+
+ errorCollector.checkThat(event.getDistributedMember(),
equalTo(event.getCallbackArgument()));
+ errorCollector.checkThat(event.getOperation(),
equalTo(Operation.UPDATE));
+ errorCollector.checkThat(event.getOldValue(), equalTo(ENTRY_VALUE));
+ errorCollector.checkThat(event.getNewValue(),
equalTo(UPDATED_ENTRY_VALUE));
+
+ if (event.getSerializedOldValue() != null) {
+
errorCollector.checkThat(event.getSerializedOldValue().getDeserializedValue(),
+ equalTo(event.getOldValue()));
+ }
+ if (event.getSerializedNewValue() != null) {
+
errorCollector.checkThat(event.getSerializedNewValue().getDeserializedValue(),
+ equalTo(event.getNewValue()));
+ }
+ }
+ }
+
+ class InvalidateCountingCacheListener extends BaseCacheListener {
+
+ @Override
+ public void afterCreate(final EntryEvent event) {
+ // ignore
+ }
+
+ @Override
+ public void afterInvalidate(final EntryEvent event) {
+ logger.info("Invoking tests invalidated listener");
+ sharedCountersRule.increment(INVALIDATES);
+
+ if (event.isOriginRemote()) {
+ errorCollector.checkThat(event.getDistributedMember(),
+ not(cacheRule.getSystem().getDistributedMember()));
+ } else {
+ errorCollector.checkThat(event.getDistributedMember(),
+ equalTo(cacheRule.getSystem().getDistributedMember()));
+ }
+ errorCollector.checkThat(event.getOperation(),
equalTo(Operation.INVALIDATE));
+ errorCollector.checkThat(event.getOldValue(), equalTo(ENTRY_VALUE));
+ errorCollector.checkThat(event.getNewValue(), nullValue());
+ }
+ }
+
+ class DestroyCountingCacheListener extends BaseCacheListener {
+
+ @Override
+ public void afterCreate(final EntryEvent event) {
+ // ignore
+ }
+
+ @Override
+ public void afterDestroy(final EntryEvent event) {
+ logger.info("Invoking objectDestroyed listener");
+ sharedCountersRule.increment(DESTROYS);
+
+ if (event.isOriginRemote()) {
+ errorCollector.checkThat(event.getDistributedMember(),
+ not(cacheRule.getSystem().getDistributedMember()));
+ } else {
+ errorCollector.checkThat(event.getDistributedMember(),
+ equalTo(cacheRule.getSystem().getDistributedMember()));
+ }
+ errorCollector.checkThat(event.getOperation(),
equalTo(Operation.DESTROY));
+ errorCollector.checkThat(event.getOldValue(), equalTo(ENTRY_VALUE));
+ errorCollector.checkThat(event.getNewValue(), nullValue());
+ }
+ }
+}
--
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].