/* * 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.tools.downloader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.commons.io.FileUtils; import org.junit.Before; import org.springframework.beans.factory.annotation.Autowired; import org.finra.herd.model.api.xml.BusinessObjectData; import org.finra.herd.model.api.xml.BusinessObjectDataKey; import org.finra.herd.model.dto.DownloaderInputManifestDto; import org.finra.herd.model.dto.ManifestFile; import org.finra.herd.model.dto.RegServerAccessParamsDto; import org.finra.herd.model.dto.S3FileTransferRequestParamsDto; import org.finra.herd.model.dto.UploaderInputManifestDto; import org.finra.herd.model.jpa.BusinessObjectDataStatusEntity; import org.finra.herd.model.jpa.StorageEntity; import org.finra.herd.tools.common.databridge.AbstractDataBridgeTest; /** * This is an abstract base class that provides useful methods for downloader test drivers. */ public abstract class AbstractDownloaderTest extends AbstractDataBridgeTest { /** * Downloader web client. */ @Autowired protected DownloaderWebClient downloaderWebClient; /** * Provide easy access to the DownloaderManifestReader instance for all test methods. */ @Autowired protected DownloaderManifestReader downloaderManifestReader; /** * Provide easy access to the DownloaderController for all test methods. */ @Autowired protected DownloaderController downloaderController; /** * Sets up the test environment. */ @Before public void setupEnv() throws IOException { super.setupEnv(); // Create and initialize a downloader web client instance. RegServerAccessParamsDto regServerAccessParamsDto = RegServerAccessParamsDto.builder().regServerHost(WEB_SERVICE_HOSTNAME).regServerPort(WEB_SERVICE_HTTPS_PORT).useSsl(true) .username(WEB_SERVICE_HTTPS_USERNAME).password(WEB_SERVICE_HTTPS_PASSWORD).build(); downloaderWebClient.setRegServerAccessParamsDto(regServerAccessParamsDto); } /** * Returns a downloader input downloaderInputManifestDto instance initialized per hard coded test values. * * @return the resulting DownloaderInputManifestDto instance */ protected DownloaderInputManifestDto getTestDownloaderInputManifestDto() { DownloaderInputManifestDto manifest = new DownloaderInputManifestDto(); manifest.setNamespace(TEST_NAMESPACE); manifest.setBusinessObjectDefinitionName(TEST_BUSINESS_OBJECT_DEFINITION); manifest.setBusinessObjectFormatUsage(TEST_BUSINESS_OBJECT_FORMAT_USAGE); manifest.setBusinessObjectFormatFileType(TEST_BUSINESS_OBJECT_FORMAT_FILE_TYPE); manifest.setBusinessObjectFormatVersion(TEST_BUSINESS_OBJECT_FORMAT_VERSION.toString()); manifest.setPartitionKey(TEST_BUSINESS_OBJECT_FORMAT_PARTITION_KEY); manifest.setPartitionValue(TEST_PARTITION_VALUE); manifest.setSubPartitionValues(TEST_SUB_PARTITION_VALUES); manifest.setBusinessObjectDataVersion(TEST_DATA_VERSION_V0.toString()); return manifest; } /** * Uploads and registers a version if of the test business object data with the specified data files. * * @param s3KeyPrefix the destination S3 key prefix that must comply with the S3 naming conventions including the expected data version value * @param manifestFiles the test data files to be uploaded to S3 and registered */ protected void uploadAndRegisterTestData(String s3KeyPrefix, List<ManifestFile> manifestFiles) throws Exception { uploadAndRegisterTestData(s3KeyPrefix, manifestFiles, new ArrayList<String>()); } /** * Uploads and registers a version if of the test business object data with the specified data files. * * @param s3KeyPrefix the destination S3 key prefix that must comply with the S3 naming conventions including the expected data version value * @param manifestFiles the test data files to be uploaded to S3 and registered * @param directoryPaths the list of directory paths to be created in S3 relative to the S3 key prefix */ protected void uploadAndRegisterTestData(String s3KeyPrefix, List<ManifestFile> manifestFiles, List<String> directoryPaths) throws Exception { uploadTestDataFilesToS3(s3KeyPrefix, manifestFiles, directoryPaths); UploaderInputManifestDto uploaderInputManifestDto = getTestUploaderInputManifestDto(); uploaderInputManifestDto.setManifestFiles(manifestFiles); S3FileTransferRequestParamsDto s3FileTransferRequestParamsDto = getTestS3FileTransferRequestParamsDto(); s3FileTransferRequestParamsDto.setS3KeyPrefix(s3KeyPrefix + "/"); BusinessObjectData businessObjectData = downloaderWebClient.preRegisterBusinessObjectData(uploaderInputManifestDto, StorageEntity.MANAGED_STORAGE, false); BusinessObjectDataKey businessObjectDataKey = businessObjectDataHelper.getBusinessObjectDataKey(businessObjectData); downloaderWebClient.addStorageFiles(businessObjectDataKey, uploaderInputManifestDto, s3FileTransferRequestParamsDto, StorageEntity.MANAGED_STORAGE); downloaderWebClient.updateBusinessObjectDataStatus(businessObjectDataKey, BusinessObjectDataStatusEntity.VALID); // Clean up the local input directory used for the test data files upload. FileUtils.cleanDirectory(LOCAL_TEMP_PATH_INPUT.toFile()); } /** * Uploads and registers a version if of the test business object data. * * @param s3KeyPrefix the destination S3 key prefix that must comply with the S3 naming conventions including the expected data version value */ protected void uploadAndRegisterTestData(String s3KeyPrefix) throws Exception { uploadAndRegisterTestData(s3KeyPrefix, testManifestFiles); } }