blob: 07d830aa467387b61157fcf689a5f3e08238c0d3 [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 SF 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.sling.hc.junitbridge;
import java.util.ArrayList;
import java.util.List;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.apache.sling.junit.TestsProvider;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.service.component.ComponentContext;
/** Bridge Health Checks into the Sling JUnit server-side test
* framework, based on their tags.
*/
@Component(
metatype=true,
label="Apache Sling Health Checks/JUnit bridge",
description="Makes Health Checks available as server-side JUnit tests"
)
@Service
public class HealthCheckTestsProvider implements TestsProvider {
private String servicePid;
private long lastModified;
private BundleContext bundleContext;
public static final String TEST_NAME_PREFIX = "HealthChecks(";
public static final String TEST_NAME_SUFFIX = ")";
public static final String [] DEFAULT_TAG_GROUPS = {
"No tag groups configured"
};
@Property(cardinality=2147483647,
label="Health Check Tags",
description="Groups of health check tags to execute as JUnit tests. Use the standard Health Checks 'includeThisTag,-omitThatTag' syntax")
public static final String PROP_TAG_GROUPS = "health.check.tag.groups";
private String [] tagGroups;
@Activate
protected void activate(ComponentContext ctx) {
bundleContext = ctx.getBundleContext();
tagGroups = PropertiesUtil.toStringArray(ctx.getProperties().get(PROP_TAG_GROUPS), DEFAULT_TAG_GROUPS);
servicePid = (String)ctx.getProperties().get(Constants.SERVICE_PID);
lastModified = System.currentTimeMillis();
}
@Deactivate
protected void deactivate() {
bundleContext = null;
servicePid = null;
lastModified = -1;
}
@Override
public Class<?> createTestClass(String testName) throws ClassNotFoundException {
// The test name is like "Health Checks(foo,bar)" and we need just 'foo,bar'
String tagString = null;
try {
tagString = testName.substring(0, testName.length() - TEST_NAME_SUFFIX.length()).substring(TEST_NAME_PREFIX.length());
} catch(Exception e) {
throw new RuntimeException("Invalid test name:" + testName);
}
JUnitTestBridge.setThreadContext(new TestBridgeContext(bundleContext, splitTags(tagString)));
return JUnitTestBridge.class;
}
private String [] splitTags(String tags) {
final List<String> result = new ArrayList<String>();
for(String tag: tags.split(",")) {
result.add(tag.trim());
}
return result.toArray(new String[]{});
}
@Override
public String getServicePid() {
return servicePid;
}
@Override
public List<String> getTestNames() {
final List<String> result = new ArrayList<String>();
for(String t : tagGroups) {
result.add(TEST_NAME_PREFIX + t + TEST_NAME_SUFFIX);
}
return result;
}
@Override
public long lastModified() {
return lastModified;
}
}