From 31c6457f4325d634db7730381d7e2c4baec6c7a8 Mon Sep 17 00:00:00 2001 From: Adrian Clay Date: Sun, 1 Sep 2024 11:56:28 +0100 Subject: [PATCH 01/14] Migrate from v1 to v2 of AWS SDK for Java v1 stops getting updates as of Dec 2025 --- service/build.gradle | 2 +- .../configuration/CustomTrustStore.java | 25 ++++++++------- .../common/storage/S3StorageConnector.java | 31 +++++++++---------- .../StorageConnectorConfiguration.java | 9 ++---- 4 files changed, 32 insertions(+), 35 deletions(-) diff --git a/service/build.gradle b/service/build.gradle index 80906fdc7f..73311c4904 100644 --- a/service/build.gradle +++ b/service/build.gradle @@ -49,7 +49,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-logging' // Infrastructure - implementation 'com.amazonaws:aws-java-sdk-s3:1.12.767' + implementation 'software.amazon.awssdk:s3:2.27.17' implementation ('com.azure:azure-storage-blob:12.27.1') implementation 'org.apache.qpid:qpid-jms-client:2.5.0' diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStore.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStore.java index 82fce457f8..0f1be6bafe 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStore.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStore.java @@ -1,5 +1,6 @@ package uk.nhs.adaptors.gp2gp.common.configuration; +import java.net.URI; import java.security.KeyStore; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; @@ -11,10 +12,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; - -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3URI; -import com.amazonaws.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.core.ResponseInputStream; +import software.amazon.awssdk.services.s3.S3Uri; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import lombok.NoArgsConstructor; @@ -27,12 +29,13 @@ @NoArgsConstructor public class CustomTrustStore { @Autowired(required = false) - private AmazonS3 s3Client; + private S3Client s3Client; @SneakyThrows public void addToDefault(String trustStorePath, String trustStorePassword) { final X509TrustManager defaultTrustManager = getDefaultTrustManager(); - final X509TrustManager customTrustManager = getCustomDbTrustManager(new AmazonS3URI(trustStorePath), trustStorePassword); + final var s3Uri = s3Client.utilities().parseUri(URI.create(trustStorePath)); + final X509TrustManager customTrustManager = getCustomDbTrustManager(s3Uri, trustStorePassword); X509TrustManager combinedTrustManager = new CombinedTrustManager(customTrustManager, defaultTrustManager); SSLContext sslContext = SSLContext.getInstance("TLS"); @@ -56,15 +59,15 @@ private X509TrustManager getDefaultTrustManager() { @SneakyThrows @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") - private X509TrustManager getCustomDbTrustManager(AmazonS3URI s3URI, String trustStorePassword) { + private X509TrustManager getCustomDbTrustManager(S3Uri s3Uri, String trustStorePassword) { TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init((KeyStore) null); - LOGGER.info("Loading custom KeyStore from '{}'", s3URI.toString()); - try (var s3Object = s3Client.getObject(new GetObjectRequest(s3URI.getBucket(), s3URI.getKey())); - var content = s3Object.getObjectContent()) { + LOGGER.info("Loading custom KeyStore from '{}'", s3Uri.toString()); + final var getObjectRequest = GetObjectRequest.builder().bucket(s3Uri.bucket().orElseThrow()).key(s3Uri.key().orElseThrow()).build(); + try (ResponseInputStream s3Object = s3Client.getObject(getObjectRequest)) { KeyStore customKeyStore = KeyStore.getInstance(KeyStore.getDefaultType()); - customKeyStore.load(content, trustStorePassword.toCharArray()); + customKeyStore.load(s3Object, trustStorePassword.toCharArray()); trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(customKeyStore); } diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnector.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnector.java index e5f736e4dc..380b4cd6dd 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnector.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnector.java @@ -2,33 +2,30 @@ import java.io.InputStream; -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3ClientBuilder; -import com.amazonaws.services.s3.model.ObjectMetadata; -import com.amazonaws.services.s3.model.S3Object; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.core.ResponseInputStream; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; public class S3StorageConnector implements StorageConnector { - private final AmazonS3 s3client; + private final S3Client s3client; private final String bucketName; protected S3StorageConnector(StorageConnectorConfiguration configuration) { this.bucketName = configuration.getContainerName(); - this.s3client = AmazonS3ClientBuilder - .standard() - .build(); + this.s3client = S3Client.builder().build(); } @Override public void uploadToStorage(InputStream is, long streamLength, String filename) throws StorageConnectorException { try { - ObjectMetadata metadata = new ObjectMetadata(); - metadata.setContentLength(streamLength); + final var putObjectRequest = PutObjectRequest.builder().bucket(bucketName).key(filename).build(); s3client.putObject( - bucketName, - filename, - is, - metadata + putObjectRequest, + RequestBody.fromInputStream(is, streamLength) ); } catch (Exception exception) { throw new StorageConnectorException("Error occurred uploading to S3 Bucket", exception); @@ -36,10 +33,10 @@ public void uploadToStorage(InputStream is, long streamLength, String filename) } @Override - public InputStream downloadFromStorage(String filename) throws StorageConnectorException { + public ResponseInputStream downloadFromStorage(String filename) throws StorageConnectorException { try { - S3Object s3Object = s3client.getObject(bucketName, filename); - return s3Object.getObjectContent(); + final var request = GetObjectRequest.builder().bucket(bucketName).key(filename).build(); + return s3client.getObject(request); } catch (Exception exception) { throw new StorageConnectorException("Error occurred downloading from S3 Bucket", exception); } diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java index 01e79aea8c..6b3079a08d 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java @@ -5,8 +5,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import software.amazon.awssdk.services.s3.S3Client; import lombok.Getter; import lombok.Setter; @@ -25,11 +24,9 @@ public class StorageConnectorConfiguration { private String trustStorePassword; @Bean - @SuppressWarnings("unused") - public AmazonS3 getS3Client() { + public S3Client getS3Client() { if (StringUtils.isNotBlank(trustStoreUrl) && trustStoreUrl.startsWith(S3_PREFIX)) { - return AmazonS3ClientBuilder.standard() - .build(); + return S3Client.builder().build(); } return null; From e977062e6f18e21d3a871436c1ebb22b2e64191e Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Tue, 7 Jan 2025 13:38:33 +0000 Subject: [PATCH 02/14] excluding intTests from unit tests --- .github/workflows/build_workflow.yml | 4 ++-- service/build.gradle | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_workflow.yml b/.github/workflows/build_workflow.yml index 31e087e5bb..ec8a545efb 100644 --- a/.github/workflows/build_workflow.yml +++ b/.github/workflows/build_workflow.yml @@ -109,9 +109,9 @@ jobs: - name: Execute Unit Tests run: | if [[ $GITHUB_ACTOR == 'dependabot[bot]' ]]; then - ./gradlew test jacocoTestReport --parallel --build-cache + ./gradlew test jacocoTestReport -x integrationTest --parallel --build-cache else - ./gradlew test jacocoTestReport sonar --parallel --build-cache + ./gradlew test jacocoTestReport sonar -x integrationTest --parallel --build-cache fi working-directory: ./service env: diff --git a/service/build.gradle b/service/build.gradle index f877ca1f54..da802eceb8 100644 --- a/service/build.gradle +++ b/service/build.gradle @@ -50,7 +50,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-logging' // Infrastructure - implementation 'software.amazon.awssdk:s3:2.27.17' + implementation 'software.amazon.awssdk:s3:2.28.29' implementation ('com.azure:azure-storage-blob:12.29.0') implementation 'org.apache.qpid:qpid-jms-client:2.6.1' @@ -179,3 +179,5 @@ sonar { bootJar { exclude("**/TransformJsonToXml*") } + +integrationTest.mustRunAfter test From 798de72d52105d32c60d643cbb51df2c85e430c0 Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Tue, 7 Jan 2025 14:48:47 +0000 Subject: [PATCH 03/14] code test coverage threshold increase --- .../common/storage/S3StorageConnector.java | 4 +- .../storage/StorageConnectorFactory.java | 3 +- .../storage/S3StorageConnectorTest.java | 62 +++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnector.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnector.java index 380b4cd6dd..142b300713 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnector.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnector.java @@ -13,9 +13,9 @@ public class S3StorageConnector implements StorageConnector { private final S3Client s3client; private final String bucketName; - protected S3StorageConnector(StorageConnectorConfiguration configuration) { + protected S3StorageConnector(S3Client s3client, StorageConnectorConfiguration configuration) { this.bucketName = configuration.getContainerName(); - this.s3client = S3Client.builder().build(); + this.s3client = s3client; } @Override diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactory.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactory.java index 6aee67c615..bdef845cc7 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactory.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactory.java @@ -3,6 +3,7 @@ import org.springframework.beans.factory.FactoryBean; import lombok.Setter; +import software.amazon.awssdk.services.s3.S3Client; @Setter public class StorageConnectorFactory implements FactoryBean { @@ -15,7 +16,7 @@ public StorageConnector getObject() { if (storageConnector == null) { switch (StorageConnectorOptions.enumOf(configuration.getType())) { case S3: - storageConnector = new S3StorageConnector(configuration); + storageConnector = new S3StorageConnector(S3Client.builder().build(), configuration); break; case AZURE: storageConnector = new AzureStorageConnector(); diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java new file mode 100644 index 0000000000..9bd50be16d --- /dev/null +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java @@ -0,0 +1,62 @@ +package uk.nhs.adaptors.gp2gp.common.storage; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import software.amazon.awssdk.core.ResponseInputStream; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; +import java.io.ByteArrayInputStream; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class S3StorageConnectorTest { + + private static final String FILE_NAME = "test-file.txt"; + private S3StorageConnector s3StorageConnector; + private StorageConnectorConfiguration config; + @Mock + private S3Client mockS3Client; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + + config = new StorageConnectorConfiguration(); + config.setContainerName("s3Bucket"); + + s3StorageConnector = new S3StorageConnector(mockS3Client, config); + } + + + @Test + void expectExceptionWhenS3ClientCantDeliverResponse() { + s3StorageConnector = new S3StorageConnector(S3Client.builder().build(), config); + Exception exception = assertThrows(StorageConnectorException.class, + () -> s3StorageConnector.downloadFromStorage("s3File")); + + assertEquals("Error occurred downloading from S3 Bucket", exception.getMessage()); + } + + @Test + void downloadFromStorage() { + var mockResponse = mock(GetObjectResponse.class); + var mockInputStream = new ByteArrayInputStream("dummy-content".getBytes()); + var mockResponseInputStream = new ResponseInputStream<>(mockResponse, mockInputStream); + + when(mockS3Client.getObject(any(GetObjectRequest.class))).thenReturn(mockResponseInputStream); + + var result = s3StorageConnector.downloadFromStorage(FILE_NAME); + + assertNotNull(result); + verify(mockS3Client).getObject(any(GetObjectRequest.class)); + } +} \ No newline at end of file From 49ecd27ac8cf61515260b3ec62bf475ed8caa9ac Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Wed, 8 Jan 2025 10:06:48 +0000 Subject: [PATCH 04/14] adjusting tests to satisfy more permutations --- .../gp2gp/common/storage/S3StorageConnectorTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java index 9bd50be16d..f6d03f1b45 100644 --- a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java @@ -13,7 +13,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -39,9 +38,9 @@ void setUp() { @Test void expectExceptionWhenS3ClientCantDeliverResponse() { - s3StorageConnector = new S3StorageConnector(S3Client.builder().build(), config); + S3StorageConnector storageConnector = new S3StorageConnector(S3Client.builder().build(), config); Exception exception = assertThrows(StorageConnectorException.class, - () -> s3StorageConnector.downloadFromStorage("s3File")); + () -> storageConnector.downloadFromStorage("s3File")); assertEquals("Error occurred downloading from S3 Bucket", exception.getMessage()); } @@ -51,12 +50,13 @@ void downloadFromStorage() { var mockResponse = mock(GetObjectResponse.class); var mockInputStream = new ByteArrayInputStream("dummy-content".getBytes()); var mockResponseInputStream = new ResponseInputStream<>(mockResponse, mockInputStream); + final var request = GetObjectRequest.builder().bucket(config.getContainerName()).key(FILE_NAME).build(); - when(mockS3Client.getObject(any(GetObjectRequest.class))).thenReturn(mockResponseInputStream); + when(mockS3Client.getObject(request)).thenReturn(mockResponseInputStream); var result = s3StorageConnector.downloadFromStorage(FILE_NAME); assertNotNull(result); - verify(mockS3Client).getObject(any(GetObjectRequest.class)); + verify(mockS3Client).getObject(request); } } \ No newline at end of file From 74d85fa4d6fc3002470f2755d77b87e3e4b8b677 Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Thu, 9 Jan 2025 09:56:43 +0000 Subject: [PATCH 05/14] increasing test coverage --- .../configuration/CustomTrustStore.java | 6 +- .../configuration/CustomTrustStoreTest.java | 67 ++++++++++++++++++ .../storage/S3StorageConnectorTest.java | 24 ++++++- .../StorageConnectorConfigurationTest.java | 24 +++++++ service/src/test/resources/test.jks | Bin 0 -> 2720 bytes 5 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java create mode 100644 service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfigurationTest.java create mode 100644 service/src/test/resources/test.jks diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStore.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStore.java index c006d07988..0fa7f2b972 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStore.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStore.java @@ -31,6 +31,10 @@ public class CustomTrustStore { @Autowired(required = false) private S3Client s3Client; + public void setS3Client(S3Client s3Client) { + this.s3Client = s3Client; + } + @SneakyThrows public void addToDefault(String trustStorePath, String trustStorePassword) { final X509TrustManager defaultTrustManager = getDefaultTrustManager(); @@ -59,7 +63,7 @@ private X509TrustManager getDefaultTrustManager() { @SneakyThrows @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE") - private X509TrustManager getCustomDbTrustManager(S3Uri s3Uri, String trustStorePassword) { + protected X509TrustManager getCustomDbTrustManager(S3Uri s3Uri, String trustStorePassword) { TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init((KeyStore) null); diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java new file mode 100644 index 0000000000..018052471a --- /dev/null +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java @@ -0,0 +1,67 @@ +package uk.nhs.adaptors.gp2gp.common.configuration; + +import io.findify.s3mock.S3Mock; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.S3Configuration; +import software.amazon.awssdk.services.s3.model.CreateBucketRequest; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; + +import java.io.File; +import java.net.URI; + +import static org.junit.jupiter.api.Assertions.*; +class CustomTrustStoreTest { + + public static final int PORT = 8001; + private static S3Mock s3Mock; + private static S3Client s3Client; + private static final String BUCKET_NAME = "test-bucket"; + private static final String TRUSTSTORE_PATH = "test.jks"; + private static final String TRUSTSTORE_PASSWORD = "password"; + + private final CustomTrustStore customTrustStore = new CustomTrustStore(); + + @BeforeAll + static void setUp() { + s3Mock = new S3Mock.Builder().withPort(PORT).withInMemoryBackend().build(); + s3Mock.start(); + System.out.println("S3Mock started at http://localhost:" + PORT); + + s3Client = S3Client.builder() + .endpointOverride(URI.create("http://localhost:" + PORT)) + .credentialsProvider(StaticCredentialsProvider.create( + AwsBasicCredentials.create("accessKey", "secretKey"))) + .region(Region.US_EAST_1) + .serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build()) + .build(); + + s3Client.createBucket(CreateBucketRequest.builder().bucket(BUCKET_NAME).build()); + + File trustStoreFile = new File("src/test/resources/test.jks"); + s3Client.putObject(PutObjectRequest.builder().bucket(BUCKET_NAME).key(TRUSTSTORE_PATH).build(), + software.amazon.awssdk.core.sync.RequestBody.fromFile(trustStoreFile)); + } + + @AfterAll + static void tearDown() { + s3Mock.shutdown(); + } + + @Test + void trustManagerLoadsSuccessfullyTest() { + + customTrustStore.setS3Client(s3Client); + + String s3Uri = "s3://" + BUCKET_NAME + "/" + TRUSTSTORE_PATH; + + var trustManager = customTrustStore.getCustomDbTrustManager(s3Client.utilities().parseUri(URI.create(s3Uri)), TRUSTSTORE_PASSWORD); + + assertNotNull(trustManager, "Custom TrustManager wasn't loaded successfully!"); + } +} \ No newline at end of file diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java index f6d03f1b45..d242ef6039 100644 --- a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java @@ -5,15 +5,22 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import software.amazon.awssdk.core.ResponseInputStream; +import software.amazon.awssdk.core.sync.RequestBody; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.GetObjectResponse; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; + import java.io.ByteArrayInputStream; +import java.io.InputStream; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -22,9 +29,14 @@ class S3StorageConnectorTest { private static final String FILE_NAME = "test-file.txt"; private S3StorageConnector s3StorageConnector; private StorageConnectorConfiguration config; + private static final long STREAM_LENGTH = 100L; + @Mock private S3Client mockS3Client; + @Mock + private InputStream is; + @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); @@ -46,7 +58,7 @@ void expectExceptionWhenS3ClientCantDeliverResponse() { } @Test - void downloadFromStorage() { + void downloadFromStorageTest() { var mockResponse = mock(GetObjectResponse.class); var mockInputStream = new ByteArrayInputStream("dummy-content".getBytes()); var mockResponseInputStream = new ResponseInputStream<>(mockResponse, mockInputStream); @@ -59,4 +71,14 @@ void downloadFromStorage() { assertNotNull(result); verify(mockS3Client).getObject(request); } + + @Test + void uploadToStorageTest() { + final var expectedRequest = PutObjectRequest.builder().bucket(config.getContainerName()).key(FILE_NAME).build(); + + s3StorageConnector.uploadToStorage(is, STREAM_LENGTH, FILE_NAME); + + verify(mockS3Client, times(1)).putObject(eq(expectedRequest), any(RequestBody.class)); + } + } \ No newline at end of file diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfigurationTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfigurationTest.java new file mode 100644 index 0000000000..d5abdff635 --- /dev/null +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfigurationTest.java @@ -0,0 +1,24 @@ +package uk.nhs.adaptors.gp2gp.common.storage; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class StorageConnectorConfigurationTest { + + private StorageConnectorConfiguration configuration; + + @BeforeEach + void setUp() { + configuration = new StorageConnectorConfiguration(); + configuration.setTrustStoreUrl("s3://my-trust-store"); + } + + @Test + void expectToReturnS3ClientTest() { + var s3Client = configuration.getS3Client(); + + assertNotNull(s3Client); + } +} \ No newline at end of file diff --git a/service/src/test/resources/test.jks b/service/src/test/resources/test.jks new file mode 100644 index 0000000000000000000000000000000000000000..4435d8acfbe4986e76afff47a976a4734219f102 GIT binary patch literal 2720 zcma)8XE+;*8crgK8LE_`LaALuW3^3jkWi%#t%lm0l&aD8P$P{!S{jF_nHn`htr$g( z9-G=*sWvrYk6N{k``r8VJoneVKfd>SzW4p!@8|n`2m(tg2*`jSuwbCf(qXz`yD%Ul zkW64v0TWn|r?fnR0IB>h36cvYK(bEhjMGYivi`@##sUP92@s7_5`}R3<$%BtW(d`P zMmB^Dm|K65%gM|Nfwtya^pmZk*=_?~5R22mm1nWwr^^1v)Z- zfzseJGbvMT*}^HuyoD8!78BhZU;?;Lmf0FbO3f>wQ$%kc^QWd6R~1c*XAWhb3fQ?6nehh?9+Y zLoT<{KPy5qYH{8``FB(DM#of*=-aqUo=?pl-_fy^e@$u8ZZ5h-oQ}4hy7@r;fkVfAut_h9UgDIs11D||`TxM%ZPH{r zFwO)EdQ+%4{KM)ZqW!M{QE|emu6JS3c_}l|=?L!iDpX}`{Uc$jUWQXsmOArCm9njm z6*P&P^_HNSDmHTT*}maCEtJWhvZxIYxAW2ThK0vw+xV@S8|f@OaDHFmKtwnZsu@#; z7FhR0fk7;=VP~+x@H7t>)sE0 zvBugL@^_8Lu_a=ir^ZmIruGWP2nH&Xhd+Nva4=`Qvd$V`cpUb`q*$9{TaCrS1o3XcDNq4f# zTt6CZIo*=O`^QnBvD6&X@NE89L&< zW)lt6ij#Fc#JF79uWaX$sNXNa&v!KUb?$r}SUtJzI}E#rALt!}tF0!x+(X5WP#f{Z z_R(r%iD`Tw=p{@?TSG(FgDY~bB_=u#SDtu9b+-H!vY_V^Ih-F*e7lKPCD2tXPd&uQ z$hfb;(R4srjC4M2TF&oL76+ryq5M&)b%a#A>qN<1Nb~XLVh?Tgi05dPd}+{JRQ#aH zBPa=wrJ@S0s>AO_8$fKzv7xU9uU)Nhx)CNhz#R}R9R#i zAZq`gxPCszoBm)9ov|}?QL%0H#2!yzm;njLtYXIdW45lbx$2f;7LPv#++83jP2cQ^6=m3Isal(NKzz*FjX6_pAqC)TrG1QpojD7 z%eH>9P9^GEDOD4a#xO$3e2UFP?m&whCPZ0bQa#-E=4+`GaU;@zd(HMaY;;kOC{H2c zvK9$huc`0jRsA*$XMI)36d+P}^`TdpZ~UeVDgUm2W(_?vo9-8VcOuL~J#lYGYse<` zNh{-P=|Nh8&I<`5t{+})XSVFivt{+&>*o67O~n`c-SB;e(xmTaS1w|F-}8YE^hA^H zx4uY9Rz6HHDZ83DqEHb~&prdqbHCW1`YhvwPqwM{lcK>s#IbZKFCCMvm9+XxVp{`M4oSw5iz7rJ+OFWWHNn$sp%c)+*Zi4hD&c^Oo$llk5 zoE3|GEH)?CL?~~7JzZXlfb0xD;fq%7_M`nKBB<{uK0ah?WE678D@)A^U@+6#50aJx zq^oY?lnRG#P4n;HW@so|`Q(*e$4(Q1ckw6Qklmb^q)m(nz1dozq+5%2A2U>WGjKrD z{rPsxC7rLH$#|+dY0qg->ealW)}znQPU>j^sjpshbCF*V@Q@o?OLGH=o`2oY)_hBx zy3|K3EFK*YvV@CHNM8J?_{P-m;6)&zfE6_iKl9TqfcHs3CXKy#=cfvjv z$z)pld3ddJZ!F>gZ`|sP5E8%}zg%+^dKrhUG0!rJeEGg3*2pm7TZm3@Jb0zyFe8ERxP>k^u- zdKeQ4EZ6)=P7^j$tKIMIC|RGt%^9{Wj}w8p2m^!y0`}``0|6lburNPE2)Q>e&@P18 zrtC@`F16>}TvkEt$mnx6nE5gtybk7;?`b=HpvY$>#t~zstF%|l+kM^jUlH>+>Ad+j literal 0 HcmV?d00001 From be87fecd9fb4356125b5829895c3d124dd85f48e Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Thu, 9 Jan 2025 09:58:19 +0000 Subject: [PATCH 06/14] adding s3mock library --- service/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/service/build.gradle b/service/build.gradle index da802eceb8..0cc7557630 100644 --- a/service/build.gradle +++ b/service/build.gradle @@ -72,6 +72,7 @@ dependencies { testImplementation 'org.wiremock:wiremock-standalone:3.9.2' testImplementation 'com.squareup.okhttp3:okhttp:4.12.0' testImplementation 'com.squareup.okhttp3:mockwebserver:4.12.0' + testImplementation 'io.findify:s3mock_2.13:0.2.6' pitest 'com.arcmutate:base:1.3.1' pitest 'com.arcmutate:pitest-git-plugin:2.0.0' From 3b8b38739d237cc1e00fa1dfab310e155ab7c95f Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:06:30 +0000 Subject: [PATCH 07/14] checkstyle --- .../gp2gp/common/configuration/CustomTrustStoreTest.java | 3 +-- .../common/storage/StorageConnectorConfigurationTest.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java index 018052471a..5a495ac65f 100644 --- a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java @@ -11,11 +11,10 @@ import software.amazon.awssdk.services.s3.S3Configuration; import software.amazon.awssdk.services.s3.model.CreateBucketRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; - import java.io.File; import java.net.URI; +import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.*; class CustomTrustStoreTest { public static final int PORT = 8001; diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfigurationTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfigurationTest.java index d5abdff635..2275c73f2d 100644 --- a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfigurationTest.java +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfigurationTest.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertNotNull; class StorageConnectorConfigurationTest { From fe24287722c184039aa42498836385a5b5fbfa35 Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:31:08 +0000 Subject: [PATCH 08/14] code refactoring --- .../gp2gp/common/configuration/CustomTrustStore.java | 4 ---- .../gp2gp/common/configuration/CustomTrustStoreTest.java | 7 +++++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStore.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStore.java index 0fa7f2b972..87fcaa85ee 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStore.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStore.java @@ -31,10 +31,6 @@ public class CustomTrustStore { @Autowired(required = false) private S3Client s3Client; - public void setS3Client(S3Client s3Client) { - this.s3Client = s3Client; - } - @SneakyThrows public void addToDefault(String trustStorePath, String trustStorePassword) { final X509TrustManager defaultTrustManager = getDefaultTrustManager(); diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java index 5a495ac65f..969e009517 100644 --- a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java @@ -12,6 +12,7 @@ import software.amazon.awssdk.services.s3.model.CreateBucketRequest; import software.amazon.awssdk.services.s3.model.PutObjectRequest; import java.io.File; +import java.lang.reflect.Field; import java.net.URI; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -53,9 +54,11 @@ static void tearDown() { } @Test - void trustManagerLoadsSuccessfullyTest() { + void trustManagerLoadsSuccessfullyTest() throws NoSuchFieldException, IllegalAccessException { - customTrustStore.setS3Client(s3Client); + Field s3ClientField = CustomTrustStore.class.getDeclaredField("s3Client"); + s3ClientField.setAccessible(true); + s3ClientField.set(customTrustStore, s3Client); String s3Uri = "s3://" + BUCKET_NAME + "/" + TRUSTSTORE_PATH; From cfd35bb709ed9c331bdd26623081d6a615ec1475 Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Thu, 9 Jan 2025 11:19:28 +0000 Subject: [PATCH 09/14] specifying a region for S3Client --- .../gp2gp/common/storage/StorageConnectorConfiguration.java | 3 ++- .../gp2gp/common/storage/S3StorageConnectorTest.java | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java index 6b3079a08d..a6af1376cd 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java @@ -5,6 +5,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import lombok.Getter; @@ -26,7 +27,7 @@ public class StorageConnectorConfiguration { @Bean public S3Client getS3Client() { if (StringUtils.isNotBlank(trustStoreUrl) && trustStoreUrl.startsWith(S3_PREFIX)) { - return S3Client.builder().build(); + return S3Client.builder().region(Region.EU_WEST_2).build(); } return null; diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java index d242ef6039..9637f273e1 100644 --- a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/S3StorageConnectorTest.java @@ -6,6 +6,7 @@ import org.mockito.MockitoAnnotations; import software.amazon.awssdk.core.ResponseInputStream; import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.GetObjectRequest; import software.amazon.awssdk.services.s3.model.GetObjectResponse; @@ -49,8 +50,8 @@ void setUp() { @Test - void expectExceptionWhenS3ClientCantDeliverResponse() { - S3StorageConnector storageConnector = new S3StorageConnector(S3Client.builder().build(), config); + void expectExceptionWhenS3ClientCannotDeliverResponse() { + S3StorageConnector storageConnector = new S3StorageConnector(S3Client.builder().region(Region.EU_WEST_2).build(), config); Exception exception = assertThrows(StorageConnectorException.class, () -> storageConnector.downloadFromStorage("s3File")); From 5a72e5e971351db2f67ee3ec5f24c4d887f683e2 Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Thu, 9 Jan 2025 11:52:56 +0000 Subject: [PATCH 10/14] addressing pitest mutations --- .../storage/StorageConnectorFactory.java | 3 ++- .../storage/StorageConnectorFactoryTest.java | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactoryTest.java diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactory.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactory.java index bdef845cc7..55d0eef9ba 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactory.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactory.java @@ -3,6 +3,7 @@ import org.springframework.beans.factory.FactoryBean; import lombok.Setter; +import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; @Setter @@ -16,7 +17,7 @@ public StorageConnector getObject() { if (storageConnector == null) { switch (StorageConnectorOptions.enumOf(configuration.getType())) { case S3: - storageConnector = new S3StorageConnector(S3Client.builder().build(), configuration); + storageConnector = new S3StorageConnector(S3Client.builder().region(Region.EU_WEST_2).build(), configuration); break; case AZURE: storageConnector = new AzureStorageConnector(); diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactoryTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactoryTest.java new file mode 100644 index 0000000000..2c4ef4da4c --- /dev/null +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactoryTest.java @@ -0,0 +1,25 @@ +package uk.nhs.adaptors.gp2gp.common.storage; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; + +class StorageConnectorFactoryTest { + + private StorageConnectorFactory storageConnectorFactory; + + @BeforeEach + void setUp() { + storageConnectorFactory = new StorageConnectorFactory(); + StorageConnectorConfiguration configuration = new StorageConnectorConfiguration(); + configuration.setType(StorageConnectorOptions.S3.getStringValue()); + storageConnectorFactory.setConfiguration(configuration); + } + + @Test + void storageConnectorFactoryReturnsS3StorageConnectorTest() { + StorageConnector storageConnector = storageConnectorFactory.getObject(); + + assertInstanceOf(S3StorageConnector.class, storageConnector); + } +} \ No newline at end of file From fe5ea1ec40b635690d68e798381af28970f047ad Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Fri, 10 Jan 2025 10:04:52 +0000 Subject: [PATCH 11/14] small code refactoring --- .../gp2gp/common/storage/StorageConnectorConfiguration.java | 4 +++- .../gp2gp/common/configuration/CustomTrustStoreTest.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java index a6af1376cd..0e0c522c19 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java @@ -16,6 +16,8 @@ @Configuration @ConfigurationProperties(prefix = "gp2gp.storage") public class StorageConnectorConfiguration { + + private static final Region REGION = Region.EU_WEST_2; private static final String S3_PREFIX = "s3"; private String type; @@ -27,7 +29,7 @@ public class StorageConnectorConfiguration { @Bean public S3Client getS3Client() { if (StringUtils.isNotBlank(trustStoreUrl) && trustStoreUrl.startsWith(S3_PREFIX)) { - return S3Client.builder().region(Region.EU_WEST_2).build(); + return S3Client.builder().region(REGION).build(); } return null; diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java index 969e009517..4a2386512e 100644 --- a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java @@ -37,7 +37,7 @@ static void setUp() { .endpointOverride(URI.create("http://localhost:" + PORT)) .credentialsProvider(StaticCredentialsProvider.create( AwsBasicCredentials.create("accessKey", "secretKey"))) - .region(Region.US_EAST_1) + .region(Region.EU_WEST_2) .serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build()) .build(); From 93112f15feeb1b59c35b706bc5a03ed350092e27 Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:15:22 +0000 Subject: [PATCH 12/14] refactoring to remove dependency on hardcoded region --- .../StorageConnectorConfiguration.java | 4 +-- .../storage/StorageConnectorFactory.java | 4 +-- .../configuration/CustomTrustStoreTest.java | 2 +- .../StorageConnectorConfigurationTest.java | 24 ------------------ .../storage/StorageConnectorFactoryTest.java | 25 ------------------- 5 files changed, 3 insertions(+), 56 deletions(-) delete mode 100644 service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfigurationTest.java delete mode 100644 service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactoryTest.java diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java index 0e0c522c19..1a5282651b 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfiguration.java @@ -5,7 +5,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import lombok.Getter; @@ -17,7 +16,6 @@ @ConfigurationProperties(prefix = "gp2gp.storage") public class StorageConnectorConfiguration { - private static final Region REGION = Region.EU_WEST_2; private static final String S3_PREFIX = "s3"; private String type; @@ -29,7 +27,7 @@ public class StorageConnectorConfiguration { @Bean public S3Client getS3Client() { if (StringUtils.isNotBlank(trustStoreUrl) && trustStoreUrl.startsWith(S3_PREFIX)) { - return S3Client.builder().region(REGION).build(); + return S3Client.builder().build(); } return null; diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactory.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactory.java index 55d0eef9ba..7f817de7b5 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactory.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactory.java @@ -1,9 +1,7 @@ package uk.nhs.adaptors.gp2gp.common.storage; import org.springframework.beans.factory.FactoryBean; - import lombok.Setter; -import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; @Setter @@ -17,7 +15,7 @@ public StorageConnector getObject() { if (storageConnector == null) { switch (StorageConnectorOptions.enumOf(configuration.getType())) { case S3: - storageConnector = new S3StorageConnector(S3Client.builder().region(Region.EU_WEST_2).build(), configuration); + storageConnector = new S3StorageConnector(S3Client.builder().build(), configuration); break; case AZURE: storageConnector = new AzureStorageConnector(); diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java index 4a2386512e..6ac2d74565 100644 --- a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/configuration/CustomTrustStoreTest.java @@ -37,8 +37,8 @@ static void setUp() { .endpointOverride(URI.create("http://localhost:" + PORT)) .credentialsProvider(StaticCredentialsProvider.create( AwsBasicCredentials.create("accessKey", "secretKey"))) - .region(Region.EU_WEST_2) .serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build()) + .region(Region.EU_WEST_2) .build(); s3Client.createBucket(CreateBucketRequest.builder().bucket(BUCKET_NAME).build()); diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfigurationTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfigurationTest.java deleted file mode 100644 index 2275c73f2d..0000000000 --- a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorConfigurationTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package uk.nhs.adaptors.gp2gp.common.storage; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertNotNull; - -class StorageConnectorConfigurationTest { - - private StorageConnectorConfiguration configuration; - - @BeforeEach - void setUp() { - configuration = new StorageConnectorConfiguration(); - configuration.setTrustStoreUrl("s3://my-trust-store"); - } - - @Test - void expectToReturnS3ClientTest() { - var s3Client = configuration.getS3Client(); - - assertNotNull(s3Client); - } -} \ No newline at end of file diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactoryTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactoryTest.java deleted file mode 100644 index 2c4ef4da4c..0000000000 --- a/service/src/test/java/uk/nhs/adaptors/gp2gp/common/storage/StorageConnectorFactoryTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package uk.nhs.adaptors.gp2gp.common.storage; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; - -class StorageConnectorFactoryTest { - - private StorageConnectorFactory storageConnectorFactory; - - @BeforeEach - void setUp() { - storageConnectorFactory = new StorageConnectorFactory(); - StorageConnectorConfiguration configuration = new StorageConnectorConfiguration(); - configuration.setType(StorageConnectorOptions.S3.getStringValue()); - storageConnectorFactory.setConfiguration(configuration); - } - - @Test - void storageConnectorFactoryReturnsS3StorageConnectorTest() { - StorageConnector storageConnector = storageConnectorFactory.getObject(); - - assertInstanceOf(S3StorageConnector.class, storageConnector); - } -} \ No newline at end of file From ad8352629940ca9f0c1681a90677ac0f2a194238 Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:50:31 +0000 Subject: [PATCH 13/14] removing GitHub Action config adjustments --- .github/workflows/build_workflow.yml | 4 ++-- service/build.gradle | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_workflow.yml b/.github/workflows/build_workflow.yml index ec8a545efb..31e087e5bb 100644 --- a/.github/workflows/build_workflow.yml +++ b/.github/workflows/build_workflow.yml @@ -109,9 +109,9 @@ jobs: - name: Execute Unit Tests run: | if [[ $GITHUB_ACTOR == 'dependabot[bot]' ]]; then - ./gradlew test jacocoTestReport -x integrationTest --parallel --build-cache + ./gradlew test jacocoTestReport --parallel --build-cache else - ./gradlew test jacocoTestReport sonar -x integrationTest --parallel --build-cache + ./gradlew test jacocoTestReport sonar --parallel --build-cache fi working-directory: ./service env: diff --git a/service/build.gradle b/service/build.gradle index 0cc7557630..fa1c1ce2e4 100644 --- a/service/build.gradle +++ b/service/build.gradle @@ -181,4 +181,3 @@ bootJar { exclude("**/TransformJsonToXml*") } -integrationTest.mustRunAfter test From 10c95eab9bba0cbb6785a0da279e4e7fe4490f0a Mon Sep 17 00:00:00 2001 From: hospel <12736698+ole4ryb@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:59:44 +0000 Subject: [PATCH 14/14] remove jacoco depending on integration tests --- service/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/service/build.gradle b/service/build.gradle index fa1c1ce2e4..3f5203956a 100644 --- a/service/build.gradle +++ b/service/build.gradle @@ -133,7 +133,6 @@ tasks.withType(Test) { } check.dependsOn integrationTest -jacocoTestReport.dependsOn integrationTest spotbugsTest.enabled = false spotbugsIntegrationTest.enabled = false