blob: c8ca24382273f21e31c53c519f23ac280c5d2c09 [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.management.internal.cli.commands;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.apache.geode.distributed.DistributedMember;
import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
import org.apache.geode.internal.cache.InternalCache;
import org.apache.geode.test.junit.rules.GfshParserRule;
public class ConfigurePDXCommandTest {
private static final String BASE_COMMAND_STRING = "configure pdx ";
private InternalCache cache;
private ConfigurePDXCommand command;
private InternalConfigurationPersistenceService clusterConfigurationService;
@Rule
public GfshParserRule gfshParserRule = new GfshParserRule();
@Before
public void setUp() throws Exception {
cache = mock(InternalCache.class);
command = spy(ConfigurePDXCommand.class);
clusterConfigurationService = mock(InternalConfigurationPersistenceService.class);
doReturn(cache).when(command).getCache();
doReturn(Collections.emptySet()).when(command).getAllNormalMembers();
doReturn(clusterConfigurationService).when(command).getConfigurationPersistenceService();
}
@Test
public void errorOutIfCCNotRunning() {
doReturn(null).when(command).getConfigurationPersistenceService();
gfshParserRule.executeAndAssertThat(command, BASE_COMMAND_STRING).statusIsError()
.containsOutput("Configure pdx failed because cluster configuration is disabled.");
}
@Test
public void parsingShouldSucceedWithoutArguments() {
assertThat(gfshParserRule.parse(BASE_COMMAND_STRING)).isNotNull();
}
@Test
public void parsingAutoCompleteShouldSucceed() throws Exception {
GfshParserRule.CommandCandidate candidate = gfshParserRule.complete(BASE_COMMAND_STRING);
assertThat(candidate).isNotNull();
assertThat(candidate.getCandidates()).isNotNull();
assertThat(candidate.getCandidates().size()).isEqualTo(5);
}
@Test
public void executionShouldHandleInternalFailures() {
doReturn(Collections.emptySet()).when(command).getAllNormalMembers();
doThrow(new RuntimeException("Can't create ReflectionBasedAutoSerializer.")).when(command)
.createReflectionBasedAutoSerializer(anyBoolean(), any());
gfshParserRule
.executeAndAssertThat(command,
BASE_COMMAND_STRING + "--auto-serializable-classes=" + new String[] {})
.statusIsError().containsOutput("Error while processing command")
.containsOutput("Can't create ReflectionBasedAutoSerializer.");
gfshParserRule
.executeAndAssertThat(command,
BASE_COMMAND_STRING + "--portable-auto-serializable-classes=" + new String[] {})
.statusIsError().containsOutput("Error while processing command")
.containsOutput("Can't create ReflectionBasedAutoSerializer.");
verify(command, times(0)).updateConfigForGroup(any(), any(), any());
}
@Test
public void executionShouldFailIfBothPortableAndNonPortableClassesParametersAreSpecifiedAtTheSameTime() {
gfshParserRule
.executeAndAssertThat(command,
BASE_COMMAND_STRING
+ "--auto-serializable-classes=org.apache.geode --portable-auto-serializable-classes=org.apache.geode")
.statusIsError().containsOutput(
"The autoserializer cannot support both portable and non-portable classes at the same time.");
verify(command, times(0)).updateConfigForGroup(any(), any(), any());
}
@Test
public void executionShouldIncludeWarningMessageWhenThereAreMembersAlreadyRunning() {
Set<DistributedMember> members = new HashSet<>();
DistributedMember mockMember = mock(DistributedMember.class);
when(mockMember.getId()).thenReturn("member0");
members.add(mockMember);
doReturn(members).when(command).getAllNormalMembers();
gfshParserRule.executeAndAssertThat(command, BASE_COMMAND_STRING).statusIsSuccess()
.containsOutput(
"The command would only take effect on new data members joining the distributed system. It won't affect the existing data members");
}
@Test
public void executionShouldWorkCorrectlyWhenDefaultsAreUsed() {
gfshParserRule.executeAndAssertThat(command, BASE_COMMAND_STRING).statusIsSuccess()
.containsOutput("persistent = false").containsOutput("read-serialized = false")
.containsOutput("ignore-unread-fields = false");
}
@Test
public void executionShouldCorrectlyConfigurePersistenceWhenDefaultDiskStoreIsUsed() {
// Default Disk Store
gfshParserRule.executeAndAssertThat(command, BASE_COMMAND_STRING + "--disk-store")
.statusIsSuccess().containsOutput("persistent = true")
.containsOutput("disk-store = DEFAULT").containsOutput("read-serialized = false")
.containsOutput("ignore-unread-fields = false");
verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
verify(command, times(0)).createReflectionBasedAutoSerializer(anyBoolean(), any());
}
@Test
public void executionShouldCorrectlyConfigurePersistenceWhenCustomDiskStoreIsUsed() {
// Custom Disk Store
gfshParserRule.executeAndAssertThat(command, BASE_COMMAND_STRING + "--disk-store=myDiskStore")
.statusIsSuccess().containsOutput("persistent = true")
.containsOutput("disk-store = myDiskStore").containsOutput("read-serialized = false")
.containsOutput("ignore-unread-fields = false");
verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
verify(command, times(0)).createReflectionBasedAutoSerializer(anyBoolean(), any());
}
@Test
public void executionShouldCorrectlyConfigureReadSerializedWhenFlagIsSetAsTrue() {
// Custom Configuration as True
gfshParserRule.executeAndAssertThat(command, BASE_COMMAND_STRING + "--read-serialized=true")
.statusIsSuccess().containsOutput("persistent = false")
.containsOutput("read-serialized = true").containsOutput("ignore-unread-fields = false");
verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
verify(command, times(0)).createReflectionBasedAutoSerializer(anyBoolean(), any());
}
@Test
public void executionShouldCorrectlyConfigureReadSerializedWhenFlagIsSetAsFalse() {
// Custom Configuration as False
gfshParserRule.executeAndAssertThat(command, BASE_COMMAND_STRING + "--read-serialized=false")
.statusIsSuccess().containsOutput("persistent = false")
.containsOutput("read-serialized = false").containsOutput("ignore-unread-fields = false");
verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
verify(command, times(0)).createReflectionBasedAutoSerializer(anyBoolean(), any());
}
@Test
public void executionShouldCorrectlyConfigureIgnoreUnreadFieldsWhenFlagIsSetAsTrue() {
// Custom Configuration as True
gfshParserRule
.executeAndAssertThat(command, BASE_COMMAND_STRING + "--ignore-unread-fields=true")
.statusIsSuccess().containsOutput("persistent = false")
.containsOutput("read-serialized = false").containsOutput("ignore-unread-fields = true");
verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
verify(command, times(0)).createReflectionBasedAutoSerializer(anyBoolean(), any());
}
@Test
public void executionShouldCorrectlyConfigureIgnoreUnreadFieldsWhenFlagIsSetAsFalse() {
// Custom Configuration as False
gfshParserRule
.executeAndAssertThat(command, BASE_COMMAND_STRING + "--ignore-unread-fields=false")
.statusIsSuccess().containsOutput("persistent = false")
.containsOutput("read-serialized = false").containsOutput("ignore-unread-fields = false");
verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
verify(command, times(0)).createReflectionBasedAutoSerializer(anyBoolean(), any());
}
@Test
public void executionShouldCorrectlyConfigurePortableAutoSerializableClassesWhenUsingCustomPattern() {
String[] patterns = new String[] {"com.company.DomainObject.*#identity=id"};
// Custom Settings
gfshParserRule
.executeAndAssertThat(command,
BASE_COMMAND_STRING + "--portable-auto-serializable-classes=" + patterns[0])
.statusIsSuccess().containsOutput("persistent = false")
.containsOutput("read-serialized = false").containsOutput("ignore-unread-fields = false")
.containsOutput("Portable Classes = [com.company.DomainObject.*#identity=id]")
.containsOutput("PDX Serializer = org.apache.geode.pdx.ReflectionBasedAutoSerializer");
verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
verify(command, times(1)).createReflectionBasedAutoSerializer(true, patterns);
}
@Test
public void executionShouldCorrectlyConfigureAutoSerializableClassesWhenUsingCustomPattern() {
String[] patterns = new String[] {"com.company.DomainObject.*#identity=id"};
// Custom Settings
gfshParserRule
.executeAndAssertThat(command,
BASE_COMMAND_STRING + "--auto-serializable-classes=" + patterns[0])
.statusIsSuccess().containsOutput("persistent = false")
.containsOutput("read-serialized = false").containsOutput("ignore-unread-fields = false")
.containsOutput("Non Portable Classes = [com.company.DomainObject.*#identity=id]")
.containsOutput("PDX Serializer = org.apache.geode.pdx.ReflectionBasedAutoSerializer");
verify(clusterConfigurationService, times(1)).updateCacheConfig(any(), any());
verify(command, times(1)).createReflectionBasedAutoSerializer(false, patterns);
}
}