diff --git a/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/DummyOpenBisServer.java b/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/DummyOpenBisServer.java index 9c760694aa221f2618d88bae0523c3971dea2abf..54d56e5dfc6c7d24c8f17f0a278a0defd9760d6a 100644 --- a/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/DummyOpenBisServer.java +++ b/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/DummyOpenBisServer.java @@ -18,6 +18,7 @@ package ch.ethz.sis.afsserver.client; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.net.InetSocketAddress; import org.springframework.remoting.httpinvoker.SimpleHttpInvokerServiceExporter; @@ -78,7 +79,7 @@ public final class DummyOpenBisServer final Object result = operationExecutor.executeOperation(method, arguments); remoteInvocationResult = new RemoteInvocationResult(result); }catch(Throwable e){ - remoteInvocationResult = new RemoteInvocationResult(e); + remoteInvocationResult = new RemoteInvocationResult(new InvocationTargetException(e)); } this.writeRemoteInvocationResult(exchange, remoteInvocationResult); diff --git a/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/OpenBisAuthApiClientTest.java b/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/OpenBisAuthApiClientTest.java index 62fec7a41cc3a0bd1523bc5c823bc9c21af3b5a3..885c1b21a67a36c98df7bdb1e217e2a92c1099b6 100644 --- a/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/OpenBisAuthApiClientTest.java +++ b/server-data-store/src/test/java/ch/ethz/sis/afsserver/client/OpenBisAuthApiClientTest.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -37,12 +38,15 @@ import ch.ethz.sis.afsapi.dto.ExceptionReason; import ch.ethz.sis.afsapi.dto.File; import ch.ethz.sis.afsapi.exception.ThrowableReason; import ch.ethz.sis.afsserver.server.Server; +import ch.ethz.sis.afsserver.server.observer.APIServerObserver; import ch.ethz.sis.afsserver.server.observer.impl.DummyServerObserver; import ch.ethz.sis.afsserver.startup.AtomicFileSystemServerParameter; import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSet; import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.PhysicalData; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create.DataSetCreation; import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.fetchoptions.DataSetFetchOptions; import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.datastore.id.DataStorePermId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.Experiment; import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentPermId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.rights.Right; @@ -51,6 +55,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample; import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId; import ch.ethz.sis.shared.io.IOUtils; import ch.ethz.sis.shared.startup.Configuration; +import ch.systemsx.cisd.common.exceptions.UserFailureException; public class OpenBisAuthApiClientTest extends BaseApiClientTest { @@ -111,7 +116,12 @@ public class OpenBisAuthApiClientTest extends BaseApiClientTest "src/test/resources/test-server-with-auth-config.properties"); final DummyServerObserver dummyServerObserver = new DummyServerObserver(); - afsServer = new Server<>(configuration, dummyServerObserver, dummyServerObserver); + APIServerObserver apiServerObserver = configuration.getInstance(AtomicFileSystemServerParameter.apiServerObserver); + if (apiServerObserver == null) + { + apiServerObserver = new DummyServerObserver(); + } + httpServerPort = configuration.getIntegerProperty(AtomicFileSystemServerParameter.httpServerPort); httpServerPath = @@ -123,6 +133,8 @@ public class OpenBisAuthApiClientTest extends BaseApiClientTest IOUtils.createDirectories(storageRoot + "/" + SHARE_1); IOUtils.createDirectories(storageRoot + "/" + SHARE_2); IOUtils.createDirectories(storageRoot + "/" + SHARE_3); + + afsServer = new Server<>(configuration, dummyServerObserver, apiServerObserver); } @Before @@ -430,6 +442,64 @@ public class OpenBisAuthApiClientTest extends BaseApiClientTest assertFalse(IOUtils.exists(IOUtils.getPath(testDataRoot, FILE_B))); } + @Test + public void write_createsDataSetInASThatDoesNotExist() throws Exception + { + login(); + + String ownerWithoutFiles = UUID.randomUUID().toString(); + + List<DataSetCreation> dataSetCreations = new ArrayList<>(); + + dummyOpenBisServer.setOperationExecutor((methodName, methodArguments) -> + { + switch (methodName) + { + case "createDataSets": + dataSetCreations.addAll((List<DataSetCreation>) methodArguments[1]); + return List.of(new DataSetPermId(ownerWithoutFiles)); + } + + return getDefaultOperationExecutor().executeOperation(methodName, methodArguments); + }); + + afsClient.write(ownerWithoutFiles, FILE_A, 0L, DATA, IOUtils.getMD5(DATA)); + + // dataset gets created on first write + assertEquals(1, dataSetCreations.size()); + assertEquals(ownerWithoutFiles, dataSetCreations.get(0).getCode()); + assertEquals(new DataStorePermId("AFS"), dataSetCreations.get(0).getDataStoreId()); + + afsClient.write(ownerWithoutFiles, FILE_B, 0L, DATA, IOUtils.getMD5(DATA)); + + // no more datasets get created on subsequent writes + assertEquals(1, dataSetCreations.size()); + assertEquals(ownerWithoutFiles, dataSetCreations.get(0).getCode()); + assertEquals(new DataStorePermId("AFS"), dataSetCreations.get(0).getDataStoreId()); + } + + @Test + public void write_createsDataSetInASThatAlreadyExists() throws Exception + { + login(); + + String ownerWithoutFiles = UUID.randomUUID().toString(); + + dummyOpenBisServer.setOperationExecutor((methodName, methodArguments) -> + { + switch (methodName) + { + case "createDataSets": + throw new UserFailureException("DataSet already exists in the database and needs to be unique"); + } + + return getDefaultOperationExecutor().executeOperation(methodName, methodArguments); + }); + + // even though AS throws an exception this does not fail + afsClient.write(ownerWithoutFiles, FILE_A, 0L, DATA, IOUtils.getMD5(DATA)); + } + @Test public void move_failsDueToMissingPermissions() throws Exception { diff --git a/server-data-store/src/test/resources/test-server-with-auth-config.properties b/server-data-store/src/test/resources/test-server-with-auth-config.properties index d6e9ae823d0ec68f75abb9c8eb4c1e26cf0ad08a..1089d119f8c3a07ca135668a0d04786f052ef5d7 100644 --- a/server-data-store/src/test/resources/test-server-with-auth-config.properties +++ b/server-data-store/src/test/resources/test-server-with-auth-config.properties @@ -40,7 +40,7 @@ workerFactoryClass=ch.ethz.sis.afsserver.worker.WorkerFactory publicApiInterface=ch.ethz.sis.afsapi.api.PublicAPI apiServerInteractiveSessionKey=1234 apiServerTransactionManagerKey=5678 -apiServerObserver= +apiServerObserver=ch.ethz.sis.afsserver.server.observer.impl.OpenBISServerObserver apiServerWorkerTimeout=30000 openBISUrl=http://localhost:8084/