/*
* Copyright (C) 2015 Stefano Fornari.
* All Rights Reserved. No use, copying or distribution of this
* work may be made except in accordance with a valid license
* agreement from Stefano Fornari. This notice must be
* included on all copies, modifications and derivatives of this
* work.
*
* STEFANO FORNARI MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY
* OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
* THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE, OR NON-INFRINGEMENT. STEFANO FORNARI SHALL NOT BE LIABLE FOR ANY
* DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
* THIS SOFTWARE OR ITS DERIVATIVES.
*/
package ste.web.acl;
import java.security.AccessControlException;
import java.util.HashSet;
import static org.assertj.core.api.BDDAssertions.then;
import org.junit.Before;
import org.junit.Test;
/**
*
* TODO: regex special characters in permissions shall be escaped
*/
public class BugFreeAccessControlList {
private final AccessControlList EMPTY = new AccessControlList();
private final AccessControlList ACL = new AccessControlList();
private final HashSet<String> PERMISSION_SET_1 = new HashSet<>();
private final HashSet<String> PERMISSION_SET_2 = new HashSet<>();
private final HashSet<String> PERMISSION_SET_3 = new HashSet<>();
@Before
public void before() {
ACL.add("ste.web.acl.permissions.star");
PERMISSION_SET_1.add("ste.web.acl.permissions.dummy");
PERMISSION_SET_2.add("ste.web.acl.permissions.dummy");
PERMISSION_SET_2.add("ste.web.acl.permissions.star");
PERMISSION_SET_3.add("ste.web.acl.permissions.dummy");
PERMISSION_SET_3.add("ste.web.acl.permissions.star");
PERMISSION_SET_3.add("ste.web.acl.permissions.other");
}
@Test
public void check_permissions_fails_if_no_given_permissions() {
try {
ACL.check(null);
} catch (AccessControlException x) {
then(x).hasMessageContaining("no permissions given");
}
try {
ACL.check(new HashSet<String>());
} catch (AccessControlException x) {
then(x).hasMessage("given permissions [] miss some of [ste.web.acl.permissions.star]");
}
}
@Test
public void check_permissions_fail_if_no_permissions() {
try {
EMPTY.check(PERMISSION_SET_1);
} catch (AccessControlException x) {
then(x).hasMessageContaining("no allowed permissions");
}
try {
EMPTY.check(PERMISSION_SET_2);
} catch (AccessControlException x) {
then(x).hasMessageContaining("no allowed permissions");
}
}
@Test
public void check_permissions_fail_if_not_all_permissions_given() {
try {
ACL.check(PERMISSION_SET_1);
} catch (AccessControlException x) {
then(x).hasMessage("given permissions [ste.web.acl.permissions.dummy] miss some of [ste.web.acl.permissions.star]");
}
try {
ACL.check(PERMISSION_SET_3);
} catch (AccessControlException x) {
then(x).hasMessage("given permissions " + PERMISSION_SET_3 + " miss some of [ste.web.acl.permissions.star]");
}
}
@Test
public void check_permissions_ok_if_all_permissions_given() {
ACL.check(PERMISSION_SET_2);
}
@Test
public void check_permissions_with_regex() {
AccessControlList acl = new AccessControlList();
acl.add(".*");
acl.check(PERMISSION_SET_1);
acl.check(PERMISSION_SET_2);
acl.check(PERMISSION_SET_3);
}
@Test
public void get_permissions() {
then(EMPTY.getPermissions()).isEmpty();
then(ACL.getPermissions()).containsExactly("ste.web.acl.permissions.star");
ACL.add("ste.web.acl.permissions.dummy");
then(ACL.getPermissions())
.contains("ste.web.acl.permissions.star")
.contains("ste.web.acl.permissions.dummy");
}
}