blob: 046fa3974b387a95a943a0d4ab788f970996f4e7 [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.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.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import org.junit.Before;
import org.junit.Test;
import org.apache.geode.cache.PartitionAttributesFactory;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionExistsException;
import org.apache.geode.cache.RegionFactory;
import org.apache.geode.cache.RegionShortcut;
import org.apache.geode.test.dunit.VM;
import org.apache.geode.test.dunit.cache.CacheTestCase;
/**
* Verifies creation of partitioned region and distributed region with same name.
*/
public class PartitionedRegionWithSameNameDUnitTest extends CacheTestCase {
private String regionName;
private String parentRegionName;
private String childRegionName;
private int localMaxMemory;
private int redundancy;
private VM vm0;
private VM vm1;
private VM vm2;
private VM vm3;
@Before
public void setUp() {
vm0 = getHost(0).getVM(0);
vm1 = getHost(0).getVM(1);
vm2 = getHost(0).getVM(2);
vm3 = getHost(0).getVM(3);
regionName = getUniqueName();
parentRegionName = getUniqueName() + "_ParentRegion";
childRegionName = getUniqueName() + "_ChildRegion";
localMaxMemory = 200;
redundancy = 0;
}
@Test
public void testNameWithPartitionRegionFirstOnSameVM() {
vm0.invoke(() -> givenPartitionedRegion(regionName));
vm0.invoke(
() -> validateCreateDistributedRegionThrows(regionName, RegionExistsException.class));
}
@Test
public void testNameWithDistributedRegionFirstOnSameVM() {
vm0.invoke(() -> givenDistributedRegion(regionName));
vm0.invoke(
() -> validateCreatePartitionedRegionThrows(regionName, RegionExistsException.class));
}
@Test
public void testNameWithPartitionRegionFirstOnDifferentVM() {
vm0.invoke(() -> givenPartitionedRegion(regionName));
vm1.invoke(
() -> validateCreateDistributedRegionThrows(regionName, IllegalStateException.class));
}
@Test
public void testNameWithDistributedRegionFirstOnDifferentVM() {
vm0.invoke(() -> givenDistributedRegion(regionName));
vm1.invoke(
() -> validateCreatePartitionedRegionThrows(regionName, IllegalStateException.class));
}
@Test
public void testLocalRegionFirst() {
vm0.invoke(() -> givenLocalRegion(regionName));
vm1.invoke(() -> validateCreatePartitionedRegionSucceeds(regionName));
}
@Test
public void testLocalRegionSecond() {
vm0.invoke(() -> givenPartitionedRegion(regionName));
vm1.invoke(() -> validateCreateLocalRegionSucceeds(regionName));
}
@Test
public void testWithPartitionedRegionAsParentRegionAndDistributedSubRegion() {
vm0.invoke(() -> givenPartitionedRegion(parentRegionName));
vm0.invoke(() -> validateCreateDistributedSubRegionThrows(parentRegionName, childRegionName,
UnsupportedOperationException.class));
}
@Test
public void testWithPartitionedRegionAsParentRegionAndPartitionedSubRegion() {
vm0.invoke(() -> givenPartitionedRegion(parentRegionName));
vm0.invoke(() -> validateCreatePartitionedSubRegionThrows(parentRegionName, childRegionName,
UnsupportedOperationException.class));
}
@Test
public void testWithSubRegionPartitionedRegionFirst() {
vm0.invoke(() -> givenDistributedRegion(parentRegionName));
vm1.invoke(() -> givenDistributedRegion(parentRegionName));
vm0.invoke(() -> givenPartitionedSubRegion(parentRegionName, childRegionName));
vm1.invoke(() -> validateCreateDistributedSubRegionThrows(parentRegionName, childRegionName,
IllegalStateException.class));
}
@Test
public void testWithSubRegionDistributedRegionFirst() {
vm0.invoke(() -> givenDistributedRegion(parentRegionName));
vm1.invoke(() -> givenDistributedRegion(parentRegionName));
vm2.invoke(() -> givenDistributedRegion(parentRegionName));
vm3.invoke(() -> givenDistributedRegion(parentRegionName));
vm0.invoke(() -> givenDistributedSubRegion(parentRegionName, childRegionName));
vm1.invoke(() -> validateCreatePartitionedSubRegionThrows(parentRegionName, childRegionName,
IllegalStateException.class));
vm2.invoke(() -> validateCreatePartitionedSubRegionThrows(parentRegionName, childRegionName,
IllegalStateException.class));
vm3.invoke(() -> validateCreatePartitionedSubRegionThrows(parentRegionName, childRegionName,
IllegalStateException.class));
}
private void givenDistributedRegion(final String regionName) {
createDistributedRegion(regionName);
}
private void givenLocalRegion(final String regionName) {
createLocalRegion(regionName);
}
private void givenPartitionedRegion(final String regionName) {
createPartitionedRegion(regionName, localMaxMemory, redundancy);
}
private void givenDistributedSubRegion(final String parentRegionName,
final String childRegionName) {
Region parentRegion = getCache().getRegion(parentRegionName);
assertThat(parentRegion).isNotNull();
RegionFactory regionFactory = getCache().createRegionFactory(RegionShortcut.REPLICATE);
Region childRegion = regionFactory.createSubregion(parentRegion, childRegionName);
assertThat(childRegion).isNotNull();
}
private void givenPartitionedSubRegion(final String parentRegionName,
final String childRegionName) {
Region parentRegion = getCache().getRegion(parentRegionName);
assertThat(parentRegion).isNotNull();
PartitionAttributesFactory paf = new PartitionAttributesFactory();
paf.setLocalMaxMemory(localMaxMemory);
paf.setRedundantCopies(redundancy);
RegionFactory regionFactory = getCache().createRegionFactory(RegionShortcut.PARTITION);
regionFactory.setPartitionAttributes(paf.create());
Region childRegion = regionFactory.createSubregion(parentRegion, childRegionName);
assertThat(childRegion).isNotNull();
}
private void createDistributedRegion(final String regionName) {
RegionFactory regionFactory = getCache().createRegionFactory(RegionShortcut.REPLICATE);
Region region = regionFactory.create(regionName);
assertThat(region).isNotNull();
}
private void createLocalRegion(final String regionName) {
RegionFactory regionFactory = getCache().createRegionFactory(RegionShortcut.LOCAL);
Region region = regionFactory.create(regionName);
assertThat(region).isNotNull();
}
private void createPartitionedRegion(final String regionName, final int localMaxMemory,
final int redundancy) {
PartitionAttributesFactory paf = new PartitionAttributesFactory();
paf.setLocalMaxMemory(localMaxMemory);
paf.setRedundantCopies(redundancy);
RegionFactory regionFactory = getCache().createRegionFactory(RegionShortcut.PARTITION);
regionFactory.setPartitionAttributes(paf.create());
Region region = regionFactory.create(regionName);
assertThat(region).isNotNull();
}
private void validateCreateDistributedRegionThrows(final String regionName,
final Class<? extends Exception> exceptionClass) {
RegionFactory regionFactory = getCache().createRegionFactory(RegionShortcut.REPLICATE);
assertThatThrownBy(() -> regionFactory.create(regionName)).isInstanceOf(exceptionClass);
}
private void validateCreateLocalRegionSucceeds(final String regionName) {
assertThatCode(() -> createLocalRegion(regionName)).doesNotThrowAnyException();
}
private void validateCreatePartitionedRegionThrows(final String regionName,
final Class<? extends Exception> exceptionClass) {
assertThatThrownBy(() -> createPartitionedRegion(regionName, localMaxMemory, redundancy))
.isInstanceOf(exceptionClass);
}
private void validateCreatePartitionedRegionSucceeds(final String regionName) {
assertThatCode(() -> createPartitionedRegion(regionName, localMaxMemory, redundancy))
.doesNotThrowAnyException();
}
private void validateCreateDistributedSubRegionThrows(final String parentRegionName,
final String childRegionName, final Class<? extends Exception> exceptionClass) {
Region parentRegion = getCache().getRegion(parentRegionName);
assertThat(parentRegion).isNotNull();
RegionFactory regionFactory = getCache().createRegionFactory(RegionShortcut.REPLICATE);
assertThatThrownBy(() -> regionFactory.createSubregion(parentRegion, childRegionName))
.isInstanceOf(exceptionClass);
}
private void validateCreatePartitionedSubRegionThrows(final String parentRegionName,
final String childRegionName, final Class<? extends Exception> exceptionClass) {
Region parentRegion = getCache().getRegion(parentRegionName);
assertThat(parentRegion).isNotNull();
PartitionAttributesFactory paf = new PartitionAttributesFactory();
paf.setLocalMaxMemory(localMaxMemory);
paf.setRedundantCopies(redundancy);
RegionFactory regionFactory = getCache().createRegionFactory(RegionShortcut.PARTITION);
regionFactory.setPartitionAttributes(paf.create());
assertThatThrownBy(() -> regionFactory.createSubregion(parentRegion, childRegionName))
.isInstanceOf(exceptionClass);
}
}