Skip to content

Commit

Permalink
add links support (fixes #1, via #9)
Browse files Browse the repository at this point in the history
  • Loading branch information
baev committed Feb 24, 2017
1 parent 74bbf96 commit 9dd042e
Show file tree
Hide file tree
Showing 20 changed files with 559 additions and 134 deletions.
4 changes: 4 additions & 0 deletions allure-java-commons/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,8 @@ dependencies {
compile 'io.qameta.allure:allure2-model-api'
compile 'org.slf4j:slf4j-api'
compile 'org.aspectj:aspectjrt'

testCompile 'junit:junit'
testCompile 'org.slf4j:slf4j-simple'
testCompile 'org.assertj:assertj-core'
}

This file was deleted.

13 changes: 4 additions & 9 deletions allure-java-commons/src/main/java/io/qameta/allure/Issue.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,17 @@

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* Use this annotation to link a single issue from issue tracker to test cases and test suites. Usage:
* <pre>
* &#064;Issue("MYPROJECT-1")
* public void myTest() {
* ...
* }
* </pre>
*/
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Repeatable(Issues.class)
public @interface Issue {

String value();
Expand Down
18 changes: 2 additions & 16 deletions allure-java-commons/src/main/java/io/qameta/allure/Issues.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,13 @@

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* Use this annotation to link multiple issues from issue tracker to test cases and test suites. Usage:
* <p/>
* <pre>
* &#064;Issues({
* &#064;Issue("MYPROJECT-1"),
* &#064;Issue("MYPROJECT-2")
* })
* public void myTest(){
* ...
* }
* </pre>
*
* @author Dmitry Baev charlie@yandex-team.ru
* Date: 01.08.14
*/
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Issues {
Expand Down
47 changes: 47 additions & 0 deletions allure-java-commons/src/main/java/io/qameta/allure/Link.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package io.qameta.allure;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* Use this annotation to add some links to results. Usage:
* <pre>
* &#064;Link("https://qameta.io")
* public void myTest() {
* ...
* }
* </pre>
*/
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Repeatable(Links.class)
public @interface Link {

/**
* Alias for {@link #name()}
*/
String value() default "";

/**
* Name for link, by default url.
*/
String name() default "";

/**
* Url for link. By default will search for system property `allure.link.{type}.pattern`, and use it
* to generate url.
*/
String url() default "";

/**
* This type is used for create an icon for link. Also there is few reserved types such as issue and tms.
*/
String type() default "custom";
}
21 changes: 21 additions & 0 deletions allure-java-commons/src/main/java/io/qameta/allure/Links.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package io.qameta.allure;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* @author charlie (Dmitry Baev).
*/
@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Links {

Link[] value();

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.qameta.allure;

import io.qameta.allure.model.Link;
import io.qameta.allure.model.Status;
import io.qameta.allure.model.StatusDetails;
import org.slf4j.Logger;
Expand Down Expand Up @@ -28,12 +29,45 @@ public final class ResultsUtils {
public static final String ALLURE_THREAD_NAME_SYSPROP = "allure.threadName";
public static final String ALLURE_THREAD_NAME_ENV = "ALLURE_THREAD_NAME";

public static final String ISSUE_LINK_TYPE = "issue";
public static final String TMS_LINK_TYPE = "tms";

private static String CACHED_HOST = null;

ResultsUtils() {
throw new IllegalStateException("Do not instance");
}

public static io.qameta.allure.model.Link createIssueLink(String value) {
return createLink(value, null, null, ISSUE_LINK_TYPE);
}

public static io.qameta.allure.model.Link createTmsLink(String value) {
return createLink(value, null, null, TMS_LINK_TYPE);
}

public static Link createLink(io.qameta.allure.Link link) {
return createLink(link.value(), link.name(), link.url(), link.type());
}

public static Link createLink(io.qameta.allure.Issue link) {
return createIssueLink(link.value());
}

public static Link createLink(io.qameta.allure.TmsLink link) {
return createTmsLink(link.value());
}

public static io.qameta.allure.model.Link createLink(String value, String name, String url, String type) {
String resolvedName = firstNonEmpty(value).orElse(name);
String resolvedUrl = firstNonEmpty(url)
.orElseGet(() -> getLinkUrl(resolvedName, type));
return new io.qameta.allure.model.Link()
.withName(resolvedName)
.withUrl(resolvedUrl)
.withType(type);
}

public static String getHostName() {
String fromProperty = System.getProperty(ALLURE_HOST_NAME_SYSPROP);
String fromEnv = System.getenv(ALLURE_HOST_NAME_ENV);
Expand All @@ -43,32 +77,13 @@ public static String getHostName() {
.orElseGet(ResultsUtils::getRealHostName);
}

private static String getRealHostName() {
if (Objects.isNull(CACHED_HOST)) {
try {
CACHED_HOST = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) { //NOSONAR
LOGGER.debug("Could not get host name {}", e);
CACHED_HOST = "default";
}
}
return CACHED_HOST;
}

public static String getTheadName() {
public static String getThreadName() {
String fromProperty = System.getProperty(ALLURE_THREAD_NAME_SYSPROP);
String fromEnv = System.getenv(ALLURE_THREAD_NAME_ENV);
return Stream.of(fromProperty, fromEnv)
.filter(Objects::nonNull)
.findFirst()
.orElseGet(ResultsUtils::getRealTheadName);
}

private static String getRealTheadName() {
return String.format("%s.%s(%s)",
ManagementFactory.getRuntimeMXBean().getName(),
Thread.currentThread().getName(),
Thread.currentThread().getId());
.orElseGet(ResultsUtils::getRealThreadName);
}

public static Optional<Status> getStatus(Throwable throwable) {
Expand All @@ -83,6 +98,44 @@ public static Optional<StatusDetails> getStatusDetails(Throwable e) {
.withTrace(getStackTraceAsString(throwable)));
}

public static Optional<String> firstNonEmpty(String... items) {
return Stream.of(items)
.filter(Objects::nonNull)
.filter(item -> !item.isEmpty())
.findFirst();
}

public static String getLinkTypePatternPropertyName(String type) {
return String.format("allure.link.%s.pattern", type);
}

private static String getLinkUrl(String name, String type) {
String pattern = System.getProperty(getLinkTypePatternPropertyName(type));
if (Objects.isNull(pattern)) {
return null;
}
return pattern.replaceAll("\\{}", Objects.isNull(name) ? "" : name);
}

private static String getRealHostName() {
if (Objects.isNull(CACHED_HOST)) {
try {
CACHED_HOST = InetAddress.getLocalHost().getHostName();
} catch (UnknownHostException e) { //NOSONAR
LOGGER.debug("Could not get host name {}", e);
CACHED_HOST = "default";
}
}
return CACHED_HOST;
}

private static String getRealThreadName() {
return String.format("%s.%s(%s)",
ManagementFactory.getRuntimeMXBean().getName(),
Thread.currentThread().getName(),
Thread.currentThread().getId());
}

private static String getStackTraceAsString(Throwable throwable) {
StringWriter stringWriter = new StringWriter();
throwable.printStackTrace(new PrintWriter(stringWriter));
Expand Down
21 changes: 0 additions & 21 deletions allure-java-commons/src/main/java/io/qameta/allure/TestCaseId.java

This file was deleted.

20 changes: 20 additions & 0 deletions allure-java-commons/src/main/java/io/qameta/allure/TmsLink.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package io.qameta.allure;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Repeatable(TmsLinks.class)
public @interface TmsLink {

String value();

}
18 changes: 18 additions & 0 deletions allure-java-commons/src/main/java/io/qameta/allure/TmsLinks.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package io.qameta.allure;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface TmsLinks {

TmsLink[] value();

}
Loading

0 comments on commit 9dd042e

Please sign in to comment.