blob: 7fa34591d49ac6a6de9c8a9b5837c928f9019218 [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.query;
import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.FAILURE;
import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.OK;
import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.SKIPPED;
import static org.apache.chemistry.opencmis.tck.CmisTestResultStatus.WARNING;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.ItemIterable;
import org.apache.chemistry.opencmis.client.api.ObjectType;
import org.apache.chemistry.opencmis.client.api.QueryResult;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.PropertyData;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
import org.apache.chemistry.opencmis.tck.CmisTestResult;
import org.apache.chemistry.opencmis.tck.impl.CmisTestResultImpl;
/**
* Query smoke test.
*/
public class QuerySmokeTest extends AbstractQueryTest {
@Override
public void init(Map<String, String> parameters) {
super.init(parameters);
setName("Query Smoke Test");
setDescription("Performs a simple query and checks if the format of the results is correct. It does not check if the results are complete!");
}
@Override
public void run(Session session) {
CmisTestResult f;
if (supportsQuery(session)) {
String testType = "cmis:document";
String statement = "SELECT * FROM " + testType;
addResult(createInfoResult("Query: " + statement));
ObjectType type = session.getTypeDefinition(testType);
f = createResult(FAILURE, "Test type definition '" + testType + "'not found!");
addResult(assertNotNull(type, null, f));
if (type == null) {
return;
}
PropertyDefinition<?> objectIdPropDef = type.getPropertyDefinitions().get(PropertyIds.OBJECT_ID);
f = createResult(FAILURE, "Object Id property definition does not exist!");
addResult(assertNotNull(objectIdPropDef, null, f));
String objectIdQueryName = null;
if (objectIdPropDef != null) {
objectIdQueryName = objectIdPropDef.getQueryName();
}
int pageSize = 100;
ItemIterable<QueryResult> resultSet = session.query(statement, false);
if (resultSet == null) {
addResult(createResult(FAILURE, "Query result set is null! (OpenCMIS issue???)"));
} else {
int i = 0;
// testing 100 results should be sufficient for this test
ItemIterable<QueryResult> queryIterable = resultSet.getPage(pageSize);
for (QueryResult qr : queryIterable) {
if (qr == null) {
addResult(createResult(FAILURE, "Query result is null! (OpenCMIS issue???)"));
} else {
addResult(checkQueryResult(session, qr, type, "Query result: " + i));
if (objectIdQueryName != null) {
String objectId = (String) qr.getPropertyByQueryName(objectIdQueryName).getFirstValue();
try {
CmisObject object = session.getObject(objectId, SELECT_ALL_NO_CACHE_OC);
addResult(checkObject(session, object, getAllProperties(object),
"Query hit check. Id: " + objectId));
} catch (CmisObjectNotFoundException e) {
addResult(createResult(FAILURE,
"Query hit references an object that doesn't exist. Id: " + objectId, e, false));
}
}
// TODO: check more
}
i++;
}
f = createResult(FAILURE, "More query results (" + i + ") than expected (page size = " + pageSize
+ ")!");
addResult(assertIsFalse((i > pageSize), null, f));
if (queryIterable.getTotalNumItems() == -1) {
addResult(createResult(WARNING, "Repository did not return numItems."));
}
addResult(createInfoResult(i + " query results for \"" + statement + "\" (page size = " + pageSize
+ ")"));
}
} else {
addResult(createResult(SKIPPED, "Query not supported. Test Skipped!"));
}
}
protected CmisTestResult checkQueryResult(Session session, QueryResult qr, ObjectType type, String message) {
List<CmisTestResult> results = new ArrayList<CmisTestResult>();
CmisTestResult f;
if (qr.getProperties().isEmpty()) {
addResult(results, createResult(FAILURE, "Query result is empty!"));
} else {
for (PropertyDefinition<?> propDef : type.getPropertyDefinitions().values()) {
if (propDef.getQueryName() == null) {
continue;
}
PropertyData<?> pd = qr.getPropertyByQueryName(propDef.getQueryName());
if (pd == null) {
addResult(results,
createResult(FAILURE, "Query property not in result set: " + propDef.getQueryName()));
} else {
if (PropertyIds.OBJECT_ID.equals(propDef.getId())
|| PropertyIds.OBJECT_TYPE_ID.equals(propDef.getId())
|| PropertyIds.BASE_TYPE_ID.equals(propDef.getId())) {
f = createResult(FAILURE, "Query property must not be empty: " + propDef.getQueryName());
addResult(results, assertStringNotEmpty((String) pd.getFirstValue(), null, f));
}
}
}
}
CmisTestResultImpl result = createResult(getWorst(results), message);
result.getChildren().addAll(results);
return (result.getStatus().getLevel() <= OK.getLevel() ? null : result);
}
}