/* * 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.service; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.util.Arrays; import java.util.List; import com.amazonaws.services.s3.model.PutObjectRequest; import org.apache.commons.collections4.IterableUtils; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.finra.herd.core.helper.LogLevel; import org.finra.herd.dao.impl.MockStsOperationsImpl; import org.finra.herd.model.ObjectNotFoundException; import org.finra.herd.model.api.xml.Attribute; import org.finra.herd.model.api.xml.BusinessObjectData; import org.finra.herd.model.api.xml.BusinessObjectDataKey; import org.finra.herd.model.api.xml.BusinessObjectDataStatusUpdateRequest; 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.UploadSingleInitiationRequest; import org.finra.herd.model.api.xml.UploadSingleInitiationResponse; import org.finra.herd.model.dto.ConfigurationValue; import org.finra.herd.model.dto.S3FileTransferRequestParamsDto; import org.finra.herd.model.jpa.BusinessObjectDataEntity; import org.finra.herd.model.jpa.BusinessObjectDataStatusEntity; import org.finra.herd.model.jpa.StorageEntity; import org.finra.herd.model.jpa.StorageUnitEntity; import org.finra.herd.service.impl.UploadDownloadServiceImpl; /** * This class tests various functionality within the custom DDL REST controller. */ public class UploadDownloadServiceTest extends AbstractServiceTest { @Autowired @Qualifier(value = "uploadDownloadServiceImpl") private UploadDownloadService uploadDownloadServiceImpl; @Test public void testInitiateUploadSingle() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); // Initiate a file upload. UploadSingleInitiationResponse resultUploadSingleInitiationResponse = uploadDownloadService.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 testInitiateUploadSingleMissingRequiredParameters() { UploadSingleInitiationRequest request; // Try to initiate a single file upload when business object format key is not specified. request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.setSourceBusinessObjectFormatKey(null); try { uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when business object format key is not specified."); } catch (IllegalArgumentException e) { assertEquals("A business object format key must be specified.", e.getMessage()); } // Try to initiate a single file upload when namespace is not specified. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getSourceBusinessObjectFormatKey().setNamespace(BLANK_TEXT); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when namespace is not specified."); } catch (IllegalArgumentException e) { assertEquals("A namespace must be specified.", e.getMessage()); } // Try to initiate a single file upload when business object definition name is not specified. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getSourceBusinessObjectFormatKey().setBusinessObjectDefinitionName(BLANK_TEXT); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when business object definition name is not specified."); } catch (IllegalArgumentException e) { assertEquals("A business object definition name must be specified.", e.getMessage()); } // Try to initiate a single file upload when business object format usage is not specified. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getSourceBusinessObjectFormatKey().setBusinessObjectFormatUsage(BLANK_TEXT); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when business object format usage is not specified."); } catch (IllegalArgumentException e) { assertEquals("A business object format usage must be specified.", e.getMessage()); } // Try to initiate a single file upload when business object format file type is not specified. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getSourceBusinessObjectFormatKey().setBusinessObjectFormatFileType(BLANK_TEXT); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when business object format file type is not specified."); } catch (IllegalArgumentException e) { assertEquals("A business object format file type must be specified.", e.getMessage()); } // Try to initiate a single file upload when business object format version is not specified. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getSourceBusinessObjectFormatKey().setBusinessObjectFormatVersion(null); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when business object format version is not specified."); } catch (IllegalArgumentException e) { assertEquals("A business object format version must be specified.", e.getMessage()); } // Try to initiate a single file upload when business object format key is not specified. request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.setTargetBusinessObjectFormatKey(null); try { uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when business object format key is not specified."); } catch (IllegalArgumentException e) { assertEquals("A business object format key must be specified.", e.getMessage()); } // Try to initiate a single file upload when namespace is not specified. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getTargetBusinessObjectFormatKey().setNamespace(BLANK_TEXT); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when namespace is not specified."); } catch (IllegalArgumentException e) { assertEquals("A namespace must be specified.", e.getMessage()); } // Try to initiate a single file upload when business object definition name is not specified. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getTargetBusinessObjectFormatKey().setBusinessObjectDefinitionName(BLANK_TEXT); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when business object definition name is not specified."); } catch (IllegalArgumentException e) { assertEquals("A business object definition name must be specified.", e.getMessage()); } // Try to initiate a single file upload when business object format usage is not specified. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getTargetBusinessObjectFormatKey().setBusinessObjectFormatUsage(BLANK_TEXT); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when business object format usage is not specified."); } catch (IllegalArgumentException e) { assertEquals("A business object format usage must be specified.", e.getMessage()); } // Try to initiate a single file upload when business object format file type is not specified. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getTargetBusinessObjectFormatKey().setBusinessObjectFormatFileType(BLANK_TEXT); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when business object format file type is not specified."); } catch (IllegalArgumentException e) { assertEquals("A business object format file type must be specified.", e.getMessage()); } // Try to initiate a single file upload when business object format version is not specified. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getTargetBusinessObjectFormatKey().setBusinessObjectFormatVersion(null); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when business object format version is not specified."); } catch (IllegalArgumentException e) { assertEquals("A business object format version must be specified.", e.getMessage()); } // Try to initiate a single file upload when attribute name is not specified. request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getBusinessObjectDataAttributes().get(0).setName(BLANK_TEXT); try { uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when attribute name is not specified."); } catch (IllegalArgumentException e) { assertEquals("An attribute name must be specified.", e.getMessage()); } // Try to initiate a single file upload when file information is not specified. request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.setFile(null); try { uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when file information is not specified."); } catch (IllegalArgumentException e) { assertEquals("File information must be specified.", e.getMessage()); } // Try to initiate a single file upload when file name is not specified. request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getFile().setFileName(BLANK_TEXT); try { uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when file name is not specified."); } catch (IllegalArgumentException e) { assertEquals("A file name must be specified.", e.getMessage()); } } @Test public void testInitiateUploadSingleMissingOptionalParameters() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); // Initiate a file upload without specifying any of the optional parameters. UploadSingleInitiationRequest request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.setBusinessObjectDataAttributes(null); request.getFile().setFileSizeBytes(null); UploadSingleInitiationResponse resultUploadSingleInitiationResponse = uploadDownloadService.initiateUploadSingle(request); // 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, NO_ATTRIBUTES, FILE_NAME, null, null, resultUploadSingleInitiationResponse); } @Test public void testInitiateUploadSingleTrimParameters() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); // Initiate a file upload using input parameters with leading and trailing empty spaces. UploadSingleInitiationResponse resultUploadSingleInitiationResponse = uploadDownloadService.initiateUploadSingle(uploadDownloadServiceTestHelper .createUploadSingleInitiationRequest(addWhitespace(NAMESPACE), addWhitespace(BDEF_NAME), addWhitespace(FORMAT_USAGE_CODE), addWhitespace(FORMAT_FILE_TYPE_CODE), FORMAT_VERSION, addWhitespace(NAMESPACE), addWhitespace(BDEF_NAME_2), addWhitespace(FORMAT_USAGE_CODE_2), addWhitespace(FORMAT_FILE_TYPE_CODE_2), FORMAT_VERSION_2)); // 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 testInitiateUploadSingleUpperCaseParameters() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); // Initiate a file upload using lower case values. UploadSingleInitiationResponse resultUploadSingleInitiationResponse = uploadDownloadService.initiateUploadSingle(uploadDownloadServiceTestHelper .createUploadSingleInitiationRequest(NAMESPACE.toLowerCase(), BDEF_NAME.toLowerCase(), FORMAT_USAGE_CODE.toLowerCase(), FORMAT_FILE_TYPE_CODE.toLowerCase(), FORMAT_VERSION, NAMESPACE.toLowerCase(), BDEF_NAME_2.toLowerCase(), FORMAT_USAGE_CODE_2.toLowerCase(), FORMAT_FILE_TYPE_CODE_2.toLowerCase(), FORMAT_VERSION_2)); // 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 testInitiateUploadSingleLowerCaseParameters() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); // Initiate a file upload using upper case values. UploadSingleInitiationResponse resultUploadSingleInitiationResponse = uploadDownloadService.initiateUploadSingle(uploadDownloadServiceTestHelper .createUploadSingleInitiationRequest(NAMESPACE.toUpperCase(), BDEF_NAME.toUpperCase(), FORMAT_USAGE_CODE.toUpperCase(), FORMAT_FILE_TYPE_CODE.toUpperCase(), FORMAT_VERSION, NAMESPACE.toUpperCase(), BDEF_NAME_2.toUpperCase(), FORMAT_USAGE_CODE_2.toUpperCase(), FORMAT_FILE_TYPE_CODE_2.toUpperCase(), FORMAT_VERSION_2)); // 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 testInitiateUploadSingleInvalidParameters() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); UploadSingleInitiationRequest request; // Try to initiate a single file upload using invalid namespace. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getSourceBusinessObjectFormatKey().setNamespace("I_DO_NOT_EXIST"); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an ObjectNotFoundException when not able to find business object format."); } catch (ObjectNotFoundException e) { assertEquals(businessObjectFormatServiceTestHelper .getExpectedBusinessObjectFormatNotFoundErrorMessage("I_DO_NOT_EXIST", BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION), e.getMessage()); } // Try to initiate a single file upload using invalid business object definition name. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getSourceBusinessObjectFormatKey().setBusinessObjectDefinitionName("I_DO_NOT_EXIST"); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an ObjectNotFoundException when not able to find business object format."); } catch (ObjectNotFoundException e) { assertEquals(businessObjectFormatServiceTestHelper .getExpectedBusinessObjectFormatNotFoundErrorMessage(NAMESPACE, "I_DO_NOT_EXIST", FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION), e.getMessage()); } // Try to initiate a single file upload using invalid format usage. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getSourceBusinessObjectFormatKey().setBusinessObjectFormatUsage("I_DO_NOT_EXIST"); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an ObjectNotFoundException when not able to find business object format."); } catch (ObjectNotFoundException e) { assertEquals(businessObjectFormatServiceTestHelper .getExpectedBusinessObjectFormatNotFoundErrorMessage(NAMESPACE, BDEF_NAME, "I_DO_NOT_EXIST", FORMAT_FILE_TYPE_CODE, FORMAT_VERSION), e.getMessage()); } // Try to initiate a single file upload using invalid format file type. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getSourceBusinessObjectFormatKey().setBusinessObjectFormatFileType("I_DO_NOT_EXIST"); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an ObjectNotFoundException when not able to find business object format."); } catch (ObjectNotFoundException e) { assertEquals(businessObjectFormatServiceTestHelper .getExpectedBusinessObjectFormatNotFoundErrorMessage(NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, "I_DO_NOT_EXIST", FORMAT_VERSION), e.getMessage()); } // Try to initiate a single file upload using invalid business object format version. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getSourceBusinessObjectFormatKey().setBusinessObjectFormatVersion(INVALID_FORMAT_VERSION); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an ObjectNotFoundException when not able to find business object format."); } catch (ObjectNotFoundException e) { assertEquals(businessObjectFormatServiceTestHelper .getExpectedBusinessObjectFormatNotFoundErrorMessage(NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, INVALID_FORMAT_VERSION), e.getMessage()); } // Try to initiate a single file upload using invalid namespace. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getTargetBusinessObjectFormatKey().setNamespace("I_DO_NOT_EXIST"); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an ObjectNotFoundException when not able to find business object format."); } catch (ObjectNotFoundException e) { assertEquals(businessObjectFormatServiceTestHelper .getExpectedBusinessObjectFormatNotFoundErrorMessage("I_DO_NOT_EXIST", BDEF_NAME_2, FORMAT_USAGE_CODE_2, FORMAT_FILE_TYPE_CODE_2, FORMAT_VERSION_2), e.getMessage()); } // Try to initiate a single file upload using invalid business object definition name. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getTargetBusinessObjectFormatKey().setBusinessObjectDefinitionName("I_DO_NOT_EXIST"); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an ObjectNotFoundException when not able to find business object format."); } catch (ObjectNotFoundException e) { assertEquals(businessObjectFormatServiceTestHelper .getExpectedBusinessObjectFormatNotFoundErrorMessage(NAMESPACE, "I_DO_NOT_EXIST", FORMAT_USAGE_CODE_2, FORMAT_FILE_TYPE_CODE_2, FORMAT_VERSION_2), e.getMessage()); } // Try to initiate a single file upload using invalid format usage. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getTargetBusinessObjectFormatKey().setBusinessObjectFormatUsage("I_DO_NOT_EXIST"); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an ObjectNotFoundException when not able to find business object format."); } catch (ObjectNotFoundException e) { assertEquals(businessObjectFormatServiceTestHelper .getExpectedBusinessObjectFormatNotFoundErrorMessage(NAMESPACE, BDEF_NAME_2, "I_DO_NOT_EXIST", FORMAT_FILE_TYPE_CODE_2, FORMAT_VERSION_2), e.getMessage()); } // Try to initiate a single file upload using invalid format file type. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getTargetBusinessObjectFormatKey().setBusinessObjectFormatFileType("I_DO_NOT_EXIST"); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an ObjectNotFoundException when not able to find business object format."); } catch (ObjectNotFoundException e) { assertEquals(businessObjectFormatServiceTestHelper .getExpectedBusinessObjectFormatNotFoundErrorMessage(NAMESPACE, BDEF_NAME_2, FORMAT_USAGE_CODE_2, "I_DO_NOT_EXIST", FORMAT_VERSION_2), e.getMessage()); } // Try to initiate a single file upload using invalid business object format version. try { request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.getTargetBusinessObjectFormatKey().setBusinessObjectFormatVersion(INVALID_FORMAT_VERSION); uploadDownloadService.initiateUploadSingle(request); fail("Should throw an ObjectNotFoundException when not able to find business object format."); } catch (ObjectNotFoundException e) { assertEquals(businessObjectFormatServiceTestHelper .getExpectedBusinessObjectFormatNotFoundErrorMessage(NAMESPACE, BDEF_NAME_2, FORMAT_USAGE_CODE_2, FORMAT_FILE_TYPE_CODE_2, INVALID_FORMAT_VERSION), e.getMessage()); } } @Test public void testInitiateUploadSingleDuplicateAttributes() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); // Try to initiate a single file upload when duplicate attributes are specified. UploadSingleInitiationRequest request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.setBusinessObjectDataAttributes(Arrays.asList(new Attribute(ATTRIBUTE_NAME_3_MIXED_CASE.toLowerCase(), ATTRIBUTE_VALUE_3), new Attribute(ATTRIBUTE_NAME_3_MIXED_CASE.toUpperCase(), ATTRIBUTE_VALUE_3))); try { uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when duplicate attributes are specified."); } catch (IllegalArgumentException e) { assertEquals(String.format("Duplicate attribute name found: %s", ATTRIBUTE_NAME_3_MIXED_CASE.toUpperCase()), e.getMessage()); } } @Test public void testInitiateUploadSingleRequiredAttribute() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); // Create and persist a business object data attribute definition entity. businessObjectFormatDaoTestHelper .createBusinessObjectDataAttributeDefinitionEntity(NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, ATTRIBUTE_NAME_1_MIXED_CASE); // Initiate a file upload. UploadSingleInitiationResponse resultUploadSingleInitiationResponse = uploadDownloadService.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 testInitiateUploadSingleRequiredAttributeMissingValue() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); // Create and persist a business object data attribute definition entity. businessObjectFormatDaoTestHelper .createBusinessObjectDataAttributeDefinitionEntity(NAMESPACE, BDEF_NAME, FORMAT_USAGE_CODE, FORMAT_FILE_TYPE_CODE, FORMAT_VERSION, ATTRIBUTE_NAME_1_MIXED_CASE); // Try to initiate a single file upload when a required attribute value is not specified. UploadSingleInitiationRequest request = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); request.setBusinessObjectDataAttributes(Arrays.asList(new Attribute(ATTRIBUTE_NAME_1_MIXED_CASE, BLANK_TEXT))); try { uploadDownloadService.initiateUploadSingle(request); fail("Should throw an IllegalArgumentException when required attribute value is not specified."); } catch (IllegalArgumentException e) { assertEquals(String.format("The business object format has a required attribute \"%s\" which was not specified or has a value which is blank.", ATTRIBUTE_NAME_1_MIXED_CASE), e.getMessage()); } } /** * Asserts that the target business object data that is created is using the target storage name that is specified in the request. */ @Test public void testInitiateUploadSingleAssertUseTargetStorageInRequest() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); StorageEntity storageEntity = storageDaoTestHelper.createStorageEntity(STORAGE_NAME_3); 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_KEY_PREFIX_VELOCITY_TEMPLATE), "$environment/$namespace/$businessObjectDataPartitionValue")); storageEntity.getAttributes().add(storageDaoTestHelper .createStorageAttributeEntity(storageEntity, configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_KMS_KEY_ID), "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012")); // Initiate a file upload. UploadSingleInitiationRequest uploadSingleInitiationRequest = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); uploadSingleInitiationRequest.setTargetStorageName(STORAGE_NAME_3); UploadSingleInitiationResponse resultUploadSingleInitiationResponse = uploadDownloadService.initiateUploadSingle(uploadSingleInitiationRequest); // 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, STORAGE_NAME_3, resultUploadSingleInitiationResponse); BusinessObjectDataEntity targetBusinessObjectDataEntity = businessObjectDataDao.getBusinessObjectDataByAltKey( new BusinessObjectDataKey(NAMESPACE, BDEF_NAME_2, FORMAT_USAGE_CODE_2, FORMAT_FILE_TYPE_CODE_2, FORMAT_VERSION_2, resultUploadSingleInitiationResponse.getTargetBusinessObjectData().getPartitionValue(), null, 0)); assertNotNull(targetBusinessObjectDataEntity); assertNotNull(targetBusinessObjectDataEntity.getStorageUnits()); assertEquals(1, targetBusinessObjectDataEntity.getStorageUnits().size()); StorageUnitEntity storageUnit = IterableUtils.get(targetBusinessObjectDataEntity.getStorageUnits(), 0); assertNotNull(storageUnit); assertNotNull(storageUnit.getStorage()); assertEquals(STORAGE_NAME_3, storageUnit.getStorage().getName()); } /** * Asserts that error is thrown when target storage's bucket name is not set. */ @Test public void testInitiateUploadSingleAssertTargetStorageBucketNameRequired() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); StorageEntity storageEntity = storageDaoTestHelper.createStorageEntity(STORAGE_NAME_3); storageEntity.getAttributes().add(storageDaoTestHelper .createStorageAttributeEntity(storageEntity, configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_KEY_PREFIX_VELOCITY_TEMPLATE), "$environment/$namespace/$businessObjectDataPartitionValue")); storageEntity.getAttributes().add(storageDaoTestHelper .createStorageAttributeEntity(storageEntity, configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_KMS_KEY_ID), "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012")); // Initiate a file upload. UploadSingleInitiationRequest uploadSingleInitiationRequest = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); uploadSingleInitiationRequest.setTargetStorageName(STORAGE_NAME_3); try { uploadDownloadService.initiateUploadSingle(uploadSingleInitiationRequest); fail(); } catch (Exception e) { assertEquals(IllegalArgumentException.class, e.getClass()); assertEquals("Attribute \"" + configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_BUCKET_NAME) + "\" for \"" + STORAGE_NAME_3 + "\" storage must be configured.", e.getMessage()); } } /** * Asserts that error is thrown when target storage's kms kms id is not set. */ @Test public void testInitiateUploadSingleAssertTargetStorageKmsKeyIdRequired() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); StorageEntity storageEntity = storageDaoTestHelper.createStorageEntity(STORAGE_NAME_3); 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_KEY_PREFIX_VELOCITY_TEMPLATE), "$environment/$namespace/$businessObjectDataPartitionValue")); // Initiate a file upload. UploadSingleInitiationRequest uploadSingleInitiationRequest = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); uploadSingleInitiationRequest.setTargetStorageName(STORAGE_NAME_3); try { uploadDownloadService.initiateUploadSingle(uploadSingleInitiationRequest); fail(); } catch (Exception e) { assertEquals(IllegalArgumentException.class, e.getClass()); assertEquals("Attribute \"" + configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_KMS_KEY_ID) + "\" for \"" + STORAGE_NAME_3 + "\" storage must be configured.", e.getMessage()); } } /** * Asserts that error is thrown when target storage's prefix template is not set. */ @Test public void testInitiateUploadSingleAssertTargetStoragePrefixTemplateRequired() { // Create database entities required for testing. uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); StorageEntity storageEntity = storageDaoTestHelper.createStorageEntity(STORAGE_NAME_3); 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_KMS_KEY_ID), "arn:aws:kms:us-east-1:123456789012:key/12345678-1234-1234-1234-123456789012")); // Initiate a file upload. UploadSingleInitiationRequest uploadSingleInitiationRequest = uploadDownloadServiceTestHelper.createUploadSingleInitiationRequest(); uploadSingleInitiationRequest.setTargetStorageName(STORAGE_NAME_3); try { uploadDownloadService.initiateUploadSingle(uploadSingleInitiationRequest); fail(); } catch (Exception e) { assertEquals(IllegalArgumentException.class, e.getClass()); assertEquals("Storage \"" + STORAGE_NAME_3 + "\" has no S3 key prefix velocity template configured.", e.getMessage()); } } @Test public void testPerformCompleteUploadSingleMessage() { runPerformCompleteUploadSingleMessageTest(); } @Test public void testPerformCompleteUploadSingleMessageWithDebugLoggingEnabled() throws Exception { // Get the logger and the current logger level. LogLevel origLogLevel = getLogLevel(UploadDownloadServiceImpl.class); // Set logging level to DEBUG. setLogLevel(UploadDownloadServiceImpl.class, LogLevel.DEBUG); // Run the test and reset the logging level back to the original value. try { runPerformCompleteUploadSingleMessageTest(); } finally { setLogLevel(UploadDownloadServiceImpl.class, origLogLevel); } } private void runPerformCompleteUploadSingleMessageTest() { uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); UploadSingleInitiationResponse resultUploadSingleInitiationResponse = uploadDownloadService.initiateUploadSingle(uploadDownloadServiceTestHelper .createUploadSingleInitiationRequest(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, FILE_NAME)); // Get the file path. String filePath = resultUploadSingleInitiationResponse.getTargetBusinessObjectData().getStorageUnits().get(0).getStorageFiles().get(0).getFilePath(); // Put a 1 KB file in the S3 "loading dock" bucket. PutObjectRequest putObjectRequest = new PutObjectRequest(storageDaoTestHelper.getS3LoadingDockBucketName(), filePath, new ByteArrayInputStream(new byte[(int) FILE_SIZE_1_KB]), null); s3Operations.putObject(putObjectRequest, null); try { // Complete the upload. UploadDownloadServiceImpl.CompleteUploadSingleMessageResult result = uploadDownloadService.performCompleteUploadSingleMessage(filePath); // Validate the result object. assertEquals(BusinessObjectDataStatusEntity.UPLOADING, result.getSourceOldBusinessObjectDataStatus()); assertEquals(BusinessObjectDataStatusEntity.DELETED, result.getSourceNewBusinessObjectDataStatus()); assertEquals(BusinessObjectDataStatusEntity.UPLOADING, result.getTargetOldBusinessObjectDataStatus()); assertEquals(BusinessObjectDataStatusEntity.VALID, result.getTargetNewBusinessObjectDataStatus()); // Try to complete the upload the second time. This might happen when a duplicate S3 notification is received for the same uploaded file. result = uploadDownloadService.performCompleteUploadSingleMessage(filePath); // Validate the result object. assertEquals(BusinessObjectDataStatusEntity.DELETED, result.getSourceOldBusinessObjectDataStatus()); assertNull(result.getSourceNewBusinessObjectDataStatus()); assertEquals(BusinessObjectDataStatusEntity.VALID, result.getTargetOldBusinessObjectDataStatus()); assertNull(result.getTargetNewBusinessObjectDataStatus()); } finally { // Clean up the S3. s3Dao.deleteDirectory( S3FileTransferRequestParamsDto.builder().s3BucketName(storageDaoTestHelper.getS3LoadingDockBucketName()).s3KeyPrefix(filePath).build()); s3Operations.rollback(); } } @Test public void testPerformCompleteUploadSingleMessageStorageFileNoExists() { // Try to complete the upload, when storage file matching the S3 key does not exist in the database. UploadDownloadServiceImpl.CompleteUploadSingleMessageResult result = uploadDownloadService.performCompleteUploadSingleMessage("KEY_DOES_NOT_EXIST"); assertNull(result.getSourceBusinessObjectDataKey()); assertNull(result.getSourceNewBusinessObjectDataStatus()); assertNull(result.getSourceOldBusinessObjectDataStatus()); assertNull(result.getTargetBusinessObjectDataKey()); assertNull(result.getTargetNewBusinessObjectDataStatus()); assertNull(result.getTargetOldBusinessObjectDataStatus()); } @Test public void testPerformCompleteUploadSingleMessageS3FileNoExists() { uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); UploadSingleInitiationResponse resultUploadSingleInitiationResponse = uploadDownloadService.initiateUploadSingle(uploadDownloadServiceTestHelper .createUploadSingleInitiationRequest(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, FILE_NAME)); String filePath = resultUploadSingleInitiationResponse.getTargetBusinessObjectData().getStorageUnits().get(0).getStorageFiles().get(0).getFilePath(); // Try to complete the upload, when source S3 file does not exist. UploadDownloadServiceImpl.CompleteUploadSingleMessageResult result = uploadDownloadService.performCompleteUploadSingleMessage(filePath); assertEquals(BusinessObjectDataStatusEntity.UPLOADING, result.getSourceOldBusinessObjectDataStatus()); assertEquals(BusinessObjectDataStatusEntity.DELETED, result.getSourceNewBusinessObjectDataStatus()); assertEquals(BusinessObjectDataStatusEntity.UPLOADING, result.getTargetOldBusinessObjectDataStatus()); assertEquals(BusinessObjectDataStatusEntity.INVALID, result.getTargetNewBusinessObjectDataStatus()); } @Test public void testPerformCompleteUploadSingleMessageSourceBusinessObjectDataStatusNotUploading() { uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); UploadSingleInitiationResponse resultUploadSingleInitiationResponse = uploadDownloadService.initiateUploadSingle(uploadDownloadServiceTestHelper .createUploadSingleInitiationRequest(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, FILE_NAME)); String filePath = resultUploadSingleInitiationResponse.getTargetBusinessObjectData().getStorageUnits().get(0).getStorageFiles().get(0).getFilePath(); // Create a business object data status. businessObjectDataStatusDaoTestHelper.createBusinessObjectDataStatusEntity(BDATA_STATUS); // Update the status of the source business object data so it would not be "UPLOADING". businessObjectDataStatusService.updateBusinessObjectDataStatus( businessObjectDataHelper.getBusinessObjectDataKey(resultUploadSingleInitiationResponse.getSourceBusinessObjectData()), new BusinessObjectDataStatusUpdateRequest(BDATA_STATUS)); // Try to complete the upload, when source business object data status is not "UPLOADING". UploadDownloadServiceImpl.CompleteUploadSingleMessageResult result = uploadDownloadService.performCompleteUploadSingleMessage(filePath); assertEquals(BDATA_STATUS, result.getSourceOldBusinessObjectDataStatus()); assertNull(result.getSourceNewBusinessObjectDataStatus()); assertEquals(BusinessObjectDataStatusEntity.UPLOADING, result.getTargetOldBusinessObjectDataStatus()); assertNull(result.getTargetNewBusinessObjectDataStatus()); } @Test public void testPerformCompleteUploadSingleMessageTargetBusinessObjectDataStatusNotUploading() { uploadDownloadServiceTestHelper.createDatabaseEntitiesForUploadDownloadTesting(); UploadSingleInitiationResponse resultUploadSingleInitiationResponse = uploadDownloadService.initiateUploadSingle(uploadDownloadServiceTestHelper .createUploadSingleInitiationRequest(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, FILE_NAME)); String filePath = resultUploadSingleInitiationResponse.getTargetBusinessObjectData().getStorageUnits().get(0).getStorageFiles().get(0).getFilePath(); // Create a business object data status. businessObjectDataStatusDaoTestHelper.createBusinessObjectDataStatusEntity(BDATA_STATUS); // Update the status of the target business object data so it would not be "UPLOADING". businessObjectDataStatusService.updateBusinessObjectDataStatus( businessObjectDataHelper.getBusinessObjectDataKey(resultUploadSingleInitiationResponse.getTargetBusinessObjectData()), new BusinessObjectDataStatusUpdateRequest(BDATA_STATUS)); // Try to complete the upload, when target business object data status is not "UPLOADING". UploadDownloadServiceImpl.CompleteUploadSingleMessageResult result = uploadDownloadService.performCompleteUploadSingleMessage(filePath); assertEquals(BusinessObjectDataStatusEntity.UPLOADING, result.getSourceOldBusinessObjectDataStatus()); assertNull(result.getSourceNewBusinessObjectDataStatus()); assertEquals(BDATA_STATUS, result.getTargetOldBusinessObjectDataStatus()); assertNull(result.getTargetNewBusinessObjectDataStatus()); } @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 testInitiateDownloadSingleBusinessObjectDataNoExists() { String INVALID_PARTITION_VALUE = "DOES_NOT_EXIST"; // Create the upload data. UploadSingleInitiationResponse uploadSingleInitiationResponse = uploadDownloadServiceTestHelper.createUploadedFileData(BusinessObjectDataStatusEntity.VALID); // Change the target business object data partition value to something invalid. uploadSingleInitiationResponse.getTargetBusinessObjectData().setPartitionValue(INVALID_PARTITION_VALUE); // Try to initiate a single file download when business object data does not exist (i.e. the partition value doesn't match). try { // Initiate the download against the uploaded data (i.e. the target business object data). initiateDownload(uploadSingleInitiationResponse.getTargetBusinessObjectData()); fail("Suppose to throw an ObjectNotFoundException when business object data does not exist."); } catch (ObjectNotFoundException e) { BusinessObjectData businessObjectData = uploadSingleInitiationResponse.getTargetBusinessObjectData(); assertEquals(businessObjectDataServiceTestHelper .getExpectedBusinessObjectDataNotFoundErrorMessage(businessObjectData.getNamespace(), businessObjectData.getBusinessObjectDefinitionName(), businessObjectData.getBusinessObjectFormatUsage(), businessObjectData.getBusinessObjectFormatFileType(), businessObjectData.getBusinessObjectFormatVersion(), INVALID_PARTITION_VALUE, NO_SUBPARTITION_VALUES, businessObjectData.getVersion(), null), e.getMessage()); } } @Test public void testInitiateDownloadSingleMultipleStorageFilesExist() { // Create the upload data. UploadSingleInitiationResponse uploadSingleInitiationResponse = uploadDownloadServiceTestHelper.createUploadedFileData(BusinessObjectDataStatusEntity.VALID); // Get the target business object data entity. BusinessObjectDataEntity targetBusinessObjectDataEntity = businessObjectDataDao .getBusinessObjectDataByAltKey(businessObjectDataHelper.getBusinessObjectDataKey(uploadSingleInitiationResponse.getTargetBusinessObjectData())); // Get the target bushiness object data storage unit. StorageUnitEntity targetStorageUnitEntity = IterableUtils.get(targetBusinessObjectDataEntity.getStorageUnits(), 0); // Add a second storage file to the target business object data storage unit. storageFileDaoTestHelper.createStorageFileEntity(targetStorageUnitEntity, FILE_NAME_2, FILE_SIZE_1_KB, ROW_COUNT_1000); // Try to initiate a single file download when business object data has more than one storage file. try { // Initiate the download against the uploaded data (i.e. the target business object data). initiateDownload(uploadSingleInitiationResponse.getTargetBusinessObjectData()); fail("Suppose to throw an IllegalArgumentException when business object has more than one storage file."); } catch (IllegalArgumentException e) { BusinessObjectData businessObjectData = uploadSingleInitiationResponse.getTargetBusinessObjectData(); assertEquals(String.format("Found 2 registered storage files when expecting one in \"%s\" storage for the business object data {%s}.", targetStorageUnitEntity.getStorage().getName(), businessObjectDataServiceTestHelper .getExpectedBusinessObjectDataKeyAsString(businessObjectDataHelper.getBusinessObjectDataKey(businessObjectData))), e.getMessage()); } } @Test public void testInitiateDownloadSingleBusinessObjectDataStatusNotValid() { // Create the upload data, but leave the target business object data in a "RE-ENCRYPTING" status. UploadSingleInitiationResponse uploadSingleInitiationResponse = uploadDownloadServiceTestHelper.createUploadedFileData(BusinessObjectDataStatusEntity.RE_ENCRYPTING); // Try to initiate a single file download when the business object data is not set to "VALID" which is invalid. try { // Initiate the download against the uploaded data (i.e. the target business object data). initiateDownload(uploadSingleInitiationResponse.getTargetBusinessObjectData()); fail("Suppose to throw an IllegalArgumentException when business object data is not in VALID status."); } catch (IllegalArgumentException e) { BusinessObjectData businessObjectData = uploadSingleInitiationResponse.getTargetBusinessObjectData(); assertEquals(String.format("Business object data status \"%s\" does not match the expected status \"%s\" for the business object data {%s}.", uploadSingleInitiationResponse.getTargetBusinessObjectData().getStatus(), BusinessObjectDataStatusEntity.VALID, businessObjectDataServiceTestHelper .getExpectedBusinessObjectDataKeyAsString(businessObjectData.getNamespace(), businessObjectData.getBusinessObjectDefinitionName(), businessObjectData.getBusinessObjectFormatUsage(), businessObjectData.getBusinessObjectFormatFileType(), businessObjectData.getBusinessObjectFormatVersion(), businessObjectData.getPartitionValue(), businessObjectData.getSubPartitionValues(), businessObjectData.getVersion())), e.getMessage()); } } @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 = uploadDownloadService.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() + "\"."); } } @Test public void testExtendUploadSingleCredentialsBusinessObjectDataStatusNotValid() { // Create the upload data. This internally calls "complete" which sets the source business object data's status to "DELETED". // This is a status where credentials can't be extended (i.e. only UPLOADING statuses). UploadSingleInitiationResponse uploadSingleInitiationResponse = uploadDownloadServiceTestHelper.createUploadedFileData(BusinessObjectDataStatusEntity.VALID); // Try to extend the upload credentials of a source business object data with an invalid status of "DELETED". try { extendUploadSingleCredentials(uploadSingleInitiationResponse.getSourceBusinessObjectData()); fail("Suppose to throw an IllegalArgumentException when business object data is not in VALID status."); } catch (IllegalArgumentException e) { BusinessObjectData businessObjectData = uploadSingleInitiationResponse.getSourceBusinessObjectData(); assertEquals(String.format("Business object data {%s} has a status of \"%s\" and must be \"%s\" to extend credentials.", businessObjectDataServiceTestHelper .getExpectedBusinessObjectDataKeyAsString(businessObjectData.getNamespace(), businessObjectData.getBusinessObjectDefinitionName(), businessObjectData.getBusinessObjectFormatUsage(), businessObjectData.getBusinessObjectFormatFileType(), businessObjectData.getBusinessObjectFormatVersion(), businessObjectData.getPartitionValue(), NO_SUBPARTITION_VALUES, businessObjectData.getVersion()), BusinessObjectDataStatusEntity.DELETED, BusinessObjectDataStatusEntity.UPLOADING), e.getMessage()); } } @Test public void testExtendUploadSingleCredentialsBusinessObjectDataNoExists() { String INVALID_PARTITION_VALUE = "DOES_NOT_EXIST"; // Create the upload data. UploadSingleInitiationResponse uploadSingleInitiationResponse = uploadDownloadServiceTestHelper.createUploadedFileData(BusinessObjectDataStatusEntity.VALID); // Change the source business object data partition value to something invalid. uploadSingleInitiationResponse.getSourceBusinessObjectData().setPartitionValue(INVALID_PARTITION_VALUE); // Try to initiate a single file download when business object data does not exist (i.e. the partition value doesn't match). try { extendUploadSingleCredentials(uploadSingleInitiationResponse.getSourceBusinessObjectData()); fail("Suppose to throw an ObjectNotFoundException when business object data does not exist."); } catch (ObjectNotFoundException e) { BusinessObjectData businessObjectData = uploadSingleInitiationResponse.getSourceBusinessObjectData(); assertEquals(businessObjectDataServiceTestHelper .getExpectedBusinessObjectDataNotFoundErrorMessage(businessObjectData.getNamespace(), businessObjectData.getBusinessObjectDefinitionName(), businessObjectData.getBusinessObjectFormatUsage(), businessObjectData.getBusinessObjectFormatFileType(), businessObjectData.getBusinessObjectFormatVersion(), INVALID_PARTITION_VALUE, NO_SUBPARTITION_VALUES, businessObjectData.getVersion(), null), e.getMessage()); } } /** * This method is to get coverage for the upload download service method that has an explicit annotation for transaction propagation. */ @Test public void testUploadDownloadHelperServiceMethodsNewTransactionPropagation() { uploadDownloadServiceImpl.performCompleteUploadSingleMessage("KEY_DOES_NOT_EXIST"); } /** * 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 uploadDownloadService.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 uploadDownloadService.extendUploadSingleCredentials(businessObjectData.getNamespace(), businessObjectData.getBusinessObjectDefinitionName(), businessObjectData.getBusinessObjectFormatUsage(), businessObjectData.getBusinessObjectFormatFileType(), businessObjectData.getBusinessObjectFormatVersion(), businessObjectData.getPartitionValue(), businessObjectData.getVersion()); } @Test public void testDownloadBusinessObjectDefinitionSampleFile() { // Create a test storage. storageDaoTestHelper.createStorageEntity(STORAGE_NAME, Arrays .asList(new Attribute(configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_BUCKET_NAME), S3_BUCKET_NAME), new Attribute(configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_DOWNLOAD_ROLE_ARN), DOWNLOADER_ROLE_ARN))); // 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(), Arrays.asList(new SampleDataFile(DIRECTORY_PATH, FILE_NAME))); // Initiate download of a sample data file. DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest downloadRequest = new DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest(); BusinessObjectDefinitionSampleDataFileKey sampleDataFileKey = new BusinessObjectDefinitionSampleDataFileKey(); sampleDataFileKey.setNamespace(NAMESPACE); sampleDataFileKey.setBusinessObjectDefinitionName(BDEF_NAME); sampleDataFileKey.setDirectoryPath(DIRECTORY_PATH); sampleDataFileKey.setFileName(FILE_NAME); downloadRequest.setBusinessObjectDefinitionSampleDataFileKey(sampleDataFileKey); DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationResponse downloadResponse = uploadDownloadService.initiateDownloadSingleSampleFile(downloadRequest); // Validate the response. assertNotNull(downloadResponse.getAwsSessionExpirationTime()); assertNotNull(downloadResponse.getPreSignedUrl()); assertEquals(new DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationResponse( new BusinessObjectDefinitionSampleDataFileKey(NAMESPACE, BDEF_NAME, DIRECTORY_PATH, FILE_NAME), S3_BUCKET_NAME, MockStsOperationsImpl.MOCK_AWS_ASSUMED_ROLE_ACCESS_KEY, MockStsOperationsImpl.MOCK_AWS_ASSUMED_ROLE_SECRET_KEY, MockStsOperationsImpl.MOCK_AWS_ASSUMED_ROLE_SESSION_TOKEN, downloadResponse.getAwsSessionExpirationTime(), downloadResponse.getPreSignedUrl()), downloadResponse); } @Test public void testDownloadBusinessObjectDefinitionSampleFileLowerCaseParameters() { // Create and persist a business object definition entity. 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()); //use the lower case name space and business definition still return the same response BusinessObjectDefinitionSampleDataFileKey sampleDataFileKeyLowerCase = new BusinessObjectDefinitionSampleDataFileKey(); sampleDataFileKeyLowerCase.setBusinessObjectDefinitionName(BDEF_NAME.toLowerCase()); sampleDataFileKeyLowerCase.setNamespace(NAMESPACE.toLowerCase()); sampleDataFileKeyLowerCase.setDirectoryPath(sampleFileList.get(0).getDirectoryPath()); sampleDataFileKeyLowerCase.setFileName(sampleFileList.get(0).getFileName()); downloadRequest.setBusinessObjectDefinitionSampleDataFileKey(sampleDataFileKeyLowerCase); DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationResponse downloadResponse = uploadDownloadService.initiateDownloadSingleSampleFile(downloadRequest); assertEquals(downloadResponse.getBusinessObjectDefinitionSampleDataFileKey(), sampleDataFileKey); assertNotNull(downloadResponse.getAwsS3BucketName()); assertNotNull(downloadResponse.getAwsAccessKey()); assertNotNull(downloadResponse.getAwsSecretKey()); assertNotNull(downloadResponse.getAwsSessionExpirationTime()); assertNotNull(downloadResponse.getAwsSessionToken()); assertNotNull(downloadResponse.getPreSignedUrl()); } @Test public void testDownloadBusinessObjectDefinitionSampleFileUpperCaseParameters() { // Create and persist a business object definition entity. 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()); //use the lower case name space and business definition still return the same response BusinessObjectDefinitionSampleDataFileKey sampleDataFileKeyUpperCase = new BusinessObjectDefinitionSampleDataFileKey(); sampleDataFileKeyUpperCase.setBusinessObjectDefinitionName(BDEF_NAME.toUpperCase()); sampleDataFileKeyUpperCase.setNamespace(NAMESPACE.toUpperCase()); sampleDataFileKeyUpperCase.setDirectoryPath(sampleFileList.get(0).getDirectoryPath()); sampleDataFileKeyUpperCase.setFileName(sampleFileList.get(0).getFileName()); downloadRequest.setBusinessObjectDefinitionSampleDataFileKey(sampleDataFileKeyUpperCase); DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationResponse downloadResponse = uploadDownloadService.initiateDownloadSingleSampleFile(downloadRequest); assertEquals(downloadResponse.getBusinessObjectDefinitionSampleDataFileKey(), sampleDataFileKey); assertNotNull(downloadResponse.getAwsS3BucketName()); assertNotNull(downloadResponse.getAwsAccessKey()); assertNotNull(downloadResponse.getAwsSecretKey()); assertNotNull(downloadResponse.getAwsSessionExpirationTime()); assertNotNull(downloadResponse.getAwsSessionToken()); assertNotNull(downloadResponse.getPreSignedUrl()); } @Test public void testDownloadBusinessObjectDefinitionSampleFileTrimmedParameters() { // Create and persist a business object definition entity. 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()); //use the lower case name space and business definition still return the same response BusinessObjectDefinitionSampleDataFileKey sampleDataFileKeyPadded = new BusinessObjectDefinitionSampleDataFileKey(); sampleDataFileKeyPadded.setBusinessObjectDefinitionName(" " + BDEF_NAME + " "); sampleDataFileKeyPadded.setNamespace(" " + NAMESPACE + " "); sampleDataFileKeyPadded.setDirectoryPath(sampleFileList.get(0).getDirectoryPath()); sampleDataFileKeyPadded.setFileName(sampleFileList.get(0).getFileName()); downloadRequest.setBusinessObjectDefinitionSampleDataFileKey(sampleDataFileKeyPadded); DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationResponse downloadResponse = uploadDownloadService.initiateDownloadSingleSampleFile(downloadRequest); assertEquals(downloadResponse.getBusinessObjectDefinitionSampleDataFileKey(), sampleDataFileKey); assertNotNull(downloadResponse.getAwsS3BucketName()); assertNotNull(downloadResponse.getAwsAccessKey()); assertNotNull(downloadResponse.getAwsSecretKey()); assertNotNull(downloadResponse.getAwsSessionExpirationTime()); assertNotNull(downloadResponse.getAwsSessionToken()); assertNotNull(downloadResponse.getPreSignedUrl()); } @Test public void testDownloadBusinessObjectDefinitionSampleFilesMissingRequiredParameters() { try { uploadDownloadService.initiateDownloadSingleSampleFile(null); fail(); } catch (IllegalArgumentException e) { assertEquals("A download business object definition sample data file single initiation request must be specified.", e.getMessage()); } try { uploadDownloadService.initiateDownloadSingleSampleFile(new DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest(null)); fail(); } catch (IllegalArgumentException e) { assertEquals("A business object definition sample data file key must be specified.", e.getMessage()); } try { uploadDownloadService.initiateDownloadSingleSampleFile(new DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest( new BusinessObjectDefinitionSampleDataFileKey(BLANK_TEXT, BDEF_NAME, DIRECTORY_PATH, FILE_NAME))); fail(); } catch (IllegalArgumentException e) { assertEquals("A namespace must be specified.", e.getMessage()); } try { uploadDownloadService.initiateDownloadSingleSampleFile(new DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest( new BusinessObjectDefinitionSampleDataFileKey(NAMESPACE, BLANK_TEXT, DIRECTORY_PATH, FILE_NAME))); fail(); } catch (IllegalArgumentException e) { assertEquals("A business object definition name must be specified.", e.getMessage()); } try { uploadDownloadService.initiateDownloadSingleSampleFile(new DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest( new BusinessObjectDefinitionSampleDataFileKey(NAMESPACE, BDEF_NAME, BLANK_TEXT, FILE_NAME))); fail(); } catch (IllegalArgumentException e) { assertEquals("A directory path must be specified.", e.getMessage()); } try { uploadDownloadService.initiateDownloadSingleSampleFile(new DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest( new BusinessObjectDefinitionSampleDataFileKey(NAMESPACE, BDEF_NAME, DIRECTORY_PATH, BLANK_TEXT))); fail(); } catch (IllegalArgumentException e) { assertEquals("A file name must be specified.", e.getMessage()); } } @Test public void testDownloadBusinessObjectDefinitionInvalidParameters() { // Create a test storage. storageDaoTestHelper.createStorageEntity(STORAGE_NAME, Arrays .asList(new Attribute(configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_BUCKET_NAME), S3_BUCKET_NAME), new Attribute(configurationHelper.getProperty(ConfigurationValue.S3_ATTRIBUTE_NAME_DOWNLOAD_ROLE_ARN), DOWNLOADER_ROLE_ARN))); // 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(), Arrays.asList(new SampleDataFile(DIRECTORY_PATH, FILE_NAME))); // Try to initiate a download using an invalid namespace. try { uploadDownloadService.initiateDownloadSingleSampleFile(new DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest( new BusinessObjectDefinitionSampleDataFileKey("I_DO_NOT_EXIST", BDEF_NAME, DIRECTORY_PATH, FILE_NAME))); fail(); } catch (ObjectNotFoundException e) { assertEquals(businessObjectDefinitionServiceTestHelper.getExpectedBusinessObjectDefinitionNotFoundErrorMessage("I_DO_NOT_EXIST", BDEF_NAME), e.getMessage()); } // Try to initiate a download using an invalid business object definition name. try { uploadDownloadService.initiateDownloadSingleSampleFile(new DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest( new BusinessObjectDefinitionSampleDataFileKey(NAMESPACE, "I_DO_NOT_EXIST", DIRECTORY_PATH, FILE_NAME))); fail(); } catch (ObjectNotFoundException e) { assertEquals(businessObjectDefinitionServiceTestHelper.getExpectedBusinessObjectDefinitionNotFoundErrorMessage(NAMESPACE, "I_DO_NOT_EXIST"), e.getMessage()); } // Try to initiate a download using an invalid directory path. try { uploadDownloadService.initiateDownloadSingleSampleFile(new DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest( new BusinessObjectDefinitionSampleDataFileKey(NAMESPACE, BDEF_NAME, "I_DO_NOT_EXIST", FILE_NAME))); fail(); } catch (ObjectNotFoundException e) { assertEquals(String.format( "Business object definition with name \"%s\" and namespace \"%s\" does not have the specified sample file registered with file name \"%s\" in" + " directory path \"%s\"", BDEF_NAME, NAMESPACE, FILE_NAME, "I_DO_NOT_EXIST"), e.getMessage()); } // Try to initiate a download using an invalid file name. try { uploadDownloadService.initiateDownloadSingleSampleFile(new DownloadBusinessObjectDefinitionSampleDataFileSingleInitiationRequest( new BusinessObjectDefinitionSampleDataFileKey(NAMESPACE, BDEF_NAME, DIRECTORY_PATH, "I_DO_NOT_EXIST"))); fail(); } catch (ObjectNotFoundException e) { assertEquals(String.format( "Business object definition with name \"%s\" and namespace \"%s\" does not have the specified sample file registered with file name \"%s\" in" + " directory path \"%s\"", BDEF_NAME, NAMESPACE, "I_DO_NOT_EXIST", DIRECTORY_PATH), e.getMessage()); } } @Test public void testUploadBusinessObjectDefinitionSampleFile() { String s3_velocity_template = "$namespace/$businessObjectDefinitionName"; String expectedS3Keyprefix = NAMESPACE.toLowerCase() + "/" + BDEF_NAME.toLowerCase() + "/"; expectedS3Keyprefix = expectedS3Keyprefix.replace("_", "-"); // 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 = uploadDownloadService.initiateUploadSampleFile(request); assertEquals(response.getBusinessObjectDefinitionKey(), businessObjectDefinitionKey); assertEquals(response.getAwsS3BucketName(), S3_BUCKET_NAME); assertEquals(response.getS3KeyPrefix(), expectedS3Keyprefix); 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); } @Test public void testUploadBusinessObjectDefinitionSampleFileLowerCase() { 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); BusinessObjectDefinitionKey businessObjectDefinitionKeyLowerCase = new BusinessObjectDefinitionKey(NAMESPACE.toLowerCase(), BDEF_NAME.toLowerCase()); request.setBusinessObjectDefinitionKey(businessObjectDefinitionKeyLowerCase); UploadBusinessObjectDefinitionSampleDataFileInitiationResponse response = uploadDownloadService.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); } @Test public void testUploadBusinessObjectDefinitionSampleFileUpperCase() { 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); BusinessObjectDefinitionKey businessObjectDefinitionKeyUpperCase = new BusinessObjectDefinitionKey(NAMESPACE.toUpperCase(), BDEF_NAME.toUpperCase()); request.setBusinessObjectDefinitionKey(businessObjectDefinitionKeyUpperCase); UploadBusinessObjectDefinitionSampleDataFileInitiationResponse response = uploadDownloadService.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); } @Test public void testUploadBusinessObjectDefinitionSampleFileTrimedParameters() { 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); BusinessObjectDefinitionKey businessObjectDefinitionKeyWhitespace = new BusinessObjectDefinitionKey(" " + NAMESPACE + " ", " " + BDEF_NAME + " "); request.setBusinessObjectDefinitionKey(businessObjectDefinitionKeyWhitespace); UploadBusinessObjectDefinitionSampleDataFileInitiationResponse response = uploadDownloadService.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); } @Test public void testUploadBusinessObjectDefinitionSampleFileMissingParameter() { try { uploadDownloadService.initiateUploadSampleFile(null); fail(); } catch (IllegalArgumentException e) { assertEquals("An upload initiation request must be specified.", e.getMessage()); } try { uploadDownloadService.initiateUploadSampleFile(new UploadBusinessObjectDefinitionSampleDataFileInitiationRequest(null)); fail(); } catch (IllegalArgumentException e) { assertEquals("A business object definition key must be specified.", e.getMessage()); } try { BusinessObjectDefinitionKey businessObjectDefinitionKey = new BusinessObjectDefinitionKey("NAMESPACE", null); UploadBusinessObjectDefinitionSampleDataFileInitiationRequest request = new UploadBusinessObjectDefinitionSampleDataFileInitiationRequest(businessObjectDefinitionKey); uploadDownloadService.initiateUploadSampleFile(request); fail(); } catch (IllegalArgumentException e) { assertEquals("A business object definition name must be specified.", e.getMessage()); } try { BusinessObjectDefinitionKey businessObjectDefinitionKey = new BusinessObjectDefinitionKey(null, "BDEF"); UploadBusinessObjectDefinitionSampleDataFileInitiationRequest request = new UploadBusinessObjectDefinitionSampleDataFileInitiationRequest(businessObjectDefinitionKey); uploadDownloadService.initiateUploadSampleFile(request); fail(); } catch (IllegalArgumentException e) { assertEquals("A namespace must be specified.", e.getMessage()); } } @Test public void testUploadBusinessObjectDefinitionSampleFileInvalidParameter() { BusinessObjectDefinitionKey businessObjectDefinitionKey = new BusinessObjectDefinitionKey(NAMESPACE, BDEF_NAME); UploadBusinessObjectDefinitionSampleDataFileInitiationRequest request = new UploadBusinessObjectDefinitionSampleDataFileInitiationRequest(businessObjectDefinitionKey); try { uploadDownloadService.initiateUploadSampleFile(request); fail(); } catch (ObjectNotFoundException e) { assertEquals(businessObjectDefinitionServiceTestHelper.getExpectedBusinessObjectDefinitionNotFoundErrorMessage(NAMESPACE, BDEF_NAME), e.getMessage()); } } @Test public void testUploadBusinessObjectDefinitionSampleFileMissingTemplate() { //String s3_velocity_template = "$namespace/$businessObjectDefinitionName"; String expectedS3Keyprefix = NAMESPACE.toLowerCase() + "/" + BDEF_NAME.toLowerCase() + "/"; expectedS3Keyprefix = expectedS3Keyprefix.replace("_", "-"); // 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); try { uploadDownloadService.initiateUploadSampleFile(request); fail(); } catch (IllegalArgumentException e) { assertEquals(String.format("Storage \"%s\" has no S3 key prefix velocity template configured.", StorageEntity.SAMPLE_DATA_FILE_STORAGE), e.getMessage()); } } }