/*
* Copyright 2015 herd contributors
*
* Licensed 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.finra.herd.rest;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.finra.herd.dao.impl.MockStsOperationsImpl;
import org.finra.herd.model.api.xml.Attribute;
import org.finra.herd.model.api.xml.BusinessObjectData;
import org.finra.herd.model.api.xml.BusinessObjectDefinitionKey;
import org.finra.herd.model.api.xml.BusinessObjectDefinitionSampleDataFileKey;
import org.finra.herd.model.api.xml.DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest;
import org.finra.herd.model.api.xml.DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationResponse;
import org.finra.herd.model.api.xml.DownloadSingleInitiationResponse;
import org.finra.herd.model.api.xml.SampleDataFile;
import org.finra.herd.model.api.xml.UploadBusinessObjectDefinitionSampleDataFileInitiationRequest;
import org.finra.herd.model.api.xml.UploadBusinessObjectDefinitionSampleDataFileInitiationResponse;
import org.finra.herd.model.api.xml.UploadSingleCredentialExtensionResponse;
import org.finra.herd.model.api.xml.UploadSingleInitiationResponse;
import org.finra.herd.model.dto.ConfigurationValue;
import org.finra.herd.model.jpa.BusinessObjectDataStatusEntity;
import org.finra.herd.model.jpa.BusinessObjectDefinitionEntity;
import org.finra.herd.model.jpa.StorageEntity;
/**
* This class tests various functionality within the custom DDL REST controller.
*/
public class UploadDownloadRestControllerTest extends AbstractRestTest
{
@Test
public void testInitiateUploadSingle()
{
// Create database entities required for testing.
uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting();
// Initiate a file upload.
UploadSingleInitiationResponse resultUploadSingleInitiationResponse =
uploadDownloadRestController.initiateUploadSingle(uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest());
// Validate the returned object.
uploadDownloadServiceTestHelper
.validateUploadSingleInitiationResponse(NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, NAMESPACE, BDEF_NAME_2,
FORMAT_USAGE_CODE_2, FORMAT_FILE_TYPE_CODE_2, FORMAT_VERSION_2, businessObjectDefinitionServiceTestHelper.getNewAttributes(), FILE_NAME,
FILE_SIZE_1_KB, null, resultUploadSingleInitiationResponse);
}
@Test
public void testInitiateDownloadSingle()
{
// Create the upload data.
UploadSingleInitiationResponse uploadSingleInitiationResponse =
uploadDownloadServiceTestHelper.createUploadedFileData(BusinessObjectDataStatusEntity.VALID);
// Initiate the download against the uploaded data (i.e. the target business object data).
DownloadSingleInitiationResponse downloadSingleInitiationResponse = initiateDownload(uploadSingleInitiationResponse.getTargetBusinessObjectData());
// Validate the download initiation response.
uploadDownloadServiceTestHelper.validateDownloadSingleInitiationResponse(uploadSingleInitiationResponse, downloadSingleInitiationResponse);
}
@Test
public void testExtendUploadSingleCredentials() throws InterruptedException
{
// Create source and target business object formats database entities which are required to initiate an upload.
uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting();
// Initiate a file upload.
UploadSingleInitiationResponse uploadSingleInitiationResponse =
uploadDownloadRestController.initiateUploadSingle(uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest());
// Sleep a short amount of time to ensure the extended credentials don't return the same expiration as the initial credentials.
Thread.sleep(10);
// Initiate the download against the uploaded data (i.e. the target business object data).
UploadSingleCredentialExtensionResponse uploadSingleCredentialExtensionResponse =
extendUploadSingleCredentials(uploadSingleInitiationResponse.getSourceBusinessObjectData());
// Validate the returned object.
assertNotNull(uploadSingleCredentialExtensionResponse.getAwsAccessKey());
assertNotNull(uploadSingleCredentialExtensionResponse.getAwsSecretKey());
assertNotNull(uploadSingleCredentialExtensionResponse.getAwsSessionToken());
assertNotNull(uploadSingleCredentialExtensionResponse.getAwsSessionExpirationTime());
assertNotNull(uploadSingleInitiationResponse.getAwsSessionExpirationTime());
// Ensure the extended credentials are greater than the original set of credentials.
// We are displaying the values in case there is a problem because this test was acting flaky.
if (uploadSingleCredentialExtensionResponse.getAwsSessionExpirationTime().toGregorianCalendar().getTimeInMillis() <=
uploadSingleInitiationResponse.getAwsSessionExpirationTime().toGregorianCalendar().getTimeInMillis())
{
fail("Initial expiration time \"" + uploadSingleInitiationResponse.getAwsSessionExpirationTime().toGregorianCalendar().getTimeInMillis() +
"\" is not > extended expiration time \"" +
uploadSingleCredentialExtensionResponse.getAwsSessionExpirationTime().toGregorianCalendar().getTimeInMillis() + "\".");
}
}
/**
* Initiates a download using the specified business object data.
*
* @param businessObjectData the business object data.
*
* @return the download single initiation response.
*/
private DownloadSingleInitiationResponse initiateDownload(BusinessObjectData businessObjectData)
{
return uploadDownloadRestController.initiateDownloadSingle(businessObjectData.getNamespace(), businessObjectData.getBusinessObjectDefinitionName(),
businessObjectData.getBusinessObjectFormatUsage(), businessObjectData.getBusinessObjectFormatFileType(),
businessObjectData.getBusinessObjectFormatVersion(), businessObjectData.getPartitionValue(), businessObjectData.getVersion());
}
/**
* Extends the credentials of an in-progress upload.
*
* @param businessObjectData the business object data for the in-progress upload.
*
* @return the upload single credential extension response.
*/
private UploadSingleCredentialExtensionResponse extendUploadSingleCredentials(BusinessObjectData businessObjectData)
{
return uploadDownloadRestController
.extendUploadSingleCredentials(businessObjectData.getNamespace(), businessObjectData.getBusinessObjectDefinitionName(),
businessObjectData.getBusinessObjectFormatUsage(), businessObjectData.getBusinessObjectFormatFileType(),
businessObjectData.getBusinessObjectFormatVersion(), businessObjectData.getPartitionValue(), businessObjectData.getVersion());
}
@Test
public void testDownloadSampleDataFile()
{
// Create and persist a business object definition entity.
BusinessObjectDefinitionEntity businessObjectDefinitionEntity = businessObjectDefinitionDaoTestHelper
.createBusinessObjectDefinitionEntity(NAMESPACE, BDEF_NAME, DATA_PROVIDER_NAME, BDEF_DESCRIPTION, BDEF_DISPLAY_NAME,
businessObjectDefinitionServiceTestHelper.getNewAttributes(), businessObjectDefinitionServiceTestHelper.getTestSampleDataFiles());
List<SampleDataFile> sampleFileList = businessObjectDefinitionServiceTestHelper.getTestSampleDataFiles();
StorageEntity storageEntity = storageDaoHelper.getStorageEntity(STORAGE_NAME);
storageEntity.getAttributes().add(
storageDaoTestHelper
.createStorageAttributeEntity(storageEntity, configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_BUCKET_NAME),
"testBucketName"));
storageEntity.getAttributes().add(
storageDaoTestHelper
.createStorageAttributeEntity(storageEntity, configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_DOWNLOAD_ROLE_ARN),
"downloadRole"));
DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest downloadRequest =
new DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest();
BusinessObjectDefinitionSampleDataFileKey sampleDataFileKey = new BusinessObjectDefinitionSampleDataFileKey();
sampleDataFileKey.setBusinessObjectDefinitionName(BDEF_NAME);
sampleDataFileKey.setNamespace(NAMESPACE);
sampleDataFileKey.setDirectoryPath(sampleFileList.get(0).getDirectoryPath());
sampleDataFileKey.setFileName(sampleFileList.get(0).getFileName());
downloadRequest.setBusinessObjectDefinitionSampleDataFileKey(sampleDataFileKey);
DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationResponse downloadResponse =
uploadDownloadRestController.initiateDownloadSingleSampleFile(downloadRequest);
assertEquals(downloadResponse.getBusinessObjectDefinitionSampleDataFileKey(), sampleDataFileKey);
assertNotNull(downloadResponse.getAwsAccessKey());
assertNotNull(downloadResponse.getAwsSecretKey());
assertNotNull(downloadResponse.getAwsSessionExpirationTime());
assertNotNull(downloadResponse.getAwsSessionToken());
assertNotNull(downloadResponse.getPreSignedUrl());
}
@Test
public void testUploadSampleDataFile()
{
String s3_velocity_template = "$namespace/$businessObjectDefinitionName";
// Create a test storage.
storageDaoTestHelper.createStorageEntity(StorageEntity.SAMPLE_DATA_FILE_STORAGE, Arrays
.asList(new Attribute(configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_BUCKET_NAME), S3_BUCKET_NAME),
new Attribute(configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_UPLOAD_ROLE_ARN), UPLOADER_ROLE_ARN),
new Attribute(configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_KEY_PREFIX_VELOCITY_TEMPLATE), s3_velocity_template)));
// Create and persist a business object definition entity with sample data files.
businessObjectDefinitionDaoTestHelper
.createBusinessObjectDefinitionEntity(NAMESPACE, BDEF_NAME, DATA_PROVIDER_NAME, BDEF_DESCRIPTION, BDEF_DISPLAY_NAME,
businessObjectDefinitionServiceTestHelper.getNewAttributes());
UploadBusinessObjectDefinitionSampleDataFileInitiationRequest request = new UploadBusinessObjectDefinitionSampleDataFileInitiationRequest();
BusinessObjectDefinitionKey businessObjectDefinitionKey = new BusinessObjectDefinitionKey(NAMESPACE, BDEF_NAME);
request.setBusinessObjectDefinitionKey(businessObjectDefinitionKey);
UploadBusinessObjectDefinitionSampleDataFileInitiationResponse response = uploadDownloadRestController.initiateUploadSampleFile(request);
assertEquals(response.getBusinessObjectDefinitionKey(), businessObjectDefinitionKey);
assertEquals(response.getAwsS3BucketName(), S3_BUCKET_NAME);
assertEquals(response.getAwsAccessKey(), MockStsOperationsImpl.MOCK_AWS_ASSUMED_ROLE_ACCESS_KEY);
assertEquals(response.getAwsSecretKey(), MockStsOperationsImpl.MOCK_AWS_ASSUMED_ROLE_SECRET_KEY);
assertEquals(response.getAwsSessionToken(), MockStsOperationsImpl.MOCK_AWS_ASSUMED_ROLE_SESSION_TOKEN);
}
}