From d3edb7b7e958bba8aded6057ee6a647906469d35 Mon Sep 17 00:00:00 2001 From: Young Gyu Park Date: Thu, 3 May 2018 18:29:49 +0900 Subject: Bugnizer link button Test: go/vts-web-staging/show_plan_release?plan=vts&type=suite&page=1 Bug: 79183660 Change-Id: I1af599e9a10fa8da6b9966d5cf64899134fddc6e --- .gitignore | 3 +- pom.xml | 91 ++++++------ .../android/vts/entity/TestSuiteResultEntity.java | 155 ++++++++++++++++++++- .../android/vts/job/VtsSuiteTestJobServlet.java | 2 +- .../com/android/vts/servlet/ShowGcsLogServlet.java | 3 +- .../vts/servlet/ShowPlanReleaseServlet.java | 2 +- .../buganizer/config.properties | 12 ++ src/main/resources/config.properties | 2 + src/main/webapp/WEB-INF/jsp/show_suite_release.jsp | 7 +- 9 files changed, 230 insertions(+), 47 deletions(-) create mode 100644 src/main/resources/bug_tracking_system/buganizer/config.properties create mode 100644 src/main/resources/config.properties diff --git a/.gitignore b/.gitignore index 80791fb..5affaa9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,8 @@ appengine-generated/ # Secutiry Key file folder -src/main/webapp/WEB-INF/keys +src/main/resources/keys/ +src/main/resources/bug_tracking_system/**/*.tpl # Java *.class diff --git a/pom.xml b/pom.xml index 7593f0d..77d20f5 100644 --- a/pom.xml +++ b/pom.xml @@ -169,45 +169,56 @@ ${project.build.directory}/${project.build.finalName}/WEB-INF/classes - - - - org.apache.maven.plugins - maven-war-plugin - 2.6 - - true - false - - - ${basedir}/src/main/webapp/WEB-INF - true - WEB-INF - - - - - - - org.apache.maven.plugins - 3.3 - maven-compiler-plugin - - 1.8 - 1.8 - - - - - com.google.appengine - appengine-maven-plugin - ${appengine.version} - - ${app.id} - ${app.version} - - - - + + + src/main/resources + + **/*.properties + **/*.json + **/*.tpl + + + + + + + + org.apache.maven.plugins + maven-war-plugin + 2.6 + + true + false + + + ${basedir}/src/main/webapp/WEB-INF + true + WEB-INF + + + + + + + org.apache.maven.plugins + 3.3 + maven-compiler-plugin + + 1.8 + 1.8 + + + + + com.google.appengine + appengine-maven-plugin + ${appengine.version} + + ${app.id} + ${app.version} + + + + diff --git a/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java b/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java index 9c5422a..3ebece7 100644 --- a/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java +++ b/src/main/java/com/android/vts/entity/TestSuiteResultEntity.java @@ -26,13 +26,31 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; - +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.text.StrSubstitutor; +import org.apache.http.NameValuePair; +import org.apache.http.ParseException; +import org.apache.http.client.utils.URIUtils; +import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.message.BasicNameValuePair; + +import javax.servlet.ServletContext; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.time.Instant; +import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; @@ -46,6 +64,37 @@ import static com.googlecode.objectify.ObjectifyService.ofy; @NoArgsConstructor public class TestSuiteResultEntity { + /** Bug Tracking System Property class */ + private static Properties bugTrackingSystemProp = new Properties(); + + /** System Configuration Property class */ + private static Properties systemConfigProp = new Properties(); + + static { + try { + InputStream defaultInputStream = + TestSuiteResultEntity.class + .getClassLoader() + .getResourceAsStream("config.properties"); + systemConfigProp.load(defaultInputStream); + + String bugTrackingSystem = systemConfigProp.getProperty("bug.tracking.system"); + + InputStream btsInputStream = + TestSuiteResultEntity.class + .getClassLoader() + .getResourceAsStream( + "bug_tracking_system/" + + bugTrackingSystem + + "/config.properties"); + bugTrackingSystemProp.load(btsInputStream); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + public enum TestType { UNKNOWN(0), TOT(1), @@ -253,4 +302,108 @@ public class TestSuiteResultEntity { return testType; } } + + private String getLabInfraIssueDescription() throws IOException { + + String bugTrackingSystem = systemConfigProp.getProperty("bug.tracking.system"); + + String templateName = + bugTrackingSystemProp.getProperty( + bugTrackingSystem + ".labInfraIssue.template.name"); + + InputStream inputStream = + this.getClass() + .getClassLoader() + .getResourceAsStream( + "bug_tracking_system/" + bugTrackingSystem + "/" + templateName); + + String templateDescription = IOUtils.toString(inputStream, "UTF-8"); + + Map valuesMap = new HashMap<>(); + valuesMap.put("suiteBuildNumber", suiteBuildNumber); + valuesMap.put("buildId", buildId); + valuesMap.put("modulesDone", Integer.toString(modulesDone)); + valuesMap.put("modulesTotal", Integer.toString(modulesTotal)); + valuesMap.put("hostName", hostName); + valuesMap.put("resultPath", resultPath); + valuesMap.put("buildVendorFingerprint", buildVendorFingerprint); + valuesMap.put("buildSystemFingerprint", buildSystemFingerprint); + + StrSubstitutor sub = new StrSubstitutor(valuesMap); + String resolvedDescription = sub.replace(templateDescription); + + return resolvedDescription; + } + + private String getCrashSecurityDescription() throws IOException { + + String bugTrackingSystem = systemConfigProp.getProperty("bug.tracking.system"); + + String templateName = + bugTrackingSystemProp.getProperty( + bugTrackingSystem + ".crashSecurity.template.name"); + + InputStream inputStream = + this.getClass() + .getClassLoader() + .getResourceAsStream( + "bug_tracking_system/" + bugTrackingSystem + "/" + templateName); + + String templateDescription = IOUtils.toString(inputStream, "UTF-8"); + + Map valuesMap = new HashMap<>(); + valuesMap.put("suiteBuildNumber", suiteBuildNumber); + valuesMap.put("buildId", buildId); + valuesMap.put("hostName", hostName); + valuesMap.put("resultPath", resultPath); + valuesMap.put("buildVendorFingerprint", buildVendorFingerprint); + valuesMap.put("buildSystemFingerprint", buildSystemFingerprint); + + StrSubstitutor sub = new StrSubstitutor(valuesMap); + String resolvedDescription = sub.replace(templateDescription); + + return resolvedDescription; + } + + public String getBuganizerLink() throws IOException, ParseException, URISyntaxException { + + String bugTrackingSystem = systemConfigProp.getProperty("bug.tracking.system"); + + List qparams = new ArrayList(); + if (!this.bootSuccess || (this.passedTestCaseCount == 0 && this.failedTestCaseCount == 0)) { + qparams.add( + new BasicNameValuePair( + "component", + this.bugTrackingSystemProp.getProperty( + bugTrackingSystem + ".labInfraIssue.component.id"))); + qparams.add( + new BasicNameValuePair( + "template", + this.bugTrackingSystemProp.getProperty( + bugTrackingSystem + ".labInfraIssue.template.id"))); + qparams.add(new BasicNameValuePair("description", this.getLabInfraIssueDescription())); + } else { + qparams.add( + new BasicNameValuePair( + "component", + this.bugTrackingSystemProp.getProperty( + bugTrackingSystem + ".crashSecurity.component.id"))); + qparams.add( + new BasicNameValuePair( + "template", + this.bugTrackingSystemProp.getProperty( + bugTrackingSystem + ".crashSecurity.template.id"))); + qparams.add(new BasicNameValuePair("description", this.getCrashSecurityDescription())); + } + + URI uri = + URIUtils.createURI( + this.bugTrackingSystemProp.getProperty(bugTrackingSystem + ".uri.scheme"), + this.bugTrackingSystemProp.getProperty(bugTrackingSystem + ".uri.host"), + -1, + this.bugTrackingSystemProp.getProperty(bugTrackingSystem + ".uri.path"), + URLEncodedUtils.format(qparams, "UTF-8"), + null); + return uri.toString(); + } } diff --git a/src/main/java/com/android/vts/job/VtsSuiteTestJobServlet.java b/src/main/java/com/android/vts/job/VtsSuiteTestJobServlet.java index e4989fb..1884513 100644 --- a/src/main/java/com/android/vts/job/VtsSuiteTestJobServlet.java +++ b/src/main/java/com/android/vts/job/VtsSuiteTestJobServlet.java @@ -122,7 +122,7 @@ public class VtsSuiteTestJobServlet extends HttpServlet { super.init(servletConfig); this.keyFileInputStream = - this.getServletContext().getResourceAsStream("/WEB-INF/keys/" + GCS_KEY_FILE); + this.getClass().getClassLoader().getResourceAsStream("keys/" + GCS_KEY_FILE); Optional optionalStorage = GcsHelper.getStorage(this.keyFileInputStream); if (optionalStorage.isPresent()) { diff --git a/src/main/java/com/android/vts/servlet/ShowGcsLogServlet.java b/src/main/java/com/android/vts/servlet/ShowGcsLogServlet.java index 340edfe..f9b6f85 100644 --- a/src/main/java/com/android/vts/servlet/ShowGcsLogServlet.java +++ b/src/main/java/com/android/vts/servlet/ShowGcsLogServlet.java @@ -78,8 +78,7 @@ public class ShowGcsLogServlet extends BaseServlet { public void init(ServletConfig cfg) throws ServletException { super.init(cfg); - this.keyFileInputStream = - this.getServletContext().getResourceAsStream("/WEB-INF/keys/" + GCS_KEY_FILE); + this.keyFileInputStream = this.getClass().getClassLoader().getResourceAsStream("keys/" + GCS_KEY_FILE); Optional optionalStorage = GcsHelper.getStorage(this.keyFileInputStream); if (optionalStorage.isPresent()) { diff --git a/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java b/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java index 4b2ac88..cd1dd41 100644 --- a/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java +++ b/src/main/java/com/android/vts/servlet/ShowPlanReleaseServlet.java @@ -302,7 +302,7 @@ public class ShowPlanReleaseServlet extends BaseServlet { ofy().load() .type(TestSuiteResultEntity.class) .filter("suitePlan", testPlan) - .filter("testType", testCategoryType) + .filter("testType", Integer.parseInt(testCategoryType)) .orderKey(true); Pagination testSuiteResultEntityPagination = diff --git a/src/main/resources/bug_tracking_system/buganizer/config.properties b/src/main/resources/bug_tracking_system/buganizer/config.properties new file mode 100644 index 0000000..d83ad57 --- /dev/null +++ b/src/main/resources/bug_tracking_system/buganizer/config.properties @@ -0,0 +1,12 @@ + +buganizer.uri.scheme= +buganizer.uri.host= +buganizer.uri.path= + +buganizer.labInfraIssue.template.name= +buganizer.labInfraIssue.component.id= +buganizer.labInfraIssue.template.id= + +buganizer.crashSecurity.template.name= +buganizer.crashSecurity.component.id= +buganizer.crashSecurity.template.id= diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties new file mode 100644 index 0000000..7e9010c --- /dev/null +++ b/src/main/resources/config.properties @@ -0,0 +1,2 @@ + +bug.tracking.system= diff --git a/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp b/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp index 1ad19cc..3670561 100644 --- a/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp +++ b/src/main/webapp/WEB-INF/jsp/show_suite_release.jsp @@ -149,12 +149,17 @@ Device Name:
-