package at.ac.ait.archistar.integration; import static org.fest.assertions.api.Assertions.assertThat; import static org.fest.assertions.api.Assertions.fail; import io.netty.channel.nio.NioEventLoopGroup; import java.io.File; import java.util.HashMap; import java.util.HashSet; import java.util.Set; import java.util.UUID; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import at.ac.ait.archistar.backendserver.storageinterface.FilesystemStorage; import at.ac.ait.archistar.backendserver.storageinterface.StorageServer; import at.ac.ait.archistar.engine.TestEngine; import at.ac.ait.archistar.engine.dataobjects.FSObject; import at.ac.ait.archistar.engine.dataobjects.SimpleFile; import at.ac.ait.archistar.engine.distributor.BFTDistributor; import at.ac.ait.archistar.engine.distributor.Distributor; import at.ac.ait.archistar.engine.distributor.TestServerConfiguration; import at.ac.ait.archistar.engine.metadata.MetadataService; import at.ac.ait.archistar.engine.metadata.SimpleMetadataService; import at.archistar.crypto.CryptoEngine; import at.archistar.crypto.RabinBenOrEngine; import at.archistar.crypto.secretsharing.ReconstructionException; import at.archistar.crypto.secretsharing.WeakSecurityException; import at.archistar.crypto.random.FakeRandomSource; import at.archistar.crypto.random.RandomSource; import java.security.NoSuchAlgorithmException; public class EncryptedFileSystemTest extends AbstractIntegrationTest { private static Set<StorageServer> createNewServers() { File baseDir = new File("/tmp/test-encrypted-filesystem/" + UUID.randomUUID() + "/"); baseDir.mkdirs(); File dir1 = new File(baseDir, "1"); dir1.mkdir(); File dir2 = new File(baseDir, "2"); dir2.mkdir(); File dir3 = new File(baseDir, "3"); dir3.mkdir(); File dir4 = new File(baseDir, "4"); dir4.mkdir(); HashSet<StorageServer> servers = new HashSet<>(); servers.add(new FilesystemStorage(0, dir1)); servers.add(new FilesystemStorage(1, dir2)); servers.add(new FilesystemStorage(2, dir3)); servers.add(new FilesystemStorage(3, dir4)); return servers; } @Test public void testPersistedStoreAndRetrieveOperation() throws ReconstructionException { SimpleFile testObject = new SimpleFile(randomTestFilename(), testData, new HashMap<String, String>()); String path = testObject.getPath(); // WHEN I connect engine and store a fragment engine.connect(); engine.putObject(testObject); // AND I disconnect and reconnect engine.disconnect(); assertThat(engine.connect()).isEqualTo(engine.getNumberOfServers()); // THEN the data should still be available FSObject retrObject = engine.getObject(path); assertThat(retrObject).isNotNull().isInstanceOf(SimpleFile.class); assertThat(path).isEqualTo(retrObject.getPath()); assertThat(((SimpleFile) retrObject).getData()).isEqualTo(testData); } @BeforeClass public static void prepareServer() throws WeakSecurityException, NoSuchAlgorithmException { serverConfig = new TestServerConfiguration(createNewServers()); serverConfig.setupTestServer(1); RandomSource rng = new FakeRandomSource(); CryptoEngine crypto = new RabinBenOrEngine(4, 3, rng); Distributor distributor = new BFTDistributor(serverConfig, new NioEventLoopGroup()); MetadataService metadata = new SimpleMetadataService(serverConfig, distributor, crypto); engine = new TestEngine(serverConfig, metadata, distributor, crypto); } @AfterClass public static void shutdownServers() { serverConfig.teardownTestServer(); } }