From 0c3af1cf06c370f0c1f798d5e6b7a1526311a08a Mon Sep 17 00:00:00 2001 From: Elwizzy12 Date: Thu, 11 Apr 2024 18:18:47 +0100 Subject: [PATCH] integration-test-files-for-clear-separation --- .../e2e/{BaseE2EIT.java => BaseE2ETest.java} | 0 ...> ProfileContainsDatasafeVersionTest.java} | 0 .../impl/e2e/SchemaDelegationTest.java | 128 +++++++++++++++ .../business/impl/e2e/SchemeDelegationIT.java | 152 ------------------ 4 files changed, 128 insertions(+), 152 deletions(-) rename datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/{BaseE2EIT.java => BaseE2ETest.java} (100%) rename datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/{ProfileContainsDatasafeVersion2EIT.java => ProfileContainsDatasafeVersionTest.java} (100%) create mode 100644 datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/SchemaDelegationTest.java delete mode 100644 datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/SchemeDelegationIT.java diff --git a/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/BaseE2EIT.java b/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/BaseE2ETest.java similarity index 100% rename from datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/BaseE2EIT.java rename to datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/BaseE2ETest.java diff --git a/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/ProfileContainsDatasafeVersion2EIT.java b/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/ProfileContainsDatasafeVersionTest.java similarity index 100% rename from datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/ProfileContainsDatasafeVersion2EIT.java rename to datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/ProfileContainsDatasafeVersionTest.java diff --git a/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/SchemaDelegationTest.java b/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/SchemaDelegationTest.java new file mode 100644 index 000000000..1ea5f453c --- /dev/null +++ b/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/SchemaDelegationTest.java @@ -0,0 +1,128 @@ +package de.adorsys.datasafe.business.impl.e2e; + +import de.adorsys.datasafe.business.impl.service.DaggerDefaultDatasafeServices; +import de.adorsys.datasafe.business.impl.service.DefaultDatasafeServices; +import de.adorsys.datasafe.directory.impl.profile.config.DefaultDFSConfig; +import de.adorsys.datasafe.encrypiton.api.types.UserID; +import de.adorsys.datasafe.encrypiton.api.types.UserIDAuth; +import de.adorsys.datasafe.storage.api.SchemeDelegatingStorage; +import de.adorsys.datasafe.storage.api.StorageService; +import de.adorsys.datasafe.storage.impl.fs.FileSystemStorageService; +import de.adorsys.datasafe.teststorage.WithStorageProvider; +import de.adorsys.datasafe.types.api.actions.WriteRequest; +import de.adorsys.datasafe.types.api.resource.AbsoluteLocation; +import de.adorsys.datasafe.types.api.resource.BasePrivateResource; +import de.adorsys.datasafe.types.api.resource.ResolvedResource; +import de.adorsys.datasafe.types.api.resource.Uri; +import de.adorsys.datasafe.types.api.types.ReadStorePassword; +import de.adorsys.datasafe.types.api.utils.ReadKeyPasswordTestFactory; +import lombok.SneakyThrows; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.testcontainers.shaded.com.google.common.collect.ImmutableMap; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +class SchemeDelegationTest extends WithStorageProvider { + + private Path fsPath; + private Uri minioPath; + private StorageService minio; + private StorageService filesystem; + private DefaultDatasafeServices datasafeServices; + + @BeforeEach + void initialize(@TempDir Path tempDir) { + WithStorageProvider.StorageDescriptor minioDescriptor = minio(); + this.fsPath = tempDir; + this.minio = minioDescriptor.getStorageService().get(); + this.filesystem = new FileSystemStorageService(tempDir); + this.minioPath = minioDescriptor.getLocation(); + StorageService multiDfs = new SchemeDelegatingStorage( + ImmutableMap.of( + "s3", minio, + "file", filesystem + ) + ); + + this.datasafeServices = DaggerDefaultDatasafeServices + .builder() + .config(new ProfilesOnFsDataOnMinio(minioPath, tempDir)) + .storage(multiDfs) + .build(); + } + + @Test + @SneakyThrows + void testProfileOnFsDataOnMinioWorks() { + UserIDAuth userJohn = new UserIDAuth("john", ReadKeyPasswordTestFactory.getForString("doe")); + + // John's profile will be saved to filesystem + datasafeServices.userProfile().registerUsingDefaults(userJohn); + + // But this data - it will be saved to minio + try (OutputStream os = + datasafeServices.privateService().write(WriteRequest.forDefaultPrivate(userJohn, "file.txt"))) { + os.write("Hello".getBytes()); + } + + // Profiles are on FS + assertThat(listFs()) + .extracting(it -> fsPath.relativize(it)) + .extracting(Path::toString) + .containsExactlyInAnyOrder("", "public-john", "private-john"); + // File and keystore/pub keys are on minio + assertThat(listMinio()) + .extracting(it -> minioPath.relativize(it.location())) + .extracting(it -> it.asURI().toString()) + .contains("users/john/private/keystore", "users/john/public/pubkeys") + .anyMatch(it -> it.startsWith("users/john/private/files/")) + .hasSize(3); + } + + private List> listMinio() { + try (Stream> ls = + minio.list(new AbsoluteLocation<>(BasePrivateResource.forPrivate(minioPath.resolve(""))))) { + return ls.collect(Collectors.toList()); + } + } + + private List listFs() throws IOException { + try (Stream ls = Files.walk(fsPath)) { + return ls.collect(Collectors.toList()); + } + } + + static class ProfilesOnFsDataOnMinio extends DefaultDFSConfig { + + private final Path profilesPath; + + ProfilesOnFsDataOnMinio(Uri minioBucketPath, Path profilesPath) { + super(minioBucketPath, new ReadStorePassword("PAZZWORT")); + this.profilesPath = profilesPath; + } + + @Override + public AbsoluteLocation publicProfile(UserID forUser) { + return new AbsoluteLocation<>( + BasePrivateResource.forPrivate(profilesPath.resolve("public-" + forUser.getValue()).toUri()) + ); + } + + @Override + public AbsoluteLocation privateProfile(UserID forUser) { + return new AbsoluteLocation<>( + BasePrivateResource.forPrivate(profilesPath.resolve("private-" + forUser.getValue()).toUri()) + ); + } + } +} \ No newline at end of file diff --git a/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/SchemeDelegationIT.java b/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/SchemeDelegationIT.java deleted file mode 100644 index 846c11ea1..000000000 --- a/datasafe-business/src/test/java/de/adorsys/datasafe/business/impl/e2e/SchemeDelegationIT.java +++ /dev/null @@ -1,152 +0,0 @@ -package de.adorsys.datasafe.business.impl.e2e; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import de.adorsys.datasafe.business.impl.service.DaggerDefaultDatasafeServices; -import de.adorsys.datasafe.business.impl.service.DefaultDatasafeServices; -import de.adorsys.datasafe.directory.impl.profile.config.DefaultDFSConfig; -import de.adorsys.datasafe.encrypiton.api.types.UserID; -import de.adorsys.datasafe.encrypiton.api.types.UserIDAuth; -import de.adorsys.datasafe.storage.api.SchemeDelegatingStorage; -import de.adorsys.datasafe.storage.api.StorageService; -import de.adorsys.datasafe.storage.impl.db.DatabaseConnectionRegistry; -import de.adorsys.datasafe.storage.impl.db.DatabaseCredentials; -import de.adorsys.datasafe.storage.impl.db.DatabaseStorageService; -import de.adorsys.datasafe.storage.impl.fs.FileSystemStorageService; -import de.adorsys.datasafe.teststorage.WithStorageProvider; -import de.adorsys.datasafe.types.api.actions.WriteRequest; -import de.adorsys.datasafe.types.api.resource.AbsoluteLocation; -import de.adorsys.datasafe.types.api.resource.BasePrivateResource; -import de.adorsys.datasafe.types.api.resource.ResolvedResource; -import de.adorsys.datasafe.types.api.resource.Uri; -import de.adorsys.datasafe.types.api.types.ReadStorePassword; -import de.adorsys.datasafe.types.api.utils.ReadKeyPasswordTestFactory; -import lombok.SneakyThrows; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -import java.io.OutputStream; -import java.net.URI; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static de.adorsys.datasafe.types.api.global.PathEncryptionId.AES_SIV; -import static org.assertj.core.api.Assertions.assertThat; - -class SchemeDelegationWithDbTest extends WithStorageProvider { - - private static final Set ALLOWED_TABLES = ImmutableSet.of("users", "private_profiles", "public_profiles"); - - private Path fsPath; - private StorageService db; - private DefaultDatasafeServices datasafeServices; - - @BeforeEach - void initialize(@TempDir Path tempDir) { - this.fsPath = tempDir; - StorageService filesystem = new FileSystemStorageService(tempDir); - this.db = new DatabaseStorageService(ALLOWED_TABLES, new DatabaseConnectionRegistry( - uri -> uri.location().getWrapped().getScheme() + ":" + uri.location().getPath().split("/")[1], - ImmutableMap.of("jdbc://localhost:9999", new DatabaseCredentials("sa", "sa"))) - ); - - StorageService multiDfs = new SchemeDelegatingStorage( - ImmutableMap.of( - "file", filesystem, - "jdbc", db - ) - ); - - this.datasafeServices = DaggerDefaultDatasafeServices - .builder() - .config(new ProfilesOnDbDataOnFs(tempDir.toUri(), URI.create("jdbc://localhost:9999/h2:mem:test/"))) - .storage(multiDfs) - .build(); - } - - @Test - @SneakyThrows - void testProfileOnDbDataOnFsWorks() { - UserIDAuth userJohn = new UserIDAuth("john", ReadKeyPasswordTestFactory.getForString("doe")); - - // John's profile will be saved to Database - datasafeServices.userProfile().registerUsingDefaults(userJohn); - - // But this data - it will be saved to FS - try (OutputStream os = - datasafeServices.privateService().write(WriteRequest.forDefaultPrivate(userJohn, "file.txt"))) { - os.write("Hello".getBytes()); - } - - // Profiles are on DB - assertThat(listDb("jdbc://localhost:9999/h2:mem:test/private_profiles/")) - .containsExactly("jdbc://localhost:9999/h2:mem:test/private_profiles/john"); - assertThat(listDb("jdbc://localhost:9999/h2:mem:test/public_profiles/")) - .containsExactly("jdbc://localhost:9999/h2:mem:test/public_profiles/john"); - - Path path = fsPath.resolve(new Uri("users/john/private/files/").resolve(AES_SIV.asUriRoot()).asString()); - Path encryptedFile = walk(path).get(1); - // File and keystore/pub keys are on FS - assertThat(walk(fsPath)) - .extracting(it -> fsPath.toUri().relativize(it.toUri())) - .extracting(URI::toString) - .containsExactlyInAnyOrder( - "", - "users/", - "users/john/", - "users/john/public/", - "users/john/public/pubkeys", - "users/john/private/", - "users/john/private/keystore", - "users/john/private/files/", - "users/john/private/files/SIV/", - fsPath.toUri().relativize(encryptedFile.toUri()).toString() - ); - } - - @SneakyThrows - private List walk(Path at) { - try (Stream ls = Files.walk(at)) { - return ls.collect(Collectors.toList()); - } - } - - private List listDb(String path) { - try (Stream> stream = db.list(BasePrivateResource.forAbsolutePrivate(URI.create(path)))){ - return stream.map(it -> it.location().asURI().toString()).collect(Collectors.toList()); - } - } - - static class ProfilesOnDbDataOnFs extends DefaultDFSConfig { - - private final Uri profilesPath; - - ProfilesOnDbDataOnFs(URI fsPath, URI profilesPath) { - super(fsPath, new ReadStorePassword("PAZZWORT")); - this.profilesPath = new Uri(profilesPath); - } - - @Override - public AbsoluteLocation publicProfile(UserID forUser) { - return new AbsoluteLocation<>( - BasePrivateResource.forPrivate( - profilesPath.resolve("public_profiles/").resolve(forUser.getValue()) - ) - ); - } - - @Override - public AbsoluteLocation privateProfile(UserID forUser) { - return new AbsoluteLocation<>( - BasePrivateResource.forPrivate( - profilesPath.resolve("private_profiles/").resolve(forUser.getValue()) - ) - ); - } - } -} \ No newline at end of file