SGF-695 - Add support for parallel snapshots.
This commit is contained in:
@@ -16,6 +16,8 @@
|
||||
|
||||
package org.springframework.data.gemfire.config.xml;
|
||||
|
||||
import static org.springframework.data.gemfire.util.CollectionUtils.nullSafeList;
|
||||
|
||||
import org.springframework.beans.factory.config.BeanDefinition;
|
||||
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
||||
import org.springframework.beans.factory.support.ManagedList;
|
||||
@@ -71,28 +73,31 @@ class SnapshotServiceParser extends AbstractSingleBeanDefinitionParser {
|
||||
private ManagedList<BeanDefinition> parseSnapshots(Element element, ParserContext parserContext,
|
||||
String childTagName) {
|
||||
|
||||
ManagedList<BeanDefinition> snapshotBeans = new ManagedList<BeanDefinition>();
|
||||
ManagedList<BeanDefinition> snapshotBeans = new ManagedList<>();
|
||||
|
||||
for (Element childElement : DomUtils.getChildElementsByTagName(element, childTagName)) {
|
||||
snapshotBeans.add(parseSnapshotMetadata(childElement, parserContext));
|
||||
}
|
||||
nullSafeList(DomUtils.getChildElementsByTagName(element, childTagName)).forEach(childElement ->
|
||||
snapshotBeans.add(parseSnapshotMetadata(childElement, parserContext)));
|
||||
|
||||
return snapshotBeans;
|
||||
}
|
||||
|
||||
/* (non-Javadoc) */
|
||||
private BeanDefinition parseSnapshotMetadata(Element snapshotMetadataElement, ParserContext parserContext) {
|
||||
BeanDefinitionBuilder snapshotMetadataBuilder = BeanDefinitionBuilder.genericBeanDefinition(
|
||||
SnapshotServiceFactoryBean.SnapshotMetadata.class);
|
||||
|
||||
BeanDefinitionBuilder snapshotMetadataBuilder =
|
||||
BeanDefinitionBuilder.genericBeanDefinition(SnapshotServiceFactoryBean.SnapshotMetadata.class);
|
||||
|
||||
snapshotMetadataBuilder.addConstructorArgValue(snapshotMetadataElement.getAttribute("location"));
|
||||
|
||||
snapshotMetadataBuilder.addConstructorArgValue(snapshotMetadataElement.getAttribute("format"));
|
||||
|
||||
if (isSnapshotFilterSpecified(snapshotMetadataElement)) {
|
||||
snapshotMetadataBuilder.addConstructorArgValue(ParsingUtils.parseRefOrNestedBeanDeclaration(
|
||||
snapshotMetadataElement, parserContext, snapshotMetadataBuilder, "filter-ref", true));
|
||||
snapshotMetadataElement, parserContext, snapshotMetadataBuilder, "filter-ref",
|
||||
true));
|
||||
}
|
||||
|
||||
snapshotMetadataBuilder.addConstructorArgValue(snapshotMetadataElement.getAttribute("format"));
|
||||
ParsingUtils.setPropertyValue(snapshotMetadataElement, snapshotMetadataBuilder, "parallel");
|
||||
|
||||
return snapshotMetadataBuilder.getBeanDefinition();
|
||||
}
|
||||
|
||||
@@ -168,7 +168,7 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
|
||||
* @see org.apache.geode.cache.snapshot.RegionSnapshotService
|
||||
*/
|
||||
protected SnapshotServiceAdapter<K, V> wrap(RegionSnapshotService<K, V> regionSnapshotService) {
|
||||
return new RegionSnapshotServiceAdapter<K, V>(regionSnapshotService);
|
||||
return new RegionSnapshotServiceAdapter<>(regionSnapshotService);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -446,8 +446,10 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
|
||||
throw new UnsupportedOperationException("not implemented");
|
||||
}
|
||||
|
||||
protected SnapshotOptions<K, V> createOptions(SnapshotFilter<K, V> filter) {
|
||||
return createOptions().setFilter(filter);
|
||||
protected SnapshotOptions<K, V> createOptions(SnapshotMetadata<K, V> metadata) {
|
||||
return createOptions()
|
||||
.setFilter(metadata.getFilter())
|
||||
.setParallelMode(metadata.isParallel());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -455,7 +457,7 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
|
||||
public void doExport(SnapshotMetadata<K, V>... configurations) {
|
||||
|
||||
stream(nullSafeArray(configurations)).forEach(configuration ->
|
||||
save(configuration.getLocation(), configuration.getFormat(), createOptions(configuration.getFilter())));
|
||||
save(configuration.getLocation(), configuration.getFormat(), createOptions(configuration)));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -463,8 +465,7 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
|
||||
public void doImport(SnapshotMetadata<K, V>... configurations) {
|
||||
|
||||
stream(nullSafeArray(configurations)).forEach(configuration ->
|
||||
load(configuration.getFormat(), createOptions(configuration.getFilter()),
|
||||
handleLocation(configuration)));
|
||||
load(configuration.getFormat(), createOptions(configuration), handleLocation(configuration)));
|
||||
}
|
||||
|
||||
protected abstract File[] handleLocation(SnapshotMetadata<K, V> configuration);
|
||||
@@ -671,7 +672,7 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
|
||||
}
|
||||
|
||||
@Override
|
||||
protected File[] handleLocation(final SnapshotMetadata<K, V> configuration) {
|
||||
protected File[] handleLocation(SnapshotMetadata<K, V> configuration) {
|
||||
return new File[] { configuration.getLocation() };
|
||||
}
|
||||
|
||||
@@ -739,22 +740,33 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
|
||||
*/
|
||||
public static class SnapshotMetadata<K, V> {
|
||||
|
||||
protected static final boolean DEFAULT_PARALLEL = false;
|
||||
|
||||
protected static final SnapshotFormat DEFAULT_SNAPSHOT_FORMAT = SnapshotFormat.GEMFIRE;
|
||||
|
||||
private boolean parallel;
|
||||
|
||||
private final File location;
|
||||
|
||||
private final SnapshotFilter<K, V> filter;
|
||||
|
||||
private final SnapshotFormat format;
|
||||
|
||||
public SnapshotMetadata(File location, SnapshotFormat format) {
|
||||
this(location, null, format);
|
||||
public SnapshotMetadata(File location) {
|
||||
this(location, DEFAULT_SNAPSHOT_FORMAT, null);
|
||||
}
|
||||
|
||||
public SnapshotMetadata(File location, SnapshotFilter<K, V> filter, SnapshotFormat format) {
|
||||
Assert.notNull(location, "Location must not be null");
|
||||
public SnapshotMetadata(File location, SnapshotFormat format) {
|
||||
this(location, format, null);
|
||||
}
|
||||
|
||||
public SnapshotMetadata(File location, SnapshotFormat format, SnapshotFilter<K, V> filter) {
|
||||
|
||||
Assert.notNull(location, "Location is required");
|
||||
|
||||
this.location = location;
|
||||
this.filter = filter;
|
||||
this.format = format;
|
||||
this.filter = filter;
|
||||
}
|
||||
|
||||
public boolean isDirectory() {
|
||||
@@ -766,7 +778,11 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
|
||||
}
|
||||
|
||||
public File getLocation() {
|
||||
return location;
|
||||
return this.location;
|
||||
}
|
||||
|
||||
public SnapshotFormat getFormat() {
|
||||
return Optional.ofNullable(this.format).orElse(DEFAULT_SNAPSHOT_FORMAT);
|
||||
}
|
||||
|
||||
public boolean isFilterPresent() {
|
||||
@@ -774,17 +790,21 @@ public class SnapshotServiceFactoryBean<K, V> extends AbstractFactoryBeanSupport
|
||||
}
|
||||
|
||||
public SnapshotFilter<K, V> getFilter() {
|
||||
return filter;
|
||||
return this.filter;
|
||||
}
|
||||
|
||||
public SnapshotFormat getFormat() {
|
||||
return (format != null ? format : SnapshotFormat.GEMFIRE);
|
||||
public void setParallel(boolean parallel) {
|
||||
this.parallel = parallel;
|
||||
}
|
||||
|
||||
public boolean isParallel() {
|
||||
return this.parallel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("{ @type = %1$s, location = %2$s, filter = %2$s, format = %4$s }",
|
||||
getClass().getName(), getLocation().getAbsolutePath(), getFilter(), getFormat());
|
||||
return String.format("{ @type = %1$s, location = %2$s, format = %3$s, filter = %4$s, parallel = %5$s }",
|
||||
getClass().getName(), getLocation().getAbsolutePath(), getFormat(), getFilter(), isParallel());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -247,9 +247,10 @@ both in the same definition) is illegal.
|
||||
</xsd:annotation>
|
||||
</xsd:any>
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="location" type="xsd:string" use="required"/>
|
||||
<xsd:attribute name="format" type="xsd:string" use="optional" default="GEMFIRE"/>
|
||||
<xsd:attribute name="filter-ref" type="xsd:string" use="optional"/>
|
||||
<xsd:attribute name="format" type="xsd:string" use="optional" default="GEMFIRE"/>
|
||||
<xsd:attribute name="location" type="xsd:string" use="required"/>
|
||||
<xsd:attribute name="parallel" type="xsd:string" use="optional" default="false"/>
|
||||
</xsd:complexType>
|
||||
|
||||
</xsd:schema>
|
||||
|
||||
@@ -27,6 +27,7 @@ import static org.hamcrest.CoreMatchers.nullValue;
|
||||
import static org.hamcrest.CoreMatchers.sameInstance;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assume.assumeThat;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.Matchers.any;
|
||||
import static org.mockito.Matchers.eq;
|
||||
import static org.mockito.Matchers.isNull;
|
||||
@@ -60,7 +61,7 @@ import org.junit.BeforeClass;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.ExpectedException;
|
||||
import org.mockito.Matchers;
|
||||
import org.mockito.ArgumentMatchers;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
import org.springframework.data.gemfire.snapshot.event.ExportSnapshotApplicationEvent;
|
||||
import org.springframework.data.gemfire.snapshot.event.ImportSnapshotApplicationEvent;
|
||||
@@ -95,7 +96,7 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
File mockFile = mock(File.class, filename);
|
||||
|
||||
when(mockFile.isFile()).thenReturn(true);
|
||||
when(mockFile.getAbsolutePath()).thenReturn(String.format("/path/to/%1$s", filename));
|
||||
when(mockFile.getAbsolutePath()).thenReturn(String.format("/path/to/%s", filename));
|
||||
when(mockFile.getName()).thenReturn(filename);
|
||||
|
||||
return mockFile;
|
||||
@@ -106,21 +107,27 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
}
|
||||
|
||||
protected <K, V> SnapshotMetadata<K, V> newSnapshotMetadata(File location) {
|
||||
return newSnapshotMetadata(location, null);
|
||||
return newSnapshotMetadata(location, null, false, SnapshotFormat.GEMFIRE);
|
||||
}
|
||||
|
||||
protected <K, V> SnapshotMetadata<K, V> newSnapshotMetadata(SnapshotFilter<K, V> filter) {
|
||||
return newSnapshotMetadata(FileSystemUtils.WORKING_DIRECTORY, filter);
|
||||
}
|
||||
|
||||
protected <K, V> SnapshotMetadata<K, V> newSnapshotMetadata(File location, SnapshotFilter<K, V> filter) {
|
||||
return newSnapshotMetadata(location, filter, SnapshotFormat.GEMFIRE);
|
||||
protected <K, V> SnapshotMetadata<K, V> newSnapshotMetadata(SnapshotFilter<K, V> filter, boolean parallel) {
|
||||
return newSnapshotMetadata(FileSystemUtils.WORKING_DIRECTORY, filter, parallel);
|
||||
}
|
||||
|
||||
protected <K, V> SnapshotMetadata<K, V> newSnapshotMetadata(File location, SnapshotFilter<K, V> filter,
|
||||
SnapshotFormat format) {
|
||||
boolean parallel) {
|
||||
|
||||
return new SnapshotMetadata<K, V>(location, filter, format);
|
||||
return newSnapshotMetadata(location, filter, parallel, SnapshotFormat.GEMFIRE);
|
||||
}
|
||||
|
||||
protected <K, V> SnapshotMetadata<K, V> newSnapshotMetadata(File location, SnapshotFilter<K, V> filter,
|
||||
boolean parallel, SnapshotFormat format) {
|
||||
|
||||
SnapshotMetadata<K, V> snapshotMetadata = new SnapshotMetadata<>(location, format, filter);
|
||||
|
||||
snapshotMetadata.setParallel(parallel);
|
||||
|
||||
return snapshotMetadata;
|
||||
}
|
||||
|
||||
protected <K, V> SnapshotMetadata<K, V>[] toArray(SnapshotMetadata<K, V>... metadata) {
|
||||
@@ -716,15 +723,18 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
when(mockCacheSnapshotService.createOptions()).thenReturn(mockSnapshotOptionsOne)
|
||||
.thenReturn(mockSnapshotOptionsTwo);
|
||||
when(mockSnapshotOptionsOne.setFilter(eq(mockSnapshotFilterOne))).thenReturn(mockSnapshotOptionsOne);
|
||||
when(mockSnapshotOptionsOne.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsOne);
|
||||
when(mockSnapshotOptionsTwo.setFilter(eq(mockSnapshotFilterTwo))).thenReturn(mockSnapshotOptionsTwo);
|
||||
when(mockSnapshotOptionsTwo.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsTwo);
|
||||
|
||||
SnapshotMetadata[] expectedImports = toArray(
|
||||
newSnapshotMetadata(FileSystemUtils.USER_HOME, mockSnapshotFilterOne),
|
||||
newSnapshotMetadata(mockSnapshotFilterTwo));
|
||||
SnapshotMetadata[] expectedImports =
|
||||
toArray(newSnapshotMetadata(FileSystemUtils.USER_HOME, mockSnapshotFilterOne, true),
|
||||
newSnapshotMetadata(mockSnapshotFilterTwo, false));
|
||||
|
||||
SnapshotServiceFactoryBean factoryBean = new SnapshotServiceFactoryBean();
|
||||
|
||||
factoryBean.setCache(mockCache);
|
||||
factoryBean.setExports(null);
|
||||
factoryBean.setImports(expectedImports);
|
||||
factoryBean.setRegion(null);
|
||||
|
||||
@@ -740,13 +750,16 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
|
||||
verify(mockCache, times(1)).getSnapshotService();
|
||||
verify(mockCacheSnapshotService, times(2)).createOptions();
|
||||
verify(mockCacheSnapshotService, times(1)).load(eq(FileSystemUtils.safeListFiles(FileSystemUtils.USER_HOME, FileSystemUtils.FileOnlyFilter.INSTANCE)),
|
||||
eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptionsOne));
|
||||
verify(mockCacheSnapshotService, times(1)).load(eq(FileSystemUtils.safeListFiles(
|
||||
FileSystemUtils.WORKING_DIRECTORY, FileSystemUtils.FileOnlyFilter.INSTANCE)),
|
||||
eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptionsTwo));
|
||||
verify(mockCacheSnapshotService, times(1))
|
||||
.load(eq(FileSystemUtils.safeListFiles(FileSystemUtils.USER_HOME, FileSystemUtils.FileOnlyFilter.INSTANCE)),
|
||||
eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptionsOne));
|
||||
verify(mockCacheSnapshotService, times(1))
|
||||
.load(eq(FileSystemUtils.safeListFiles(FileSystemUtils.WORKING_DIRECTORY, FileSystemUtils.FileOnlyFilter.INSTANCE)),
|
||||
eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptionsTwo));
|
||||
verify(mockSnapshotOptionsOne, times(1)).setFilter(eq(mockSnapshotFilterOne));
|
||||
verify(mockSnapshotOptionsOne, times(1)).setParallelMode(eq(true));
|
||||
verify(mockSnapshotOptionsTwo, times(1)).setFilter(eq(mockSnapshotFilterTwo));
|
||||
verify(mockSnapshotOptionsTwo, times(1)).setParallelMode(eq(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -771,16 +784,20 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
when(mockRegionSnapshotService.createOptions()).thenReturn(mockSnapshotOptionsOne)
|
||||
.thenReturn(mockSnapshotOptionsTwo);
|
||||
when(mockSnapshotOptionsOne.setFilter(eq(mockSnapshotFilterOne))).thenReturn(mockSnapshotOptionsOne);
|
||||
when(mockSnapshotOptionsOne.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsOne);
|
||||
when(mockSnapshotOptionsTwo.setFilter(eq(mockSnapshotFilterTwo))).thenReturn(mockSnapshotOptionsTwo);
|
||||
when(mockSnapshotOptionsTwo.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsTwo);
|
||||
|
||||
File snapshotDatTwo = mockFile("snapshot-2.dat");
|
||||
|
||||
SnapshotMetadata[] expectedImports = toArray(newSnapshotMetadata(snapshotDat, mockSnapshotFilterOne),
|
||||
newSnapshotMetadata(snapshotDatTwo, mockSnapshotFilterTwo));
|
||||
SnapshotMetadata[] expectedImports =
|
||||
toArray(newSnapshotMetadata(snapshotDat, mockSnapshotFilterOne, true),
|
||||
newSnapshotMetadata(snapshotDatTwo, mockSnapshotFilterTwo, false));
|
||||
|
||||
SnapshotServiceFactoryBean factoryBean = new SnapshotServiceFactoryBean();
|
||||
|
||||
factoryBean.setCache(mockCache);
|
||||
factoryBean.setExports(null);
|
||||
factoryBean.setImports(expectedImports);
|
||||
factoryBean.setRegion(mockRegion);
|
||||
|
||||
@@ -797,12 +814,14 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
verify(mockCache, never()).getSnapshotService();
|
||||
verify(mockRegion, times(1)).getSnapshotService();
|
||||
verify(mockRegionSnapshotService, times(2)).createOptions();
|
||||
verify(mockRegionSnapshotService, times(1)).load(eq(snapshotDat), eq(SnapshotFormat.GEMFIRE),
|
||||
eq(mockSnapshotOptionsOne));
|
||||
verify(mockRegionSnapshotService, times(1)).load(eq(snapshotDatTwo), eq(SnapshotFormat.GEMFIRE),
|
||||
eq(mockSnapshotOptionsTwo));
|
||||
verify(mockRegionSnapshotService, times(1))
|
||||
.load(eq(snapshotDat), eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptionsOne));
|
||||
verify(mockRegionSnapshotService, times(1))
|
||||
.load(eq(snapshotDatTwo), eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptionsTwo));
|
||||
verify(mockSnapshotOptionsOne, times(1)).setFilter(eq(mockSnapshotFilterOne));
|
||||
verify(mockSnapshotOptionsOne, times(1)).setParallelMode(eq(true));
|
||||
verify(mockSnapshotOptionsTwo, times(1)).setFilter(eq(mockSnapshotFilterTwo));
|
||||
verify(mockSnapshotOptionsTwo, times(1)).setParallelMode(eq(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -823,10 +842,13 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
when(mockCacheSnapshotService.createOptions()).thenReturn(mockSnapshotOptionsOne)
|
||||
.thenReturn(mockSnapshotOptionsTwo);
|
||||
when(mockSnapshotOptionsOne.setFilter(eq(mockSnapshotFilterOne))).thenReturn(mockSnapshotOptionsOne);
|
||||
when(mockSnapshotOptionsOne.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsOne);
|
||||
when(mockSnapshotOptionsTwo.setFilter(eq(mockSnapshotFilterTwo))).thenReturn(mockSnapshotOptionsTwo);
|
||||
when(mockSnapshotOptionsTwo.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsTwo);
|
||||
|
||||
SnapshotMetadata[] expectedExports = toArray(newSnapshotMetadata(mockSnapshotFilterOne),
|
||||
newSnapshotMetadata(mockSnapshotFilterTwo));
|
||||
SnapshotMetadata[] expectedExports =
|
||||
toArray(newSnapshotMetadata(mockSnapshotFilterOne, true),
|
||||
newSnapshotMetadata(mockSnapshotFilterTwo, false));
|
||||
|
||||
SnapshotServiceFactoryBean factoryBean = new SnapshotServiceFactoryBean();
|
||||
|
||||
@@ -846,7 +868,9 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
verify(mockCacheSnapshotService, times(1)).save(eq(expectedExports[1].getLocation()),
|
||||
eq(expectedExports[1].getFormat()), eq(mockSnapshotOptionsTwo));
|
||||
verify(mockSnapshotOptionsOne, times(1)).setFilter(eq(mockSnapshotFilterOne));
|
||||
verify(mockSnapshotOptionsOne, times(1)).setParallelMode(eq(true));
|
||||
verify(mockSnapshotOptionsTwo, times(1)).setFilter(eq(mockSnapshotFilterTwo));
|
||||
verify(mockSnapshotOptionsTwo, times(1)).setParallelMode(eq(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -870,10 +894,13 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
when(mockRegionSnapshotService.createOptions()).thenReturn(mockSnapshotOptionsOne)
|
||||
.thenReturn(mockSnapshotOptionsTwo);
|
||||
when(mockSnapshotOptionsOne.setFilter(eq(mockSnapshotFilterOne))).thenReturn(mockSnapshotOptionsOne);
|
||||
when(mockSnapshotOptionsOne.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsOne);
|
||||
when(mockSnapshotOptionsTwo.setFilter(eq(mockSnapshotFilterTwo))).thenReturn(mockSnapshotOptionsTwo);
|
||||
when(mockSnapshotOptionsTwo.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptionsTwo);
|
||||
|
||||
SnapshotMetadata[] expectedExports = toArray(newSnapshotMetadata(mockSnapshotFilterOne),
|
||||
newSnapshotMetadata(mockSnapshotFilterTwo));
|
||||
SnapshotMetadata[] expectedExports =
|
||||
toArray(newSnapshotMetadata(mockSnapshotFilterOne, true),
|
||||
newSnapshotMetadata(mockSnapshotFilterTwo, false));
|
||||
|
||||
SnapshotServiceFactoryBean factoryBean = new SnapshotServiceFactoryBean();
|
||||
|
||||
@@ -894,17 +921,20 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
verify(mockRegionSnapshotService, times(1)).save(eq(expectedExports[1].getLocation()),
|
||||
eq(expectedExports[1].getFormat()), eq(mockSnapshotOptionsTwo));
|
||||
verify(mockSnapshotOptionsOne, times(1)).setFilter(eq(mockSnapshotFilterOne));
|
||||
verify(mockSnapshotOptionsOne, times(1)).setParallelMode(eq(true));
|
||||
verify(mockSnapshotOptionsTwo, times(1)).setFilter(eq(mockSnapshotFilterTwo));
|
||||
verify(mockSnapshotOptionsTwo, times(1)).setParallelMode(eq(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createOptionsWithFilterOnSnapshotServiceAdapterSupport() {
|
||||
public void createOptionsWithParallelModeAndFilterOnSnapshotServiceAdapterSupport() {
|
||||
|
||||
SnapshotFilter mockSnapshotFilter = mock(SnapshotFilter.class, "MockSnapshotFilter");
|
||||
|
||||
SnapshotOptions mockSnapshotOptions = mock(SnapshotOptions.class, "MockSnapshotOptions");
|
||||
|
||||
when(mockSnapshotOptions.setFilter(any(SnapshotFilter.class))).thenReturn(mockSnapshotOptions);
|
||||
when(mockSnapshotOptions.setParallelMode(anyBoolean())).thenReturn(mockSnapshotOptions);
|
||||
|
||||
TestSnapshotServiceAdapter snapshotService = new TestSnapshotServiceAdapter() {
|
||||
@Override public SnapshotOptions<Object, Object> createOptions() {
|
||||
@@ -912,9 +942,16 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
}
|
||||
};
|
||||
|
||||
assertThat(snapshotService.createOptions(mockSnapshotFilter), is(equalTo(mockSnapshotOptions)));
|
||||
SnapshotMetadata<Object, Object> snapshotMetadata =
|
||||
new SnapshotMetadata<>(mockFile("snapshot.gfd"), SnapshotMetadata.DEFAULT_SNAPSHOT_FORMAT,
|
||||
mockSnapshotFilter);
|
||||
|
||||
snapshotMetadata.setParallel(true);
|
||||
|
||||
assertThat(snapshotService.createOptions(snapshotMetadata), is(equalTo(mockSnapshotOptions)));
|
||||
|
||||
verify(mockSnapshotOptions, times(1)).setFilter(eq(mockSnapshotFilter));
|
||||
verify(mockSnapshotOptions, times(1)).setParallelMode(eq(true));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1051,7 +1088,7 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
}
|
||||
finally {
|
||||
verify(mockCacheSnapshotService, times(1)).load(eq(new File[] { snapshotDat }),
|
||||
eq(SnapshotFormat.GEMFIRE), Matchers.isA(SnapshotOptions.class));
|
||||
eq(SnapshotFormat.GEMFIRE), ArgumentMatchers.isA(SnapshotOptions.class));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1112,7 +1149,7 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
}
|
||||
finally {
|
||||
verify(mockCacheSnapshotService, times(1)).save(eq(FileSystemUtils.USER_HOME), eq(SnapshotFormat.GEMFIRE),
|
||||
Matchers.isA(SnapshotOptions.class));
|
||||
ArgumentMatchers.isA(SnapshotOptions.class));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1208,9 +1245,10 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
public void saveRegionSnapshotWithSnapshotFileFormatAndOptionsHandlesExceptionAppropriately() throws Exception {
|
||||
|
||||
SnapshotOptions mockSnapshotOptions =
|
||||
mock(SnapshotOptions.class, "MockSnapahotOptions");
|
||||
mock(SnapshotOptions.class, "MockSnapshotOptions");
|
||||
|
||||
RegionSnapshotService mockRegionSnapshotService = mock(RegionSnapshotService.class, "MockRegionSnapshotService");
|
||||
RegionSnapshotService mockRegionSnapshotService =
|
||||
mock(RegionSnapshotService.class, "MockRegionSnapshotService");
|
||||
|
||||
doThrow(new ClassCastException("TEST")).when(mockRegionSnapshotService).save(any(File.class),
|
||||
any(SnapshotFormat.class), any(SnapshotOptions.class));
|
||||
@@ -1223,16 +1261,18 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
adapter.save(snapshotDat, SnapshotFormat.GEMFIRE, mockSnapshotOptions);
|
||||
}
|
||||
catch (ExportSnapshotException expected) {
|
||||
|
||||
assertThat(expected.getMessage(), is(equalTo(String.format(
|
||||
"Failed to save snapshot to file [%1$s] in format [GEMFIRE] using options [%2$s]",
|
||||
snapshotDat, mockSnapshotOptions))));
|
||||
assertThat(expected.getCause(), is(instanceOf(ClassCastException.class)));
|
||||
assertThat(expected.getCause().getMessage(), is(equalTo("TEST")));
|
||||
|
||||
throw expected;
|
||||
}
|
||||
finally {
|
||||
verify(mockRegionSnapshotService, times(1)).save(eq(snapshotDat), eq(SnapshotFormat.GEMFIRE),
|
||||
eq(mockSnapshotOptions));
|
||||
verify(mockRegionSnapshotService, times(1))
|
||||
.save(eq(snapshotDat), eq(SnapshotFormat.GEMFIRE), eq(mockSnapshotOptions));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1241,38 +1281,40 @@ public class SnapshotServiceFactoryBeanTest {
|
||||
|
||||
exception.expect(IllegalArgumentException.class);
|
||||
exception.expectCause(is(nullValue(Throwable.class)));
|
||||
exception.expectMessage("Location must not be null");
|
||||
exception.expectMessage("Location is required");
|
||||
|
||||
new SnapshotMetadata(null, mock(SnapshotFilter.class), SnapshotFormat.GEMFIRE);
|
||||
new SnapshotMetadata(null, SnapshotFormat.GEMFIRE, mock(SnapshotFilter.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createSnapshotMetadataWithDirectoryFilterAndUnspecifiedFormat() {
|
||||
public void createSnapshotMetadataWithFileGemFireFormatAndNullFilter() throws Exception {
|
||||
|
||||
SnapshotFilter mockSnapshotFilter = mock(SnapshotFilter.class, "MockSnapshotFilter");
|
||||
|
||||
SnapshotMetadata metadata =
|
||||
new SnapshotMetadata(FileSystemUtils.WORKING_DIRECTORY, mockSnapshotFilter, null);
|
||||
|
||||
assertThat(metadata.getLocation(), is(equalTo(FileSystemUtils.WORKING_DIRECTORY)));
|
||||
assertThat(metadata.isDirectory(), is(true));
|
||||
assertThat(metadata.isFile(), is(false));
|
||||
assertThat(metadata.getFilter(), is(equalTo(mockSnapshotFilter)));
|
||||
assertThat(metadata.isFilterPresent(), is(true));
|
||||
assertThat(metadata.getFormat(), is(equalTo(SnapshotFormat.GEMFIRE)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createSnapshotMetadataWithFileNullFilterAndGemFireFormat() throws Exception {
|
||||
|
||||
SnapshotMetadata snapshotMetadata = new SnapshotMetadata(snapshotDat, null, SnapshotFormat.GEMFIRE);
|
||||
SnapshotMetadata snapshotMetadata = new SnapshotMetadata(snapshotDat, SnapshotFormat.GEMFIRE, null);
|
||||
|
||||
assertThat(snapshotMetadata.getLocation(), is(equalTo(snapshotDat)));
|
||||
assertThat(snapshotMetadata.isDirectory(), is(false));
|
||||
assertThat(snapshotMetadata.isFile(), is(true));
|
||||
assertThat(snapshotMetadata.getFilter(), is(nullValue()));
|
||||
assertThat(snapshotMetadata.isFilterPresent(), is(false));
|
||||
assertThat(snapshotMetadata.getFormat(), is(equalTo(SnapshotFormat.GEMFIRE)));
|
||||
assertThat(snapshotMetadata.isFilterPresent(), is(false));
|
||||
assertThat(snapshotMetadata.getFilter(), is(nullValue()));
|
||||
assertThat(snapshotMetadata.isParallel(), is(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createSnapshotMetadataWithDirectoryNullFormatAndFilter() {
|
||||
|
||||
SnapshotFilter mockSnapshotFilter = mock(SnapshotFilter.class, "MockSnapshotFilter");
|
||||
|
||||
SnapshotMetadata snapshotMetadata =
|
||||
new SnapshotMetadata(FileSystemUtils.WORKING_DIRECTORY, null, mockSnapshotFilter);
|
||||
|
||||
assertThat(snapshotMetadata.getLocation(), is(equalTo(FileSystemUtils.WORKING_DIRECTORY)));
|
||||
assertThat(snapshotMetadata.isDirectory(), is(true));
|
||||
assertThat(snapshotMetadata.isFile(), is(false));
|
||||
assertThat(snapshotMetadata.getFormat(), is(equalTo(SnapshotFormat.GEMFIRE)));
|
||||
assertThat(snapshotMetadata.isFilterPresent(), is(true));
|
||||
assertThat(snapshotMetadata.getFilter(), is(equalTo(mockSnapshotFilter)));
|
||||
assertThat(snapshotMetadata.isParallel(), is(false));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -54,18 +54,19 @@ import org.springframework.data.gemfire.test.support.FileSystemUtils;
|
||||
public class SnapshotApplicationEventTest {
|
||||
|
||||
@Mock
|
||||
@SuppressWarnings("unused")
|
||||
private Region<Object, Object> mockRegion;
|
||||
|
||||
protected <K, V> SnapshotMetadata<K, V> newSnapshotMetadata() {
|
||||
return new SnapshotMetadata<K, V>(FileSystemUtils.WORKING_DIRECTORY, null,
|
||||
SnapshotOptions.SnapshotFormat.GEMFIRE);
|
||||
return new SnapshotMetadata<>(FileSystemUtils.WORKING_DIRECTORY, SnapshotOptions.SnapshotFormat.GEMFIRE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void constructSnapshotApplicationEventWithoutRegionOrSnapshotMetadata() {
|
||||
|
||||
SnapshotApplicationEvent event = new TestSnapshotApplicationEvent(this);
|
||||
|
||||
assertThat((SnapshotApplicationEventTest) event.getSource(), is(equalTo(this)));
|
||||
assertThat(event.getSource(), is(equalTo(this)));
|
||||
assertThat(event.getRegionPath(), is(nullValue()));
|
||||
assertThat(event.getSnapshotMetadata(), is(notNullValue()));
|
||||
assertThat(event.getSnapshotMetadata().length, is(equalTo(0)));
|
||||
@@ -75,11 +76,12 @@ public class SnapshotApplicationEventTest {
|
||||
|
||||
@Test
|
||||
public void constructSnapshotApplicationEventWithRegionAndSnapshotMetadata() {
|
||||
|
||||
SnapshotMetadata eventSnapshotMetadata = newSnapshotMetadata();
|
||||
|
||||
SnapshotApplicationEvent event = new TestSnapshotApplicationEvent(this, "/Example", eventSnapshotMetadata);
|
||||
|
||||
assertThat((SnapshotApplicationEventTest) event.getSource(), is(equalTo(this)));
|
||||
assertThat(event.getSource(), is(equalTo(this)));
|
||||
assertThat(event.getRegionPath(), is(equalTo("/Example")));
|
||||
assertThat(event.getSnapshotMetadata()[0], is(sameInstance(eventSnapshotMetadata)));
|
||||
assertThat(event.isCacheSnapshotEvent(), is(false));
|
||||
@@ -88,9 +90,10 @@ public class SnapshotApplicationEventTest {
|
||||
|
||||
@Test
|
||||
public void constructSnapshotApplicationEventWithRegionButNoSnapshotMetadata() {
|
||||
|
||||
SnapshotApplicationEvent event = new TestSnapshotApplicationEvent(this, "/Example");
|
||||
|
||||
assertThat((SnapshotApplicationEventTest) event.getSource(), is(equalTo(this)));
|
||||
assertThat(event.getSource(), is(equalTo(this)));
|
||||
assertThat(event.getRegionPath(), is(equalTo("/Example")));
|
||||
assertThat(event.getSnapshotMetadata(), is(notNullValue()));
|
||||
assertThat(event.getSnapshotMetadata().length, is(equalTo(0)));
|
||||
@@ -100,13 +103,14 @@ public class SnapshotApplicationEventTest {
|
||||
|
||||
@Test
|
||||
public void constructSnapshotApplicationEventWithSnapshotMetadataButNoRegion() {
|
||||
|
||||
SnapshotMetadata eventSnapshotMetadataOne = newSnapshotMetadata();
|
||||
SnapshotMetadata eventSnapshotMetadataTwo = newSnapshotMetadata();
|
||||
|
||||
SnapshotApplicationEvent event = new TestSnapshotApplicationEvent(this, eventSnapshotMetadataOne,
|
||||
eventSnapshotMetadataTwo);
|
||||
SnapshotApplicationEvent event =
|
||||
new TestSnapshotApplicationEvent(this, eventSnapshotMetadataOne, eventSnapshotMetadataTwo);
|
||||
|
||||
assertThat((SnapshotApplicationEventTest) event.getSource(), is(equalTo(this)));
|
||||
assertThat(event.getSource(), is(equalTo(this)));
|
||||
assertThat(event.getRegionPath(), is(nullValue()));
|
||||
assertThat(event.getSnapshotMetadata()[0], is(equalTo(eventSnapshotMetadataOne)));
|
||||
assertThat(event.getSnapshotMetadata()[1], is(equalTo(eventSnapshotMetadataTwo)));
|
||||
@@ -121,6 +125,7 @@ public class SnapshotApplicationEventTest {
|
||||
|
||||
@Test
|
||||
public void matchesNonMatchingRegionIsFalse() {
|
||||
|
||||
Region mockRegion = mock(Region.class, "MockRegion");
|
||||
|
||||
when(mockRegion.getFullPath()).thenReturn("/Example");
|
||||
@@ -132,6 +137,7 @@ public class SnapshotApplicationEventTest {
|
||||
|
||||
@Test
|
||||
public void matchesMatchingRegionIsTrue() {
|
||||
|
||||
Region mockRegion = mock(Region.class, "MockRegion");
|
||||
|
||||
when(mockRegion.getFullPath()).thenReturn("/Example");
|
||||
@@ -143,6 +149,7 @@ public class SnapshotApplicationEventTest {
|
||||
|
||||
@Test
|
||||
public void matchesNonMatchingRegionPathsIsFalse() {
|
||||
|
||||
SnapshotApplicationEvent event = new TestSnapshotApplicationEvent(this, "/Example");
|
||||
|
||||
assertThat(event.getRegionPath(), is(equalTo("/Example")));
|
||||
@@ -162,6 +169,7 @@ public class SnapshotApplicationEventTest {
|
||||
|
||||
@Test
|
||||
public void matchesMatchingRegionPathsIsTrue() {
|
||||
|
||||
assertThat(new TestSnapshotApplicationEvent(this, "/Example").matches("/Example"), is(true));
|
||||
assertThat(new TestSnapshotApplicationEvent(this, "/").matches("/"), is(true));
|
||||
assertThat(new TestSnapshotApplicationEvent(this, " ").matches(" "), is(true));
|
||||
@@ -181,5 +189,4 @@ public class SnapshotApplicationEventTest {
|
||||
super(source, regionPath, snapshotMetadata);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user