/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * See LICENSE.txt included in this distribution for the specific * language governing permissions and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at LICENSE.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. */ package org.opensolaris.opengrok.authorization; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import java.util.function.Function; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.opensolaris.opengrok.configuration.Group; import org.opensolaris.opengrok.configuration.Project; import org.opensolaris.opengrok.configuration.RuntimeEnvironment; import static org.junit.Assert.assertEquals; /** * * @author Krystof Tulinger */ @RunWith(Parameterized.class) public class AuthorizationEntityTest { private Set<Group> envGroups; private Map<String, Project> envProjects; private final Function<Void, AuthorizationEntity> authEntityFactory; private static final Function<Void, AuthorizationEntity> PLUGIN_FACTORY = new Function<Void, AuthorizationEntity>() { @Override public AuthorizationEntity apply(Void t) { return new AuthorizationPlugin(AuthControlFlag.REQUIRED, ""); } }; private static final Function<Void, AuthorizationEntity> STACK_FACTORY = new Function<Void, AuthorizationEntity>() { @Override public AuthorizationEntity apply(Void t) { return new AuthorizationStack(AuthControlFlag.REQUIRED, ""); } }; @Parameterized.Parameters public static Collection<Function<Void, AuthorizationEntity>> parameters() { List<Function<Void, AuthorizationEntity>> l = new ArrayList<>(); l.add(PLUGIN_FACTORY); l.add(STACK_FACTORY); return l; } public AuthorizationEntityTest(Function<Void, AuthorizationEntity> authEntityFactory) { this.authEntityFactory = authEntityFactory; } @Before public void setUp() { RuntimeEnvironment env = RuntimeEnvironment.getInstance(); envGroups = env.getGroups(); envProjects = env.getProjects(); env.setGroups(new TreeSet<>()); env.setProjects(new TreeMap<>()); } @After public void tearDown() { RuntimeEnvironment.getInstance().setGroups(envGroups); RuntimeEnvironment.getInstance().setProjects(envProjects); } @Test public void testForGroupsAndForProjectsDiscovery() { Group g1, g2, g3; AuthorizationEntity authEntity; RuntimeEnvironment env = RuntimeEnvironment.getInstance(); env.getProjects().put("project 1", new Project("project 1")); env.getProjects().put("project 2", new Project("project 2")); env.getProjects().put("project 3", new Project("project 3")); env.getProjects().put("project 4", new Project("project 4")); env.getProjects().put("project 5", new Project("project 5")); env.getProjects().put("project 6", new Project("project 6")); env.getProjects().put("project 7", new Project("project 7")); env.getProjects().put("project 8", new Project("project 8")); env.getProjects().put("project 9", new Project("project 9")); /** * Structure<br> * <pre> * G1 + P1 * + P2 * + P3 * + G2 * + P4 * + P5 * + P6 * + P7 * G3 + P8 * + P9 * </pre> */ g1 = new Group(); g1.setName("group 1"); g1.addProject(env.getProjects().get("project 1")); g1.addProject(env.getProjects().get("project 2")); g1.addProject(env.getProjects().get("project 3")); env.getGroups().add(g1); g2 = new Group(); g2.setName("group 2"); g2.addProject(env.getProjects().get("project 4")); g2.addProject(env.getProjects().get("project 5")); g2.addProject(env.getProjects().get("project 6")); g2.addProject(env.getProjects().get("project 7")); g1.addGroup(g2); env.getGroups().add(g2); g3 = new Group(); g3.setName("group 3"); g3.addProject(env.getProjects().get("project 8")); g3.addProject(env.getProjects().get("project 9")); env.getGroups().add(g3); // add g1 and all descendants their projects authEntity = authEntityFactory.apply(null); authEntity.setForGroups(new TreeSet<>()); authEntity.setForGroups("group 1"); authEntity.load(new TreeMap<>()); assertEquals(new TreeSet<>(Arrays.asList(new String[]{"group 1", "group 2"})), authEntity.forGroups()); assertEquals(new TreeSet<>(Arrays.asList(new String[]{"project 1", "project 2", "project 3", "project 4", "project 5", "project 6", "project 7"})), authEntity.forProjects()); // add group2, its parent g1 and g2 projects authEntity = authEntityFactory.apply(null); authEntity.setForGroups(new TreeSet<>()); authEntity.setForGroups("group 2"); authEntity.load(new TreeMap<>()); assertEquals(new TreeSet<>(Arrays.asList(new String[]{"group 1", "group 2"})), authEntity.forGroups()); assertEquals(new TreeSet<>(Arrays.asList(new String[]{"project 4", "project 5", "project 6", "project 7"})), authEntity.forProjects()); // add only g3 and its projects authEntity = authEntityFactory.apply(null); authEntity.setForGroups(new TreeSet<>()); authEntity.setForGroups("group 3"); authEntity.load(new TreeMap<>()); assertEquals(new TreeSet<>(Arrays.asList(new String[]{"group 3"})), authEntity.forGroups()); assertEquals(new TreeSet<>(Arrays.asList(new String[]{"project 8", "project 9"})), authEntity.forProjects()); } /** * Listed projects don't exist. */ @Test public void testForGroupsAndForProjectsDiscoveryInvalidProject() { AuthorizationEntity authEntity = authEntityFactory.apply(null); authEntity.setForProjects(new TreeSet<>(Arrays.asList(new String[]{"project 1", "project 2", "project 3", "project 4", "project 5", "project 6", "project 7"}))); authEntity.load(new TreeMap<>()); assertEquals(new TreeSet<>(), authEntity.forGroups()); assertEquals(new TreeSet<>(), authEntity.forProjects()); } /** * Listed groups don't exist. */ @Test public void testForGroupsAndForProjectsDiscoveryInvalidGroup() { AuthorizationEntity authEntity = authEntityFactory.apply(null); authEntity.setForGroups(new TreeSet<>(Arrays.asList(new String[]{"group 1", "group 2"}))); authEntity.load(new TreeMap<>()); assertEquals(new TreeSet<>(), authEntity.forGroups()); assertEquals(new TreeSet<>(), authEntity.forProjects()); } /** * Listed projects in the group don't exist. */ @Test public void testForGroupsAndForProjectsDiscoveryInvalidProjectInGroup() { AuthorizationEntity authEntity = authEntityFactory.apply(null); authEntity.setForGroups(new TreeSet<>(Arrays.asList(new String[]{"group 1", "group 2"}))); RuntimeEnvironment env = RuntimeEnvironment.getInstance(); Group g1 = new Group(); g1.setName("group 1"); g1.addProject(new Project("project 1")); g1.addProject(new Project("project 2")); g1.addProject(new Project("project 3")); env.getGroups().add(g1); authEntity.load(new TreeMap<>()); assertEquals(new TreeSet<>(Arrays.asList(new String[]{"group 1"})), authEntity.forGroups()); assertEquals(new TreeSet<>(), authEntity.forProjects()); } }