package dk.kb.yggdrasil.preservation;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.jwat.warc.WarcReader;
import org.jwat.warc.WarcReaderFactory;
import org.jwat.warc.WarcRecord;
import org.mockito.Mockito;
import dk.kb.yggdrasil.HttpCommunication;
import dk.kb.yggdrasil.bitmag.Bitrepository;
import dk.kb.yggdrasil.config.RequestHandlerContext;
import dk.kb.yggdrasil.config.YggdrasilConfig;
import dk.kb.yggdrasil.db.PreservationRequestState;
import dk.kb.yggdrasil.db.StateDatabase;
import dk.kb.yggdrasil.exceptions.ArgumentCheck;
import dk.kb.yggdrasil.json.preservation.PreservationRequest;
import dk.kb.yggdrasil.messaging.RemotePreservationStateUpdater;
import dk.kb.yggdrasil.testutils.MetadataContentUtils;
@RunWith(JUnit4.class)
public class PreservationPackerTest {
protected static final String NON_RANDOM_UUID = "random-uuid";
protected static final String NON_RANDOM_FILE_UUID = "random-file-uuid";
protected static final String DEFAULT_COLLECTION = "collection";
protected static final String WARC_FILE_ID = "warc-file.warc";
private static File generalConfigFile = new File("config/yggdrasil.yml");
protected static File testFileDir = new File("temporarydir");
protected static Bitrepository bitrepository;
protected static YggdrasilConfig config;
protected static StateDatabase stateDatabase;
protected static HttpCommunication httpCommunication;
protected static File metadataPayloadFile;
protected static File contentFilePayloadFile;
@BeforeClass
public static void beforeClass() throws Exception {
System.setProperty("dk.kb.yggdrasil.runningmode", "test");
config = new YggdrasilConfig(generalConfigFile);
FileUtils.deleteDirectory(config.getDatabaseDir());
bitrepository = Mockito.mock(Bitrepository.class);
stateDatabase = new StateDatabase(config.getDatabaseDir());
httpCommunication = new HttpCommunication(testFileDir);
metadataPayloadFile = new File(config.getTemporaryDir(), "metadataPayloadFile.txt");
if(!metadataPayloadFile.isFile()) {
FileOutputStream fos = new FileOutputStream(metadataPayloadFile);
fos.write(new String("This is the metadata payload file").getBytes());
fos.close();
}
Assert.assertTrue(metadataPayloadFile.isFile());
contentFilePayloadFile = new File(config.getTemporaryDir(), "contentFilePayloadFile.txt");
if(!contentFilePayloadFile.isFile()) {
FileOutputStream fos = new FileOutputStream(contentFilePayloadFile);
fos.write(new String("This is the contentFile payload file").getBytes());
fos.close();
}
Assert.assertTrue(metadataPayloadFile.isFile());
Assert.assertTrue(metadataPayloadFile.length() != contentFilePayloadFile.length());
}
@Test
public void writePreservationRecordWithoutFiles() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
Assert.assertNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
packer.writePreservationRecord(prs);
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_COMPLETE));
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_WAITING_FOR_MORE_DATA));
verifyNoMoreInteractions(updater);
Assert.assertNotNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
Assert.assertNull(prs.getUpdatePreservation());
}
@Test
public void writePreservationRecordWithoutFilesValidateWarcFile() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
packer.writePreservationRecord(prs);
// Verify WARC file
// Must only contain the warcinfo record.
File warcFile = new File(config.getTemporaryDir(), prs.getWarcId());
Assert.assertTrue(warcFile.isFile());
Map<String, WarcRecord> records = retrieveWarcRecords(warcFile);
Assert.assertNotNull(records);
Assert.assertEquals(records.size(), 1);
Assert.assertEquals(((WarcRecord) records.values().toArray()[0]).header.warcTypeStr, "warcinfo");
}
@Test
public void writePreservationRecordWithMetadataFile() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
prs.setMetadataPayload(metadataPayloadFile);
Assert.assertNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
packer.writePreservationRecord(prs);
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_COMPLETE));
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_WAITING_FOR_MORE_DATA));
verifyNoMoreInteractions(updater);
Assert.assertNotNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
Assert.assertNull(prs.getUpdatePreservation());
Assert.assertNotNull(prs.getOffset());
Assert.assertNull(prs.getFileOffset());
}
@Test
public void writePreservationRecordWithMetadataFileValidateWarcFile() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
prs.setMetadataPayload(metadataPayloadFile);
packer.writePreservationRecord(prs);
// Verify WARC file
// Should contain 2 warc-records.
// Including the packaged metadata in a warc-record with the UUID
File warcFile = new File(config.getTemporaryDir(), prs.getWarcId());
Assert.assertTrue(warcFile.isFile());
Map<String, WarcRecord> records = retrieveWarcRecords(warcFile);
Assert.assertEquals(records.size(), 2);
// look at packaged metadata
String metadataRecordUUID = "urn:uuid:" + prs.getUUID();
Assert.assertTrue(records.containsKey(metadataRecordUUID));
Assert.assertEquals(records.get(metadataRecordUUID).header.warcTypeStr, "metadata");
Assert.assertNull(records.get(metadataRecordUUID).header.warcRefersToStr);
Assert.assertEquals(records.get(metadataRecordUUID).header.contentLengthStr, "" + metadataPayloadFile.length());
}
@Test
public void writePreservationRecordWithResourceFile() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
prs.setContentPayload(contentFilePayloadFile);
Assert.assertNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
packer.writePreservationRecord(prs);
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_RESOURCES_PACKAGE_SUCCESS));
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_COMPLETE));
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_WAITING_FOR_MORE_DATA));
verifyNoMoreInteractions(updater);
Assert.assertNotNull(prs.getWarcId());
Assert.assertNotNull(prs.getFileWarcId());
Assert.assertEquals(prs.getWarcId(), prs.getFileWarcId());
Assert.assertNull(prs.getUpdatePreservation());
Assert.assertNull(prs.getOffset());
Assert.assertNotNull(prs.getFileOffset());
}
@Test
public void writePreservationRecordWithResourceFileValidateWarcFile() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
prs.setContentPayload(contentFilePayloadFile);
packer.writePreservationRecord(prs);
// Verify WARC file
// Should contain 2 warc-records.
// Including the packaged resource in a warc-record with the file_UUID
File warcFile = new File(config.getTemporaryDir(), prs.getWarcId());
Assert.assertTrue(warcFile.isFile());
Map<String, WarcRecord> records = retrieveWarcRecords(warcFile);
Assert.assertEquals(records.size(), 2);
// look at packaged resource
String fileRecordUUID = "urn:uuid:" + prs.getRequest().File_UUID;
Assert.assertTrue(records.containsKey(fileRecordUUID));
Assert.assertEquals(records.get(fileRecordUUID).header.warcTypeStr, "resource");
Assert.assertNull(records.get(fileRecordUUID).header.warcRefersToStr);
Assert.assertEquals(records.get(fileRecordUUID).header.contentLengthStr, "" + contentFilePayloadFile.length());
}
@Test
public void writePreservationRecordWithBothFile() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
prs.setContentPayload(metadataPayloadFile);
prs.setMetadataPayload(contentFilePayloadFile);
Assert.assertNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
packer.writePreservationRecord(prs);
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_RESOURCES_PACKAGE_SUCCESS));
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_COMPLETE));
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_WAITING_FOR_MORE_DATA));
verifyNoMoreInteractions(updater);
Assert.assertNotNull(prs.getWarcId());
Assert.assertNotNull(prs.getFileWarcId());
Assert.assertNotNull(prs.getOffset());
Assert.assertNotNull(prs.getFileOffset());
Assert.assertNull(prs.getUpdatePreservation());
}
@Test
public void writePreservationRecordWithBothFileValidateWarcFile() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
prs.setContentPayload(contentFilePayloadFile);
prs.setMetadataPayload(metadataPayloadFile);
packer.writePreservationRecord(prs);
// Verify WARC file
// Should contain 3 warc-records.
// Including the packaged metadata and packaged resource in a warc-records
File warcFile = new File(config.getTemporaryDir(), prs.getWarcId());
Assert.assertTrue(warcFile.isFile());
Map<String, WarcRecord> records = retrieveWarcRecords(warcFile);
Assert.assertEquals(records.size(), 3);
// look at packaged resource
String fileRecordUUID = "urn:uuid:" + prs.getRequest().File_UUID;
Assert.assertTrue(records.containsKey(fileRecordUUID));
Assert.assertEquals(records.get(fileRecordUUID).header.warcTypeStr, "resource");
Assert.assertNull(records.get(fileRecordUUID).header.warcRefersToStr);
Assert.assertEquals(records.get(fileRecordUUID).header.contentLengthStr, "" + contentFilePayloadFile.length());
// look at packaged metadata
String metadataRecordUUID = "urn:uuid:" + prs.getUUID();
Assert.assertTrue(records.containsKey(metadataRecordUUID));
Assert.assertEquals(records.get(metadataRecordUUID).header.warcTypeStr, "metadata");
Assert.assertEquals(records.get(metadataRecordUUID).header.warcRefersToStr, "<" + fileRecordUUID + ">");
Assert.assertEquals(records.get(metadataRecordUUID).header.contentLengthStr, "" + metadataPayloadFile.length());
}
@Test(expected = ArgumentCheck.class)
public void writeUpdateRecordFailure() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
Assert.assertNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
packer.writeUpdateRecord(prs);
}
@Test
public void writeUpdateRecordWithMetadataFile() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
request.warc_id = WARC_FILE_ID;
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
prs.setMetadataPayload(metadataPayloadFile);
Assert.assertNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
Assert.assertNull(prs.getUpdatePreservation());
packer.writeUpdateRecord(prs);
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_COMPLETE));
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_WAITING_FOR_MORE_DATA));
verifyNoMoreInteractions(updater);
Assert.assertNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
Assert.assertNotNull(prs.getUpdatePreservation());
Assert.assertNotNull(prs.getUpdatePreservation().date);
Assert.assertNotNull(prs.getUpdatePreservation().uuid);
Assert.assertNotNull(prs.getUpdatePreservation().warc_id);
Assert.assertNull(prs.getUpdatePreservation().file_uuid);
Assert.assertNull(prs.getUpdatePreservation().file_warc_id);
}
@Test
public void writeUpdateRecordWithMetadataFileValidateWarcFile() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
request.warc_id = WARC_FILE_ID;
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
prs.setMetadataPayload(metadataPayloadFile);
packer.writeUpdateRecord(prs);
// Verify WARC file
// Should contain 2 warc-records.
// Including the update record for the metadata
File warcFile = new File(config.getTemporaryDir(), prs.getUpdatePreservation().warc_id);
Assert.assertTrue(warcFile.isFile());
Map<String, WarcRecord> records = retrieveWarcRecords(warcFile);
Assert.assertEquals(records.size(), 2);
// look at packaged metadata
String metadataRecordUUID = "urn:uuid:" + prs.getUpdatePreservation().uuid;
Assert.assertTrue(records.containsKey(metadataRecordUUID));
Assert.assertEquals(records.get(metadataRecordUUID).header.warcTypeStr, "update");
Assert.assertNull(records.get(metadataRecordUUID).header.warcRefersToStr);
Assert.assertEquals(records.get(metadataRecordUUID).header.warcConcurrentToList.size(), 1);
Assert.assertEquals(records.get(metadataRecordUUID).header.warcConcurrentToList.get(0).warcConcurrentToStr, "<" + prs.getUUID() + ">");
Assert.assertEquals(records.get(metadataRecordUUID).header.contentLengthStr, "" + metadataPayloadFile.length());
}
@Test
public void writeUpdateRecordWithContentFile() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
request.warc_id = WARC_FILE_ID;
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
prs.setContentPayload(metadataPayloadFile);
Assert.assertNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
Assert.assertNull(prs.getUpdatePreservation());
packer.writeUpdateRecord(prs);
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_RESOURCES_PACKAGE_SUCCESS));
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_COMPLETE));
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_WAITING_FOR_MORE_DATA));
verifyNoMoreInteractions(updater);
Assert.assertNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
Assert.assertNotNull(prs.getUpdatePreservation());
Assert.assertNotNull(prs.getUpdatePreservation().date);
Assert.assertNull(prs.getUpdatePreservation().uuid);
Assert.assertNull(prs.getUpdatePreservation().warc_id);
Assert.assertNotNull(prs.getUpdatePreservation().file_uuid);
Assert.assertNotNull(prs.getUpdatePreservation().file_warc_id);
}
@Test
public void writeUpdateRecordWithContentFileValidateWarcFile() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
request.warc_id = WARC_FILE_ID;
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
prs.setContentPayload(contentFilePayloadFile);
packer.writeUpdateRecord(prs);
// Verify WARC file
// Should contain 2 warc-records.
// Including the update record for the resource
File warcFile = new File(config.getTemporaryDir(), prs.getUpdatePreservation().file_warc_id);
Assert.assertTrue(warcFile.isFile());
Map<String, WarcRecord> records = retrieveWarcRecords(warcFile);
Assert.assertEquals(records.size(), 2);
// look at packaged resource
String fileRecordUUID = "urn:uuid:" + prs.getUpdatePreservation().file_uuid;
Assert.assertTrue(records.containsKey(fileRecordUUID));
Assert.assertEquals(records.get(fileRecordUUID).header.warcTypeStr, "update");
Assert.assertNull(records.get(fileRecordUUID).header.warcRefersToStr);
Assert.assertEquals(records.get(fileRecordUUID).header.warcConcurrentToList.size(), 1);
Assert.assertEquals(records.get(fileRecordUUID).header.warcConcurrentToList.get(0).warcConcurrentToStr, "<" + prs.getRequest().File_UUID + ">");
Assert.assertEquals(records.get(fileRecordUUID).header.contentLengthStr, "" + contentFilePayloadFile.length());
}
@Test
public void writeUpdateRecordWithBothFiles() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
request.warc_id = WARC_FILE_ID;
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
prs.setContentPayload(contentFilePayloadFile);
prs.setMetadataPayload(metadataPayloadFile);
Assert.assertNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
Assert.assertNull(prs.getUpdatePreservation());
packer.writeUpdateRecord(prs);
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_RESOURCES_PACKAGE_SUCCESS));
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_COMPLETE));
verify(updater).sendPreservationResponse(any(PreservationRequestState.class), eq(PreservationState.PRESERVATION_PACKAGE_WAITING_FOR_MORE_DATA));
verifyNoMoreInteractions(updater);
Assert.assertNull(prs.getWarcId());
Assert.assertNull(prs.getFileWarcId());
Assert.assertNotNull(prs.getUpdatePreservation());
Assert.assertNotNull(prs.getUpdatePreservation().date);
Assert.assertNotNull(prs.getUpdatePreservation().uuid);
Assert.assertNotNull(prs.getUpdatePreservation().warc_id);
Assert.assertNotNull(prs.getUpdatePreservation().file_uuid);
Assert.assertNotNull(prs.getUpdatePreservation().file_warc_id);
}
@Test
public void writeUpdateRecordWithBothFilesValidateWarcFile() throws Exception {
RemotePreservationStateUpdater updater = Mockito.mock(RemotePreservationStateUpdater.class);
RequestHandlerContext context = new RequestHandlerContext(bitrepository, config, stateDatabase, updater, httpCommunication);
PreservationPacker packer = new PreservationPacker(context, "test-collection");
PreservationRequest request = makeRequest();
request.warc_id = WARC_FILE_ID;
PreservationRequestState prs = new PreservationRequestState(request, PreservationState.PRESERVATION_REQUEST_RECEIVED, request.UUID);
prs.setContentPayload(contentFilePayloadFile);
prs.setMetadataPayload(metadataPayloadFile);
packer.writeUpdateRecord(prs);
// Verify WARC file
// Should contain 3 warc-records.
// Including the update record for the resource
File warcFile = new File(config.getTemporaryDir(), prs.getUpdatePreservation().file_warc_id);
Assert.assertTrue(warcFile.isFile());
Map<String, WarcRecord> records = retrieveWarcRecords(warcFile);
Assert.assertEquals(records.size(), 3);
// look at packaged resource
String fileRecordUUID = "urn:uuid:" + prs.getUpdatePreservation().file_uuid;
Assert.assertTrue(records.containsKey(fileRecordUUID));
Assert.assertEquals(records.get(fileRecordUUID).header.warcTypeStr, "update");
Assert.assertNull(records.get(fileRecordUUID).header.warcRefersToStr);
Assert.assertEquals(records.get(fileRecordUUID).header.warcConcurrentToList.size(), 1);
Assert.assertEquals(records.get(fileRecordUUID).header.warcConcurrentToList.get(0).warcConcurrentToStr, "<" + prs.getRequest().File_UUID + ">");
Assert.assertEquals(records.get(fileRecordUUID).header.contentLengthStr, "" + contentFilePayloadFile.length());
// look at packaged metadata
String metadataRecordUUID = "urn:uuid:" + prs.getUpdatePreservation().uuid;
Assert.assertTrue(records.containsKey(metadataRecordUUID));
Assert.assertEquals(records.get(metadataRecordUUID).header.warcTypeStr, "update");
Assert.assertEquals(records.get(metadataRecordUUID).header.warcRefersToStr, "<" + fileRecordUUID + ">");
Assert.assertEquals(records.get(metadataRecordUUID).header.warcConcurrentToList.size(), 1);
Assert.assertEquals(records.get(metadataRecordUUID).header.warcConcurrentToList.get(0).warcConcurrentToStr, "<" + prs.getUUID() + ">");
Assert.assertEquals(records.get(metadataRecordUUID).header.contentLengthStr, "" + metadataPayloadFile.length());
}
public static PreservationRequest makeRequest() {
PreservationRequest request = new PreservationRequest();
request.Content_URI = null;
request.File_UUID = NON_RANDOM_FILE_UUID;
request.metadata = MetadataContentUtils.getExampleInstanceMetadata();
request.Model = "instance";
request.Preservation_profile = DEFAULT_COLLECTION;
request.UUID = NON_RANDOM_UUID;
request.Valhal_ID = "ID";
return request;
}
public static Map<String, WarcRecord> retrieveWarcRecords(File warcFile) {
Map<String, WarcRecord> res = new HashMap<String, WarcRecord>();
try {
WarcReader reader = WarcReaderFactory.getReader(new FileInputStream(warcFile));
WarcRecord record;
while ( (record = reader.getNextRecord()) != null ) {
res.put(record.header.warcRecordIdUri.toString(), record);
}
} catch (IOException e) {
Assert.fail(e.getMessage());
}
return res;
}
}