/**
* Copyright (c) Codice Foundation
* <p/>
* This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software Foundation, either version 3 of the
* License, or any later version.
* <p/>
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details. A copy of the GNU Lesser General Public License
* is distributed along with this program and can be found at
* <http://www.gnu.org/licenses/lgpl.html>.
*/
package ddf.catalog.plugin.groomer;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThan;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.Serializable;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map.Entry;
import org.joda.time.DateTime;
import org.junit.Test;
import ddf.catalog.data.AttributeDescriptor;
import ddf.catalog.data.AttributeImpl;
import ddf.catalog.data.Metacard;
import ddf.catalog.data.MetacardImpl;
import ddf.catalog.operation.CreateRequest;
import ddf.catalog.operation.CreateRequestImpl;
import ddf.catalog.operation.DeleteRequest;
import ddf.catalog.operation.DeleteRequestImpl;
import ddf.catalog.operation.UpdateRequest;
import ddf.catalog.operation.UpdateRequestImpl;
import ddf.catalog.plugin.PluginExecutionException;
import ddf.catalog.plugin.StopProcessingException;
import ddf.catalog.plugin.groomer.metacard.StandardMetacardGroomerPlugin;
/**
* Tests the class {@link StandardMetacardGroomerPlugin}
*
* @author Ashraf Barakat
* @author ddf.isgs@lmco.com
*
*/
public class TestMetacardGroomerPlugin {
public static final String DEFAULT_TITLE = "Flagstaff";
public static final String DEFAULT_VERSION = "mockVersion";
public static final String DEFAULT_TYPE = "simple";
public static final String DEFAULT_LOCATION = "POINT (1 0)";
public static final String DEFAULT_SOURCE_ID = "ddf";
private static final String SAMPLE_ID = "12345678900987654321abcdeffedcba";
private static final String DEFAULT_METADATA = "<sample>sample</sample>";
@Test
public void testCreateWithNullRequest()
throws PluginExecutionException, StopProcessingException {
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
CreateRequest returnedRequest = plugin.process((CreateRequest) null);
assertThat(returnedRequest, nullValue());
}
@Test
public void testCreateWithNullRecords()
throws PluginExecutionException, StopProcessingException {
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
CreateRequest request = mock(CreateRequest.class);
when(request.getMetacards()).thenReturn(null);
CreateRequest returnedRequest = plugin.process(request);
assertThat(returnedRequest, not(nullValue()));
assertThat(returnedRequest.getMetacards(), nullValue());
}
@Test
public void testCreateWithNoRecords() throws PluginExecutionException, StopProcessingException {
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
CreateRequest request = mock(CreateRequest.class);
when(request.getMetacards()).thenReturn(new ArrayList<Metacard>());
CreateRequest returnedRequest = plugin.process(request);
assertThat(returnedRequest, not(nullValue()));
assertThat(returnedRequest.getMetacards(), not(nullValue()));
assertThat(returnedRequest.getMetacards().size(), is(0));
}
@Test
public void testCreateStandard() throws PluginExecutionException, StopProcessingException {
Metacard inputMetacard = getStandardMetacard();
Metacard outputMetacard = processCreate(inputMetacard);
assertNotNull(outputMetacard.getId());
assertEquals(DEFAULT_TITLE, outputMetacard.getTitle());
assertEquals(DEFAULT_LOCATION, outputMetacard.getLocation());
assertEquals(DEFAULT_TYPE, outputMetacard.getContentTypeName());
assertEquals(DEFAULT_VERSION, outputMetacard.getContentTypeVersion());
assertThat(outputMetacard.getMetadata(), is(DEFAULT_METADATA));
assertThat(outputMetacard.getCreatedDate().getTime(),
is(greaterThan(inputMetacard.getCreatedDate().getTime())));
assertThat(outputMetacard.getModifiedDate().getTime(),
is(greaterThan(inputMetacard.getModifiedDate().getTime())));
assertEquals(inputMetacard.getEffectiveDate(), outputMetacard.getEffectiveDate());
assertEquals(inputMetacard.getExpirationDate(), outputMetacard.getExpirationDate());
assertTrue(Arrays.equals(inputMetacard.getThumbnail(), outputMetacard.getThumbnail()));
assertEquals(inputMetacard.getLocation(), outputMetacard.getLocation());
}
@Test
public void testCreateNoDates() throws PluginExecutionException, StopProcessingException {
Date snapshotOfNow = new Date();
Metacard inputMetacard = getStandardMetacard();
inputMetacard.setAttribute(new AttributeImpl(Metacard.CREATED, null));
inputMetacard.setAttribute(new AttributeImpl(Metacard.MODIFIED, null));
inputMetacard.setAttribute(new AttributeImpl(Metacard.EXPIRATION, null));
inputMetacard.setAttribute(new AttributeImpl(Metacard.EFFECTIVE, null));
Metacard outputMetacard = processCreate(inputMetacard);
assertNotNull(outputMetacard.getId());
assertEquals(DEFAULT_TITLE, outputMetacard.getTitle());
assertEquals(DEFAULT_LOCATION, outputMetacard.getLocation());
assertEquals(DEFAULT_TYPE, outputMetacard.getContentTypeName());
assertEquals(DEFAULT_VERSION, outputMetacard.getContentTypeVersion());
assertThat(outputMetacard.getMetadata(), is(DEFAULT_METADATA));
// CREATED
assertThat(inputMetacard.getCreatedDate(), is(nullValue()));
assertThat(outputMetacard.getCreatedDate().getTime(),
is(greaterThanOrEqualTo(snapshotOfNow.getTime())));
// MODIFIED
assertThat(inputMetacard.getModifiedDate(), is(nullValue()));
assertThat(outputMetacard.getModifiedDate().getTime(),
is(greaterThanOrEqualTo(snapshotOfNow.getTime())));
// EFFECTIVE
assertEquals(inputMetacard.getEffectiveDate(), outputMetacard.getEffectiveDate());
// EXPIRATION
assertEquals(inputMetacard.getExpirationDate(), outputMetacard.getExpirationDate());
assertTrue(Arrays.equals(inputMetacard.getThumbnail(), outputMetacard.getThumbnail()));
assertEquals(inputMetacard.getLocation(), outputMetacard.getLocation());
}
@Test
public void testCreateNoTitleEmptyString()
throws PluginExecutionException, StopProcessingException, ParseException {
Metacard inputMetacard = getStandardMetacard();
inputMetacard.setAttribute(new AttributeImpl(Metacard.TITLE, ""));
Metacard outputMetacard = processCreate(inputMetacard);
assertNotNull(outputMetacard.getId());
assertThat(outputMetacard.getTitle(), is(""));
assertEquals(DEFAULT_LOCATION, outputMetacard.getLocation());
assertEquals(DEFAULT_TYPE, outputMetacard.getContentTypeName());
assertEquals(DEFAULT_VERSION, outputMetacard.getContentTypeVersion());
assertThat(outputMetacard.getMetadata(), is(DEFAULT_METADATA));
assertThat(outputMetacard.getCreatedDate().getTime(),
is(greaterThan(inputMetacard.getCreatedDate().getTime())));
assertThat(outputMetacard.getModifiedDate().getTime(),
is(greaterThan(inputMetacard.getModifiedDate().getTime())));
assertEquals(inputMetacard.getEffectiveDate(), outputMetacard.getEffectiveDate());
assertEquals(inputMetacard.getExpirationDate(), outputMetacard.getExpirationDate());
assertTrue(Arrays.equals(inputMetacard.getThumbnail(), outputMetacard.getThumbnail()));
assertEquals(inputMetacard.getLocation(), outputMetacard.getLocation());
}
@Test
public void testCreateNoTitleNull()
throws PluginExecutionException, StopProcessingException, ParseException {
Metacard inputMetacard = getStandardMetacard();
inputMetacard.setAttribute(new AttributeImpl(Metacard.TITLE, null));
Metacard outputMetacard = processCreate(inputMetacard);
assertNotNull(outputMetacard.getId());
assertThat(outputMetacard.getTitle(), is(nullValue()));
assertEquals(DEFAULT_LOCATION, outputMetacard.getLocation());
assertEquals(DEFAULT_TYPE, outputMetacard.getContentTypeName());
assertEquals(DEFAULT_VERSION, outputMetacard.getContentTypeVersion());
assertThat(outputMetacard.getMetadata(), is(DEFAULT_METADATA));
assertThat(outputMetacard.getCreatedDate().getTime(),
is(greaterThan(inputMetacard.getCreatedDate().getTime())));
assertThat(outputMetacard.getModifiedDate().getTime(),
is(greaterThan(inputMetacard.getModifiedDate().getTime())));
assertEquals(inputMetacard.getEffectiveDate(), outputMetacard.getEffectiveDate());
assertEquals(inputMetacard.getExpirationDate(), outputMetacard.getExpirationDate());
assertTrue(Arrays.equals(inputMetacard.getThumbnail(), outputMetacard.getThumbnail()));
assertEquals(inputMetacard.getLocation(), outputMetacard.getLocation());
}
@Test
public void testCreateNoContentTypeNull()
throws PluginExecutionException, StopProcessingException, ParseException {
Metacard inputMetacard = getStandardMetacard();
inputMetacard.setAttribute(new AttributeImpl(Metacard.CONTENT_TYPE, null));
inputMetacard.setAttribute(new AttributeImpl(Metacard.CONTENT_TYPE_VERSION, null));
Metacard outputMetacard = processCreate(inputMetacard);
assertNotNull(outputMetacard.getId());
assertEquals(DEFAULT_TITLE, outputMetacard.getTitle());
assertEquals(DEFAULT_LOCATION, outputMetacard.getLocation());
assertThat(outputMetacard.getContentTypeName(), is(nullValue()));
assertThat(outputMetacard.getContentTypeVersion(), is(nullValue()));
assertThat(outputMetacard.getMetadata(), is(DEFAULT_METADATA));
assertThat(outputMetacard.getCreatedDate().getTime(),
is(greaterThan(inputMetacard.getCreatedDate().getTime())));
assertThat(outputMetacard.getModifiedDate().getTime(),
is(greaterThan(inputMetacard.getModifiedDate().getTime())));
assertEquals(inputMetacard.getEffectiveDate(), outputMetacard.getEffectiveDate());
assertEquals(inputMetacard.getExpirationDate(), outputMetacard.getExpirationDate());
assertTrue(Arrays.equals(inputMetacard.getThumbnail(), outputMetacard.getThumbnail()));
assertEquals(inputMetacard.getLocation(), outputMetacard.getLocation());
}
@Test
public void testDelete()
throws PluginExecutionException, StopProcessingException, ParseException {
DeleteRequest inputRequest = new DeleteRequestImpl(SAMPLE_ID);
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
DeleteRequest returnedRequest = plugin.process(inputRequest);
assertNotNull(returnedRequest);
assertThat(returnedRequest, equalTo(inputRequest));
}
@Test
public void testUpdateStandard() throws PluginExecutionException, StopProcessingException {
Metacard inputMetacard = getStandardMetacard();
inputMetacard.setAttribute(new AttributeImpl(Metacard.ID, SAMPLE_ID));
Metacard outputMetacard = processUpdate(inputMetacard);
assertThat(inputMetacard.getId(), is(outputMetacard.getId()));
assertEquals(DEFAULT_TITLE, outputMetacard.getTitle());
assertEquals(DEFAULT_LOCATION, outputMetacard.getLocation());
assertEquals(DEFAULT_TYPE, outputMetacard.getContentTypeName());
assertEquals(DEFAULT_VERSION, outputMetacard.getContentTypeVersion());
assertThat(outputMetacard.getMetadata(), is(DEFAULT_METADATA));
assertThat(outputMetacard.getCreatedDate().getTime(),
is(inputMetacard.getCreatedDate().getTime()));
assertThat(outputMetacard.getModifiedDate().getTime(),
is(greaterThan(inputMetacard.getModifiedDate().getTime())));
assertEquals(inputMetacard.getEffectiveDate(), outputMetacard.getEffectiveDate());
assertEquals(inputMetacard.getExpirationDate(), outputMetacard.getExpirationDate());
assertTrue(Arrays.equals(inputMetacard.getThumbnail(), outputMetacard.getThumbnail()));
assertEquals(inputMetacard.getLocation(), outputMetacard.getLocation());
}
@Test
public void testUpdateNoId() throws PluginExecutionException, StopProcessingException {
Metacard inputMetacard = getStandardMetacard();
Metacard outputMetacard = processUpdate(inputMetacard);
assertThat(inputMetacard.getId(), is(nullValue()));
assertThat(outputMetacard.getId(), is(SAMPLE_ID));
assertEquals(DEFAULT_TITLE, outputMetacard.getTitle());
assertEquals(DEFAULT_LOCATION, outputMetacard.getLocation());
assertEquals(DEFAULT_TYPE, outputMetacard.getContentTypeName());
assertEquals(DEFAULT_VERSION, outputMetacard.getContentTypeVersion());
assertThat(outputMetacard.getMetadata(), is(DEFAULT_METADATA));
assertThat(outputMetacard.getCreatedDate().getTime(),
is(inputMetacard.getCreatedDate().getTime()));
assertThat(outputMetacard.getModifiedDate().getTime(),
is(greaterThan(inputMetacard.getModifiedDate().getTime())));
assertEquals(inputMetacard.getEffectiveDate(), outputMetacard.getEffectiveDate());
assertEquals(inputMetacard.getExpirationDate(), outputMetacard.getExpirationDate());
assertTrue(Arrays.equals(inputMetacard.getThumbnail(), outputMetacard.getThumbnail()));
assertEquals(inputMetacard.getLocation(), outputMetacard.getLocation());
}
@Test
public void testUpdateByAlternativeIdentifier()
throws PluginExecutionException, StopProcessingException, URISyntaxException {
Metacard inputMetacard = getStandardMetacard();
URI[] uris = new URI[1];
uris[0] = new URI(SAMPLE_ID);
UpdateRequestImpl inputRequest = new UpdateRequestImpl(uris,
Arrays.asList(copy(inputMetacard)));
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
UpdateRequest returnedRequest = plugin.process(inputRequest);
assertNotNull(returnedRequest);
assertThat(returnedRequest.getUpdates().size(), is(1));
Metacard outputMetacard = returnedRequest.getUpdates().get(0).getValue();
assertThat(inputMetacard.getId(), is(outputMetacard.getId()));
assertEquals(DEFAULT_TITLE, outputMetacard.getTitle());
assertEquals(DEFAULT_LOCATION, outputMetacard.getLocation());
assertEquals(DEFAULT_TYPE, outputMetacard.getContentTypeName());
assertEquals(DEFAULT_VERSION, outputMetacard.getContentTypeVersion());
assertThat(outputMetacard.getMetadata(), is(DEFAULT_METADATA));
assertThat(outputMetacard.getCreatedDate().getTime(),
is(inputMetacard.getCreatedDate().getTime()));
assertThat(outputMetacard.getModifiedDate().getTime(),
is(greaterThan(inputMetacard.getModifiedDate().getTime())));
assertEquals(inputMetacard.getEffectiveDate(), outputMetacard.getEffectiveDate());
assertEquals(inputMetacard.getExpirationDate(), outputMetacard.getExpirationDate());
assertTrue(Arrays.equals(inputMetacard.getThumbnail(), outputMetacard.getThumbnail()));
assertEquals(inputMetacard.getLocation(), outputMetacard.getLocation());
}
@Test
public void testUpdateEmptyFields()
throws PluginExecutionException, StopProcessingException, ParseException {
Date snapshotOfNow = new Date();
Metacard inputMetacard = getStandardMetacard();
inputMetacard.setAttribute(new AttributeImpl(Metacard.TITLE, null));
inputMetacard.setAttribute(new AttributeImpl(Metacard.GEOGRAPHY, null));
inputMetacard.setAttribute(new AttributeImpl(Metacard.CREATED, null));
inputMetacard.setAttribute(new AttributeImpl(Metacard.MODIFIED, null));
inputMetacard.setAttribute(new AttributeImpl(Metacard.EFFECTIVE, null));
inputMetacard.setAttribute(new AttributeImpl(Metacard.THUMBNAIL, null));
inputMetacard.setAttribute(new AttributeImpl(Metacard.CONTENT_TYPE, null));
inputMetacard.setAttribute(new AttributeImpl(Metacard.CONTENT_TYPE_VERSION, null));
Metacard outputMetacard = processUpdate(inputMetacard);
assertThat(outputMetacard.getId(), is(SAMPLE_ID));
assertThat(outputMetacard.getTitle(), is(nullValue()));
assertThat(outputMetacard.getLocation(), is(nullValue()));
assertThat(outputMetacard.getMetadata(), is(DEFAULT_METADATA));
assertThat(outputMetacard.getCreatedDate(), is(notNullValue()));
assertThat(outputMetacard.getCreatedDate().getTime(),
is(greaterThanOrEqualTo(snapshotOfNow.getTime())));
assertThat(outputMetacard.getModifiedDate(), is(notNullValue()));
assertThat(outputMetacard.getModifiedDate().getTime(),
is(greaterThanOrEqualTo(snapshotOfNow.getTime())));
assertEquals(inputMetacard.getEffectiveDate(), outputMetacard.getEffectiveDate());
assertThat(outputMetacard.getEffectiveDate(), is(nullValue()));
assertEquals(inputMetacard.getExpirationDate(), outputMetacard.getExpirationDate());
assertThat(outputMetacard.getThumbnail(), is(nullValue()));
assertThat(outputMetacard.getContentTypeName(), is(nullValue()));
assertThat(outputMetacard.getContentTypeVersion(), is(nullValue()));
}
@Test
public void testUpdateWithNullRequest()
throws PluginExecutionException, StopProcessingException {
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
UpdateRequest returnedRequest = plugin.process((UpdateRequest) null);
assertThat(returnedRequest, nullValue());
}
@Test
public void testUpdateWithNullRecords()
throws PluginExecutionException, StopProcessingException {
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
UpdateRequest request = mock(UpdateRequest.class);
when(request.getUpdates()).thenReturn(null);
UpdateRequest returnedRequest = plugin.process(request);
assertThat(returnedRequest, not(nullValue()));
assertThat(returnedRequest.getUpdates(), nullValue());
}
@Test
public void testUpdateWithNoRecords() throws PluginExecutionException, StopProcessingException {
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
UpdateRequest request = mock(UpdateRequest.class);
when(request.getUpdates()).thenReturn(new ArrayList<Entry<Serializable, Metacard>>());
UpdateRequest returnedRequest = plugin.process(request);
assertThat(returnedRequest, not(nullValue()));
assertThat(returnedRequest.getUpdates(), not(nullValue()));
assertThat(returnedRequest.getUpdates().size(), is(0));
}
@Test
public void testUpdateSingleUpdateNull()
throws PluginExecutionException, StopProcessingException {
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
UpdateRequest request = mock(UpdateRequest.class);
List<Entry<Serializable, Metacard>> updates = new ArrayList<Entry<Serializable, Metacard>>();
updates.add((Entry<Serializable, Metacard>) null);
when(request.getUpdates()).thenReturn(updates);
UpdateRequest returnedRequest = plugin.process(request);
assertThat(returnedRequest, is(request));
}
@Test
public void testUpdateSingleUpdateKeyNull()
throws PluginExecutionException, StopProcessingException {
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
UpdateRequest request = mock(UpdateRequest.class);
List<Entry<Serializable, Metacard>> updates = new ArrayList<Entry<Serializable, Metacard>>();
updates.add(new Entry<Serializable, Metacard>() {
@Override
public Metacard setValue(Metacard value) {
return null;
}
@Override
public Metacard getValue() {
return null;
}
@Override
public Serializable getKey() {
return null;
}
});
when(request.getUpdates()).thenReturn(updates);
UpdateRequest returnedRequest = plugin.process(request);
assertThat(returnedRequest, is(request));
}
@Test
public void testUpdateSingleUpdateValueNull()
throws PluginExecutionException, StopProcessingException {
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
UpdateRequest request = mock(UpdateRequest.class);
List<Entry<Serializable, Metacard>> updates = new ArrayList<Entry<Serializable, Metacard>>();
updates.add(new Entry<Serializable, Metacard>() {
@Override
public Metacard setValue(Metacard value) {
return null;
}
@Override
public Metacard getValue() {
return null;
}
@Override
public Serializable getKey() {
return SAMPLE_ID;
}
});
when(request.getUpdates()).thenReturn(updates);
UpdateRequest returnedRequest = plugin.process(request);
assertThat(returnedRequest, is(request));
}
protected Metacard processCreate(Metacard inputMetacard)
throws PluginExecutionException, StopProcessingException {
CreateRequestImpl inputRequest = new CreateRequestImpl(copy(inputMetacard));
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
CreateRequest returnedRequest = plugin.process(inputRequest);
assertNotNull(returnedRequest);
assertThat(returnedRequest.getMetacards().size(), is(1));
return returnedRequest.getMetacards().get(0);
}
protected Metacard processUpdate(Metacard inputMetacard)
throws PluginExecutionException, StopProcessingException {
UpdateRequestImpl inputRequest = new UpdateRequestImpl(SAMPLE_ID, copy(inputMetacard));
StandardMetacardGroomerPlugin plugin = new StandardMetacardGroomerPlugin();
UpdateRequest returnedRequest = plugin.process(inputRequest);
assertNotNull(returnedRequest);
assertThat(returnedRequest.getUpdates().size(), is(1));
return returnedRequest.getUpdates().get(0).getValue();
}
private Metacard copy(Metacard inputMetacard) {
MetacardImpl newMetacard = new MetacardImpl();
newMetacard.setSourceId(inputMetacard.getSourceId());
newMetacard.setType(inputMetacard.getMetacardType());
for (AttributeDescriptor ad : inputMetacard.getMetacardType().getAttributeDescriptors()) {
newMetacard.setAttribute(inputMetacard.getAttribute(ad.getName()));
}
return newMetacard;
}
protected Metacard getStandardMetacard() {
DateTime currentDate = new DateTime();
Date defaultDate = currentDate.minusMinutes(1).toDate();
MetacardImpl metacard = new MetacardImpl();
metacard.setTitle(DEFAULT_TITLE);
metacard.setCreatedDate(defaultDate);
metacard.setEffectiveDate(defaultDate);
metacard.setExpirationDate(defaultDate);
metacard.setModifiedDate(defaultDate);
metacard.setMetadata(DEFAULT_METADATA);
metacard.setContentTypeName(DEFAULT_TYPE);
metacard.setContentTypeVersion(DEFAULT_VERSION);
metacard.setLocation(DEFAULT_LOCATION);
byte[] defaultBytes = {-86};
metacard.setThumbnail(defaultBytes);
return metacard;
}
}