blob: ec1f04fa2bb28f476dd4e261162020a178b826c4 [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.test.dunit.rules.tests;
import static org.assertj.core.api.Java6Assertions.assertThatThrownBy;
import java.util.Arrays;
import java.util.Collection;
import org.awaitility.core.ConditionTimeoutException;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
import org.apache.geode.cache.DiskStore;
import org.apache.geode.cache.RegionShortcut;
import org.apache.geode.test.dunit.rules.ClusterStartupRule;
import org.apache.geode.test.dunit.rules.MemberVM;
import org.apache.geode.test.junit.rules.MemberStarterRule;
import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
@RunWith(Parameterized.class)
@Parameterized.UseParametersRunnerFactory(CategoryWithParameterizedRunnerFactory.class)
public class MemberStarterRuleAwaitDUnitTest {
@ClassRule
public static ClusterStartupRule csRule = new ClusterStartupRule(2);
// Name snooped in server VM below. At time of writing, should be "DEFAULT"
private static String existingDiskStoreName;
private static String existingRegionName = "existingRegion";
private static MemberVM locator, server;
private MemberVM memberToTest;
@Before
public void before() {
memberToTest = memberTypeToTest.equals("locator") ? locator : server;
}
@Parameter
public String memberTypeToTest;
@Parameters(name = "{index}: Using {0} VM")
public static Collection<String> useBothRules() {
return Arrays.asList("locator", "server");
}
@BeforeClass
public static void beforeClass() {
locator = csRule.startLocatorVM(0);
int locatorPort = locator.getPort();
server = csRule.startServerVM(1, member -> member.withJMXManager()
.withConnectionToLocator(locatorPort)
.withRegion(RegionShortcut.PARTITION_PERSISTENT, existingRegionName));
existingDiskStoreName = server.invoke(() -> {
DiskStore anExistingDiskStore =
(DiskStore) ClusterStartupRule.getCache().listDiskStores().toArray()[0];
return anExistingDiskStore.getName();
});
// Override the default 30 second timeout to something lower for the scope of this test
locator.invoke(() -> MemberStarterRule.setWaitUntilTimeout(3));
server.invoke(() -> MemberStarterRule.setWaitUntilTimeout(3));
}
@Test
public void nonexistingRegionTimeout() {
assertThatThrownBy(
() -> memberToTest.waitUntilRegionIsReadyOnExactlyThisManyServers("nonexistentRegion", 3))
.hasCauseInstanceOf(ConditionTimeoutException.class)
.hasStackTraceContaining("Expecting to find an mbean for region 'nonexistentRegion'");
}
@Test
public void existingRegionTimeout() {
assertThatThrownBy(
() -> memberToTest.waitUntilRegionIsReadyOnExactlyThisManyServers(existingRegionName, 3))
.hasCauseInstanceOf(ConditionTimeoutException.class)
.hasStackTraceContaining(
"Expecting to find an mbean for region '" + existingRegionName);
}
@Test
public void nonexistingQueueTimeout() {
assertThatThrownBy(() -> memberToTest
.waitUntilAsyncEventQueuesAreReadyOnExactlyThisManyServers("badQueueId", 3))
.hasCauseInstanceOf(ConditionTimeoutException.class)
.hasStackTraceContaining(
"Expecting exactly 3 servers to have an AEQ with id 'badQueueId'.");
}
@Test
public void nonexistingDiskStoreTimeout() {
assertThatThrownBy(
() -> memberToTest.waitUntilDiskStoreIsReadyOnExactlyThisManyServers("badDiskName", 3))
.hasCauseInstanceOf(ConditionTimeoutException.class)
.hasStackTraceContaining(
"Expecting exactly 3 servers to present mbeans for a disk store with name badDiskName");
}
@Test
public void existingDiskStoreTimeout() {
assertThatThrownBy(() -> memberToTest
.waitUntilDiskStoreIsReadyOnExactlyThisManyServers(existingDiskStoreName, 3))
.hasCauseInstanceOf(ConditionTimeoutException.class)
.hasStackTraceContaining(
"Expecting exactly 3 servers to present mbeans for a disk store with name "
+ existingDiskStoreName);
}
}