From a2128fb4c543951ab0dd939a9241ee75f83145d5 Mon Sep 17 00:00:00 2001
From: anttil <anttil>
Date: Tue, 10 Jul 2012 14:26:14 +0000
Subject: [PATCH] BIS-51 / SP-175: Change RelationshipServiceAuthorizationTest
 to use AuthorizationRules instead of the old complex version of authorization
 rule management.

SVN: 26060
---
 .../RelationshipServiceAuthorizationTest.java | 479 ++++++++----------
 .../base/auth/BasicAuthorizationRule.java     |   4 -
 2 files changed, 209 insertions(+), 274 deletions(-)

diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
index c3a9a13e9b0..4e00a12f19d 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
@@ -16,10 +16,10 @@
 
 package ch.systemsx.cisd.openbis.systemtest;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
+import static ch.systemsx.cisd.openbis.systemtest.base.auth.RuleBuilder.and;
+import static ch.systemsx.cisd.openbis.systemtest.base.auth.RuleBuilder.not;
+import static ch.systemsx.cisd.openbis.systemtest.base.auth.RuleBuilder.or;
+import static ch.systemsx.cisd.openbis.systemtest.base.auth.RuleBuilder.rule;
 
 import org.springframework.test.context.ContextConfiguration;
 import org.testng.annotations.BeforeClass;
@@ -39,6 +39,11 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 import ch.systemsx.cisd.openbis.systemtest.base.BaseTest;
+import ch.systemsx.cisd.openbis.systemtest.base.auth.AuthorizationRule;
+import ch.systemsx.cisd.openbis.systemtest.base.auth.GuardedDomain;
+import ch.systemsx.cisd.openbis.systemtest.base.auth.InstanceDomain;
+import ch.systemsx.cisd.openbis.systemtest.base.auth.RolePermutator;
+import ch.systemsx.cisd.openbis.systemtest.base.auth.SpaceDomain;
 
 /**
  * @author anttil
@@ -47,30 +52,35 @@ import ch.systemsx.cisd.openbis.systemtest.base.BaseTest;
     { "classpath:stub_relationship_service.xml" }, inheritLocations = true)
 public class RelationshipServiceAuthorizationTest extends BaseTest
 {
+    Space sourceSpace;
 
-    private Space sourceSpace;
+    Space destinationSpace;
 
-    private Space destinationSpace;
+    Space unrelatedAdmin;
 
-    private Project sourceProject;
+    Space unrelatedObserver;
 
-    private Project destinationProject;
+    Space unrelatedNone;
 
-    private Experiment sourceExperiment;
+    Project sourceProject;
 
-    private Experiment destinationExperiment;
+    Project destinationProject;
 
-    private Sample sourceSample;
+    Experiment sourceExperiment;
 
-    private Sample destinationSample;
+    Experiment destinationExperiment;
 
-    private Sample sharedSample;
+    Sample sourceSample;
 
-    private Sample childSample;
+    Sample destinationSample;
 
-    private Sample parentSample;
+    Sample sharedSample;
 
-    private ExternalData dataSet;
+    Sample childSample;
+
+    Sample parentSample;
+
+    ExternalData dataSet;
 
     @BeforeClass
     public void createFixture() throws Exception
@@ -90,6 +100,10 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
 
         parentSample = create(aSample().inSpace(sourceSpace));
         childSample = create(aSample().inSpace(destinationSpace).withParent(parentSample));
+
+        unrelatedAdmin = create(aSpace());
+        unrelatedObserver = create(aSpace());
+        unrelatedNone = create(aSpace());
     }
 
     @Test(dataProvider = "rolesAllowedToAssignExperimentToProject", groups = "authorization")
@@ -275,327 +289,369 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         removeParentFromSample(sourceSpaceRole, destinationSpaceRole, instanceRole);
     }
 
-    private void assignExperimentToProject(RoleWithHierarchy sourceSpaceRole,
+    void assignExperimentToProject(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
         String session =
-                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
-                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+                create(aSession()
+                        .withSpaceRole(sourceSpaceRole, sourceSpace)
+                        .withSpaceRole(destinationSpaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
 
         relationshipService.assignExperimentToProject(sessionManager.getSession(session),
                 pe(sourceExperiment), pe(destinationProject));
     }
 
-    private void assignProjectToSpace(RoleWithHierarchy sourceSpaceRole,
+    void assignProjectToSpace(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
         String session =
-                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
-                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+                create(aSession()
+                        .withSpaceRole(sourceSpaceRole, sourceSpace)
+                        .withSpaceRole(destinationSpaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
 
         relationshipService.assignProjectToSpace(sessionManager.getSession(session),
-                pe(sourceProject),
-                pe(destinationSpace));
+                pe(sourceProject), pe(destinationSpace));
     }
 
-    private void assignSampleToExperiment(RoleWithHierarchy sourceSpaceRole,
+    void assignSampleToExperiment(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
         String session =
-                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
-                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+                create(aSession()
+                        .withSpaceRole(sourceSpaceRole, sourceSpace)
+                        .withSpaceRole(destinationSpaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
 
         relationshipService.assignSampleToExperiment(sessionManager.getSession(session),
-                pe(sourceSample),
-                pe(destinationExperiment));
+                pe(sourceSample), pe(destinationExperiment));
     }
 
-    private void unassignSampleFromExperiment(RoleWithHierarchy spaceRole,
+    void unassignSampleFromExperiment(RoleWithHierarchy spaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
         String session =
-                create(aSession().withSpaceRole(spaceRole, sourceSpace).withInstanceRole(
-                        instanceRole));
+                create(aSession()
+                        .withSpaceRole(spaceRole, sourceSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
 
         relationshipService.unassignSampleFromExperiment(sessionManager.getSession(session),
                 pe(sourceSample));
     }
 
-    private void unshareSample(RoleWithHierarchy spaceRole, RoleWithHierarchy instanceRole)
+    void unshareSample(RoleWithHierarchy spaceRole, RoleWithHierarchy instanceRole)
             throws Exception
     {
         String session =
-                create(aSession().withSpaceRole(spaceRole, destinationSpace).withInstanceRole(
-                        instanceRole));
-        relationshipService
-                .unshareSample(sessionManager.getSession(session), pe(sharedSample),
-                        pe(destinationSpace));
+                create(aSession()
+                        .withSpaceRole(spaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
+
+        relationshipService.unshareSample(sessionManager.getSession(session), pe(sharedSample),
+                pe(destinationSpace));
     }
 
-    private void assignSampleToSpace(RoleWithHierarchy sourceSpaceRole,
+    void assignSampleToSpace(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
 
         String session =
-                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
-                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+                create(aSession()
+                        .withSpaceRole(sourceSpaceRole, sourceSpace)
+                        .withSpaceRole(destinationSpaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
 
         relationshipService.assignSampleToSpace(sessionManager.getSession(session),
-                pe(sourceSample),
-                pe(destinationSpace));
+                pe(sourceSample), pe(destinationSpace));
     }
 
-    private void shareSample(RoleWithHierarchy spaceRole, RoleWithHierarchy instanceRole)
+    void shareSample(RoleWithHierarchy spaceRole, RoleWithHierarchy instanceRole)
             throws Exception
     {
         String session =
-                create(aSession().withSpaceRole(spaceRole, sourceSpace).withInstanceRole(
-                        instanceRole));
+                create(aSession()
+                        .withSpaceRole(spaceRole, sourceSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
+
         relationshipService.shareSample(sessionManager.getSession(session), pe(sourceSample));
     }
 
-    private void assignDataSetToExperiment(RoleWithHierarchy sourceSpaceRole,
+    void assignDataSetToExperiment(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
         String session =
-                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
-                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+                create(aSession()
+                        .withSpaceRole(sourceSpaceRole, sourceSpace)
+                        .withSpaceRole(destinationSpaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
 
         relationshipService.assignDataSetToExperiment(sessionManager.getSession(session),
-                pe(dataSet),
-                pe(destinationExperiment));
+                pe(dataSet), pe(destinationExperiment));
     }
 
-    private void assignDataSetToSample(RoleWithHierarchy sourceSpaceRole,
+    void assignDataSetToSample(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
 
         String session =
-                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
-                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+                create(aSession()
+                        .withSpaceRole(sourceSpaceRole, sourceSpace)
+                        .withSpaceRole(destinationSpaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
 
         relationshipService.assignDataSetToSample(sessionManager.getSession(session),
-                pe(dataSet),
-                pe(destinationSample));
+                pe(dataSet), pe(destinationSample));
     }
 
-    private void addParentToSample(RoleWithHierarchy sourceSpaceRole,
+    void addParentToSample(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
         String session =
-                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
-                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+                create(aSession()
+                        .withSpaceRole(sourceSpaceRole, sourceSpace)
+                        .withSpaceRole(destinationSpaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
 
         relationshipService.addParentToSample(sessionManager.getSession(session), pe(sourceSample),
                 pe(destinationSample));
 
     }
 
-    private void removeParentFromSample(RoleWithHierarchy sourceSpaceRole,
+    void removeParentFromSample(RoleWithHierarchy sourceSpaceRole,
             RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
         String session =
-                create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace).withSpaceRole(
-                        destinationSpaceRole, destinationSpace).withInstanceRole(instanceRole));
+                create(aSession()
+                        .withSpaceRole(sourceSpaceRole, sourceSpace)
+                        .withSpaceRole(destinationSpaceRole, destinationSpace)
+                        .withInstanceRole(instanceRole)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_ADMIN, unrelatedAdmin)
+                        .withSpaceRole(RoleWithHierarchy.SPACE_OBSERVER, unrelatedObserver));
 
         relationshipService.removeParentFromSample(sessionManager.getSession(session),
-                pe(childSample),
-                pe(parentSample));
+                pe(childSample), pe(parentSample));
     }
 
+    GuardedDomain instance = new InstanceDomain("instance");
+
+    GuardedDomain source = new SpaceDomain("source", instance);
+
+    GuardedDomain destination = new SpaceDomain("destination", instance);
+
+    AuthorizationRule spaceAdminOrSpaceEtlServer =
+            and(
+                    or(
+                            rule(source, RoleWithHierarchy.SPACE_POWER_USER),
+                            rule(source, RoleWithHierarchy.SPACE_ETL_SERVER)
+                    ),
+                    or(
+                            rule(destination, RoleWithHierarchy.SPACE_POWER_USER),
+                            rule(destination, RoleWithHierarchy.SPACE_ETL_SERVER)
+                    )
+            );
+
+    AuthorizationRule spaceAdminOrSpaceEtlServerSingle =
+            or(
+                    rule(source, RoleWithHierarchy.SPACE_POWER_USER),
+                    rule(source, RoleWithHierarchy.SPACE_ETL_SERVER)
+            );
+
+    AuthorizationRule instanceEtlServer = rule(instance, RoleWithHierarchy.INSTANCE_ETL_SERVER);
+
     @DataProvider(name = "rolesAllowedToAssignExperimentToProject")
-    public static RoleWithHierarchy[][] rolesAllowedToAssignExperimentToProject()
+    RoleWithHierarchy[][] rolesAllowedToAssignExperimentToProject()
     {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(spaceAdminOrSpaceEtlServer,
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesNotAllowedToAssignExperimentToProject")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAssignExperimentToProject()
+    RoleWithHierarchy[][] rolesNotAllowedToAssignExperimentToProject()
     {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(not(spaceAdminOrSpaceEtlServer),
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesAllowedToAssignProjectToSpace")
-    public static RoleWithHierarchy[][] rolesAllowedToAssignProjectToSpace()
+    RoleWithHierarchy[][] rolesAllowedToAssignProjectToSpace()
     {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(spaceAdminOrSpaceEtlServer,
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesNotAllowedToAssignProjectToSpace")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAssignProjectToSpace()
+    RoleWithHierarchy[][] rolesNotAllowedToAssignProjectToSpace()
     {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(not(spaceAdminOrSpaceEtlServer),
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesAllowedToAssignSampleToExperiment")
-    public static RoleWithHierarchy[][] rolesAllowedToAssignSampleToExperiment()
+    RoleWithHierarchy[][] rolesAllowedToAssignSampleToExperiment()
     {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(spaceAdminOrSpaceEtlServer,
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesNotAllowedToAssignSampleToExperiment")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAssignSampleToExperiment()
+    RoleWithHierarchy[][] rolesNotAllowedToAssignSampleToExperiment()
     {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(not(spaceAdminOrSpaceEtlServer),
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesAllowedToUnassignSampleFromExperiment")
-    public static RoleWithHierarchy[][] rolesAllowedToUnassignSampleFromExperiment()
+    RoleWithHierarchy[][] rolesAllowedToUnassignSampleFromExperiment()
     {
-        return toNestedArray(acceptedRoles(1, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(spaceAdminOrSpaceEtlServerSingle,
+                source, instance);
     }
 
     @DataProvider(name = "rolesNotAllowedToUnassignSampleFromExperiment")
-    public static RoleWithHierarchy[][] rolesNotAllowedToUnassignSampleFromExperiment()
+    RoleWithHierarchy[][] rolesNotAllowedToUnassignSampleFromExperiment()
     {
-        return toNestedArray(rejectedRoles(1, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(not(spaceAdminOrSpaceEtlServerSingle),
+                source, instance);
     }
 
     @DataProvider(name = "rolesAllowedToUnshareSample")
-    public static RoleWithHierarchy[][] rolesAllowedToUnshareSample()
+    RoleWithHierarchy[][] rolesAllowedToUnshareSample()
     {
-        return toNestedArray(acceptedRoles(1, RoleWithHierarchy.INSTANCE_ETL_SERVER,
-                RoleWithHierarchy.INSTANCE_ADMIN));
+        return RolePermutator.getAcceptedPermutations(instanceEtlServer,
+                destination, instance);
     }
 
     @DataProvider(name = "rolesNotAllowedToUnshareSample")
-    public static RoleWithHierarchy[][] rolesNotAllowedToUnshareSample()
+    RoleWithHierarchy[][] rolesNotAllowedToUnshareSample()
     {
-        return toNestedArray(rejectedRoles(1, RoleWithHierarchy.INSTANCE_ETL_SERVER,
-                RoleWithHierarchy.INSTANCE_ADMIN));
+        return RolePermutator.getAcceptedPermutations(not(instanceEtlServer),
+                destination, instance);
     }
 
     @DataProvider(name = "rolesAllowedToAssignSampleToSpace")
-    public static RoleWithHierarchy[][] rolesAllowedToAssignSampleToSpace()
+    RoleWithHierarchy[][] rolesAllowedToAssignSampleToSpace()
     {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(spaceAdminOrSpaceEtlServer,
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesNotAllowedToAssignSampleToSpace")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAssignSampleToSpace()
+    RoleWithHierarchy[][] rolesNotAllowedToAssignSampleToSpace()
     {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(not(spaceAdminOrSpaceEtlServer),
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesAllowedToShareSample")
-    public static RoleWithHierarchy[][] rolesAllowedToShareSample()
+    RoleWithHierarchy[][] rolesAllowedToShareSample()
     {
-        return toNestedArray(acceptedRoles(1, RoleWithHierarchy.INSTANCE_ETL_SERVER,
-                RoleWithHierarchy.INSTANCE_ADMIN));
+        return RolePermutator.getAcceptedPermutations(instanceEtlServer, source, instance);
     }
 
     @DataProvider(name = "rolesNotAllowedToShareSample")
-    public static RoleWithHierarchy[][] rolesNotAllowedToShareSample()
+    RoleWithHierarchy[][] rolesNotAllowedToShareSample()
     {
-        return toNestedArray(rejectedRoles(1, RoleWithHierarchy.INSTANCE_ETL_SERVER,
-                RoleWithHierarchy.INSTANCE_ADMIN));
+        return RolePermutator.getAcceptedPermutations(not(instanceEtlServer), source, instance);
     }
 
     @DataProvider(name = "rolesAllowedToAssignDataSetToExperiment")
-    public static RoleWithHierarchy[][] rolesAllowedToAssignDataSetToExperiment()
+    RoleWithHierarchy[][] rolesAllowedToAssignDataSetToExperiment()
     {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(spaceAdminOrSpaceEtlServer,
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesNotAllowedToAssignDataSetToExperiment")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAssignDataSetToExperiment()
+    RoleWithHierarchy[][] rolesNotAllowedToAssignDataSetToExperiment()
     {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(not(spaceAdminOrSpaceEtlServer),
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesAllowedToAssignDataSetToSample")
-    public static RoleWithHierarchy[][] rolesAllowedToAssignDataSetToSample()
+    RoleWithHierarchy[][] rolesAllowedToAssignDataSetToSample()
     {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(spaceAdminOrSpaceEtlServer,
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesNotAllowedToAssignDataSetToSample")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAssignDataSetToSample()
+    RoleWithHierarchy[][] rolesNotAllowedToAssignDataSetToSample()
     {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(not(spaceAdminOrSpaceEtlServer),
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesAllowedToAddParentToSample")
-    public static RoleWithHierarchy[][] rolesAllowedToAddParentToSample()
+    RoleWithHierarchy[][] rolesAllowedToAddParentToSample()
     {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(spaceAdminOrSpaceEtlServer,
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesNotAllowedToAddParentToSample")
-    public static RoleWithHierarchy[][] rolesNotAllowedToAddParentToSample()
+    RoleWithHierarchy[][] rolesNotAllowedToAddParentToSample()
     {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(not(spaceAdminOrSpaceEtlServer),
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesAllowedRemoveAddParentFromSample")
-    public static RoleWithHierarchy[][] rolesAllowedToRemoveParentFromSample()
+    RoleWithHierarchy[][] rolesAllowedToRemoveParentFromSample()
     {
-        return toNestedArray(acceptedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(spaceAdminOrSpaceEtlServer,
+                source, destination, instance);
     }
 
     @DataProvider(name = "rolesNotAllowedToRemoveParentFromSample")
-    public static RoleWithHierarchy[][] rolesNotAllowedToRemoveParentFromSample()
+    RoleWithHierarchy[][] rolesNotAllowedToRemoveParentFromSample()
     {
-        return toNestedArray(rejectedRoles(2, RoleWithHierarchy.SPACE_ETL_SERVER,
-                RoleWithHierarchy.SPACE_POWER_USER));
+        return RolePermutator.getAcceptedPermutations(not(spaceAdminOrSpaceEtlServer),
+                source, destination, instance);
     }
 
-    public static Collection<RoleWithHierarchy> allInstanceRoles = new HashSet<RoleWithHierarchy>();
-
-    public static Collection<RoleWithHierarchy> allSpaceRoles = new HashSet<RoleWithHierarchy>();
-
-    {
-        allInstanceRoles.add(RoleWithHierarchy.INSTANCE_ADMIN);
-        allInstanceRoles.add(RoleWithHierarchy.INSTANCE_ETL_SERVER);
-        allInstanceRoles.add(RoleWithHierarchy.INSTANCE_OBSERVER);
-        allInstanceRoles.add(null);
-
-        allSpaceRoles.add(RoleWithHierarchy.SPACE_ADMIN);
-        allSpaceRoles.add(RoleWithHierarchy.SPACE_ETL_SERVER);
-        allSpaceRoles.add(RoleWithHierarchy.SPACE_POWER_USER);
-        allSpaceRoles.add(RoleWithHierarchy.SPACE_USER);
-        allSpaceRoles.add(RoleWithHierarchy.SPACE_OBSERVER);
-        allSpaceRoles.add(null);
-    }
-
-    private ExperimentPE pe(Experiment experiment)
+    ExperimentPE pe(Experiment experiment)
     {
         return daoFactory.getExperimentDAO().tryGetByPermID(experiment.getPermId());
     }
 
-    private ProjectPE pe(Project project)
+    ProjectPE pe(Project project)
     {
         return daoFactory.getProjectDAO().tryFindProject(
                 project.getSpace().getInstance().getCode(), project.getSpace().getCode(),
                 project.getCode());
     }
 
-    private SpacePE pe(Space space)
+    SpacePE pe(Space space)
     {
         return daoFactory.getSpaceDAO().tryFindSpaceByCodeAndDatabaseInstance(
                 space.getCode(),
@@ -603,130 +659,13 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
                         space.getInstance().getCode()));
     }
 
-    private SamplePE pe(Sample sample)
+    SamplePE pe(Sample sample)
     {
         return daoFactory.getSampleDAO().tryToFindByPermID(sample.getPermId());
     }
 
-    private DataPE pe(ExternalData data)
+    DataPE pe(ExternalData data)
     {
         return daoFactory.getDataDAO().tryToFindDataSetByCode(data.getCode());
     }
-
-    public static RoleWithHierarchy[][] toNestedArray(Collection<List<RoleWithHierarchy>> input)
-    {
-        RoleWithHierarchy[][] result = new RoleWithHierarchy[input.size()][];
-        int index = 0;
-        for (List<RoleWithHierarchy> roles : input)
-        {
-            result[index] = roles.toArray(new RoleWithHierarchy[0]);
-            index++;
-        }
-        return result;
-    }
-
-    public static Collection<List<RoleWithHierarchy>> acceptedRoles(int numSpaceRoles,
-            RoleWithHierarchy... limits)
-    {
-        Collection<RoleWithHierarchy> acceptedRoles = new HashSet<RoleWithHierarchy>();
-        for (RoleWithHierarchy limit : limits)
-        {
-            acceptedRoles.addAll(limit.getRoles());
-        }
-
-        Collection<List<RoleWithHierarchy>> results = new HashSet<List<RoleWithHierarchy>>();
-        for (RoleWithHierarchy instanceRole : allInstanceRoles)
-        {
-            for (List<RoleWithHierarchy> spaceRoles : getSpaceRoleCombinations(numSpaceRoles))
-            {
-                if (acceptedRoles.contains(instanceRole) || acceptedRoles.containsAll(spaceRoles))
-                {
-                    List<RoleWithHierarchy> result = new ArrayList<RoleWithHierarchy>();
-                    for (RoleWithHierarchy spaceRole : spaceRoles)
-                    {
-                        result.add(spaceRole);
-                    }
-                    result.add(instanceRole);
-                    results.add(result);
-                }
-            }
-        }
-        return results;
-    }
-
-    public static Collection<List<RoleWithHierarchy>> rejectedRoles(int numSpaceRoles,
-            RoleWithHierarchy... limits)
-    {
-        Collection<List<RoleWithHierarchy>> allCombinations = getAllRoleCombinations(numSpaceRoles);
-        Collection<List<RoleWithHierarchy>> acceptedCombinations =
-                acceptedRoles(numSpaceRoles, limits);
-        allCombinations.removeAll(acceptedCombinations);
-        return allCombinations;
-    }
-
-    public static Collection<List<RoleWithHierarchy>> getSpaceRoleCombinations(int num)
-    {
-        Collection<List<RoleWithHierarchy>> result = new HashSet<List<RoleWithHierarchy>>();
-        if (num == 0)
-        {
-            return result;
-        }
-
-        Collection<List<RoleWithHierarchy>> subLists = getSpaceRoleCombinations(num - 1);
-
-        for (RoleWithHierarchy role : allSpaceRoles)
-        {
-            if (subLists.size() == 0)
-            {
-                List<RoleWithHierarchy> list = new ArrayList<RoleWithHierarchy>();
-                list.add(role);
-                result.add(list);
-            } else
-            {
-                for (List<RoleWithHierarchy> subList : subLists)
-                {
-                    List<RoleWithHierarchy> list = new ArrayList<RoleWithHierarchy>();
-                    list.add(role);
-                    list.addAll(subList);
-                    result.add(list);
-                }
-            }
-        }
-        return result;
-    }
-
-    public static Collection<List<RoleWithHierarchy>> getAllRoleCombinations(int numSpaceRoles)
-    {
-        Collection<List<RoleWithHierarchy>> result = new HashSet<List<RoleWithHierarchy>>();
-
-        for (List<RoleWithHierarchy> spaceRoles : getSpaceRoleCombinations(numSpaceRoles))
-        {
-            for (RoleWithHierarchy instanceRole : allInstanceRoles)
-            {
-                List<RoleWithHierarchy> list = new ArrayList<RoleWithHierarchy>();
-                list.addAll(spaceRoles);
-                list.add(instanceRole);
-
-                if (containsOnlyNulls(list))
-                {
-                    continue;
-                }
-
-                result.add(list);
-            }
-        }
-        return result;
-    }
-
-    public static boolean containsOnlyNulls(Collection<?> collection)
-    {
-        for (Object o : collection)
-        {
-            if (o != null)
-            {
-                return false;
-            }
-        }
-        return true;
-    }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/auth/BasicAuthorizationRule.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/auth/BasicAuthorizationRule.java
index 45424861bae..a6dcac5e013 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/auth/BasicAuthorizationRule.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/auth/BasicAuthorizationRule.java
@@ -16,9 +16,7 @@
 
 package ch.systemsx.cisd.openbis.systemtest.base.auth;
 
-import java.util.HashSet;
 import java.util.Map;
-import java.util.Set;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 
@@ -58,7 +56,6 @@ public class BasicAuthorizationRule implements AuthorizationRule
     @Override
     public boolean accepts(Map<GuardedDomain, RoleWithHierarchy> permutation)
     {
-        Set<RoleWithHierarchy> roles = new HashSet<RoleWithHierarchy>();
         GuardedDomain current = this.domain;
         while (current != null)
         {
@@ -68,7 +65,6 @@ public class BasicAuthorizationRule implements AuthorizationRule
             }
             current = current.getSuperDomain();
         }
-
         return false;
     }
 }
-- 
GitLab