package tw.com.integration; import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; import com.amazonaws.services.cloudformation.model.Parameter; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.AmazonS3Exception; import com.amazonaws.services.s3.model.S3ObjectSummary; import org.apache.commons.io.FilenameUtils; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import tw.com.EnvironmentSetupForTests; import tw.com.FilesForTesting; import tw.com.providers.ArtifactUploader; import java.io.File; import java.io.FilenameFilter; import java.util.LinkedList; import java.util.List; import static org.junit.Assert.*; public class TestArtifactUploader { private static final Integer BUILD_NUMBER = 6574; private static final String KEY_A = BUILD_NUMBER+"/instance.json"; private static final String KEY_B = BUILD_NUMBER+"/simpleStack.json"; private static AmazonS3Client s3Client; @BeforeClass public static void beforeAllTestsRun() { s3Client = EnvironmentSetupForTests.createS3Client(new DefaultAWSCredentialsProviderChain()); } @After public void afterEachTestHasRun() { deleteTestKeysFromBucket(); } @Before public void beforeEachTestRuns() { deleteTestKeysFromBucket(); } private void deleteTestKeysFromBucket() { try { s3Client.deleteObject(EnvironmentSetupForTests.BUCKET_NAME, KEY_A); s3Client.deleteObject(EnvironmentSetupForTests.BUCKET_NAME, KEY_B); s3Client.deleteObject(EnvironmentSetupForTests.BUCKET_NAME, BUILD_NUMBER+"/cfnassit-1.0.DEV.zip"); s3Client.deleteObject(EnvironmentSetupForTests.BUCKET_NAME, BUILD_NUMBER+"/01createSubnet.json"); s3Client.deleteObject(EnvironmentSetupForTests.BUCKET_NAME, BUILD_NUMBER+"/02createAcls.json"); } catch(AmazonS3Exception exception) { System.out.println(exception); } } @Test public void expectUploadFilesAndURLsReturnedBack() { List<Parameter> arts = new LinkedList<>(); // any files would do here Parameter artA = new Parameter().withParameterKey("urlA").withParameterValue(FilesForTesting.INSTANCE); Parameter artB = new Parameter().withParameterKey("urlB").withParameterValue(FilesForTesting.SIMPLE_STACK); arts.add(artA); arts.add(artB); ArtifactUploader uploader = new ArtifactUploader(s3Client, EnvironmentSetupForTests.BUCKET_NAME, BUILD_NUMBER); List<Parameter> results = uploader.uploadArtifacts(arts); assertEquals(arts.size(), results.size()); // expect keys remains same assertEquals(arts.get(0).getParameterKey(), results.get(0).getParameterKey()); assertEquals(arts.get(1).getParameterKey(), results.get(1).getParameterKey()); // expect value the S3 URL assertEquals(EnvironmentSetupForTests.S3_PREFIX+"/"+KEY_A, results.get(0).getParameterValue()); assertEquals(EnvironmentSetupForTests.S3_PREFIX+"/"+KEY_B, results.get(1).getParameterValue()); // check upload actually happened List<S3ObjectSummary> objectSummaries = EnvironmentSetupForTests.getBucketObjects(s3Client); assertTrue(EnvironmentSetupForTests.isContainedIn(objectSummaries, KEY_A)); assertTrue(EnvironmentSetupForTests.isContainedIn(objectSummaries, KEY_B)); } @Test public void expectUploadDirWithFolderURLReturnedBack() { List<Parameter> arts = new LinkedList<>(); // any folder with files would do here String folderPath = FilesForTesting.ORDERED_SCRIPTS_FOLDER; File folder = new File(folderPath); FilenameFilter filter = (dir, name) -> name.endsWith(".json"); String[] filesOnDisc = folder.list(filter); Parameter folderParam = new Parameter().withParameterKey("folder").withParameterValue(folderPath); arts.add(folderParam); ArtifactUploader uploader = new ArtifactUploader(s3Client, EnvironmentSetupForTests.BUCKET_NAME, BUILD_NUMBER); List<Parameter> results = uploader.uploadArtifacts(arts); assertEquals(1, results.size()); String s3Prefix = EnvironmentSetupForTests.S3_PREFIX+"/"+BUILD_NUMBER; assertEquals(s3Prefix, results.get(0).getParameterValue()); List<S3ObjectSummary> objectSummaries = EnvironmentSetupForTests.getBucketObjects(s3Client); assertEquals(filesOnDisc.length, objectSummaries.size()); for(String file : filesOnDisc) { EnvironmentSetupForTests.isContainedIn(objectSummaries, String.format("%s/%s", s3Prefix, FilenameUtils.getName(file))); } } @Test public void canDeleteArtifactsFromS3() { List<Parameter> arts = new LinkedList<>(); // any files would do here Parameter artA = new Parameter().withParameterKey("urlA").withParameterValue(FilesForTesting.INSTANCE); arts.add(artA); ArtifactUploader uploader = new ArtifactUploader(s3Client, EnvironmentSetupForTests.BUCKET_NAME, BUILD_NUMBER); uploader.uploadArtifacts(arts); // check upload actually happened List<S3ObjectSummary> objectSummaries = EnvironmentSetupForTests.getBucketObjects(s3Client); assertTrue(EnvironmentSetupForTests.isContainedIn(objectSummaries, KEY_A)); uploader.delete("instance.json"); objectSummaries = EnvironmentSetupForTests.getBucketObjects(s3Client); assertFalse(EnvironmentSetupForTests.isContainedIn(objectSummaries, KEY_A)); } // @Test // @Ignore("For debugging of large file uploads only") // public void testUploadLargeFile() { // List<Parameter> arts = new LinkedList<Parameter>(); // Parameter artA = new Parameter().withParameterKey("urlA").withParameterValue("cfnassit-1.0.DEV.zip"); // // arts.add(artA); // // ArtifactUploader uploader = new ArtifactUploader(s3Client, EnvironmentSetupForTests.BUCKET_NAME, BUILD_NUMBER); // uploader.uploadArtifacts(arts); // // } }