/** * Copyright 2005-2016 Red Hat, Inc. * <p> * Red Hat 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 * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * 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.arquillian.cube.kubernetes.impl; import java.util.HashMap; import java.util.Map; import org.arquillian.cube.impl.util.Strings; import org.arquillian.cube.kubernetes.api.AnnotationProvider; import org.arquillian.cube.kubernetes.api.NamespaceService; import org.arquillian.cube.kubernetes.api.Session; import org.jboss.arquillian.core.api.Instance; import org.jboss.arquillian.core.api.annotation.Inject; import org.jboss.arquillian.core.api.annotation.Observes; import org.jboss.arquillian.test.spi.TestResult; import org.jboss.arquillian.test.spi.event.suite.After; import org.jboss.arquillian.test.spi.event.suite.Before; import org.jboss.arquillian.test.spi.event.suite.TestLifecycleEvent; import static org.arquillian.cube.kubernetes.api.AnnotationProvider.MAX_ANNOTATION_KEY_LENGTH; import static org.arquillian.cube.kubernetes.api.AnnotationProvider.TEST_CASE_STATUS_FORMAT; public class TestListener { @Inject Instance<DefaultSession> session; @Inject Instance<NamespaceService> namespaceService; static String getPackage(TestLifecycleEvent event) { if (event.getTestClass() == null) { return ""; } else if (event.getTestClass().getJavaClass() == null) { return ""; } else if (event.getTestClass().getJavaClass().getPackage() == null) { return ""; } else { return event.getTestClass().getJavaClass().getPackage().getName(); } } static String getClassName(TestLifecycleEvent event) { if (event.getTestClass() == null) { throw new IllegalArgumentException("TestLifecycleEvent does not have a valid test class"); } else if (event.getTestClass().getJavaClass() == null) { throw new IllegalArgumentException("TestLifecycleEvent does not have a valid test class"); } else { return event.getTestClass().getJavaClass().getName(); } } static String getMethodName(TestLifecycleEvent event) { if (event.getTestMethod() == null) { throw new IllegalArgumentException("TestLifecycleEvent does not have a valid method name"); } else { return event.getTestMethod().getName(); } } static String trimName(String packageName, String className, String methodName) { StringBuilder sb = new StringBuilder(); String trimmedPackage = trimPackage(packageName); if (Strings.isNotNullOrEmpty(packageName)) { sb.append(trimmedPackage).append("."); } sb.append(className).append(".").append(methodName); String result = sb.toString(); int prefixLength = AnnotationProvider.TEST_CASE_STATUS_FORMAT.length() - 1; if (prefixLength + result.length() > MAX_ANNOTATION_KEY_LENGTH) { result = result.substring(prefixLength + result.length() - MAX_ANNOTATION_KEY_LENGTH); } if (result.charAt(0) == '.') { result = result.substring(1); } return result; } static String trimPackage(String pkg) { if (Strings.isNullOrEmpty(pkg)) { return pkg; } StringBuilder sb = new StringBuilder(); boolean first = true; for (String part : pkg.split("\\.")) { if (first) { first = false; } else { sb.append("."); } sb.append(part.substring(0, 1)); } return sb.toString(); } public void start(@Observes(precedence = Integer.MIN_VALUE) Before event) { Session session = this.session.get(); NamespaceService namespaceService = this.namespaceService.get(); String pkg = getPackage(event); String className = getClassName(event); String methodName = getMethodName(event); Map<String, String> annotations = new HashMap<>(); String testCase = trimName(pkg, className, methodName); annotations.put(String.format(TEST_CASE_STATUS_FORMAT, testCase), Constants.RUNNING_STATUS); try { namespaceService.annotate(session.getNamespace(), annotations); } catch (Throwable t) { session.getLogger().warn("Could not annotate namespace:[" + session.getNamespace() + "] with test: [" + className + "] method: [" + methodName + "] state:[" + Constants.RUNNING_STATUS + "]"); } } public void stop(@Observes(precedence = Integer.MIN_VALUE) After event, TestResult result) { Session session = this.session.get(); NamespaceService namespaceService = this.namespaceService.get(); String pkg = getPackage(event); String className = getClassName(event); String methodName = getMethodName(event); Map<String, String> annotations = new HashMap<>(); String testCase = trimName(pkg, className, methodName); annotations.put(String.format(TEST_CASE_STATUS_FORMAT, testCase), result.getStatus().name()); try { namespaceService.annotate(session.getNamespace(), annotations); } catch (Throwable t) { session.getLogger().warn("Could not annotate namespace:[" + session.getNamespace() + "] with test: [" + className + "] method: [" + methodName + "] result:[" + result.getStatus().name() + "]"); } switch (result.getStatus()) { case PASSED: session.getPassed().incrementAndGet(); break; case FAILED: session.getFailed().incrementAndGet(); break; case SKIPPED: session.getSkipped().incrementAndGet(); } } }