From 515ee6c1065555ca46013f3bbdabcdbfc3034bd0 Mon Sep 17 00:00:00 2001 From: felmer <felmer> Date: Thu, 6 Sep 2012 07:13:11 +0000 Subject: [PATCH] BIS-166 Introducing system tests which tests authorization for AbstractServer. SVN: 26525 --- .../authorization/PersonManagementTest.java | 223 ++++++++++++++++++ .../openbis/systemtest/base/BaseTest.java | 12 +- .../systemtest/base/builder/Builder.java | 2 +- .../base/builder/ExperimentBuilder.java | 17 +- 4 files changed, 242 insertions(+), 12 deletions(-) create mode 100644 openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/authorization/PersonManagementTest.java diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/authorization/PersonManagementTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/authorization/PersonManagementTest.java new file mode 100644 index 00000000000..1afef423097 --- /dev/null +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/authorization/PersonManagementTest.java @@ -0,0 +1,223 @@ +/* + * Copyright 2012 ETH Zuerich, CISD + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.systemsx.cisd.openbis.systemtest.authorization; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.fail; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +import org.apache.log4j.Level; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import ch.systemsx.cisd.common.exceptions.AuthorizationFailureException; +import ch.systemsx.cisd.common.logging.BufferedAppender; +import ch.systemsx.cisd.openbis.generic.server.CommonServer; +import ch.systemsx.cisd.openbis.generic.server.ETLService; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy; +import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; +import ch.systemsx.cisd.openbis.plugin.generic.server.GenericServer; +import ch.systemsx.cisd.openbis.plugin.query.server.QueryServer; +import ch.systemsx.cisd.openbis.systemtest.base.BaseTest; + +/** + * This test tests registering and deactivating a person. It also tests authorization of + * {@link CommonServer}, {@link ETLService}, {@link GenericServer}, and {@link QueryServer}. + * + * @author Franz-Josef Elmer + */ +public class PersonManagementTest extends BaseTest +{ + private BufferedAppender logRecorder; + + @BeforeMethod + public void setUpLogger() + { + logRecorder = new BufferedAppender("%-5p %c - %m%n", Level.INFO, "AUTH.CommonServer"); + } + + @AfterMethod + public void resetLogger() + { + logRecorder.reset(); + } + + @Test + public void testForCommonServerCountActivePersons() + { + String sessionToken = create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_ADMIN)); + + int numberOfActivePersons = commonServer.countActivePersons(sessionToken); + + assertEquals(2, numberOfActivePersons); + } + + @Test + public void testForETLServiceCountActivePersons() + { + String sessionToken = create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_ADMIN)); + + int numberOfActivePersons = etlService.countActivePersons(sessionToken); + + assertEquals(2, numberOfActivePersons); + } + + @Test + public void testForGenericServerCountActivePersons() + { + String sessionToken = create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_ADMIN)); + + int numberOfActivePersons = genericServer.countActivePersons(sessionToken); + + assertEquals(2, numberOfActivePersons); + } + + @Test + public void testForQueryServerCountActivePersons() + { + String sessionToken = create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_ADMIN)); + + int numberOfActivePersons = queryServer.countActivePersons(sessionToken); + + assertEquals(2, numberOfActivePersons); + } + + @Test(expectedExceptions = + { AuthorizationFailureException.class }) + public void testForCommonServerCountActivePersonsFailedBecauseOfInsufficientAuthorization() + { + String sessionToken = + create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_OBSERVER)); + + commonServer.countActivePersons(sessionToken); + } + + @Test(expectedExceptions = + { AuthorizationFailureException.class }) + public void testForETLServiceCountActivePersonsFailedBecauseOfInsufficientAuthorization() + { + String sessionToken = + create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_OBSERVER)); + + etlService.countActivePersons(sessionToken); + } + + @Test(expectedExceptions = + { AuthorizationFailureException.class }) + public void testForGenericServerCountActivePersonsFailedBecauseOfInsufficientAuthorization() + { + String sessionToken = + create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_OBSERVER)); + + genericServer.countActivePersons(sessionToken); + } + + @Test(expectedExceptions = + { AuthorizationFailureException.class }) + public void testForQueryServerCountActivePersonsFailedBecauseOfInsufficientAuthorization() + { + String sessionToken = + create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_OBSERVER)); + + queryServer.countActivePersons(sessionToken); + } + + @Test + public void testDeactivatePersons() + { + String sessionToken = create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_ADMIN)); + + commonServer.deactivatePersons(sessionToken, Arrays.asList("system")); + + assertEquals(1, commonServer.countActivePersons(sessionToken)); + SessionContextDTO session = commonServer.tryToAuthenticate("system", "password"); + assertEquals(null, session); + assertEquals("INFO AUTH.CommonServer - User 'system' has no role assignments " + + "and thus is not permitted to login.", logRecorder.getLogContent()); + } + + @Test + public void testRegisterPerson() + { + String sessionToken = create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_ADMIN)); + + commonServer.registerPerson(sessionToken, "einstein"); + + List<Person> persons = commonServer.listPersons(sessionToken); + assertPersonExists(persons, "einstein"); + } + + @Test(expectedExceptions = + { AuthorizationFailureException.class }) + public void testRegisterPersonFailedBecauseOfInsufficientAuthorization() + { + String sessionToken = + create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_OBSERVER)); + + commonServer.registerPerson(sessionToken, "einstein"); + } + + @Test + public void testSetSessionUser() + { + String sessionToken = create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_ADMIN)); + commonServer.registerPerson(sessionToken, "einstein"); + + commonServer.setSessionUser(sessionToken, "einstein"); + + try + { + commonServer.listPersons(sessionToken); + fail("AuthorizationFailureException expected"); + } catch (AuthorizationFailureException ex) + { + assertEquals("Authorization failure: ERROR: \"No role assignments could be found " + + "for user 'einstein'.\".", ex.getMessage()); + } + } + + @Test(expectedExceptions = + { AuthorizationFailureException.class }) + public void testSetSessionUserFailedBecauseOfInsufficientAuthorization() + { + String sessionToken = + create(aSession().withInstanceRole(RoleWithHierarchy.INSTANCE_OBSERVER)); + + commonServer.setSessionUser(sessionToken, "system"); + } + + private void assertPersonExists(List<Person> persons, String userID) + { + Set<String> userIDs = new TreeSet<String>(); + for (Person person : persons) + { + String userId = person.getUserId(); + userIDs.add(userId); + if (userId.equals(userID)) + { + return; + } + } + fail("Person '" + userID + "' does not exist: " + userIDs); + } +} diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/BaseTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/BaseTest.java index 9a8641b0542..94ec40b7b71 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/BaseTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/BaseTest.java @@ -55,6 +55,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientService; import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer; +import ch.systemsx.cisd.openbis.plugin.query.shared.IQueryServer; import ch.systemsx.cisd.openbis.systemtest.base.auth.AndAuthorizationRule; import ch.systemsx.cisd.openbis.systemtest.base.auth.AuthorizationRule; import ch.systemsx.cisd.openbis.systemtest.base.auth.BasicAuthorizationRule; @@ -101,6 +102,8 @@ public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextT protected IGenericServer genericServer; + protected IQueryServer queryServer; + protected ICommonClientService commonClientService; protected IGenericClientService genericClientService; @@ -203,6 +206,13 @@ public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextT this.genericServer = genericServer; } + @Autowired + @Test(enabled = false) + public final void setQueryServer(final IQueryServer queryServer) + { + this.queryServer = queryServer; + } + @Autowired @Test(enabled = false) public final void setCommonClientService(final ICommonClientService commonClientService) @@ -238,7 +248,7 @@ public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextT this.sessionManager = sessionManager; } - protected static <T> T create(Builder<T> builder) throws Exception + protected static <T> T create(Builder<T> builder) { return builder.create(); } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/Builder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/Builder.java index f7f66c605d6..504e7551241 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/Builder.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/Builder.java @@ -37,5 +37,5 @@ public abstract class Builder<T> this.systemSession = commonServer.tryToAuthenticateAsSystem().getSessionToken(); } - public abstract T create() throws Exception; + public abstract T create(); } diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/ExperimentBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/ExperimentBuilder.java index 98f341bb8e3..1e2eac0e2e0 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/ExperimentBuilder.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/ExperimentBuilder.java @@ -79,7 +79,7 @@ public class ExperimentBuilder extends Builder<Experiment> } @Override - public Experiment create() throws Exception + public Experiment create() { String experimentTypeCode = UUID.randomUUID().toString(); @@ -87,14 +87,13 @@ public class ExperimentBuilder extends Builder<Experiment> experimentType.setCode(experimentTypeCode); experimentType.setDatabaseInstance(this.project.getSpace().getInstance()); experimentType.setDescription("description"); - experimentType - .setExperimentTypePropertyTypes(new ArrayList<ExperimentTypePropertyType>()); + experimentType.setExperimentTypePropertyTypes(new ArrayList<ExperimentTypePropertyType>()); commonServer.registerExperimentType(systemSession, experimentType); - String experimentId = "/" + this.project.getSpace().getCode() + "/" + - this.project.getCode() + "/" - + this.code; + String experimentId = + "/" + this.project.getSpace().getCode() + "/" + this.project.getCode() + "/" + + this.code; NewExperiment details = new NewExperiment(experimentId, experimentType.getCode()); details.setAttachments(new ArrayList<NewAttachment>()); @@ -103,8 +102,7 @@ public class ExperimentBuilder extends Builder<Experiment> details.setProperties(new IEntityProperty[0]); details.setRegisterSamples(false); details.setSamples(this.samples); - genericServer.registerExperiment(this.session, details, - new ArrayList<NewAttachment>()); + genericServer.registerExperiment(this.session, details, new ArrayList<NewAttachment>()); return getExperiment(experimentId); } @@ -112,8 +110,7 @@ public class ExperimentBuilder extends Builder<Experiment> private Experiment getExperiment(String experimentId) { String[] codes = experimentId.split("/"); - return commonServer.getExperimentInfo(systemSession, new ExperimentIdentifier( - "CISD", + return commonServer.getExperimentInfo(systemSession, new ExperimentIdentifier("CISD", codes[1], codes[2], codes[3])); } -- GitLab