/**
* 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.camel.component.catalog.content;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.camel.component.file.GenericFile;
import org.apache.camel.component.file.GenericFileMessage;
import org.apache.commons.collections.map.HashedMap;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import ddf.catalog.CatalogFramework;
import ddf.catalog.Constants;
import ddf.catalog.content.operation.CreateStorageRequest;
import ddf.catalog.content.operation.StorageRequest;
import ddf.catalog.data.impl.MetacardImpl;
import ddf.catalog.operation.CreateResponse;
import ddf.catalog.operation.DeleteRequest;
import ddf.catalog.operation.DeleteResponse;
import ddf.catalog.operation.UpdateResponse;
import ddf.mime.MimeTypeMapper;
public class ContentProducerDataAccessObjectTest {
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
ContentProducerDataAccessObject contentProducerDataAccessObject =
new ContentProducerDataAccessObject();
@Test
public void testGetFileUsingRefKey() throws Exception {
File testFile = temporaryFolder.newFile("testRefKey");
GenericFileMessage<File> mockMessage = getMockMessage(testFile);
//test with storeRefKey == false
assertThat(contentProducerDataAccessObject.getFileUsingRefKey(false, mockMessage)
.equals(testFile), is(true));
//test with storeRefKey == true
assertThat(contentProducerDataAccessObject.getFileUsingRefKey(true, mockMessage)
.equals(testFile), is(true));
}
@Test
public void testGetEventType() throws Exception {
File testFile = temporaryFolder.newFile("testEventType");
GenericFileMessage<File> mockMessage = getMockMessage(testFile);
//test that a new standard kind is created if storeRefKey == false
assertThat(contentProducerDataAccessObject.getEventType(false, mockMessage)
.equals(StandardWatchEventKinds.ENTRY_CREATE), is(true));
//test that the sample kind is returned when storeRefKey == true
assertThat(contentProducerDataAccessObject.getEventType(true, mockMessage)
.name()
.equals("example"), is(true));
}
private GenericFileMessage<File> getMockMessage(File testFile) {
//set the mockGenericFile to return the test file when requested
GenericFile<File> mockGenericFileFromBody = mock(GenericFile.class);
doReturn(testFile).when(mockGenericFileFromBody)
.getFile();
WatchEvent<Path> mockWatchEvent = mock(WatchEvent.class);
//mock out the context that links to the file
Path mockContext = mock(Path.class);
doReturn(testFile).when(mockContext)
.toFile();
//mock out with a sample kind
WatchEvent.Kind mockKind = mock(WatchEvent.Kind.class);
doReturn("example").when(mockKind)
.name();
//return the kind or context for the mockWatchEvent
doReturn(mockKind).when(mockWatchEvent)
.kind();
doReturn(mockContext).when(mockWatchEvent)
.context();
//return the mockWatchEvent when the file is called for
GenericFile<File> mockGenericFile = mock(GenericFile.class);
doReturn(mockWatchEvent).when(mockGenericFile)
.getFile();
GenericFileMessage mockMessage = mock(GenericFileMessage.class);
doReturn(mockGenericFileFromBody).when(mockMessage)
.getBody();
doReturn(mockGenericFile).when(mockMessage)
.getGenericFile();
return mockMessage;
}
@Test
public void testGetMimeType() throws Exception {
File testFile1 = temporaryFolder.newFile("testGetMimeType1.xml");
File testFile2 = temporaryFolder.newFile("testGetMimeType2.txt");
//mock out two different ways for getting mimeType
MimeTypeMapper mockMimeTypeMapper = mock(MimeTypeMapper.class);
doReturn("guess").when(mockMimeTypeMapper)
.guessMimeType(any(), any());
doReturn("extension").when(mockMimeTypeMapper)
.getMimeTypeForFileExtension(any());
//mock out Component that returns mockMimeTypeMapper when the mimeTypeMapper is requested
ContentComponent mockComponent = mock(ContentComponent.class);
doReturn(mockMimeTypeMapper).when(mockComponent)
.getMimeTypeMapper();
//mock out ContentEndpoint that returns the mockComponent
ContentEndpoint mockEndpoint = mock(ContentEndpoint.class);
doReturn(mockComponent).when(mockEndpoint)
.getComponent();
//assert the mock mimeTypeMappers are reached if/not xml
assertThat(contentProducerDataAccessObject.getMimeType(mockEndpoint, testFile1)
.equals("guess"), is(true));
assertThat(contentProducerDataAccessObject.getMimeType(mockEndpoint, testFile2)
.equals("extension"), is(true));
}
@Test
public void testCreateContentItem() throws Exception {
File testFile = temporaryFolder.newFile("testCreateContentItem.txt");
//make sample list of metacard and set of keys
List<MetacardImpl> metacardList = ImmutableList.of(new MetacardImpl());
Set<String> keys = ImmutableSet.of(String.valueOf(testFile.getAbsolutePath()
.hashCode()));
//mock out responses for create, delete, update
CreateResponse mockCreateResponse = mock(CreateResponse.class);
doReturn(metacardList).when(mockCreateResponse)
.getCreatedMetacards();
DeleteResponse mockDeleteResponse = mock(DeleteResponse.class);
doReturn(metacardList).when(mockDeleteResponse)
.getDeletedMetacards();
UpdateResponse mockUpdateResponse = mock(UpdateResponse.class);
doReturn(metacardList).when(mockUpdateResponse)
.getUpdatedMetacards();
//setup mockFileSystemPersistenceProvider
FileSystemPersistenceProvider mockFileSystemPersistenceProvider = mock(
FileSystemPersistenceProvider.class);
doReturn(keys).when(mockFileSystemPersistenceProvider)
.loadAllKeys();
doReturn("sample").when(mockFileSystemPersistenceProvider)
.loadFromPersistence(any(String.class));
//setup mockCatalogFramework
CatalogFramework mockCatalogFramework = mock(CatalogFramework.class);
doReturn(mockCreateResponse).when(mockCatalogFramework)
.create(any(CreateStorageRequest.class));
doReturn(mockDeleteResponse).when(mockCatalogFramework)
.delete(any(DeleteRequest.class));
//setup mockComponent
ContentComponent mockComponent = mock(ContentComponent.class);
doReturn(mockCatalogFramework).when(mockComponent)
.getCatalogFramework();
//setup mockEndpoint
ContentEndpoint mockEndpoint = mock(ContentEndpoint.class);
doReturn(mockComponent).when(mockEndpoint)
.getComponent();
WatchEvent.Kind<Path> kind;
String mimeType = "txt";
Map<String, Object> headers = new HashedMap();
Map<String, Serializable> attributeOverrides = new HashMap<>();
attributeOverrides.put("example", ImmutableList.of("something", "something1"));
attributeOverrides.put("example2", ImmutableList.of("something2"));
headers.put(Constants.ATTRIBUTE_OVERRIDES_KEY, attributeOverrides);
kind = StandardWatchEventKinds.ENTRY_CREATE;
contentProducerDataAccessObject.createContentItem(mockFileSystemPersistenceProvider,
mockEndpoint,
testFile,
kind,
mimeType,
headers);
kind = StandardWatchEventKinds.ENTRY_DELETE;
contentProducerDataAccessObject.createContentItem(mockFileSystemPersistenceProvider,
mockEndpoint,
testFile,
kind,
mimeType,
headers);
kind = StandardWatchEventKinds.ENTRY_MODIFY;
contentProducerDataAccessObject.createContentItem(mockFileSystemPersistenceProvider,
mockEndpoint,
testFile,
kind,
mimeType,
headers);
}
@Test
public void testProcessHeaders() throws IOException {
Map<String, Serializable> requestProperties = new HashMap<>();
StorageRequest storageRequest = mock(StorageRequest.class);
doReturn(requestProperties).when(storageRequest)
.getProperties();
Map<String, Object> camelHeaders = new HashMap<>();
Map<String, Serializable> attributeOverrides = new HashMap<>();
attributeOverrides.put("example", ImmutableList.of("something", "something1"));
attributeOverrides.put("example2", ImmutableList.of("something2"));
camelHeaders.put(Constants.ATTRIBUTE_OVERRIDES_KEY, attributeOverrides);
contentProducerDataAccessObject.processHeaders(camelHeaders,
storageRequest,
Files.createTempFile("foobar", "txt")
.toFile());
assertThat(requestProperties.containsKey(Constants.STORE_REFERENCE_KEY), is(false));
assertThat(((Map<String, List<String>>) requestProperties.get(Constants.ATTRIBUTE_OVERRIDES_KEY)).get(
"example"), is(Arrays.asList("something", "something1")));
requestProperties.clear();
camelHeaders.put(Constants.ATTRIBUTE_OVERRIDES_KEY, ImmutableMap.of());
camelHeaders.put(Constants.STORE_REFERENCE_KEY, "true");
contentProducerDataAccessObject.processHeaders(camelHeaders,
storageRequest,
Files.createTempFile("foobar", "txt")
.toFile());
assertThat(requestProperties.containsKey(Constants.STORE_REFERENCE_KEY), is(true));
assertThat(requestProperties.containsKey(Constants.ATTRIBUTE_OVERRIDES_KEY), is(false));
}
}