blob: 6c349fc53f378f2241f3aaa19f8dd7b0ba8245d2 [file] [log] [blame]
/*
* 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.chemistry.opencmis.tck.tests.control;
import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.FAILURE;
import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.INFO;
import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.SKIPPED;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.commons.data.Ace;
import org.apache.chemistry.opencmis.commons.data.Acl;
import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
import org.apache.chemistry.opencmis.commons.enums.AclPropagation;
import org.apache.chemistry.opencmis.commons.enums.CapabilityAcl;
import org.apache.chemistry.opencmis.tck.CmisTestResult;
import org.apache.chemistry.opencmis.tck.impl.AbstractSessionTest;
import org.apache.chemistry.opencmis.tck.impl.TestParameters;
/**
* ACL smoke test.
*/
public class ACLSmokeTest extends AbstractSessionTest {
@Override
public void init(Map<String, String> parameters) {
super.init(parameters);
setName("ACL Test");
setDescription("Creates a document and checks its ACL.");
}
@Override
public void run(Session session) {
CmisTestResult f;
if (supportsACLs(session)) {
try {
// create folder and document
Folder testFolder = createTestFolder(session);
Document doc = createDocument(session, testFolder, "acltest.txt", "ACL test");
// check if there is an ACL
Acl acl = doc.getAcl();
f = createResult(FAILURE, "ACLs are supported but newly created document has no ACL!");
addResult(assertNotNull(acl, null, f));
// check basic permissions
Acl basicAcl = session.getAcl(doc, true);
f = createResult(FAILURE,
"ACLs are supported but repository does not return a basic ACL for the newly created document!");
addResult(assertNotNull(basicAcl, null, f));
if (basicAcl != null) {
addResult(checkACL(session, basicAcl, false, "Basic ACL"));
if (basicAcl.getAces() != null) {
for (Ace ace : basicAcl.getAces()) {
if (ace.getPermissions() != null) {
for (String permission : ace.getPermissions()) {
if (!"cmis:read".equals(permission) && !"cmis:write".equals(permission)
&& !"cmis:all".equals(permission)) {
addResult(createResult(FAILURE, "ACE contains a non-basic permission: "
+ permission));
}
}
}
}
}
}
if (getAclCapability(session) == CapabilityAcl.MANAGE
&& !Boolean.FALSE.equals(doc.getType().isControllableAcl())) {
String principal = getParameters().get(TestParameters.DEFAULT_ACL_PRINCIPAL);
if (principal == null) {
principal = TestParameters.DEFAULT_ACL_PRINCIPAL_VALUE;
}
// apply permission "cmis:write"
List<Ace> aces = new ArrayList<Ace>();
aces.add(session.getObjectFactory().createAce(principal, Collections.singletonList("cmis:write")));
session.applyAcl(doc, aces, null, null);
if (session.getRepositoryInfo().getAclCapabilities().getAclPropagation() != AclPropagation.REPOSITORYDETERMINED) {
// set permission "cmis:all"
aces = new ArrayList<Ace>();
aces.add(session.getObjectFactory().createAce(principal, Collections.singletonList("cmis:all")));
session.setAcl(doc, aces);
}
} else {
addResult(createResult(INFO, "The repository or the type '" + doc.getType().getId()
+ "' don't support managing ACLs."));
}
deleteObject(doc);
} finally {
deleteTestFolder();
}
} else {
addResult(createResult(SKIPPED, "ACLs are not supported. Test Skipped!"));
}
}
protected boolean supportsACLs(Session session) {
CapabilityAcl aclCap = getAclCapability(session);
return (aclCap != null) && (aclCap != CapabilityAcl.NONE);
}
protected CapabilityAcl getAclCapability(Session session) {
RepositoryInfo repository = session.getRepositoryInfo();
if (repository.getCapabilities().getAclCapability() == null) {
return null;
}
return repository.getCapabilities().getAclCapability();
}
}