|
@@ -0,0 +1,1208 @@
|
|
|
+/**
|
|
|
+ * Licensed to the Apache Software Foundation (ASF) under one
|
|
|
+ * or more contributor license agreements. See the NOTICE file
|
|
|
+ * distributed with this work for additional information
|
|
|
+ * regarding copyright ownership. The ASF licenses this file
|
|
|
+ * to you 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 org.apache.hadoop.hdfs.server.namenode;
|
|
|
+
|
|
|
+import static org.apache.hadoop.fs.permission.AclEntryScope.*;
|
|
|
+import static org.apache.hadoop.fs.permission.AclEntryType.*;
|
|
|
+import static org.apache.hadoop.fs.permission.FsAction.*;
|
|
|
+import static org.apache.hadoop.hdfs.server.namenode.AclTestHelpers.*;
|
|
|
+import static org.apache.hadoop.hdfs.server.namenode.AclTransformation.*;
|
|
|
+import static org.junit.Assert.*;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+import com.google.common.collect.ImmutableList;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+import org.junit.Test;
|
|
|
+
|
|
|
+import org.apache.hadoop.fs.permission.AclEntry;
|
|
|
+import org.apache.hadoop.fs.permission.AclEntryScope;
|
|
|
+import org.apache.hadoop.fs.permission.AclEntryType;
|
|
|
+import org.apache.hadoop.fs.permission.FsAction;
|
|
|
+import org.apache.hadoop.hdfs.protocol.AclException;
|
|
|
+import org.apache.hadoop.hdfs.server.namenode.AclTransformation;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Tests operations that modify ACLs. All tests in this suite have been
|
|
|
+ * cross-validated against Linux setfacl/getfacl to check for consistency of the
|
|
|
+ * HDFS implementation.
|
|
|
+ */
|
|
|
+public class TestAclTransformation {
|
|
|
+
|
|
|
+ private static final List<AclEntry> ACL_SPEC_TOO_LARGE;
|
|
|
+ static {
|
|
|
+ ACL_SPEC_TOO_LARGE = Lists.newArrayListWithCapacity(33);
|
|
|
+ for (int i = 0; i < 33; ++i) {
|
|
|
+ ACL_SPEC_TOO_LARGE.add(aclEntry(ACCESS, USER, "user" + i, ALL));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testFilterAclEntriesByAclSpec() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, "sales", READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, "execs", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, "diana"),
|
|
|
+ aclEntry(ACCESS, GROUP, "sales"));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, "execs", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, filterAclEntriesByAclSpec(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testFilterAclEntriesByAclSpecUnchanged() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, "sales", ALL))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, "clark"),
|
|
|
+ aclEntry(ACCESS, GROUP, "execs"));
|
|
|
+ assertEquals(existing, filterAclEntriesByAclSpec(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testFilterAclEntriesByAclSpecAccessMaskCalculated()
|
|
|
+ throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, "diana"));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, filterAclEntriesByAclSpec(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testFilterAclEntriesByAclSpecDefaultMaskCalculated()
|
|
|
+ throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, USER, "diana"));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, filterAclEntriesByAclSpec(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testFilterAclEntriesByAclSpecDefaultMaskPreserved()
|
|
|
+ throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", ALL))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, "diana"));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", ALL))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, filterAclEntriesByAclSpec(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testFilterAclEntriesByAclSpecAccessMaskPreserved()
|
|
|
+ throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, USER, "diana"));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, filterAclEntriesByAclSpec(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testFilterAclEntriesByAclSpecAutomaticDefaultUser()
|
|
|
+ throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, USER));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, filterAclEntriesByAclSpec(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testFilterAclEntriesByAclSpecAutomaticDefaultGroup()
|
|
|
+ throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, GROUP));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, filterAclEntriesByAclSpec(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testFilterAclEntriesByAclSpecAutomaticDefaultOther()
|
|
|
+ throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, OTHER));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, filterAclEntriesByAclSpec(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testFilterAclEntriesByAclSpecEmptyAclSpec() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.<AclEntry>newArrayList();
|
|
|
+ assertEquals(existing, filterAclEntriesByAclSpec(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testFilterAclEntriesByAclSpecRemoveAccessMaskRequired()
|
|
|
+ throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, MASK));
|
|
|
+ filterAclEntriesByAclSpec(existing, aclSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testFilterAclEntriesByAclSpecRemoveDefaultMaskRequired()
|
|
|
+ throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, MASK));
|
|
|
+ filterAclEntriesByAclSpec(existing, aclSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testFilterAclEntriesByAclSpecInputTooLarge() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ filterAclEntriesByAclSpec(existing, ACL_SPEC_TOO_LARGE);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testFilterDefaultAclEntries() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, "sales", READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, "sales", READ_EXECUTE))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, READ_EXECUTE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, "sales", READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, filterDefaultAclEntries(existing));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testFilterDefaultAclEntriesUnchanged() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, "sales", ALL))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(existing, filterDefaultAclEntries(existing));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntries() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, "bruce", ALL));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntriesUnchanged() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, "sales", ALL))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", ALL))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, "sales", ALL))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, USER, "bruce", ALL),
|
|
|
+ aclEntry(ACCESS, GROUP, READ_EXECUTE),
|
|
|
+ aclEntry(ACCESS, GROUP, "sales", ALL),
|
|
|
+ aclEntry(ACCESS, MASK, ALL),
|
|
|
+ aclEntry(ACCESS, OTHER, NONE),
|
|
|
+ aclEntry(DEFAULT, USER, ALL),
|
|
|
+ aclEntry(DEFAULT, USER, "bruce", ALL),
|
|
|
+ aclEntry(DEFAULT, GROUP, READ_EXECUTE),
|
|
|
+ aclEntry(DEFAULT, GROUP, "sales", ALL),
|
|
|
+ aclEntry(DEFAULT, MASK, ALL),
|
|
|
+ aclEntry(DEFAULT, OTHER, NONE));
|
|
|
+ assertEquals(existing, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntriesMultipleNewBeforeExisting()
|
|
|
+ throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, "bruce", READ_EXECUTE),
|
|
|
+ aclEntry(ACCESS, USER, "clark", READ_EXECUTE),
|
|
|
+ aclEntry(ACCESS, USER, "diana", READ_EXECUTE));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, USER, "clark", READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntriesAccessMaskCalculated() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, "bruce", READ_EXECUTE),
|
|
|
+ aclEntry(ACCESS, USER, "diana", READ));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntriesDefaultMaskCalculated() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, USER, "bruce", READ_WRITE),
|
|
|
+ aclEntry(DEFAULT, USER, "diana", READ_EXECUTE));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", READ_EXECUTE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntriesDefaultMaskPreserved() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", ALL))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, "diana", FsAction.READ_EXECUTE));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", ALL))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntriesAccessMaskPreserved() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, USER, "diana", READ_EXECUTE));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", READ_EXECUTE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ_EXECUTE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntriesAutomaticDefaultUser() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, GROUP, READ_EXECUTE),
|
|
|
+ aclEntry(DEFAULT, OTHER, READ));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntriesAutomaticDefaultGroup() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, USER, READ_EXECUTE),
|
|
|
+ aclEntry(DEFAULT, OTHER, READ));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, READ_EXECUTE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntriesAutomaticDefaultOther() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, USER, READ_EXECUTE),
|
|
|
+ aclEntry(DEFAULT, GROUP, READ_EXECUTE));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, READ_EXECUTE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntriesProvidedAccessMask() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, "bruce", READ_EXECUTE),
|
|
|
+ aclEntry(ACCESS, MASK, ALL));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntriesProvidedDefaultMask() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, USER, ALL),
|
|
|
+ aclEntry(DEFAULT, GROUP, READ),
|
|
|
+ aclEntry(DEFAULT, MASK, ALL),
|
|
|
+ aclEntry(DEFAULT, OTHER, NONE));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testMergeAclEntriesEmptyAclSpec() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.<AclEntry>newArrayList();
|
|
|
+ assertEquals(existing, mergeAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testMergeAclEntriesInputTooLarge() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ mergeAclEntries(existing, ACL_SPEC_TOO_LARGE);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testMergeAclEntriesResultTooLarge() throws AclException {
|
|
|
+ ImmutableList.Builder<AclEntry> aclBuilder =
|
|
|
+ new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL));
|
|
|
+ for (int i = 1; i <= 28; ++i) {
|
|
|
+ aclBuilder.add(aclEntry(ACCESS, USER, "user" + i, READ));
|
|
|
+ }
|
|
|
+ aclBuilder
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE));
|
|
|
+ List<AclEntry> existing = aclBuilder.build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, "bruce", READ));
|
|
|
+ mergeAclEntries(existing, aclSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testMergeAclEntriesDuplicateEntries() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, "bruce", ALL),
|
|
|
+ aclEntry(ACCESS, USER, "diana", READ_WRITE),
|
|
|
+ aclEntry(ACCESS, USER, "clark", READ),
|
|
|
+ aclEntry(ACCESS, USER, "bruce", READ_EXECUTE));
|
|
|
+ mergeAclEntries(existing, aclSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testMergeAclEntriesNamedMask() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, MASK, "bruce", READ_EXECUTE));
|
|
|
+ mergeAclEntries(existing, aclSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testMergeAclEntriesNamedOther() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, OTHER, "bruce", READ_EXECUTE));
|
|
|
+ mergeAclEntries(existing, aclSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReplaceAclEntries() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, USER, "bruce", READ_WRITE),
|
|
|
+ aclEntry(ACCESS, GROUP, READ_EXECUTE),
|
|
|
+ aclEntry(ACCESS, GROUP, "sales", ALL),
|
|
|
+ aclEntry(ACCESS, MASK, ALL),
|
|
|
+ aclEntry(ACCESS, OTHER, NONE),
|
|
|
+ aclEntry(DEFAULT, USER, ALL),
|
|
|
+ aclEntry(DEFAULT, USER, "bruce", READ_WRITE),
|
|
|
+ aclEntry(DEFAULT, GROUP, READ_EXECUTE),
|
|
|
+ aclEntry(DEFAULT, GROUP, "sales", ALL),
|
|
|
+ aclEntry(DEFAULT, MASK, ALL),
|
|
|
+ aclEntry(DEFAULT, OTHER, NONE));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, "sales", ALL))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, "sales", ALL))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, replaceAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReplaceAclEntriesUnchanged() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, "sales", ALL))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", ALL))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ_EXECUTE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, "sales", ALL))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, USER, "bruce", ALL),
|
|
|
+ aclEntry(ACCESS, GROUP, READ_EXECUTE),
|
|
|
+ aclEntry(ACCESS, GROUP, "sales", ALL),
|
|
|
+ aclEntry(ACCESS, MASK, ALL),
|
|
|
+ aclEntry(ACCESS, OTHER, NONE),
|
|
|
+ aclEntry(DEFAULT, USER, ALL),
|
|
|
+ aclEntry(DEFAULT, USER, "bruce", ALL),
|
|
|
+ aclEntry(DEFAULT, GROUP, READ_EXECUTE),
|
|
|
+ aclEntry(DEFAULT, GROUP, "sales", ALL),
|
|
|
+ aclEntry(DEFAULT, MASK, ALL),
|
|
|
+ aclEntry(DEFAULT, OTHER, NONE));
|
|
|
+ assertEquals(existing, replaceAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReplaceAclEntriesAccessMaskCalculated() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, USER, "bruce", READ),
|
|
|
+ aclEntry(ACCESS, USER, "diana", READ_WRITE),
|
|
|
+ aclEntry(ACCESS, GROUP, READ),
|
|
|
+ aclEntry(ACCESS, OTHER, READ));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, replaceAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReplaceAclEntriesDefaultMaskCalculated() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, GROUP, READ),
|
|
|
+ aclEntry(ACCESS, OTHER, READ),
|
|
|
+ aclEntry(DEFAULT, USER, ALL),
|
|
|
+ aclEntry(DEFAULT, USER, "bruce", READ),
|
|
|
+ aclEntry(DEFAULT, USER, "diana", READ_WRITE),
|
|
|
+ aclEntry(DEFAULT, GROUP, ALL),
|
|
|
+ aclEntry(DEFAULT, OTHER, READ));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, replaceAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReplaceAclEntriesDefaultMaskPreserved() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", ALL))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, USER, "bruce", READ),
|
|
|
+ aclEntry(ACCESS, USER, "diana", READ_WRITE),
|
|
|
+ aclEntry(ACCESS, GROUP, ALL),
|
|
|
+ aclEntry(ACCESS, OTHER, READ));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, ALL))
|
|
|
+ .add(aclEntry(ACCESS, MASK, ALL))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", ALL))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, replaceAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReplaceAclEntriesAccessMaskPreserved() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, USER, ALL),
|
|
|
+ aclEntry(DEFAULT, USER, "bruce", READ),
|
|
|
+ aclEntry(DEFAULT, GROUP, READ),
|
|
|
+ aclEntry(DEFAULT, OTHER, NONE));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(ACCESS, USER, "diana", READ_WRITE))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, MASK, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, READ))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, replaceAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReplaceAclEntriesAutomaticDefaultUser() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, GROUP, READ),
|
|
|
+ aclEntry(ACCESS, OTHER, NONE),
|
|
|
+ aclEntry(DEFAULT, USER, "bruce", READ),
|
|
|
+ aclEntry(DEFAULT, GROUP, READ_WRITE),
|
|
|
+ aclEntry(DEFAULT, MASK, READ_WRITE),
|
|
|
+ aclEntry(DEFAULT, OTHER, READ));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, replaceAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReplaceAclEntriesAutomaticDefaultGroup() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, GROUP, READ),
|
|
|
+ aclEntry(ACCESS, OTHER, NONE),
|
|
|
+ aclEntry(DEFAULT, USER, READ_WRITE),
|
|
|
+ aclEntry(DEFAULT, USER, "bruce", READ),
|
|
|
+ aclEntry(DEFAULT, MASK, READ),
|
|
|
+ aclEntry(DEFAULT, OTHER, READ));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, READ))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, replaceAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReplaceAclEntriesAutomaticDefaultOther() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, GROUP, READ),
|
|
|
+ aclEntry(ACCESS, OTHER, NONE),
|
|
|
+ aclEntry(DEFAULT, USER, READ_WRITE),
|
|
|
+ aclEntry(DEFAULT, USER, "bruce", READ),
|
|
|
+ aclEntry(DEFAULT, GROUP, READ_WRITE),
|
|
|
+ aclEntry(DEFAULT, MASK, READ_WRITE));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ_WRITE))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, replaceAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test
|
|
|
+ public void testReplaceAclEntriesOnlyDefaults() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(DEFAULT, USER, "bruce", READ));
|
|
|
+ List<AclEntry> expected = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .add(aclEntry(DEFAULT, USER, ALL))
|
|
|
+ .add(aclEntry(DEFAULT, USER, "bruce", READ))
|
|
|
+ .add(aclEntry(DEFAULT, GROUP, READ))
|
|
|
+ .add(aclEntry(DEFAULT, MASK, READ))
|
|
|
+ .add(aclEntry(DEFAULT, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ assertEquals(expected, replaceAclEntries(existing, aclSpec));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testReplaceAclEntriesInputTooLarge() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ replaceAclEntries(existing, ACL_SPEC_TOO_LARGE);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testReplaceAclEntriesResultTooLarge() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayListWithCapacity(32);
|
|
|
+ aclSpec.add(aclEntry(ACCESS, USER, ALL));
|
|
|
+ for (int i = 1; i <= 29; ++i) {
|
|
|
+ aclSpec.add(aclEntry(ACCESS, USER, "user" + i, READ));
|
|
|
+ }
|
|
|
+ aclSpec.add(aclEntry(ACCESS, GROUP, READ));
|
|
|
+ aclSpec.add(aclEntry(ACCESS, OTHER, NONE));
|
|
|
+ // The ACL spec now has 32 entries. Automatic mask calculation will push it
|
|
|
+ // over the limit to 33.
|
|
|
+ replaceAclEntries(existing, aclSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testReplaceAclEntriesDuplicateEntries() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, USER, "bruce", ALL),
|
|
|
+ aclEntry(ACCESS, USER, "diana", READ_WRITE),
|
|
|
+ aclEntry(ACCESS, USER, "clark", READ),
|
|
|
+ aclEntry(ACCESS, USER, "bruce", READ_EXECUTE),
|
|
|
+ aclEntry(ACCESS, GROUP, READ),
|
|
|
+ aclEntry(ACCESS, OTHER, NONE));
|
|
|
+ replaceAclEntries(existing, aclSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testReplaceAclEntriesNamedMask() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, GROUP, READ),
|
|
|
+ aclEntry(ACCESS, OTHER, NONE),
|
|
|
+ aclEntry(ACCESS, MASK, "bruce", READ_EXECUTE));
|
|
|
+ replaceAclEntries(existing, aclSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testReplaceAclEntriesNamedOther() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, GROUP, READ),
|
|
|
+ aclEntry(ACCESS, OTHER, NONE),
|
|
|
+ aclEntry(ACCESS, OTHER, "bruce", READ_EXECUTE));
|
|
|
+ replaceAclEntries(existing, aclSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testReplaceAclEntriesMissingUser() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, "bruce", READ_WRITE),
|
|
|
+ aclEntry(ACCESS, GROUP, READ_EXECUTE),
|
|
|
+ aclEntry(ACCESS, GROUP, "sales", ALL),
|
|
|
+ aclEntry(ACCESS, MASK, ALL),
|
|
|
+ aclEntry(ACCESS, OTHER, NONE));
|
|
|
+ replaceAclEntries(existing, aclSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testReplaceAclEntriesMissingGroup() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, USER, "bruce", READ_WRITE),
|
|
|
+ aclEntry(ACCESS, GROUP, "sales", ALL),
|
|
|
+ aclEntry(ACCESS, MASK, ALL),
|
|
|
+ aclEntry(ACCESS, OTHER, NONE));
|
|
|
+ replaceAclEntries(existing, aclSpec);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Test(expected=AclException.class)
|
|
|
+ public void testReplaceAclEntriesMissingOther() throws AclException {
|
|
|
+ List<AclEntry> existing = new ImmutableList.Builder<AclEntry>()
|
|
|
+ .add(aclEntry(ACCESS, USER, ALL))
|
|
|
+ .add(aclEntry(ACCESS, GROUP, READ))
|
|
|
+ .add(aclEntry(ACCESS, OTHER, NONE))
|
|
|
+ .build();
|
|
|
+ List<AclEntry> aclSpec = Lists.newArrayList(
|
|
|
+ aclEntry(ACCESS, USER, ALL),
|
|
|
+ aclEntry(ACCESS, USER, "bruce", READ_WRITE),
|
|
|
+ aclEntry(ACCESS, GROUP, READ_EXECUTE),
|
|
|
+ aclEntry(ACCESS, GROUP, "sales", ALL),
|
|
|
+ aclEntry(ACCESS, MASK, ALL));
|
|
|
+ replaceAclEntries(existing, aclSpec);
|
|
|
+ }
|
|
|
+}
|